On Tue, 22 Nov 2022 17:42:06 GMT, Weijun Wang <[email protected]> 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.
>
> Weijun Wang has updated the pull request incrementally with one additional
> commit since the last revision:
>
> IssuerAlternativeNameExtension names
More comments.
src/java.base/share/classes/sun/security/x509/CertificatePoliciesExtension.java
line 113:
> 111: public CertificatePoliciesExtension(Boolean critical,
> 112: List<PolicyInformation> certPolicies) throws IOException {
> 113: if (certPolicies == null || certPolicies.isEmpty()) {
You should probably also change `PolicyInformation(CertificatePolicyId
policyIdentifier, Set<PolicyQualifierInfo> policyQualifiers)` to
check for a null policyIdentifier and an empty policyQualifiers set.
src/java.base/share/classes/sun/security/x509/Extension.java line 178:
> 176:
> 177: Objects.requireNonNull(extensionId,
> 178: "Null OID to encode for the extension!");
I would probably drop the exclamation points. And change "Null OID" to "No OID".
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 both be null");
s/exclude/excluded/
src/java.base/share/classes/sun/security/x509/PolicyMappingsExtension.java line
78:
> 76: * Create a PolicyMappings with the List of CertificatePolicyMap.
> 77: *
> 78: * @param maps the List of CertificatePolicyMap, cannot be null or
> empty.
Do you want to add similar null checks to the `CertificatePolicyMap` ctor?
src/java.base/share/classes/sun/security/x509/SubjectAlternativeNameExtension.java
line 91:
> 89: */
> 90: public SubjectAlternativeNameExtension(Boolean critical, GeneralNames
> names)
> 91: throws IOException {
`GeneralNames` should probably also be modified so that it cannot contain an
empty or null List.
src/java.base/share/classes/sun/security/x509/SubjectInfoAccessExtension.java
line 89:
> 87: if (accessDescriptions == null || accessDescriptions.isEmpty()) {
> 88: throw new IllegalArgumentException(
> 89: "AccessDescription cannot be null or empty");
s/AccessDescription/accessDescriptions/
src/java.base/share/classes/sun/security/x509/SubjectKeyIdentifierExtension.java
line 76:
> 74: */
> 75: public SubjectKeyIdentifierExtension(byte[] octetString)
> 76: throws IOException {
Do you want to change the `KeyIdentifer` ctor to check for null instead of
letting it throw NPE?
-------------
PR: https://git.openjdk.org/jdk/pull/11137