On Mon, 14 Nov 2022 16:47:22 GMT, Weijun Wang <wei...@openjdk.org> wrote:
> Inside JDK we support a lot of X.509 certificate extensions. Almost every > extension has a rule about what is legal or not. For example, the names in > `SubjectAlternativeNameExtension` cannot be missing or empty. Usually, a rule > is enforced in the `encode()` method, where the extension value is assigned > null for illegal extension and the method throws an `IOException`. However, > before the `encode()` method is called, the illegal extension can always be > created successfully, whether from a constructor using extension components > (For example, `new SubjectAlternativeNameExtension(names)`) or using the > encoded value (for example, `new > SubjectAlternativeNameExtension(derEncoding)`). > > This code change tries to prevent illegal extensions from being created right > from the beginning but the solution is not complete. Precisely, for > constructors using extension components, new checks are added to ensure the > correct components are provided and the extension can be encoded correctly. > Fortunately, most of these conditions are already met inside JDK calls to > them. The only exception is inside the `keytool -gencrl` command where the > reason code of a revoked certificate could be zero. This has been fixed in > this code change. There are some constructors having no arguments at all. > These are useless and also removed. > > On the other hand, constructors using the encoded value are complicated. Some > of them check for legal values, some do not. However, since the encoding is > read from the argument and already stored inside the object, there is no need > to calculate the encoding in the `encode()` method and this method always > succeed. > > In short, while we cannot ensure the extensions created are perfectly legal, > we ensure their `encode()` methods are always able to find a non-null > extension value to write out. > > More fine comments in the code change. src/java.base/share/classes/sun/security/x509/AuthorityKeyIdentifierExtension.java line 114: > 112: SerialNumber sn) > 113: throws IOException { > 114: if (kid == null && names == null && serialNum == null) { Might want to mention in javadoc comment that at least one element must be non-null. src/java.base/share/classes/sun/security/x509/NameConstraintsExtension.java line 142: > 140: if (permitted == null && excluded == null) { > 141: throw new IllegalArgumentException( > 142: "permitted and exclude cannot be all null"); s/be all/both be/ src/java.base/share/classes/sun/security/x509/PolicyConstraintsExtension.java line 115: > 113: if (require == -1 && inhibit == -1) { > 114: throw new IllegalArgumentException( > 115: "require and inhibit cannot be all -1"); s/be all/both be/ src/java.base/share/classes/sun/security/x509/PrivateKeyUsageExtension.java line 107: > 105: if (notBefore == null && notAfter == null) { > 106: throw new IllegalArgumentException( > 107: "notBefore and notAfter cannot be all null"); s/be all/both be/ ------------- PR: https://git.openjdk.org/jdk/pull/11137