| | |
| | | |
| | | |
| | | |
| | | import java.io.IOException; |
| | | import java.util.List; |
| | | import org.forgerock.i18n.slf4j.LocalizedLogger; |
| | | |
| | |
| | | import org.opends.server.types.ConfigChangeResult; |
| | | import org.opends.server.types.ResultCode; |
| | | |
| | | import org.opends.server.protocols.asn1.ASN1; |
| | | import org.opends.server.protocols.asn1.ASN1Exception; |
| | | import org.opends.server.protocols.asn1.ASN1Reader; |
| | | import org.forgerock.opendj.io.ASN1; |
| | | import org.forgerock.opendj.ldap.DecodeException; |
| | | import org.forgerock.opendj.io.ASN1Reader; |
| | | |
| | | import static org.opends.messages.SchemaMessages.*; |
| | | |
| | | import org.forgerock.i18n.LocalizableMessage; |
| | | import org.forgerock.i18n.LocalizableMessageBuilder; |
| | | import static org.opends.server.schema.SchemaConstants.*; |
| | | import static org.opends.server.protocols.asn1.ASN1Constants.*; |
| | | |
| | | |
| | | /** |
| | |
| | | { |
| | | // Certificate SIGNED SEQUENCE |
| | | if (!reader.hasNextElement() || |
| | | reader.peekType() != UNIVERSAL_SEQUENCE_TYPE) |
| | | reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE) |
| | | { |
| | | invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get()); |
| | | return false; |
| | |
| | | |
| | | // CertificateContent SEQUENCE |
| | | if (!reader.hasNextElement() || |
| | | reader.peekType() != UNIVERSAL_SEQUENCE_TYPE) |
| | | reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE) |
| | | { |
| | | invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get()); |
| | | return false; |
| | |
| | | |
| | | // Optional Version |
| | | if (reader.hasNextElement() && |
| | | reader.peekType() == (TYPE_MASK_CONTEXT | TYPE_MASK_CONSTRUCTED)) |
| | | reader.peekType() == (ASN1.TYPE_MASK_CONTEXT | ASN1.TYPE_MASK_CONSTRUCTED)) |
| | | { |
| | | reader.readStartExplicitTag(); |
| | | if (!reader.hasNextElement() || |
| | | reader.peekType() != UNIVERSAL_INTEGER_TYPE) |
| | | reader.peekType() != ASN1.UNIVERSAL_INTEGER_TYPE) |
| | | { |
| | | invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get()); |
| | | return false; |
| | |
| | | |
| | | // serialNumber |
| | | if (!reader.hasNextElement() || |
| | | reader.peekType() != UNIVERSAL_INTEGER_TYPE) |
| | | reader.peekType() != ASN1.UNIVERSAL_INTEGER_TYPE) |
| | | { |
| | | invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get()); |
| | | return false; |
| | |
| | | |
| | | // signature AlgorithmIdentifier |
| | | if (!reader.hasNextElement() || |
| | | reader.peekType() != UNIVERSAL_SEQUENCE_TYPE) |
| | | reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE) |
| | | { |
| | | invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get()); |
| | | return false; |
| | |
| | | |
| | | // issuer name (SEQUENCE as of X.501, 9.2) |
| | | if (!reader.hasNextElement() || |
| | | reader.peekType() != UNIVERSAL_SEQUENCE_TYPE) |
| | | reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE) |
| | | { |
| | | invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get()); |
| | | return false; |
| | |
| | | |
| | | // validity (SEQUENCE) |
| | | if (!reader.hasNextElement() || |
| | | reader.peekType() != UNIVERSAL_SEQUENCE_TYPE) |
| | | reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE) |
| | | { |
| | | invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get()); |
| | | return false; |
| | |
| | | |
| | | // subject name (SEQUENCE as of X.501, 9.2) |
| | | if (!reader.hasNextElement() || |
| | | reader.peekType() != UNIVERSAL_SEQUENCE_TYPE) |
| | | reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE) |
| | | { |
| | | invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get()); |
| | | return false; |
| | |
| | | |
| | | // SubjectPublicKeyInfo (SEQUENCE) |
| | | if (!reader.hasNextElement() || |
| | | reader.peekType() != UNIVERSAL_SEQUENCE_TYPE) |
| | | reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE) |
| | | { |
| | | invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get()); |
| | | return false; |
| | |
| | | |
| | | // OPTIONAL issuerUniqueIdentifier |
| | | if (reader.hasNextElement() && |
| | | reader.peekType() == (TYPE_MASK_CONTEXT + 1)) |
| | | reader.peekType() == (ASN1.TYPE_MASK_CONTEXT + 1)) |
| | | { |
| | | if (x509Version < 1) |
| | | { |
| | |
| | | |
| | | // OPTIONAL subjectUniqueIdentifier |
| | | if (reader.hasNextElement() && |
| | | reader.peekType() == (TYPE_MASK_CONTEXT + 2)) |
| | | reader.peekType() == (ASN1.TYPE_MASK_CONTEXT + 2)) |
| | | { |
| | | if (x509Version < 1) |
| | | { |
| | |
| | | |
| | | // OPTIONAL extensions |
| | | if (reader.hasNextElement() && |
| | | reader.peekType() == ((TYPE_MASK_CONTEXT|TYPE_MASK_CONSTRUCTED) + 3)) |
| | | reader.peekType() == ((ASN1.TYPE_MASK_CONTEXT|ASN1.TYPE_MASK_CONSTRUCTED) + 3)) |
| | | { |
| | | if (x509Version < 2) |
| | | { |
| | |
| | | } |
| | | reader.readStartExplicitTag(); // read Tag |
| | | if (!reader.hasNextElement() || |
| | | reader.peekType() != UNIVERSAL_SEQUENCE_TYPE) |
| | | reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE) |
| | | { |
| | | // only valid in v3 |
| | | invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get()); |
| | |
| | | |
| | | // AlgorithmIdentifier SEQUENCE |
| | | if (!reader.hasNextElement() || |
| | | reader.peekType() != UNIVERSAL_SEQUENCE_TYPE) |
| | | reader.peekType() != ASN1.UNIVERSAL_SEQUENCE_TYPE) |
| | | { |
| | | invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get()); |
| | | return false; |
| | |
| | | |
| | | // ENCRYPTED HASH BIT STRING |
| | | if (!reader.hasNextElement() || |
| | | reader.peekType() != UNIVERSAL_BIT_STRING_TYPE) |
| | | reader.peekType() != ASN1.UNIVERSAL_BIT_STRING_TYPE) |
| | | { |
| | | invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get()); |
| | | return false; |
| | |
| | | } |
| | | // End of the certificate |
| | | } |
| | | catch (ASN1Exception e) |
| | | catch (DecodeException e) |
| | | { |
| | | System.out.println(e.getMessageObject()); |
| | | invalidReason.append(e.getMessageObject()); |
| | | return false; |
| | | } |
| | | catch (IOException e) |
| | | { |
| | | invalidReason.append(e.getMessage()); |
| | | return false; |
| | | } |
| | | |
| | | // The basic structure of the value is an X.509 certificate |
| | | return true; |