From 1a32ba623a05567be6be1203a8025b82dd4f153c Mon Sep 17 00:00:00 2001
From: Manuel Gaupp <m.gaupp@scanplus.de>
Date: Sun, 02 Mar 2014 13:13:59 +0000
Subject: [PATCH] CR-2890: Port certificateSyntax and certificateExactMatch to SDK

---
 opendj-core/src/main/java/org/forgerock/opendj/ldap/GSERParser.java                                  |  406 +++++++
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaConstants.java                      |   27 
 opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java                       |    3 
 opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/CertificateSyntaxTest.java                |  166 ++
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CertificateExactAssertionSyntaxImpl.java  |   71 +
 opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties                             |   44 
 opendj-core/src/test/java/org/forgerock/opendj/ldif/LDIFChangeRecordReaderTestCase.java              |   13 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java                        |   25 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/GenerateCoreSchema.java                   |    7 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CoreSchemaImpl.java                       |  108 +
 opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/CertificateExactMatchingRuleImplTest.java |  212 +++
 opendj-core/src/main/java/org/forgerock/opendj/io/ASN1Reader.java                                    |   34 
 opendj-core/src/main/java/org/forgerock/opendj/io/AbstractASN1Reader.java                            |   25 
 opendj-core/src/test/java/org/forgerock/opendj/io/ASN1ReaderTestCase.java                            |   31 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CertificateExactMatchingRuleImpl.java     |  241 ++++
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CertificateSyntaxImpl.java                |  181 ++
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CoreSchema.java                           | 1539 +++++++++++++------------
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java                               |   43 
 opendj-core/src/test/java/org/forgerock/opendj/ldap/GSERParserTestCase.java                          |  299 +++++
 19 files changed, 2,671 insertions(+), 804 deletions(-)

diff --git a/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1Reader.java b/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1Reader.java
index e1af324..e270b6b 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1Reader.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1Reader.java
@@ -23,6 +23,7 @@
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
  *      Portions copyright 2012-2013 ForgeRock AS.
+ *      Portions Copyright 2014 Manuel Gaupp
  */
 
 package org.forgerock.opendj.io;
@@ -338,9 +339,9 @@
     void readStartSequence() throws DecodeException, IOException;
 
     /**
-     * Reads the next element as an explicit tag having the Universal Sequence
-     * ASN.1 type tag. All further reads will read the elements in the explicit
-     * tag until {@link #readEndExplicitTag()} is called.
+     * Reads the next element as an explicit ignoring the ASN.1 type tag. All
+     * further reads will read the elements in the explicit tag until
+     * {@link #readEndExplicitTag()} is called.
      *
      * @throws DecodeException
      *             If the element cannot be decoded as an explicit tag.
@@ -350,6 +351,20 @@
     void readStartExplicitTag() throws DecodeException, IOException;
 
     /**
+     * Reads the next element as an explicit tag having the provided tag type.
+     * All further reads will read the elements in the explicit tag until
+     * {@link #readEndExplicitTag()} is called.
+     *
+     * @param type
+     *            The expected type tag of the element.
+     * @throws DecodeException
+     *             If the element cannot be decoded as an explicit tag.
+     * @throws IOException
+     *             If an unexpected IO error occurred.
+     */
+    void readStartExplicitTag(byte type) throws DecodeException, IOException;
+
+    /**
      * Reads the next element as a sequence having the provided type tag. All
      * further reads will read the elements in the sequence until
      * {@link #readEndSequence()} is called.
@@ -399,4 +414,17 @@
      *             If an unexpected IO error occurred.
      */
     ASN1Reader skipElement() throws DecodeException, IOException;
+
+    /**
+     * Skips the next element having the provided type tag without decoding it.
+     *
+     * @param type
+     *            The expected type tag of the element.
+     * @return A reference to this ASN.1 reader.
+     * @throws DecodeException
+     *             If the next element does not have the provided type tag.
+     * @throws IOException
+     *             If an unexpected IO error occurred.
+     */
+    ASN1Reader skipElement(byte type) throws DecodeException, IOException;
 }
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/io/AbstractASN1Reader.java b/opendj-core/src/main/java/org/forgerock/opendj/io/AbstractASN1Reader.java
index 7648ee0..9327266 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/io/AbstractASN1Reader.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/io/AbstractASN1Reader.java
@@ -23,6 +23,7 @@
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
  *      Portions copyright 2012-2013 ForgeRock AS.
+ *      Portions Copyright 2014 Manuel Gaupp
  */
 
 package org.forgerock.opendj.io;
@@ -132,6 +133,17 @@
     /**
      * {@inheritDoc}
      */
+    public void readStartExplicitTag(byte type) throws IOException {
+        if (type == 0x00) {
+            type = (ASN1.TYPE_MASK_CONTEXT | ASN1.TYPE_MASK_CONSTRUCTED);
+        }
+        checkType(type);
+        readStartExplicitTag();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
     public void readStartSequence(byte type) throws IOException {
         if (type == 0x00) {
             type = ASN1.UNIVERSAL_SEQUENCE_TYPE;
@@ -153,6 +165,19 @@
         readStartSet();
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    public ASN1Reader skipElement(final byte expectedType) throws IOException {
+        if (peekType() != expectedType) {
+            final LocalizableMessage message =
+                    ERR_ASN1_UNEXPECTED_TAG.get(expectedType, peekType());
+            throw DecodeException.fatalError(message);
+        }
+        skipElement();
+        return this;
+    }
+
     private void checkType(final byte expectedType) throws IOException {
         if (peekType() != expectedType) {
             final LocalizableMessage message =
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/GSERParser.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/GSERParser.java
new file mode 100644
index 0000000..e4c9f9a
--- /dev/null
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/GSERParser.java
@@ -0,0 +1,406 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2013-2014 Manuel Gaupp
+ */
+package org.forgerock.opendj.ldap;
+
+import java.math.BigInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.forgerock.util.Reject;
+import org.forgerock.i18n.LocalizableMessage;
+
+import static com.forgerock.opendj.ldap.CoreMessages.WARN_GSER_NO_VALID_IDENTIFIEDCHOICE;
+import static com.forgerock.opendj.ldap.CoreMessages.WARN_GSER_NO_VALID_IDENTIFIER;
+import static com.forgerock.opendj.ldap.CoreMessages.WARN_GSER_NO_VALID_INTEGER;
+import static com.forgerock.opendj.ldap.CoreMessages.WARN_GSER_NO_VALID_SEPARATOR;
+import static com.forgerock.opendj.ldap.CoreMessages.WARN_GSER_NO_VALID_STRING;
+import static com.forgerock.opendj.ldap.CoreMessages.WARN_GSER_PATTERN_NO_MATCH;
+import static com.forgerock.opendj.ldap.CoreMessages.WARN_GSER_SPACE_CHAR_EXPECTED;
+
+/**
+ * This class implements a parser for strings which are encoded using the
+ * Generic String Encoding Rules (GSER) defined in RFC 3641.
+ *
+ * @see <a href="http://tools.ietf.org/html/rfc3641">RFC 3641 - Generic String
+ * Encoding Rules (GSER) for ASN.1 Types</a>
+ */
+public final class GSERParser {
+
+    private final String gserValue;
+
+    private int pos;
+
+    private final int length;
+
+    /**
+     * Pattern to match an identifier defined in RFC 3641, section 3.4.
+     * <pre>
+     * An &lt;identifier&gt; conforms to the definition of an identifier in ASN.1
+     * notation (Clause 11.3 of X.680 [8]).  It begins with a lowercase
+     * letter and is followed by zero or more letters, digits, and hyphens.
+     * A hyphen is not permitted to be the last character, nor is it to be
+     * followed by another hyphen.  The case of letters in an identifier is
+     * always significant.
+     *
+     *    identifier    = lowercase *alphanumeric *(hyphen 1*alphanumeric)
+     *    alphanumeric  = uppercase / lowercase / decimal-digit
+     *    uppercase     = %x41-5A  ; "A" to "Z"
+     *    lowercase     = %x61-7A  ; "a" to "z"
+     *    decimal-digit = %x30-39  ; "0" to "9"
+     *    hyphen        = "-"
+     * </pre>
+     */
+    private static final Pattern GSER_IDENTIFIER = Pattern.compile("^([a-z]([A-Za-z0-9]|(-[A-Za-z0-9]))*)");
+
+    /**
+     * Pattern to match the identifier part (including the colon) of an
+     * IdentifiedChoiceValue defined in RFC 3641, section 3.12.
+     * <pre>
+     *    IdentifiedChoiceValue = identifier ":" Value
+     * </pre>
+     */
+    private static final Pattern GSER_CHOICE_IDENTIFIER = Pattern.compile("^([a-z]([A-Za-z0-9]|(-[A-Za-z0-9]))*:)");
+
+    /**
+     * Pattern to match "sp", containing zero, one or more space characters.
+     * <pre>
+     *    sp = *%x20  ; zero, one or more space characters
+     * </pre>
+     */
+    private static final Pattern GSER_SP = Pattern.compile("^( *)");
+
+    /**
+     * Pattern to match "msp", containing at least one space character.
+     * <pre>
+     *    msp = 1*%x20  ; one or more space characters
+     * </pre>
+     */
+    private static final Pattern GSER_MSP = Pattern.compile("^( +)");
+
+    /**
+     * Pattern to match an Integer value.
+     */
+    private static final Pattern GSER_INTEGER = Pattern.compile("^(\\d+)");
+
+    /**
+     * Pattern to match a GSER StringValue, defined in RFC 3641, section 3.2:
+     * <pre>
+     * Any embedded double quotes in the resulting UTF-8 character string
+     * are escaped by repeating the double quote characters.
+     *
+     * [...]
+     *
+     *    StringValue       = dquote *SafeUTF8Character dquote
+     *    dquote            = %x22 ; &quot; (double quote)
+     * </pre>
+     */
+    private static final Pattern GSER_STRING = Pattern.compile("^(\"([^\"]|(\"\"))*\")");
+
+    /**
+     * Pattern to match the beginning of a GSER encoded Sequence.
+     * <pre>
+     *    SequenceValue = ComponentList
+     *    ComponentList = "{" [ sp NamedValue *( "," sp NamedValue) ] sp "}"
+     * </pre>
+     */
+    private static final Pattern GSER_SEQUENCE_START = Pattern.compile("^(\\{)");
+
+    /**
+     * Pattern to match the end of a GSER encoded Sequence.
+     * <pre>
+     *    SequenceValue = ComponentList
+     *    ComponentList = "{" [ sp NamedValue *( "," sp NamedValue) ] sp "}"
+     * </pre>
+     */
+    private static final Pattern GSER_SEQUENCE_END = Pattern.compile("^(\\})");
+
+    /**
+     * Pattern to match the separator used in GSER encoded sequences.
+     */
+    private static final Pattern GSER_SEP = Pattern.compile("^(,)");
+
+    /**
+     * Creates a new GSER Parser.
+     *
+     * @param value the GSER encoded String value
+     */
+    public GSERParser(CharSequence value) {
+        Reject.checkNotNull(value);
+        this.gserValue = value.toString();
+        this.pos = 0;
+        this.length = value.length();
+    }
+
+    /**
+     * Determines if the GSER String contains at least one character to be read.
+     *
+     * @return <code>true</code> if there is at least one remaining character or
+     * <code>false</code> otherwise.
+     */
+    public boolean hasNext() {
+        return (pos < length);
+    }
+
+    /**
+     * Determines if the remaining GSER String matches the provided pattern.
+     *
+     * @param pattern the pattern to search for
+     *
+     * @return <code>true</code> if the remaining string matches the pattern or
+     * <code>false</code> otherwise.
+     */
+    private boolean hasNext(Pattern pattern) {
+        if (!hasNext()) {
+            return false;
+        }
+
+        Matcher matcher = pattern.matcher(gserValue.substring(pos, length));
+
+        return matcher.find();
+    }
+
+    /**
+     * Returns the String matched by the first capturing group of the pattern.
+     * The parser advances past the input matched by the first capturing group.
+     *
+     * @param pattern the pattern to search for
+     *
+     * @return the String matched by the first capturing group of the pattern
+     *
+     * @throws DecodeException If no match could be found
+     */
+    private String next(Pattern pattern) throws DecodeException {
+        Matcher matcher = pattern.matcher(gserValue.substring(pos, length));
+        if (matcher.find() && matcher.groupCount() >= 1) {
+            pos += matcher.end(1);
+            return matcher.group(1);
+        } else {
+            final LocalizableMessage msg =
+                    WARN_GSER_PATTERN_NO_MATCH.get(pattern.pattern(),
+                                                   gserValue.substring(pos, length));
+            throw DecodeException.error(msg);
+        }
+    }
+
+    /**
+     * Skips the input matched by the first capturing group.
+     *
+     * @param pattern the pattern to search for
+     *
+     * @throws DecodeException If no match could be found
+     */
+    private void skip(Pattern pattern) throws DecodeException {
+        Matcher matcher = pattern.matcher(gserValue.substring(pos, length));
+
+        if (matcher.find() && matcher.groupCount() >= 1) {
+            pos += matcher.end(1);
+        } else {
+            final LocalizableMessage msg =
+                    WARN_GSER_PATTERN_NO_MATCH.get(pattern.pattern(),
+                                                   gserValue.substring(pos, length));
+            throw DecodeException.error(msg);
+        }
+    }
+
+    /**
+     * Skips the input matching zero, one or more space characters.
+     *
+     * @return reference to this GSERParser
+     *
+     * @throws DecodeException If no match could be found
+     */
+    public GSERParser skipSP() throws DecodeException {
+        skip(GSER_SP);
+        return this;
+    }
+
+    /**
+     * Skips the input matching one or more space characters.
+     *
+     * @return reference to this GSERParser
+     *
+     * @throws DecodeException If no match could be found
+     */
+    public GSERParser skipMSP() throws DecodeException {
+        skip(GSER_MSP);
+        return this;
+    }
+
+    /**
+     * Skips the input matching the start of a sequence and subsequent space
+     * characters.
+     *
+     * @return reference to this GSERParser
+     *
+     * @throws DecodeException If the input does not match the start of a
+     * sequence
+     */
+    public GSERParser readStartSequence() throws DecodeException {
+        next(GSER_SEQUENCE_START);
+        skip(GSER_SP);
+        return this;
+    }
+
+    /**
+     * Skips the input matching the end of a sequence and preceding space
+     * characters.
+     *
+     * @return reference to this GSERParser
+     *
+     * @throws DecodeException If the input does not match the end of a sequence
+     */
+    public GSERParser readEndSequence() throws DecodeException {
+        skip(GSER_SP);
+        next(GSER_SEQUENCE_END);
+        return this;
+    }
+
+    /**
+     * Skips the input matching the separator pattern (",") and subsequenct
+     * space characters.
+     *
+     * @return reference to this GSERParser
+     *
+     * @throws DecodeException If the input does not match the separator
+     * pattern.
+     */
+    public GSERParser skipSeparator() throws DecodeException {
+        if (!hasNext(GSER_SEP)) {
+            final LocalizableMessage msg =
+                    WARN_GSER_NO_VALID_SEPARATOR.get(gserValue.substring(pos, length));
+            throw DecodeException.error(msg);
+        }
+        skip(GSER_SEP);
+        skip(GSER_SP);
+        return this;
+    }
+
+    /**
+     * Returns the next element as a String.
+     *
+     * @return the input matching the String pattern
+     *
+     * @throws DecodeException If the input does not match the string pattern.
+     */
+    public String nextString() throws DecodeException {
+        if (!hasNext(GSER_STRING)) {
+            final LocalizableMessage msg =
+                    WARN_GSER_NO_VALID_STRING.get(gserValue.substring(pos, length));
+            throw DecodeException.error(msg);
+        }
+
+        String str = next(GSER_STRING);
+
+        // Strip leading and trailing dquotes; unescape double dquotes
+        return str.substring(1, str.length() - 1).replace("\"\"", "\"");
+    }
+
+    /**
+     * Returns the next element as an Integer.
+     *
+     * @return the input matching the integer pattern
+     *
+     * @throws DecodeException If the input does not match the integer pattern
+     */
+    public int nextInteger() throws DecodeException {
+        if (!hasNext(GSER_INTEGER)) {
+            final LocalizableMessage msg =
+                    WARN_GSER_NO_VALID_INTEGER.get(gserValue.substring(pos, length));
+            throw DecodeException.error(msg);
+        }
+        return Integer.valueOf(next(GSER_INTEGER)).intValue();
+    }
+
+    /**
+     * Returns the next element as a BigInteger.
+     *
+     * @return the input matching the integer pattern
+     *
+     * @throws DecodeException If the input does not match the integer pattern
+     */
+    public BigInteger nextBigInteger() throws DecodeException {
+        if (!hasNext(GSER_INTEGER)) {
+            final LocalizableMessage msg =
+                    WARN_GSER_NO_VALID_INTEGER.get(gserValue.substring(pos, length));
+            throw DecodeException.error(msg);
+        }
+        return new BigInteger(next(GSER_INTEGER));
+    }
+
+    /**
+     * Returns the identifier of the next NamedValue element.
+     *
+     * @return the identifier of the NamedValue element
+     *
+     * @throws DecodeException If the input does not match the identifier
+     * pattern of a NamedValue
+     */
+    public String nextNamedValueIdentifier() throws DecodeException {
+        if (!hasNext(GSER_IDENTIFIER)) {
+            final LocalizableMessage msg =
+                    WARN_GSER_NO_VALID_IDENTIFIER.get(gserValue.substring(pos, length));
+            throw DecodeException.error(msg);
+        }
+        String identifier = next(GSER_IDENTIFIER);
+        if (!hasNext(GSER_MSP)) {
+            final LocalizableMessage msg =
+                    WARN_GSER_SPACE_CHAR_EXPECTED.get(gserValue.substring(pos, length));
+            throw DecodeException.error(msg);
+        }
+        skipMSP();
+        return identifier;
+    }
+
+    /**
+     * Return the identifier of the next IdentifiedChoiceValue element.
+     *
+     * @return the identifier of the IdentifiedChoiceValue element
+     *
+     * @throws DecodeException If the input does not match the identifier
+     * pattern of an IdentifiedChoiceValue
+     */
+    public String nextChoiceValueIdentifier() throws DecodeException {
+        if (!hasNext(GSER_CHOICE_IDENTIFIER)) {
+            final LocalizableMessage msg =
+                    WARN_GSER_NO_VALID_IDENTIFIEDCHOICE.get(gserValue.substring(pos, length));
+            throw DecodeException.error(msg);
+        }
+        String identifier = next(GSER_CHOICE_IDENTIFIER);
+
+        // Remove the colon at the end of the identifier
+        return identifier.substring(0, identifier.length() - 1);
+    }
+
+    /**
+     * Returns the GSER encoded String value.
+     *
+     * @return The GSER encoded String value.
+     */
+    @Override
+    public String toString() {
+        return gserValue;
+    }
+}
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CertificateExactAssertionSyntaxImpl.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CertificateExactAssertionSyntaxImpl.java
new file mode 100644
index 0000000..c86fa56
--- /dev/null
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CertificateExactAssertionSyntaxImpl.java
@@ -0,0 +1,71 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 Manuel Gaupp
+ */
+package org.forgerock.opendj.ldap.schema;
+
+import static org.forgerock.opendj.ldap.schema.SchemaConstants.SYNTAX_CERTIFICATE_EXACT_ASSERTION_NAME;
+
+import org.forgerock.i18n.LocalizableMessageBuilder;
+import org.forgerock.opendj.ldap.ByteSequence;
+
+/**
+ * This class defines the Certificate Exact Assertion attribute syntax, which
+ * contains components for matching X.509 certificates.
+ */
+final class CertificateExactAssertionSyntaxImpl extends AbstractSyntaxImpl {
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getName() {
+        return SYNTAX_CERTIFICATE_EXACT_ASSERTION_NAME;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isBEREncodingRequired() {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isHumanReadable() {
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean valueIsAcceptable(final Schema schema, final ByteSequence value,
+            final LocalizableMessageBuilder invalidReason) {
+        // This method will never be called because this syntax is only used
+        // within assertions.
+        return true;
+    }
+}
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CertificateExactMatchingRuleImpl.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CertificateExactMatchingRuleImpl.java
new file mode 100644
index 0000000..4f420a1
--- /dev/null
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CertificateExactMatchingRuleImpl.java
@@ -0,0 +1,241 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2013-2014 Manuel Gaupp
+ */
+package org.forgerock.opendj.ldap.schema;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.math.BigInteger;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import javax.security.auth.x500.X500Principal;
+
+import com.forgerock.opendj.util.StaticUtils;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.Assertion;
+import org.forgerock.opendj.ldap.ByteSequence;
+import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.ByteStringBuilder;
+import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.ldap.GSERParser;
+import org.forgerock.opendj.ldap.DN;
+
+import static com.forgerock.opendj.ldap.CoreMessages.ERR_MR_CERTIFICATE_MATCH_EXPECTED_END;
+import static com.forgerock.opendj.ldap.CoreMessages.ERR_MR_CERTIFICATE_MATCH_GSER_INVALID;
+import static com.forgerock.opendj.ldap.CoreMessages.ERR_MR_CERTIFICATE_MATCH_INVALID_DN;
+import static com.forgerock.opendj.ldap.CoreMessages.ERR_MR_CERTIFICATE_MATCH_IDENTIFIER_NOT_FOUND;
+import static com.forgerock.opendj.ldap.CoreMessages.ERR_MR_CERTIFICATE_MATCH_PARSE_ERROR;
+
+/**
+ * This class implements the certificateExactMatch matching rule defined in
+ * X.509 and referenced in RFC 4523.
+ */
+final class CertificateExactMatchingRuleImpl
+        extends AbstractMatchingRuleImpl {
+
+    private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
+
+    /**
+     * The GSER identifier for the serialNumber named value.
+     */
+    private static final String GSER_ID_SERIALNUMBER = "serialNumber";
+
+    /**
+     * The GSER identifier for the issuer named value.
+     */
+    private static final String GSER_ID_ISSUER = "issuer";
+
+    /**
+     * The GSER identifier for the rdnSequence IdentifiedChoiceValue.
+     */
+    private static final String GSER_ID_RDNSEQUENCE = "rdnSequence";
+
+    /**
+     * Retrieves the normalized form of the provided value, which is best suited
+     * for efficiently performing matching operations on that value.
+     *
+     * @param value The value to be normalized.
+     *
+     * @return The normalized version of the provided value.
+     *
+     * @throws DirectoryException If the provided value is invalid according to
+     * the associated attribute syntax.
+     */
+    public ByteString normalizeAttributeValue(final Schema schema, final ByteSequence value)
+            throws DecodeException {
+        final BigInteger serialNumber;
+        final String dnstring;
+        String certificateIssuer;
+
+        // Read the X.509 Certificate and extract serialNumber and issuerDN
+        try {
+            CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+            InputStream inputStream = new ByteArrayInputStream(value.toByteArray());
+            X509Certificate certValue = (X509Certificate) certFactory
+                    .generateCertificate(inputStream);
+
+            serialNumber = certValue.getSerialNumber();
+            X500Principal issuer = certValue.getIssuerX500Principal();
+            dnstring = issuer.getName(X500Principal.RFC2253);
+        } catch (CertificateException ce) {
+            // There seems to be a problem while parsing the certificate.
+            final LocalizableMessage message =
+                    ERR_MR_CERTIFICATE_MATCH_PARSE_ERROR.get(ce.getMessage());
+            logger.trace(message);
+
+            // return the raw bytes as a fall back
+            return value.toByteString();
+        }
+
+        // Normalize the DN
+        try {
+            DN dn = DN.valueOf(dnstring, schema.asNonStrictSchema());
+            certificateIssuer = dn.toNormalizedString();
+        } catch (Exception e) {
+            // We couldn't normalize the DN for some reason.
+            final LocalizableMessage message
+                = ERR_MR_CERTIFICATE_MATCH_INVALID_DN.get(dnstring,
+                    StaticUtils.getExceptionMessage(e));
+            throw DecodeException.error(message);
+        }
+
+        // Create the encoded value
+        return createEncodedValue(serialNumber, certificateIssuer);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Assertion getAssertion(final Schema schema, final ByteSequence value)
+            throws DecodeException {
+        // validate and normalize the GSER structure
+        // according to the definitions from RFC 4523, Appendix A.1
+        final BigInteger serialNumber;
+        final String dnstring;
+        String certificateIssuer;
+
+        final GSERParser parser;
+        String identifier;
+
+        parser = new GSERParser(value.toString());
+
+        try {
+            // the String starts with a sequence
+            parser.readStartSequence();
+        } catch (DecodeException e) {
+            logger.traceException(e);
+            // Assume the assertion value is a certificate and parse issuer and
+            // serial number. If the value is not even a certificate then the
+            // raw bytes will be returned.
+            return new DefaultEqualityAssertion(normalizeAttributeValue(schema, value));
+        }
+
+        try {
+            // the first namedValue is serialNumber
+            identifier = parser.nextNamedValueIdentifier();
+            if (!identifier.equals(GSER_ID_SERIALNUMBER)) {
+                LocalizableMessage message =
+                        ERR_MR_CERTIFICATE_MATCH_IDENTIFIER_NOT_FOUND.get(GSER_ID_SERIALNUMBER);
+                throw DecodeException.error(message);
+            }
+
+            // The value for the serialNumber
+            serialNumber = parser.nextBigInteger();
+
+            // separator
+            parser.skipSeparator();
+
+            // the next namedValue is issuer
+            identifier = parser.nextNamedValueIdentifier();
+            if (!identifier.equals(GSER_ID_ISSUER)) {
+                LocalizableMessage message =
+                        ERR_MR_CERTIFICATE_MATCH_IDENTIFIER_NOT_FOUND.get(GSER_ID_ISSUER);
+                throw DecodeException.error(message);
+            }
+
+            // expecting "rdnSequence:"
+            identifier = parser.nextChoiceValueIdentifier();
+            if (!identifier.equals(GSER_ID_RDNSEQUENCE)) {
+                LocalizableMessage message =
+                        ERR_MR_CERTIFICATE_MATCH_IDENTIFIER_NOT_FOUND.get(GSER_ID_RDNSEQUENCE);
+                throw DecodeException.error(message);
+            }
+
+            // now the issuer dn
+            dnstring = parser.nextString();
+
+            // Closing the Sequence
+            parser.readEndSequence();
+
+            // There should not be additional characters
+            if (parser.hasNext()) {
+                LocalizableMessage message = ERR_MR_CERTIFICATE_MATCH_EXPECTED_END.get();
+                throw DecodeException.error(message);
+            }
+        } catch (DecodeException e) {
+            LocalizableMessage message =
+                    ERR_MR_CERTIFICATE_MATCH_GSER_INVALID.get(StaticUtils.getExceptionMessage(e));
+            throw DecodeException.error(message);
+        }
+
+        // Normalize the DN
+        try {
+            DN dn = DN.valueOf(dnstring, schema.asNonStrictSchema());
+            certificateIssuer = dn.toNormalizedString();
+        } catch (Exception e) {
+            logger.traceException(e);
+
+            // We couldn't normalize the DN for some reason.
+            LocalizableMessage message =
+                    ERR_MR_CERTIFICATE_MATCH_INVALID_DN.get(dnstring,
+                            StaticUtils.getExceptionMessage(e));
+            throw DecodeException.error(message);
+        }
+
+        // Create the encoded value
+        return new DefaultEqualityAssertion(createEncodedValue(serialNumber, certificateIssuer));
+    }
+
+    /**
+     * Creates the value containing serialNumber and issuer DN.
+     *
+     * @param serial the serialNumber
+     * @param issuerDN the issuer DN String
+     *
+     * @return the encoded ByteString
+     */
+    private static ByteString createEncodedValue(BigInteger serial,
+            String issuerDN) {
+        ByteStringBuilder builder = new ByteStringBuilder();
+        builder.append(StaticUtils.getBytes(issuerDN));
+        builder.append((byte) 0); // Separator
+        builder.append(serial.toByteArray());
+        return builder.toByteString();
+    }
+
+}
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CertificateSyntaxImpl.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CertificateSyntaxImpl.java
index 3352cbe..26e8af1 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CertificateSyntaxImpl.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CertificateSyntaxImpl.java
@@ -22,63 +22,208 @@
  *
  *
  *      Copyright 2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 Manuel Gaupp
  */
 
 package org.forgerock.opendj.ldap.schema;
 
-import static org.forgerock.opendj.ldap.schema.SchemaConstants.EMR_OCTET_STRING_OID;
+import java.io.IOException;
+
+import static com.forgerock.opendj.ldap.CoreMessages.ERR_SYNTAX_CERTIFICATE_INVALID_DER;
+import static com.forgerock.opendj.ldap.CoreMessages.ERR_SYNTAX_CERTIFICATE_INVALID_VERSION;
+import static com.forgerock.opendj.ldap.CoreMessages.ERR_SYNTAX_CERTIFICATE_NO_ELEMENT_EXPECTED;
+import static com.forgerock.opendj.ldap.CoreMessages.ERR_SYNTAX_CERTIFICATE_NOTVALID;
+import static com.forgerock.opendj.ldap.CoreMessages.ERR_SYNTAX_CERTIFICATE_ONLY_VALID_V23;
+import static com.forgerock.opendj.ldap.CoreMessages.ERR_SYNTAX_CERTIFICATE_ONLY_VALID_V3;
+import static org.forgerock.opendj.ldap.schema.SchemaConstants.EMR_CERTIFICATE_EXACT_OID;
 import static org.forgerock.opendj.ldap.schema.SchemaConstants.OMR_OCTET_STRING_OID;
 import static org.forgerock.opendj.ldap.schema.SchemaConstants.SYNTAX_CERTIFICATE_NAME;
+import static org.forgerock.opendj.io.ASN1.*;
 
+import com.forgerock.opendj.util.StaticUtils;
 import org.forgerock.i18n.LocalizableMessageBuilder;
+import org.forgerock.opendj.io.ASN1;
+import org.forgerock.opendj.io.ASN1Reader;
 import org.forgerock.opendj.ldap.ByteSequence;
+import org.forgerock.opendj.ldap.DecodeException;
+
+
 
 /**
- * This class implements the certificate attribute syntax. This should be
- * restricted to holding only X.509 certificates, but we will accept any set of
- * bytes. It will be treated much like the octet string attribute syntax.
+ * This class implements the certificate attribute syntax. It is restricted to
+ * accept only X.509 certificates.
  */
 final class CertificateSyntaxImpl extends AbstractSyntaxImpl {
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public String getEqualityMatchingRule() {
-        return EMR_OCTET_STRING_OID;
+        return EMR_CERTIFICATE_EXACT_OID;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public String getName() {
         return SYNTAX_CERTIFICATE_NAME;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public String getOrderingMatchingRule() {
         return OMR_OCTET_STRING_OID;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public boolean isBEREncodingRequired() {
         return true;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public boolean isHumanReadable() {
         return false;
     }
 
     /**
-     * Indicates whether the provided value is acceptable for use in an
-     * attribute with this syntax. If it is not, then the reason may be appended
-     * to the provided buffer.
-     *
-     * @param schema
-     *            The schema in which this syntax is defined.
-     * @param value
-     *            The value for which to make the determination.
-     * @param invalidReason
-     *            The buffer to which the invalid reason should be appended.
-     * @return <CODE>true</CODE> if the provided value is acceptable for use
-     *         with this syntax, or <CODE>false</CODE> if not.
+     * {@inheritDoc}
      */
+    @Override
     public boolean valueIsAcceptable(final Schema schema, final ByteSequence value,
             final LocalizableMessageBuilder invalidReason) {
-        // All values will be acceptable for the certificate syntax.
+        // Skip validation if strict validation is disabled.
+        if (schema.allowMalformedCertificates()) {
+            return true;
+        }
+
+        // Validate the ByteSequence against the definitions of X.509, clause 7
+        ASN1Reader reader = ASN1.getReader(value);
+        try {
+            // Certificate SIGNED SEQUENCE
+            reader.readStartSequence(UNIVERSAL_SEQUENCE_TYPE);
+
+            // CertificateContent SEQUENCE
+            reader.readStartSequence(UNIVERSAL_SEQUENCE_TYPE);
+
+            // Optional Version
+            long x509Version = 0;
+            if (reader.hasNextElement() && reader.peekType() == (TYPE_MASK_CONTEXT | TYPE_MASK_CONSTRUCTED)) {
+                reader.readStartExplicitTag((byte) (TYPE_MASK_CONTEXT | TYPE_MASK_CONSTRUCTED));
+
+                x509Version = reader.readInteger(UNIVERSAL_INTEGER_TYPE);
+                if (x509Version < 0 || x509Version > 2) {
+                    // invalid Version specified
+                    invalidReason.append(ERR_SYNTAX_CERTIFICATE_INVALID_VERSION.get(x509Version));
+                    return false;
+                }
+
+                if (x509Version == 0) {
+                    // DEFAULT values shall not be included in DER encoded
+                    // SEQUENCE (X.690, 11.5)
+                    invalidReason.append(ERR_SYNTAX_CERTIFICATE_INVALID_DER.get());
+                    return false;
+                }
+
+                reader.readEndExplicitTag();
+            }
+
+            // serialNumber
+            reader.skipElement(UNIVERSAL_INTEGER_TYPE);
+
+            // signature AlgorithmIdentifier
+            reader.skipElement(UNIVERSAL_SEQUENCE_TYPE);
+
+            // issuer name (SEQUENCE as of X.501, 9.2)
+            reader.skipElement(UNIVERSAL_SEQUENCE_TYPE);
+
+            // validity (SEQUENCE)
+            reader.skipElement(UNIVERSAL_SEQUENCE_TYPE);
+
+            // subject name (SEQUENCE as of X.501, 9.2)
+            reader.skipElement(UNIVERSAL_SEQUENCE_TYPE);
+
+            // SubjectPublicKeyInfo (SEQUENCE)
+            reader.skipElement(UNIVERSAL_SEQUENCE_TYPE);
+
+            // OPTIONAL issuerUniqueIdentifier
+            if (reader.hasNextElement() && reader.peekType() == (TYPE_MASK_CONTEXT + 1)) {
+                if (x509Version < 1) {
+                    // only valid in v2 and v3
+                    invalidReason.append(ERR_SYNTAX_CERTIFICATE_ONLY_VALID_V23.get("issuerUniqueIdentifier"));
+                    return false;
+                }
+                reader.skipElement();
+            }
+
+            // OPTIONAL subjectUniqueIdentifier
+            if (reader.hasNextElement() && reader.peekType() == (TYPE_MASK_CONTEXT + 2)) {
+                if (x509Version < 1) {
+                    // only valid in v2 and v3
+                    invalidReason.append(ERR_SYNTAX_CERTIFICATE_ONLY_VALID_V23.get("subjectUniqueIdentifier"));
+                    return false;
+                }
+                reader.skipElement();
+            }
+
+            // OPTIONAL extensions
+            if (reader.hasNextElement() && reader.peekType() == ((TYPE_MASK_CONTEXT | TYPE_MASK_CONSTRUCTED) + 3)) {
+                if (x509Version < 2) {
+                    // only valid in v3
+                    invalidReason.append(ERR_SYNTAX_CERTIFICATE_ONLY_VALID_V3.get("extensions"));
+                    return false;
+                }
+
+                reader.readStartExplicitTag((byte) ((TYPE_MASK_CONTEXT | TYPE_MASK_CONSTRUCTED) + 3));
+
+                reader.skipElement(UNIVERSAL_SEQUENCE_TYPE);
+
+                reader.readEndExplicitTag();
+            }
+
+            // There should not be any further ASN.1 elements within this SEQUENCE
+            if (reader.hasNextElement()) {
+                invalidReason.append(ERR_SYNTAX_CERTIFICATE_NO_ELEMENT_EXPECTED.get());
+                return false;
+            }
+            reader.readEndSequence(); // End CertificateContent SEQUENCE
+
+            // AlgorithmIdentifier SEQUENCE
+            reader.skipElement(UNIVERSAL_SEQUENCE_TYPE);
+
+            // ENCRYPTED HASH BIT STRING
+            reader.skipElement(UNIVERSAL_BIT_STRING_TYPE);
+
+            // There should not be any further ASN.1 elements within this SEQUENCE
+            if (reader.hasNextElement()) {
+                invalidReason.append(ERR_SYNTAX_CERTIFICATE_NO_ELEMENT_EXPECTED.get());
+                return false;
+            }
+            reader.readEndSequence(); // End Certificate SEQUENCE
+
+            // There should not be any further ASN.1 elements
+            if (reader.hasNextElement()) {
+                invalidReason.append(ERR_SYNTAX_CERTIFICATE_NO_ELEMENT_EXPECTED.get());
+                return false;
+            }
+            // End of the certificate
+        } catch (DecodeException de) {
+            invalidReason.append(ERR_SYNTAX_CERTIFICATE_NOTVALID.get(de));
+            return false;
+        } catch (IOException e) {
+            invalidReason.append(StaticUtils.getExceptionMessage(e));
+            return false;
+        }
+
+        // The basic structure of the value is an X.509 certificate
         return true;
     }
 }
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CoreSchema.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CoreSchema.java
index f1fac33..007bad9 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CoreSchema.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CoreSchema.java
@@ -23,384 +23,415 @@
  *
  *      Copyright 2009 Sun Microsystems, Inc.
  */
-
 package org.forgerock.opendj.ldap.schema;
 
 /**
- * The OpenDJ SDK core schema contains standard LDAP RFC schema elements. These
- * include:
+ * The OpenDJ SDK core schema contains standard LDAP RFC schema elements. These include:
  * <ul>
- * <li><a href="http://tools.ietf.org/html/rfc4512">RFC 4512 - Lightweight
- * Directory Access Protocol (LDAP): Directory Information Models </a>
- * <li><a href="http://tools.ietf.org/html/rfc4517">RFC 4517 - Lightweight
- * Directory Access Protocol (LDAP): Syntaxes and Matching Rules </a>
- * <li><a href="http://tools.ietf.org/html/rfc4519">RFC 4519 - Lightweight
- * Directory Access Protocol (LDAP): Schema for User Applications </a>
- * <li><a href="http://tools.ietf.org/html/rfc4530">RFC 4530 - Lightweight
- * Directory Access Protocol (LDAP): entryUUID Operational Attribute </a>
- * <li><a href="http://tools.ietf.org/html/rfc3045">RFC 3045 - Storing Vendor
- * Information in the LDAP Root DSE </a>
- * <li><a href="http://tools.ietf.org/html/rfc3112">RFC 3112 - LDAP
- * Authentication Password Schema </a>
+ * <li><a href="http://tools.ietf.org/html/rfc4512">RFC 4512 - Lightweight Directory Access Protocol (LDAP): Directory
+ * Information Models </a>
+ * <li><a href="http://tools.ietf.org/html/rfc4517">RFC 4517 - Lightweight Directory Access Protocol (LDAP): Syntaxes
+ * and Matching Rules </a>
+ * <li><a href="http://tools.ietf.org/html/rfc4519">RFC 4519 - Lightweight Directory Access Protocol (LDAP): Schema for
+ * User Applications </a>
+ * <li><a href="http://tools.ietf.org/html/rfc4530">RFC 4530 - Lightweight Directory Access Protocol (LDAP): entryUUID
+ * Operational Attribute </a>
+ * <li><a href="http://tools.ietf.org/html/rfc3045">RFC 3045 - Storing Vendor Information in the LDAP Root DSE </a>
+ * <li><a href="http://tools.ietf.org/html/rfc3112">RFC 3112 - LDAP Authentication Password Schema </a>
  * </ul>
  * <p>
- * The core schema is non-strict: attempts to retrieve non-existent Attribute
- * Types will return a temporary Attribute Type having the Octet String syntax.
+ * The core schema is non-strict: attempts to retrieve non-existent Attribute Types will return a temporary Attribute
+ * Type having the Octet String syntax.
  */
 public final class CoreSchema {
+
     // Core Syntaxes
-    private static final Syntax ATTRIBUTE_TYPE_DESCRIPTION_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.3");
-    private static final Syntax AUTHENTICATION_PASSWORD_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.4203.1.1.2");
-    private static final Syntax BINARY_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.5");
-    private static final Syntax BIT_STRING_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.6");
-    private static final Syntax BOOLEAN_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.7");
-    private static final Syntax CERTIFICATE_LIST_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.9");
-    private static final Syntax CERTIFICATE_PAIR_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.10");
-    private static final Syntax CERTIFICATE_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.8");
-    private static final Syntax COUNTRY_STRING_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.11");
-    private static final Syntax DELIVERY_METHOD_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.14");
-    private static final Syntax DIRECTORY_STRING_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.15");
-    private static final Syntax DIT_CONTENT_RULE_DESCRIPTION_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.16");
-    private static final Syntax DIT_STRUCTURE_RULE_DESCRIPTION_SYNTAX = CoreSchemaImpl
-            .getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.17");
-    private static final Syntax DN_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.12");
-    private static final Syntax ENHANCED_GUIDE_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.21");
-    private static final Syntax FACSIMILE_TELEPHONE_NUMBER_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.22");
-    private static final Syntax FAX_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.23");
-    private static final Syntax GENERALIZED_TIME_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.24");
-    private static final Syntax GUIDE_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.25");
-    private static final Syntax IA5_STRING_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.26");
-    private static final Syntax INTEGER_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.27");
-    private static final Syntax JPEG_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.28");
-    private static final Syntax LDAP_SYNTAX_DESCRIPTION_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.54");
-    private static final Syntax MATCHING_RULE_DESCRIPTION_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.30");
-    private static final Syntax MATCHING_RULE_USE_DESCRIPTION_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.31");
-    private static final Syntax NAME_AND_OPTIONAL_UID_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.34");
-    private static final Syntax NAME_FORM_DESCRIPTION_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.35");
-    private static final Syntax NUMERIC_STRING_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.36");
-    private static final Syntax OBJECT_CLASS_DESCRIPTION_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.37");
-    private static final Syntax OCTET_STRING_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.40");
-    private static final Syntax OID_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.38");
-    private static final Syntax OTHER_MAILBOX_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.39");
-    private static final Syntax POSTAL_ADDRESS_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.41");
-    private static final Syntax PRESENTATION_ADDRESS_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.43");
-    private static final Syntax PRINTABLE_STRING_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.44");
-    private static final Syntax PROTOCOL_INFORMATION_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.42");
-    private static final Syntax SUBSTRING_ASSERTION_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.58");
-    private static final Syntax SUPPORTED_ALGORITHM_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.49");
-    private static final Syntax TELEPHONE_NUMBER_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.50");
-    private static final Syntax TELETEX_TERMINAL_IDENTIFIER_SYNTAX = CoreSchemaImpl.getInstance()
-            .getSyntax("1.3.6.1.4.1.1466.115.121.1.51");
-    private static final Syntax TELEX_NUMBER_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.52");
-    private static final Syntax UTC_TIME_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.4.1.1466.115.121.1.53");
-    private static final Syntax UUID_SYNTAX = CoreSchemaImpl.getInstance().getSyntax(
-            "1.3.6.1.1.16.1");
+    private static final Syntax ATTRIBUTE_TYPE_DESCRIPTION_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.3");
+    private static final Syntax AUTHENTICATION_PASSWORD_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.4203.1.1.2");
+    private static final Syntax BINARY_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.5");
+    private static final Syntax BIT_STRING_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.6");
+    private static final Syntax BOOLEAN_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.7");
+    private static final Syntax CERTIFICATE_LIST_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.9");
+    private static final Syntax CERTIFICATE_PAIR_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.10");
+    private static final Syntax CERTIFICATE_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.8");
+    private static final Syntax COUNTRY_STRING_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.11");
+    private static final Syntax DELIVERY_METHOD_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.14");
+    private static final Syntax DIRECTORY_STRING_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.15");
+    private static final Syntax DIT_CONTENT_RULE_DESCRIPTION_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.16");
+    private static final Syntax DIT_STRUCTURE_RULE_DESCRIPTION_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.17");
+    private static final Syntax DN_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.12");
+    private static final Syntax ENHANCED_GUIDE_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.21");
+    private static final Syntax FACSIMILE_TELEPHONE_NUMBER_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.22");
+    private static final Syntax FAX_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.23");
+    private static final Syntax GENERALIZED_TIME_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.24");
+    private static final Syntax GUIDE_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.25");
+    private static final Syntax IA5_STRING_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.26");
+    private static final Syntax INTEGER_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.27");
+    private static final Syntax JPEG_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.28");
+    private static final Syntax LDAP_SYNTAX_DESCRIPTION_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.54");
+    private static final Syntax MATCHING_RULE_DESCRIPTION_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.30");
+    private static final Syntax MATCHING_RULE_USE_DESCRIPTION_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.31");
+    private static final Syntax NAME_AND_OPTIONAL_UID_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.34");
+    private static final Syntax NAME_FORM_DESCRIPTION_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.35");
+    private static final Syntax NUMERIC_STRING_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.36");
+    private static final Syntax OBJECT_CLASS_DESCRIPTION_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.37");
+    private static final Syntax OCTET_STRING_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.40");
+    private static final Syntax OID_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.38");
+    private static final Syntax OTHER_MAILBOX_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.39");
+    private static final Syntax POSTAL_ADDRESS_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.41");
+    private static final Syntax PRESENTATION_ADDRESS_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.43");
+    private static final Syntax PRINTABLE_STRING_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.44");
+    private static final Syntax PROTOCOL_INFORMATION_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.42");
+    private static final Syntax SUBSTRING_ASSERTION_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.58");
+    private static final Syntax SUPPORTED_ALGORITHM_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.49");
+    private static final Syntax TELEPHONE_NUMBER_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.50");
+    private static final Syntax TELETEX_TERMINAL_IDENTIFIER_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.51");
+    private static final Syntax TELEX_NUMBER_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.52");
+    private static final Syntax UTC_TIME_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.4.1.1466.115.121.1.53");
+    private static final Syntax UUID_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.1.16.1");
+    private static final Syntax X509_CERTIFICATE_EXACT_ASSERTION_SYNTAX
+        = CoreSchemaImpl.getInstance().getSyntax("1.3.6.1.1.15.1");
 
     // Core Matching Rules
-    private static final MatchingRule AUTH_PASSWORD_EXACT_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("1.3.6.1.4.1.4203.1.2.2");
-    private static final MatchingRule BIT_STRING_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.16");
-    private static final MatchingRule BOOLEAN_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.13");
-    private static final MatchingRule CASE_EXACT_IA5_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("1.3.6.1.4.1.1466.109.114.1");
-    private static final MatchingRule CASE_EXACT_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.5");
-    private static final MatchingRule CASE_EXACT_ORDERING_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.6");
-    private static final MatchingRule CASE_EXACT_SUBSTRINGS_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.7");
-    private static final MatchingRule CASE_IGNORE_IA5_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("1.3.6.1.4.1.1466.109.114.2");
-    private static final MatchingRule CASE_IGNORE_IA5_SUBSTRINGS_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("1.3.6.1.4.1.1466.109.114.3");
-    private static final MatchingRule CASE_IGNORE_LIST_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.11");
-    private static final MatchingRule CASE_IGNORE_LIST_SUBSTRINGS_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.12");
-    private static final MatchingRule CASE_IGNORE_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.2");
-    private static final MatchingRule CASE_IGNORE_ORDERING_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.3");
-    private static final MatchingRule CASE_IGNORE_SUBSTRINGS_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.4");
-    private static final MatchingRule DIRECTORY_STRING_FIRST_COMPONENT_MATCHING_RULE =
-            CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.31");
-    private static final MatchingRule DISTINGUISHED_NAME_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.1");
-    private static final MatchingRule GENERALIZED_TIME_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.27");
-    private static final MatchingRule GENERALIZED_TIME_ORDERING_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.28");
-    private static final MatchingRule INTEGER_FIRST_COMPONENT_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.29");
-    private static final MatchingRule INTEGER_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.14");
-    private static final MatchingRule INTEGER_ORDERING_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.15");
-    private static final MatchingRule KEYWORD_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.33");
-    private static final MatchingRule NUMERIC_STRING_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.8");
-    private static final MatchingRule NUMERIC_STRING_ORDERING_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.9");
-    private static final MatchingRule NUMERIC_STRING_SUBSTRINGS_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.10");
-    private static final MatchingRule OBJECT_IDENTIFIER_FIRST_COMPONENT_MATCHING_RULE =
-            CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.30");
-    private static final MatchingRule OBJECT_IDENTIFIER_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.0");
-    private static final MatchingRule OCTET_STRING_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.17");
-    private static final MatchingRule OCTET_STRING_ORDERING_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.18");
-    private static final MatchingRule OCTET_STRING_SUBSTRINGS_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.19");
-    private static final MatchingRule PRESENTATION_ADDRESS_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.22");
-    private static final MatchingRule PROTOCOL_INFORMATION_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.24");
-    private static final MatchingRule TELEPHONE_NUMBER_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.20");
-    private static final MatchingRule TELEPHONE_NUMBER_SUBSTRINGS_MATCHING_RULE = CoreSchemaImpl
-            .getInstance().getMatchingRule("2.5.13.21");
-    private static final MatchingRule UNIQUE_MEMBER_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.23");
-    private static final MatchingRule UUID_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("1.3.6.1.1.16.2");
-    private static final MatchingRule UUID_ORDERING_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("1.3.6.1.1.16.3");
-    private static final MatchingRule WORD_MATCHING_RULE = CoreSchemaImpl.getInstance()
-            .getMatchingRule("2.5.13.32");
+    private static final MatchingRule AUTH_PASSWORD_EXACT_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("1.3.6.1.4.1.4203.1.2.2");
+    private static final MatchingRule BIT_STRING_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.16");
+    private static final MatchingRule BOOLEAN_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.13");
+    private static final MatchingRule CASE_EXACT_IA5_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("1.3.6.1.4.1.1466.109.114.1");
+    private static final MatchingRule CASE_EXACT_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.5");
+    private static final MatchingRule CASE_EXACT_ORDERING_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.6");
+    private static final MatchingRule CASE_EXACT_SUBSTRINGS_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.7");
+    private static final MatchingRule CASE_IGNORE_IA5_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("1.3.6.1.4.1.1466.109.114.2");
+    private static final MatchingRule CASE_IGNORE_IA5_SUBSTRINGS_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("1.3.6.1.4.1.1466.109.114.3");
+    private static final MatchingRule CASE_IGNORE_LIST_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.11");
+    private static final MatchingRule CASE_IGNORE_LIST_SUBSTRINGS_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.12");
+    private static final MatchingRule CASE_IGNORE_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.2");
+    private static final MatchingRule CASE_IGNORE_ORDERING_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.3");
+    private static final MatchingRule CASE_IGNORE_SUBSTRINGS_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.4");
+    private static final MatchingRule CERTIFICATE_EXACT_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.34");
+    private static final MatchingRule DIRECTORY_STRING_FIRST_COMPONENT_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.31");
+    private static final MatchingRule DISTINGUISHED_NAME_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.1");
+    private static final MatchingRule GENERALIZED_TIME_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.27");
+    private static final MatchingRule GENERALIZED_TIME_ORDERING_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.28");
+    private static final MatchingRule INTEGER_FIRST_COMPONENT_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.29");
+    private static final MatchingRule INTEGER_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.14");
+    private static final MatchingRule INTEGER_ORDERING_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.15");
+    private static final MatchingRule KEYWORD_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.33");
+    private static final MatchingRule NUMERIC_STRING_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.8");
+    private static final MatchingRule NUMERIC_STRING_ORDERING_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.9");
+    private static final MatchingRule NUMERIC_STRING_SUBSTRINGS_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.10");
+    private static final MatchingRule OBJECT_IDENTIFIER_FIRST_COMPONENT_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.30");
+    private static final MatchingRule OBJECT_IDENTIFIER_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.0");
+    private static final MatchingRule OCTET_STRING_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.17");
+    private static final MatchingRule OCTET_STRING_ORDERING_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.18");
+    private static final MatchingRule OCTET_STRING_SUBSTRINGS_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.19");
+    private static final MatchingRule PRESENTATION_ADDRESS_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.22");
+    private static final MatchingRule PROTOCOL_INFORMATION_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.24");
+    private static final MatchingRule TELEPHONE_NUMBER_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.20");
+    private static final MatchingRule TELEPHONE_NUMBER_SUBSTRINGS_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.21");
+    private static final MatchingRule UNIQUE_MEMBER_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.23");
+    private static final MatchingRule UUID_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("1.3.6.1.1.16.2");
+    private static final MatchingRule UUID_ORDERING_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("1.3.6.1.1.16.3");
+    private static final MatchingRule WORD_MATCHING_RULE
+        = CoreSchemaImpl.getInstance().getMatchingRule("2.5.13.32");
 
     // Core Attribute Types
-    private static final AttributeType ALIASED_OBJECT_NAME_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.1");
-    private static final AttributeType ALT_SERVER_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("1.3.6.1.4.1.1466.101.120.6");
-    private static final AttributeType ATTRIBUTE_TYPES_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.21.5");
-    private static final AttributeType AUTH_PASSWORD_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("1.3.6.1.4.1.4203.1.3.4");
-    private static final AttributeType BUSINESS_CATEGORY_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.15");
-    private static final AttributeType CN_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.3");
-    private static final AttributeType CREATE_TIMESTAMP_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.18.1");
-    private static final AttributeType CREATORS_NAME_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.18.3");
-    private static final AttributeType C_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.6");
-    private static final AttributeType DC_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("0.9.2342.19200300.100.1.25");
-    private static final AttributeType DESCRIPTION_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.13");
-    private static final AttributeType DESTINATION_INDICATOR_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.27");
-    private static final AttributeType DISTINGUISHED_NAME_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.49");
-    private static final AttributeType DIT_CONTENT_RULES_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.21.2");
-    private static final AttributeType DIT_STRUCTURE_RULES_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.21.1");
-    private static final AttributeType DN_QUALIFIER_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.46");
-    private static final AttributeType ENHANCED_SEARCH_GUIDE_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.47");
-    private static final AttributeType ENTRY_DN_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("1.3.6.1.1.20");
-    private static final AttributeType ENTRY_UUID_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("1.3.6.1.1.16.4");
-    private static final AttributeType FACSIMILE_TELEPHONE_NUMBER_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.23");
-    private static final AttributeType GENERATION_QUALIFIER_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.44");
-    private static final AttributeType GIVEN_NAME_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.42");
-    private static final AttributeType GOVERNING_STRUCTURE_RULE_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.21.10");
-    private static final AttributeType HOUSE_IDENTIFIER_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.51");
-    private static final AttributeType INITIALS_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.43");
-    private static final AttributeType INTERNATIONAL_ISDN_NUMBER_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.25");
-    private static final AttributeType LDAP_SYNTAXES_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("1.3.6.1.4.1.1466.101.120.16");
-    private static final AttributeType L_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.7");
-    private static final AttributeType MATCHING_RULES_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.21.4");
-    private static final AttributeType MATCHING_RULE_USE_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.21.8");
-    private static final AttributeType MEMBER_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.31");
-    private static final AttributeType MODIFIERS_NAME_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.18.4");
-    private static final AttributeType MODIFY_TIMESTAMP_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.18.2");
-    private static final AttributeType NAME_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.41");
-    private static final AttributeType NAME_FORMS_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.21.7");
-    private static final AttributeType NAMING_CONTEXTS_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("1.3.6.1.4.1.1466.101.120.5");
-    private static final AttributeType OBJECT_CLASSES_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.21.6");
-    private static final AttributeType OBJECT_CLASS_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.0");
-    private static final AttributeType OU_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.11");
-    private static final AttributeType OWNER_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.32");
-    private static final AttributeType O_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.10");
-    private static final AttributeType PHYSICAL_DELIVERY_OFFICE_NAME_ATTRIBUTE_TYPE =
-            CoreSchemaImpl.getInstance().getAttributeType("2.5.4.19");
-    private static final AttributeType POSTAL_ADDRESS_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.16");
-    private static final AttributeType POSTAL_CODE_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.17");
-    private static final AttributeType POST_OFFICE_BOX_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.18");
-    private static final AttributeType PREFERRED_DELIVERY_METHOD_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.28");
-    private static final AttributeType REGISTERED_ADDRESS_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.26");
-    private static final AttributeType ROLE_OCCUPANT_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.33");
-    private static final AttributeType SEARCH_GUIDE_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.14");
-    private static final AttributeType SEE_ALSO_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.34");
-    private static final AttributeType SERIAL_NUMBER_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.5");
-    private static final AttributeType SN_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.4");
-    private static final AttributeType STREET_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.9");
-    private static final AttributeType STRUCTURAL_OBJECT_CLASS_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.21.9");
-    private static final AttributeType ST_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.8");
-    private static final AttributeType SUBSCHEMA_SUBENTRY_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.18.10");
-    private static final AttributeType SUPPORTED_AUTH_PASSWORD_SCHEMES_ATTRIBUTE_TYPE =
-            CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.4.1.4203.1.3.3");
-    private static final AttributeType SUPPORTED_CONTROL_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("1.3.6.1.4.1.1466.101.120.13");
-    private static final AttributeType SUPPORTED_EXTENSION_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("1.3.6.1.4.1.1466.101.120.7");
-    private static final AttributeType SUPPORTED_FEATURES_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("1.3.6.1.4.1.4203.1.3.5");
-    private static final AttributeType SUPPORTED_LDAP_VERSION_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("1.3.6.1.4.1.1466.101.120.15");
-    private static final AttributeType SUPPORTED_SASL_MECHANISMS_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("1.3.6.1.4.1.1466.101.120.14");
-    private static final AttributeType TELEPHONE_NUMBER_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.20");
-    private static final AttributeType TELETEX_TERMINAL_IDENTIFIER_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.22");
-    private static final AttributeType TELEX_NUMBER_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.21");
-    private static final AttributeType TITLE_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.12");
-    private static final AttributeType UID_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("0.9.2342.19200300.100.1.1");
-    private static final AttributeType UNIQUE_MEMBER_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.50");
-    private static final AttributeType USER_PASSWORD_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.35");
-    private static final AttributeType VENDOR_NAME_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("1.3.6.1.1.4");
-    private static final AttributeType VENDOR_VERSION_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("1.3.6.1.1.5");
-    private static final AttributeType X121_ADDRESS_ATTRIBUTE_TYPE = CoreSchemaImpl.getInstance()
-            .getAttributeType("2.5.4.24");
-    private static final AttributeType X500_UNIQUE_IDENTIFIER_ATTRIBUTE_TYPE = CoreSchemaImpl
-            .getInstance().getAttributeType("2.5.4.45");
+    private static final AttributeType ALIASED_OBJECT_NAME_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.1");
+    private static final AttributeType ALT_SERVER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.4.1.1466.101.120.6");
+    private static final AttributeType ATTRIBUTE_TYPES_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.21.5");
+    private static final AttributeType AUTHORITY_REVOCATION_LIST_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.38");
+    private static final AttributeType AUTH_PASSWORD_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.4.1.4203.1.3.4");
+    private static final AttributeType BUSINESS_CATEGORY_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.15");
+    private static final AttributeType CERTIFICATE_REVOCATION_LIST_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.39");
+    private static final AttributeType CN_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.3");
+    private static final AttributeType CREATE_TIMESTAMP_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.18.1");
+    private static final AttributeType CREATORS_NAME_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.18.3");
+    private static final AttributeType CROSS_CERTIFICATE_PAIR_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.40");
+    private static final AttributeType C_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.6");
+    private static final AttributeType C_A_CERTIFICATE_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.37");
+    private static final AttributeType DC_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("0.9.2342.19200300.100.1.25");
+    private static final AttributeType DELTA_REVOCATION_LIST_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.53");
+    private static final AttributeType DESCRIPTION_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.13");
+    private static final AttributeType DESTINATION_INDICATOR_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.27");
+    private static final AttributeType DISTINGUISHED_NAME_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.49");
+    private static final AttributeType DIT_CONTENT_RULES_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.21.2");
+    private static final AttributeType DIT_STRUCTURE_RULES_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.21.1");
+    private static final AttributeType DN_QUALIFIER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.46");
+    private static final AttributeType ENHANCED_SEARCH_GUIDE_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.47");
+    private static final AttributeType ENTRY_DN_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.1.20");
+    private static final AttributeType ENTRY_UUID_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.1.16.4");
+    private static final AttributeType FACSIMILE_TELEPHONE_NUMBER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.23");
+    private static final AttributeType GENERATION_QUALIFIER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.44");
+    private static final AttributeType GIVEN_NAME_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.42");
+    private static final AttributeType GOVERNING_STRUCTURE_RULE_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.21.10");
+    private static final AttributeType HOUSE_IDENTIFIER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.51");
+    private static final AttributeType INITIALS_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.43");
+    private static final AttributeType INTERNATIONAL_ISDN_NUMBER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.25");
+    private static final AttributeType LDAP_SYNTAXES_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.4.1.1466.101.120.16");
+    private static final AttributeType L_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.7");
+    private static final AttributeType MATCHING_RULES_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.21.4");
+    private static final AttributeType MATCHING_RULE_USE_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.21.8");
+    private static final AttributeType MEMBER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.31");
+    private static final AttributeType MODIFIERS_NAME_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.18.4");
+    private static final AttributeType MODIFY_TIMESTAMP_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.18.2");
+    private static final AttributeType NAME_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.41");
+    private static final AttributeType NAME_FORMS_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.21.7");
+    private static final AttributeType NAMING_CONTEXTS_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.4.1.1466.101.120.5");
+    private static final AttributeType OBJECT_CLASSES_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.21.6");
+    private static final AttributeType OBJECT_CLASS_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.0");
+    private static final AttributeType OU_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.11");
+    private static final AttributeType OWNER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.32");
+    private static final AttributeType O_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.10");
+    private static final AttributeType PHYSICAL_DELIVERY_OFFICE_NAME_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.19");
+    private static final AttributeType POSTAL_ADDRESS_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.16");
+    private static final AttributeType POSTAL_CODE_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.17");
+    private static final AttributeType POST_OFFICE_BOX_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.18");
+    private static final AttributeType PREFERRED_DELIVERY_METHOD_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.28");
+    private static final AttributeType REGISTERED_ADDRESS_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.26");
+    private static final AttributeType ROLE_OCCUPANT_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.33");
+    private static final AttributeType SEARCH_GUIDE_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.14");
+    private static final AttributeType SEE_ALSO_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.34");
+    private static final AttributeType SERIAL_NUMBER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.5");
+    private static final AttributeType SN_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.4");
+    private static final AttributeType STREET_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.9");
+    private static final AttributeType STRUCTURAL_OBJECT_CLASS_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.21.9");
+    private static final AttributeType ST_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.8");
+    private static final AttributeType SUBSCHEMA_SUBENTRY_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.18.10");
+    private static final AttributeType SUPPORTED_ALGORITHMS_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.52");
+    private static final AttributeType SUPPORTED_AUTH_PASSWORD_SCHEMES_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.4.1.4203.1.3.3");
+    private static final AttributeType SUPPORTED_CONTROL_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.4.1.1466.101.120.13");
+    private static final AttributeType SUPPORTED_EXTENSION_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.4.1.1466.101.120.7");
+    private static final AttributeType SUPPORTED_FEATURES_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.4.1.4203.1.3.5");
+    private static final AttributeType SUPPORTED_LDAP_VERSION_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.4.1.1466.101.120.15");
+    private static final AttributeType SUPPORTED_SASL_MECHANISMS_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.4.1.1466.101.120.14");
+    private static final AttributeType TELEPHONE_NUMBER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.20");
+    private static final AttributeType TELETEX_TERMINAL_IDENTIFIER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.22");
+    private static final AttributeType TELEX_NUMBER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.21");
+    private static final AttributeType TITLE_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.12");
+    private static final AttributeType UID_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("0.9.2342.19200300.100.1.1");
+    private static final AttributeType UNIQUE_MEMBER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.50");
+    private static final AttributeType USER_CERTIFICATE_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.36");
+    private static final AttributeType USER_PASSWORD_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.35");
+    private static final AttributeType VENDOR_NAME_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.1.4");
+    private static final AttributeType VENDOR_VERSION_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("1.3.6.1.1.5");
+    private static final AttributeType X121_ADDRESS_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.24");
+    private static final AttributeType X500_UNIQUE_IDENTIFIER_ATTRIBUTE_TYPE
+        = CoreSchemaImpl.getInstance().getAttributeType("2.5.4.45");
 
     // Core Object Classes
-    private static final ObjectClass ALIAS_OBJECT_CLASS = CoreSchemaImpl.getInstance()
-            .getObjectClass("2.5.6.1");
-    private static final ObjectClass APPLICATION_PROCESS_OBJECT_CLASS = CoreSchemaImpl
-            .getInstance().getObjectClass("2.5.6.11");
-    private static final ObjectClass AUTH_PASSWORD_OBJECT_OBJECT_CLASS = CoreSchemaImpl
-            .getInstance().getObjectClass("1.3.6.1.4.1.4203.1.4.7");
-    private static final ObjectClass COUNTRY_OBJECT_CLASS = CoreSchemaImpl.getInstance()
-            .getObjectClass("2.5.6.2");
-    private static final ObjectClass DC_OBJECT_OBJECT_CLASS = CoreSchemaImpl.getInstance()
-            .getObjectClass("1.3.6.1.4.1.1466.344");
-    private static final ObjectClass DEVICE_OBJECT_CLASS = CoreSchemaImpl.getInstance()
-            .getObjectClass("2.5.6.14");
-    private static final ObjectClass EXTENSIBLE_OBJECT_OBJECT_CLASS = CoreSchemaImpl.getInstance()
-            .getObjectClass("1.3.6.1.4.1.1466.101.120.111");
-    private static final ObjectClass GROUP_OF_NAMES_OBJECT_CLASS = CoreSchemaImpl.getInstance()
-            .getObjectClass("2.5.6.9");
-    private static final ObjectClass GROUP_OF_UNIQUE_NAMES_OBJECT_CLASS = CoreSchemaImpl
-            .getInstance().getObjectClass("2.5.6.17");
-    private static final ObjectClass LOCALITY_OBJECT_CLASS = CoreSchemaImpl.getInstance()
-            .getObjectClass("2.5.6.3");
-    private static final ObjectClass ORGANIZATIONAL_PERSON_OBJECT_CLASS = CoreSchemaImpl
-            .getInstance().getObjectClass("2.5.6.7");
-    private static final ObjectClass ORGANIZATIONAL_ROLE_OBJECT_CLASS = CoreSchemaImpl
-            .getInstance().getObjectClass("2.5.6.8");
-    private static final ObjectClass ORGANIZATIONAL_UNIT_OBJECT_CLASS = CoreSchemaImpl
-            .getInstance().getObjectClass("2.5.6.5");
-    private static final ObjectClass ORGANIZATION_OBJECT_CLASS = CoreSchemaImpl.getInstance()
-            .getObjectClass("2.5.6.4");
-    private static final ObjectClass PERSON_OBJECT_CLASS = CoreSchemaImpl.getInstance()
-            .getObjectClass("2.5.6.6");
-    private static final ObjectClass RESIDENTIAL_PERSON_OBJECT_CLASS = CoreSchemaImpl.getInstance()
-            .getObjectClass("2.5.6.10");
-    private static final ObjectClass SUBSCHEMA_OBJECT_CLASS = CoreSchemaImpl.getInstance()
-            .getObjectClass("2.5.20.1");
-    private static final ObjectClass TOP_OBJECT_CLASS = CoreSchemaImpl.getInstance()
-            .getObjectClass("2.5.6.0");
-    private static final ObjectClass UID_OBJECT_OBJECT_CLASS = CoreSchemaImpl.getInstance()
-            .getObjectClass("1.3.6.1.1.3.1");
+    private static final ObjectClass ALIAS_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.1");
+    private static final ObjectClass APPLICATION_PROCESS_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.11");
+    private static final ObjectClass AUTH_PASSWORD_OBJECT_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("1.3.6.1.4.1.4203.1.4.7");
+    private static final ObjectClass CERTIFICATION_AUTHORITY_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.16");
+    private static final ObjectClass CERTIFICATION_AUTHORITY_V2_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.16.2");
+    private static final ObjectClass COUNTRY_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.2");
+    private static final ObjectClass C_RL_DISTRIBUTION_POINT_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.19");
+    private static final ObjectClass DC_OBJECT_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("1.3.6.1.4.1.1466.344");
+    private static final ObjectClass DELTA_CRL_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.23");
+    private static final ObjectClass DEVICE_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.14");
+    private static final ObjectClass EXTENSIBLE_OBJECT_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("1.3.6.1.4.1.1466.101.120.111");
+    private static final ObjectClass GROUP_OF_NAMES_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.9");
+    private static final ObjectClass GROUP_OF_UNIQUE_NAMES_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.17");
+    private static final ObjectClass LOCALITY_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.3");
+    private static final ObjectClass ORGANIZATIONAL_PERSON_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.7");
+    private static final ObjectClass ORGANIZATIONAL_ROLE_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.8");
+    private static final ObjectClass ORGANIZATIONAL_UNIT_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.5");
+    private static final ObjectClass ORGANIZATION_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.4");
+    private static final ObjectClass PERSON_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.6");
+    private static final ObjectClass PKI_CA_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.22");
+    private static final ObjectClass PKI_USER_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.21");
+    private static final ObjectClass RESIDENTIAL_PERSON_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.10");
+    private static final ObjectClass STRONG_AUTHENTICATION_USER_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.15");
+    private static final ObjectClass SUBSCHEMA_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.20.1");
+    private static final ObjectClass TOP_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.0");
+    private static final ObjectClass UID_OBJECT_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("1.3.6.1.1.3.1");
+    private static final ObjectClass USER_SECURITY_INFORMATION_OBJECT_CLASS
+        = CoreSchemaImpl.getInstance().getObjectClass("2.5.6.18");
 
     // Prevent instantiation
     private CoreSchema() {
@@ -417,8 +448,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Attribute Type Description Syntax}
-     * which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.3}.
+     * Returns a reference to the {@code Attribute Type Description Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.3}.
      *
      * @return A reference to the {@code Attribute Type Description Syntax}.
      */
@@ -427,8 +458,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Authentication Password Syntax} which
-     * has the OID {@code 1.3.6.1.4.1.4203.1.1.2}.
+     * Returns a reference to the {@code Authentication Password Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.4203.1.1.2}.
      *
      * @return A reference to the {@code Authentication Password Syntax}.
      */
@@ -437,8 +468,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Binary Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.5}.
+     * Returns a reference to the {@code Binary Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.5}.
      *
      * @return A reference to the {@code Binary Syntax}.
      */
@@ -447,8 +477,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Bit String Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.6}.
+     * Returns a reference to the {@code Bit String Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.6}.
      *
      * @return A reference to the {@code Bit String Syntax}.
      */
@@ -457,8 +486,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Boolean Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.7}.
+     * Returns a reference to the {@code Boolean Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.7}.
      *
      * @return A reference to the {@code Boolean Syntax}.
      */
@@ -467,8 +495,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Certificate List Syntax} which has the
-     * OID {@code 1.3.6.1.4.1.1466.115.121.1.9}.
+     * Returns a reference to the {@code Certificate List Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.9}.
      *
      * @return A reference to the {@code Certificate List Syntax}.
      */
@@ -477,8 +505,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Certificate Pair Syntax} which has the
-     * OID {@code 1.3.6.1.4.1.1466.115.121.1.10}.
+     * Returns a reference to the {@code Certificate Pair Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.10}.
      *
      * @return A reference to the {@code Certificate Pair Syntax}.
      */
@@ -487,8 +515,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Certificate Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.8}.
+     * Returns a reference to the {@code Certificate Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.8}.
      *
      * @return A reference to the {@code Certificate Syntax}.
      */
@@ -497,8 +524,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Country String Syntax} which has the
-     * OID {@code 1.3.6.1.4.1.1466.115.121.1.11}.
+     * Returns a reference to the {@code Country String Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.11}.
      *
      * @return A reference to the {@code Country String Syntax}.
      */
@@ -507,8 +533,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Delivery Method Syntax} which has the
-     * OID {@code 1.3.6.1.4.1.1466.115.121.1.14}.
+     * Returns a reference to the {@code Delivery Method Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.14}.
      *
      * @return A reference to the {@code Delivery Method Syntax}.
      */
@@ -517,8 +543,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Directory String Syntax} which has the
-     * OID {@code 1.3.6.1.4.1.1466.115.121.1.15}.
+     * Returns a reference to the {@code Directory String Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.15}.
      *
      * @return A reference to the {@code Directory String Syntax}.
      */
@@ -527,8 +553,8 @@
     }
 
     /**
-     * Returns a reference to the {@code DIT Content Rule Description Syntax}
-     * which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.16}.
+     * Returns a reference to the {@code DIT Content Rule Description Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.16}.
      *
      * @return A reference to the {@code DIT Content Rule Description Syntax}.
      */
@@ -537,8 +563,8 @@
     }
 
     /**
-     * Returns a reference to the {@code DIT Structure Rule Description Syntax}
-     * which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.17}.
+     * Returns a reference to the {@code DIT Structure Rule Description Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.17}.
      *
      * @return A reference to the {@code DIT Structure Rule Description Syntax}.
      */
@@ -547,8 +573,7 @@
     }
 
     /**
-     * Returns a reference to the {@code DN Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.12}.
+     * Returns a reference to the {@code DN Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.12}.
      *
      * @return A reference to the {@code DN Syntax}.
      */
@@ -557,8 +582,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Enhanced Guide Syntax} which has the
-     * OID {@code 1.3.6.1.4.1.1466.115.121.1.21}.
+     * Returns a reference to the {@code Enhanced Guide Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.21}.
      *
      * @return A reference to the {@code Enhanced Guide Syntax}.
      */
@@ -567,8 +591,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Facsimile Telephone Number Syntax}
-     * which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.22}.
+     * Returns a reference to the {@code Facsimile Telephone Number Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.22}.
      *
      * @return A reference to the {@code Facsimile Telephone Number Syntax}.
      */
@@ -577,8 +601,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Fax Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.23}.
+     * Returns a reference to the {@code Fax Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.23}.
      *
      * @return A reference to the {@code Fax Syntax}.
      */
@@ -587,8 +610,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Generalized Time Syntax} which has the
-     * OID {@code 1.3.6.1.4.1.1466.115.121.1.24}.
+     * Returns a reference to the {@code Generalized Time Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.24}.
      *
      * @return A reference to the {@code Generalized Time Syntax}.
      */
@@ -597,8 +620,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Guide Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.25}.
+     * Returns a reference to the {@code Guide Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.25}.
      *
      * @return A reference to the {@code Guide Syntax}.
      */
@@ -607,8 +629,7 @@
     }
 
     /**
-     * Returns a reference to the {@code IA5 String Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.26}.
+     * Returns a reference to the {@code IA5 String Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.26}.
      *
      * @return A reference to the {@code IA5 String Syntax}.
      */
@@ -617,8 +638,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Integer Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.27}.
+     * Returns a reference to the {@code Integer Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.27}.
      *
      * @return A reference to the {@code Integer Syntax}.
      */
@@ -627,8 +647,7 @@
     }
 
     /**
-     * Returns a reference to the {@code JPEG Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.28}.
+     * Returns a reference to the {@code JPEG Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.28}.
      *
      * @return A reference to the {@code JPEG Syntax}.
      */
@@ -637,8 +656,8 @@
     }
 
     /**
-     * Returns a reference to the {@code LDAP Syntax Description Syntax} which
-     * has the OID {@code 1.3.6.1.4.1.1466.115.121.1.54}.
+     * Returns a reference to the {@code LDAP Syntax Description Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.54}.
      *
      * @return A reference to the {@code LDAP Syntax Description Syntax}.
      */
@@ -647,8 +666,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Matching Rule Description Syntax} which
-     * has the OID {@code 1.3.6.1.4.1.1466.115.121.1.30}.
+     * Returns a reference to the {@code Matching Rule Description Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.30}.
      *
      * @return A reference to the {@code Matching Rule Description Syntax}.
      */
@@ -657,8 +676,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Matching Rule Use Description Syntax}
-     * which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.31}.
+     * Returns a reference to the {@code Matching Rule Use Description Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.31}.
      *
      * @return A reference to the {@code Matching Rule Use Description Syntax}.
      */
@@ -667,8 +686,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Name and Optional UID Syntax} which has
-     * the OID {@code 1.3.6.1.4.1.1466.115.121.1.34}.
+     * Returns a reference to the {@code Name and Optional UID Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.34}.
      *
      * @return A reference to the {@code Name and Optional UID Syntax}.
      */
@@ -677,8 +696,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Name Form Description Syntax} which has
-     * the OID {@code 1.3.6.1.4.1.1466.115.121.1.35}.
+     * Returns a reference to the {@code Name Form Description Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.35}.
      *
      * @return A reference to the {@code Name Form Description Syntax}.
      */
@@ -687,8 +706,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Numeric String Syntax} which has the
-     * OID {@code 1.3.6.1.4.1.1466.115.121.1.36}.
+     * Returns a reference to the {@code Numeric String Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.36}.
      *
      * @return A reference to the {@code Numeric String Syntax}.
      */
@@ -697,8 +715,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Object Class Description Syntax} which
-     * has the OID {@code 1.3.6.1.4.1.1466.115.121.1.37}.
+     * Returns a reference to the {@code Object Class Description Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.37}.
      *
      * @return A reference to the {@code Object Class Description Syntax}.
      */
@@ -707,8 +725,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Octet String Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.40}.
+     * Returns a reference to the {@code Octet String Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.40}.
      *
      * @return A reference to the {@code Octet String Syntax}.
      */
@@ -717,8 +734,7 @@
     }
 
     /**
-     * Returns a reference to the {@code OID Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.38}.
+     * Returns a reference to the {@code OID Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.38}.
      *
      * @return A reference to the {@code OID Syntax}.
      */
@@ -727,8 +743,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Other Mailbox Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.39}.
+     * Returns a reference to the {@code Other Mailbox Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.39}.
      *
      * @return A reference to the {@code Other Mailbox Syntax}.
      */
@@ -737,8 +752,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Postal Address Syntax} which has the
-     * OID {@code 1.3.6.1.4.1.1466.115.121.1.41}.
+     * Returns a reference to the {@code Postal Address Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.41}.
      *
      * @return A reference to the {@code Postal Address Syntax}.
      */
@@ -747,8 +761,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Presentation Address Syntax} which has
-     * the OID {@code 1.3.6.1.4.1.1466.115.121.1.43}.
+     * Returns a reference to the {@code Presentation Address Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.43}.
      *
      * @return A reference to the {@code Presentation Address Syntax}.
      */
@@ -757,8 +771,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Printable String Syntax} which has the
-     * OID {@code 1.3.6.1.4.1.1466.115.121.1.44}.
+     * Returns a reference to the {@code Printable String Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.44}.
      *
      * @return A reference to the {@code Printable String Syntax}.
      */
@@ -767,8 +781,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Protocol Information Syntax} which has
-     * the OID {@code 1.3.6.1.4.1.1466.115.121.1.42}.
+     * Returns a reference to the {@code Protocol Information Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.42}.
      *
      * @return A reference to the {@code Protocol Information Syntax}.
      */
@@ -777,8 +791,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Substring Assertion Syntax} which has
-     * the OID {@code 1.3.6.1.4.1.1466.115.121.1.58}.
+     * Returns a reference to the {@code Substring Assertion Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.58}.
      *
      * @return A reference to the {@code Substring Assertion Syntax}.
      */
@@ -787,8 +801,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Supported Algorithm Syntax} which has
-     * the OID {@code 1.3.6.1.4.1.1466.115.121.1.49}.
+     * Returns a reference to the {@code Supported Algorithm Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.49}.
      *
      * @return A reference to the {@code Supported Algorithm Syntax}.
      */
@@ -797,8 +811,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Telephone Number Syntax} which has the
-     * OID {@code 1.3.6.1.4.1.1466.115.121.1.50}.
+     * Returns a reference to the {@code Telephone Number Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.50}.
      *
      * @return A reference to the {@code Telephone Number Syntax}.
      */
@@ -807,8 +821,8 @@
     }
 
     /**
-     * Returns a reference to the {@code Teletex Terminal Identifier Syntax}
-     * which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.51}.
+     * Returns a reference to the {@code Teletex Terminal Identifier Syntax} which has the OID
+     * {@code 1.3.6.1.4.1.1466.115.121.1.51}.
      *
      * @return A reference to the {@code Teletex Terminal Identifier Syntax}.
      */
@@ -817,8 +831,7 @@
     }
 
     /**
-     * Returns a reference to the {@code Telex Number Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.52}.
+     * Returns a reference to the {@code Telex Number Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.52}.
      *
      * @return A reference to the {@code Telex Number Syntax}.
      */
@@ -827,8 +840,7 @@
     }
 
     /**
-     * Returns a reference to the {@code UTC Time Syntax} which has the OID
-     * {@code 1.3.6.1.4.1.1466.115.121.1.53}.
+     * Returns a reference to the {@code UTC Time Syntax} which has the OID {@code 1.3.6.1.4.1.1466.115.121.1.53}.
      *
      * @return A reference to the {@code UTC Time Syntax}.
      */
@@ -837,8 +849,7 @@
     }
 
     /**
-     * Returns a reference to the {@code UUID Syntax} which has the OID
-     * {@code 1.3.6.1.1.16.1}.
+     * Returns a reference to the {@code UUID Syntax} which has the OID {@code 1.3.6.1.1.16.1}.
      *
      * @return A reference to the {@code UUID Syntax}.
      */
@@ -847,8 +858,18 @@
     }
 
     /**
-     * Returns a reference to the {@code authPasswordExactMatch} Matching Rule
-     * which has the OID {@code 1.3.6.1.4.1.4203.1.2.2}.
+     * Returns a reference to the {@code X.509 Certificate Exact Assertion Syntax} which has the OID
+     * {@code 1.3.6.1.1.15.1}.
+     *
+     * @return A reference to the {@code X.509 Certificate Exact Assertion Syntax}.
+     */
+    public static Syntax getX509CertificateExactAssertionSyntax() {
+        return X509_CERTIFICATE_EXACT_ASSERTION_SYNTAX;
+    }
+
+    /**
+     * Returns a reference to the {@code authPasswordExactMatch} Matching Rule which has the OID
+     * {@code 1.3.6.1.4.1.4203.1.2.2}.
      *
      * @return A reference to the {@code authPasswordExactMatch} Matching Rule.
      */
@@ -857,8 +878,7 @@
     }
 
     /**
-     * Returns a reference to the {@code bitStringMatch} Matching Rule which has
-     * the OID {@code 2.5.13.16}.
+     * Returns a reference to the {@code bitStringMatch} Matching Rule which has the OID {@code 2.5.13.16}.
      *
      * @return A reference to the {@code bitStringMatch} Matching Rule.
      */
@@ -867,8 +887,7 @@
     }
 
     /**
-     * Returns a reference to the {@code booleanMatch} Matching Rule which has
-     * the OID {@code 2.5.13.13}.
+     * Returns a reference to the {@code booleanMatch} Matching Rule which has the OID {@code 2.5.13.13}.
      *
      * @return A reference to the {@code booleanMatch} Matching Rule.
      */
@@ -877,8 +896,8 @@
     }
 
     /**
-     * Returns a reference to the {@code caseExactIA5Match} Matching Rule which
-     * has the OID {@code 1.3.6.1.4.1.1466.109.114.1}.
+     * Returns a reference to the {@code caseExactIA5Match} Matching Rule which has the OID
+     * {@code 1.3.6.1.4.1.1466.109.114.1}.
      *
      * @return A reference to the {@code caseExactIA5Match} Matching Rule.
      */
@@ -887,8 +906,7 @@
     }
 
     /**
-     * Returns a reference to the {@code caseExactMatch} Matching Rule which has
-     * the OID {@code 2.5.13.5}.
+     * Returns a reference to the {@code caseExactMatch} Matching Rule which has the OID {@code 2.5.13.5}.
      *
      * @return A reference to the {@code caseExactMatch} Matching Rule.
      */
@@ -897,8 +915,7 @@
     }
 
     /**
-     * Returns a reference to the {@code caseExactOrderingMatch} Matching Rule
-     * which has the OID {@code 2.5.13.6}.
+     * Returns a reference to the {@code caseExactOrderingMatch} Matching Rule which has the OID {@code 2.5.13.6}.
      *
      * @return A reference to the {@code caseExactOrderingMatch} Matching Rule.
      */
@@ -907,19 +924,17 @@
     }
 
     /**
-     * Returns a reference to the {@code caseExactSubstringsMatch} Matching Rule
-     * which has the OID {@code 2.5.13.7}.
+     * Returns a reference to the {@code caseExactSubstringsMatch} Matching Rule which has the OID {@code 2.5.13.7}.
      *
-     * @return A reference to the {@code caseExactSubstringsMatch} Matching
-     *         Rule.
+     * @return A reference to the {@code caseExactSubstringsMatch} Matching Rule.
      */
     public static MatchingRule getCaseExactSubstringsMatchingRule() {
         return CASE_EXACT_SUBSTRINGS_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code caseIgnoreIA5Match} Matching Rule which
-     * has the OID {@code 1.3.6.1.4.1.1466.109.114.2}.
+     * Returns a reference to the {@code caseIgnoreIA5Match} Matching Rule which has the OID
+     * {@code 1.3.6.1.4.1.1466.109.114.2}.
      *
      * @return A reference to the {@code caseIgnoreIA5Match} Matching Rule.
      */
@@ -928,19 +943,17 @@
     }
 
     /**
-     * Returns a reference to the {@code caseIgnoreIA5SubstringsMatch} Matching
-     * Rule which has the OID {@code 1.3.6.1.4.1.1466.109.114.3}.
+     * Returns a reference to the {@code caseIgnoreIA5SubstringsMatch} Matching Rule which has the OID
+     * {@code 1.3.6.1.4.1.1466.109.114.3}.
      *
-     * @return A reference to the {@code caseIgnoreIA5SubstringsMatch} Matching
-     *         Rule.
+     * @return A reference to the {@code caseIgnoreIA5SubstringsMatch} Matching Rule.
      */
     public static MatchingRule getCaseIgnoreIA5SubstringsMatchingRule() {
         return CASE_IGNORE_IA5_SUBSTRINGS_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code caseIgnoreListMatch} Matching Rule
-     * which has the OID {@code 2.5.13.11}.
+     * Returns a reference to the {@code caseIgnoreListMatch} Matching Rule which has the OID {@code 2.5.13.11}.
      *
      * @return A reference to the {@code caseIgnoreListMatch} Matching Rule.
      */
@@ -949,19 +962,17 @@
     }
 
     /**
-     * Returns a reference to the {@code caseIgnoreListSubstringsMatch} Matching
-     * Rule which has the OID {@code 2.5.13.12}.
+     * Returns a reference to the {@code caseIgnoreListSubstringsMatch} Matching Rule which has the OID
+     * {@code 2.5.13.12}.
      *
-     * @return A reference to the {@code caseIgnoreListSubstringsMatch} Matching
-     *         Rule.
+     * @return A reference to the {@code caseIgnoreListSubstringsMatch} Matching Rule.
      */
     public static MatchingRule getCaseIgnoreListSubstringsMatchingRule() {
         return CASE_IGNORE_LIST_SUBSTRINGS_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code caseIgnoreMatch} Matching Rule which
-     * has the OID {@code 2.5.13.2}.
+     * Returns a reference to the {@code caseIgnoreMatch} Matching Rule which has the OID {@code 2.5.13.2}.
      *
      * @return A reference to the {@code caseIgnoreMatch} Matching Rule.
      */
@@ -970,8 +981,7 @@
     }
 
     /**
-     * Returns a reference to the {@code caseIgnoreOrderingMatch} Matching Rule
-     * which has the OID {@code 2.5.13.3}.
+     * Returns a reference to the {@code caseIgnoreOrderingMatch} Matching Rule which has the OID {@code 2.5.13.3}.
      *
      * @return A reference to the {@code caseIgnoreOrderingMatch} Matching Rule.
      */
@@ -980,30 +990,35 @@
     }
 
     /**
-     * Returns a reference to the {@code caseIgnoreSubstringsMatch} Matching
-     * Rule which has the OID {@code 2.5.13.4}.
+     * Returns a reference to the {@code caseIgnoreSubstringsMatch} Matching Rule which has the OID {@code 2.5.13.4}.
      *
-     * @return A reference to the {@code caseIgnoreSubstringsMatch} Matching
-     *         Rule.
+     * @return A reference to the {@code caseIgnoreSubstringsMatch} Matching Rule.
      */
     public static MatchingRule getCaseIgnoreSubstringsMatchingRule() {
         return CASE_IGNORE_SUBSTRINGS_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code directoryStringFirstComponentMatch}
-     * Matching Rule which has the OID {@code 2.5.13.31}.
+     * Returns a reference to the {@code certificateExactMatch} Matching Rule which has the OID {@code 2.5.13.34}.
      *
-     * @return A reference to the {@code directoryStringFirstComponentMatch}
-     *         Matching Rule.
+     * @return A reference to the {@code certificateExactMatch} Matching Rule.
+     */
+    public static MatchingRule getCertificateExactMatchingRule() {
+        return CERTIFICATE_EXACT_MATCHING_RULE;
+    }
+
+    /**
+     * Returns a reference to the {@code directoryStringFirstComponentMatch} Matching Rule which has the OID
+     * {@code 2.5.13.31}.
+     *
+     * @return A reference to the {@code directoryStringFirstComponentMatch} Matching Rule.
      */
     public static MatchingRule getDirectoryStringFirstComponentMatchingRule() {
         return DIRECTORY_STRING_FIRST_COMPONENT_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code distinguishedNameMatch} Matching Rule
-     * which has the OID {@code 2.5.13.1}.
+     * Returns a reference to the {@code distinguishedNameMatch} Matching Rule which has the OID {@code 2.5.13.1}.
      *
      * @return A reference to the {@code distinguishedNameMatch} Matching Rule.
      */
@@ -1012,8 +1027,7 @@
     }
 
     /**
-     * Returns a reference to the {@code generalizedTimeMatch} Matching Rule
-     * which has the OID {@code 2.5.13.27}.
+     * Returns a reference to the {@code generalizedTimeMatch} Matching Rule which has the OID {@code 2.5.13.27}.
      *
      * @return A reference to the {@code generalizedTimeMatch} Matching Rule.
      */
@@ -1022,30 +1036,26 @@
     }
 
     /**
-     * Returns a reference to the {@code generalizedTimeOrderingMatch} Matching
-     * Rule which has the OID {@code 2.5.13.28}.
+     * Returns a reference to the {@code generalizedTimeOrderingMatch} Matching Rule which has the OID
+     * {@code 2.5.13.28}.
      *
-     * @return A reference to the {@code generalizedTimeOrderingMatch} Matching
-     *         Rule.
+     * @return A reference to the {@code generalizedTimeOrderingMatch} Matching Rule.
      */
     public static MatchingRule getGeneralizedTimeOrderingMatchingRule() {
         return GENERALIZED_TIME_ORDERING_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code integerFirstComponentMatch} Matching
-     * Rule which has the OID {@code 2.5.13.29}.
+     * Returns a reference to the {@code integerFirstComponentMatch} Matching Rule which has the OID {@code 2.5.13.29}.
      *
-     * @return A reference to the {@code integerFirstComponentMatch} Matching
-     *         Rule.
+     * @return A reference to the {@code integerFirstComponentMatch} Matching Rule.
      */
     public static MatchingRule getIntegerFirstComponentMatchingRule() {
         return INTEGER_FIRST_COMPONENT_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code integerMatch} Matching Rule which has
-     * the OID {@code 2.5.13.14}.
+     * Returns a reference to the {@code integerMatch} Matching Rule which has the OID {@code 2.5.13.14}.
      *
      * @return A reference to the {@code integerMatch} Matching Rule.
      */
@@ -1054,8 +1064,7 @@
     }
 
     /**
-     * Returns a reference to the {@code integerOrderingMatch} Matching Rule
-     * which has the OID {@code 2.5.13.15}.
+     * Returns a reference to the {@code integerOrderingMatch} Matching Rule which has the OID {@code 2.5.13.15}.
      *
      * @return A reference to the {@code integerOrderingMatch} Matching Rule.
      */
@@ -1064,8 +1073,7 @@
     }
 
     /**
-     * Returns a reference to the {@code keywordMatch} Matching Rule which has
-     * the OID {@code 2.5.13.33}.
+     * Returns a reference to the {@code keywordMatch} Matching Rule which has the OID {@code 2.5.13.33}.
      *
      * @return A reference to the {@code keywordMatch} Matching Rule.
      */
@@ -1074,8 +1082,7 @@
     }
 
     /**
-     * Returns a reference to the {@code numericStringMatch} Matching Rule which
-     * has the OID {@code 2.5.13.8}.
+     * Returns a reference to the {@code numericStringMatch} Matching Rule which has the OID {@code 2.5.13.8}.
      *
      * @return A reference to the {@code numericStringMatch} Matching Rule.
      */
@@ -1084,41 +1091,36 @@
     }
 
     /**
-     * Returns a reference to the {@code numericStringOrderingMatch} Matching
-     * Rule which has the OID {@code 2.5.13.9}.
+     * Returns a reference to the {@code numericStringOrderingMatch} Matching Rule which has the OID {@code 2.5.13.9}.
      *
-     * @return A reference to the {@code numericStringOrderingMatch} Matching
-     *         Rule.
+     * @return A reference to the {@code numericStringOrderingMatch} Matching Rule.
      */
     public static MatchingRule getNumericStringOrderingMatchingRule() {
         return NUMERIC_STRING_ORDERING_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code numericStringSubstringsMatch} Matching
-     * Rule which has the OID {@code 2.5.13.10}.
+     * Returns a reference to the {@code numericStringSubstringsMatch} Matching Rule which has the OID
+     * {@code 2.5.13.10}.
      *
-     * @return A reference to the {@code numericStringSubstringsMatch} Matching
-     *         Rule.
+     * @return A reference to the {@code numericStringSubstringsMatch} Matching Rule.
      */
     public static MatchingRule getNumericStringSubstringsMatchingRule() {
         return NUMERIC_STRING_SUBSTRINGS_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code objectIdentifierFirstComponentMatch}
-     * Matching Rule which has the OID {@code 2.5.13.30}.
+     * Returns a reference to the {@code objectIdentifierFirstComponentMatch} Matching Rule which has the OID
+     * {@code 2.5.13.30}.
      *
-     * @return A reference to the {@code objectIdentifierFirstComponentMatch}
-     *         Matching Rule.
+     * @return A reference to the {@code objectIdentifierFirstComponentMatch} Matching Rule.
      */
     public static MatchingRule getObjectIdentifierFirstComponentMatchingRule() {
         return OBJECT_IDENTIFIER_FIRST_COMPONENT_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code objectIdentifierMatch} Matching Rule
-     * which has the OID {@code 2.5.13.0}.
+     * Returns a reference to the {@code objectIdentifierMatch} Matching Rule which has the OID {@code 2.5.13.0}.
      *
      * @return A reference to the {@code objectIdentifierMatch} Matching Rule.
      */
@@ -1127,8 +1129,7 @@
     }
 
     /**
-     * Returns a reference to the {@code octetStringMatch} Matching Rule which
-     * has the OID {@code 2.5.13.17}.
+     * Returns a reference to the {@code octetStringMatch} Matching Rule which has the OID {@code 2.5.13.17}.
      *
      * @return A reference to the {@code octetStringMatch} Matching Rule.
      */
@@ -1137,52 +1138,43 @@
     }
 
     /**
-     * Returns a reference to the {@code octetStringOrderingMatch} Matching Rule
-     * which has the OID {@code 2.5.13.18}.
+     * Returns a reference to the {@code octetStringOrderingMatch} Matching Rule which has the OID {@code 2.5.13.18}.
      *
-     * @return A reference to the {@code octetStringOrderingMatch} Matching
-     *         Rule.
+     * @return A reference to the {@code octetStringOrderingMatch} Matching Rule.
      */
     public static MatchingRule getOctetStringOrderingMatchingRule() {
         return OCTET_STRING_ORDERING_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code octetStringSubstringsMatch} Matching
-     * Rule which has the OID {@code 2.5.13.19}.
+     * Returns a reference to the {@code octetStringSubstringsMatch} Matching Rule which has the OID {@code 2.5.13.19}.
      *
-     * @return A reference to the {@code octetStringSubstringsMatch} Matching
-     *         Rule.
+     * @return A reference to the {@code octetStringSubstringsMatch} Matching Rule.
      */
     public static MatchingRule getOctetStringSubstringsMatchingRule() {
         return OCTET_STRING_SUBSTRINGS_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code presentationAddressMatch} Matching Rule
-     * which has the OID {@code 2.5.13.22}.
+     * Returns a reference to the {@code presentationAddressMatch} Matching Rule which has the OID {@code 2.5.13.22}.
      *
-     * @return A reference to the {@code presentationAddressMatch} Matching
-     *         Rule.
+     * @return A reference to the {@code presentationAddressMatch} Matching Rule.
      */
     public static MatchingRule getPresentationAddressMatchingRule() {
         return PRESENTATION_ADDRESS_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code protocolInformationMatch} Matching Rule
-     * which has the OID {@code 2.5.13.24}.
+     * Returns a reference to the {@code protocolInformationMatch} Matching Rule which has the OID {@code 2.5.13.24}.
      *
-     * @return A reference to the {@code protocolInformationMatch} Matching
-     *         Rule.
+     * @return A reference to the {@code protocolInformationMatch} Matching Rule.
      */
     public static MatchingRule getProtocolInformationMatchingRule() {
         return PROTOCOL_INFORMATION_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code telephoneNumberMatch} Matching Rule
-     * which has the OID {@code 2.5.13.20}.
+     * Returns a reference to the {@code telephoneNumberMatch} Matching Rule which has the OID {@code 2.5.13.20}.
      *
      * @return A reference to the {@code telephoneNumberMatch} Matching Rule.
      */
@@ -1191,19 +1183,17 @@
     }
 
     /**
-     * Returns a reference to the {@code telephoneNumberSubstringsMatch}
-     * Matching Rule which has the OID {@code 2.5.13.21}.
+     * Returns a reference to the {@code telephoneNumberSubstringsMatch} Matching Rule which has the OID
+     * {@code 2.5.13.21}.
      *
-     * @return A reference to the {@code telephoneNumberSubstringsMatch}
-     *         Matching Rule.
+     * @return A reference to the {@code telephoneNumberSubstringsMatch} Matching Rule.
      */
     public static MatchingRule getTelephoneNumberSubstringsMatchingRule() {
         return TELEPHONE_NUMBER_SUBSTRINGS_MATCHING_RULE;
     }
 
     /**
-     * Returns a reference to the {@code uniqueMemberMatch} Matching Rule which
-     * has the OID {@code 2.5.13.23}.
+     * Returns a reference to the {@code uniqueMemberMatch} Matching Rule which has the OID {@code 2.5.13.23}.
      *
      * @return A reference to the {@code uniqueMemberMatch} Matching Rule.
      */
@@ -1212,8 +1202,7 @@
     }
 
     /**
-     * Returns a reference to the {@code uuidMatch} Matching Rule which has the
-     * OID {@code 1.3.6.1.1.16.2}.
+     * Returns a reference to the {@code uuidMatch} Matching Rule which has the OID {@code 1.3.6.1.1.16.2}.
      *
      * @return A reference to the {@code uuidMatch} Matching Rule.
      */
@@ -1222,8 +1211,7 @@
     }
 
     /**
-     * Returns a reference to the {@code uuidOrderingMatch} Matching Rule which
-     * has the OID {@code 1.3.6.1.1.16.3}.
+     * Returns a reference to the {@code uuidOrderingMatch} Matching Rule which has the OID {@code 1.3.6.1.1.16.3}.
      *
      * @return A reference to the {@code uuidOrderingMatch} Matching Rule.
      */
@@ -1232,8 +1220,7 @@
     }
 
     /**
-     * Returns a reference to the {@code wordMatch} Matching Rule which has the
-     * OID {@code 2.5.13.32}.
+     * Returns a reference to the {@code wordMatch} Matching Rule which has the OID {@code 2.5.13.32}.
      *
      * @return A reference to the {@code wordMatch} Matching Rule.
      */
@@ -1242,8 +1229,7 @@
     }
 
     /**
-     * Returns a reference to the {@code aliasedObjectName} Attribute Type which
-     * has the OID {@code 2.5.4.1}.
+     * Returns a reference to the {@code aliasedObjectName} Attribute Type which has the OID {@code 2.5.4.1}.
      *
      * @return A reference to the {@code aliasedObjectName} Attribute Type.
      */
@@ -1252,8 +1238,7 @@
     }
 
     /**
-     * Returns a reference to the {@code altServer} Attribute Type which has the
-     * OID {@code 1.3.6.1.4.1.1466.101.120.6}.
+     * Returns a reference to the {@code altServer} Attribute Type which has the OID {@code 1.3.6.1.4.1.1466.101.120.6}.
      *
      * @return A reference to the {@code altServer} Attribute Type.
      */
@@ -1262,8 +1247,7 @@
     }
 
     /**
-     * Returns a reference to the {@code attributeTypes} Attribute Type which
-     * has the OID {@code 2.5.21.5}.
+     * Returns a reference to the {@code attributeTypes} Attribute Type which has the OID {@code 2.5.21.5}.
      *
      * @return A reference to the {@code attributeTypes} Attribute Type.
      */
@@ -1272,8 +1256,16 @@
     }
 
     /**
-     * Returns a reference to the {@code authPassword} Attribute Type which has
-     * the OID {@code 1.3.6.1.4.1.4203.1.3.4}.
+     * Returns a reference to the {@code authorityRevocationList} Attribute Type which has the OID {@code 2.5.4.38}.
+     *
+     * @return A reference to the {@code authorityRevocationList} Attribute Type.
+     */
+    public static AttributeType getAuthorityRevocationListAttributeType() {
+        return AUTHORITY_REVOCATION_LIST_ATTRIBUTE_TYPE;
+    }
+
+    /**
+     * Returns a reference to the {@code authPassword} Attribute Type which has the OID {@code 1.3.6.1.4.1.4203.1.3.4}.
      *
      * @return A reference to the {@code authPassword} Attribute Type.
      */
@@ -1282,8 +1274,7 @@
     }
 
     /**
-     * Returns a reference to the {@code businessCategory} Attribute Type which
-     * has the OID {@code 2.5.4.15}.
+     * Returns a reference to the {@code businessCategory} Attribute Type which has the OID {@code 2.5.4.15}.
      *
      * @return A reference to the {@code businessCategory} Attribute Type.
      */
@@ -1292,8 +1283,16 @@
     }
 
     /**
-     * Returns a reference to the {@code cn} Attribute Type which has the OID
-     * {@code 2.5.4.3}.
+     * Returns a reference to the {@code certificateRevocationList} Attribute Type which has the OID {@code 2.5.4.39}.
+     *
+     * @return A reference to the {@code certificateRevocationList} Attribute Type.
+     */
+    public static AttributeType getCertificateRevocationListAttributeType() {
+        return CERTIFICATE_REVOCATION_LIST_ATTRIBUTE_TYPE;
+    }
+
+    /**
+     * Returns a reference to the {@code cn} Attribute Type which has the OID {@code 2.5.4.3}.
      *
      * @return A reference to the {@code cn} Attribute Type.
      */
@@ -1302,8 +1301,7 @@
     }
 
     /**
-     * Returns a reference to the {@code createTimestamp} Attribute Type which
-     * has the OID {@code 2.5.18.1}.
+     * Returns a reference to the {@code createTimestamp} Attribute Type which has the OID {@code 2.5.18.1}.
      *
      * @return A reference to the {@code createTimestamp} Attribute Type.
      */
@@ -1312,8 +1310,7 @@
     }
 
     /**
-     * Returns a reference to the {@code creatorsName} Attribute Type which has
-     * the OID {@code 2.5.18.3}.
+     * Returns a reference to the {@code creatorsName} Attribute Type which has the OID {@code 2.5.18.3}.
      *
      * @return A reference to the {@code creatorsName} Attribute Type.
      */
@@ -1322,8 +1319,16 @@
     }
 
     /**
-     * Returns a reference to the {@code c} Attribute Type which has the OID
-     * {@code 2.5.4.6}.
+     * Returns a reference to the {@code crossCertificatePair} Attribute Type which has the OID {@code 2.5.4.40}.
+     *
+     * @return A reference to the {@code crossCertificatePair} Attribute Type.
+     */
+    public static AttributeType getCrossCertificatePairAttributeType() {
+        return CROSS_CERTIFICATE_PAIR_ATTRIBUTE_TYPE;
+    }
+
+    /**
+     * Returns a reference to the {@code c} Attribute Type which has the OID {@code 2.5.4.6}.
      *
      * @return A reference to the {@code c} Attribute Type.
      */
@@ -1332,8 +1337,16 @@
     }
 
     /**
-     * Returns a reference to the {@code dc} Attribute Type which has the OID
-     * {@code 0.9.2342.19200300.100.1.25}.
+     * Returns a reference to the {@code cACertificate} Attribute Type which has the OID {@code 2.5.4.37}.
+     *
+     * @return A reference to the {@code cACertificate} Attribute Type.
+     */
+    public static AttributeType getCACertificateAttributeType() {
+        return C_A_CERTIFICATE_ATTRIBUTE_TYPE;
+    }
+
+    /**
+     * Returns a reference to the {@code dc} Attribute Type which has the OID {@code 0.9.2342.19200300.100.1.25}.
      *
      * @return A reference to the {@code dc} Attribute Type.
      */
@@ -1342,8 +1355,16 @@
     }
 
     /**
-     * Returns a reference to the {@code description} Attribute Type which has
-     * the OID {@code 2.5.4.13}.
+     * Returns a reference to the {@code deltaRevocationList} Attribute Type which has the OID {@code 2.5.4.53}.
+     *
+     * @return A reference to the {@code deltaRevocationList} Attribute Type.
+     */
+    public static AttributeType getDeltaRevocationListAttributeType() {
+        return DELTA_REVOCATION_LIST_ATTRIBUTE_TYPE;
+    }
+
+    /**
+     * Returns a reference to the {@code description} Attribute Type which has the OID {@code 2.5.4.13}.
      *
      * @return A reference to the {@code description} Attribute Type.
      */
@@ -1352,8 +1373,7 @@
     }
 
     /**
-     * Returns a reference to the {@code destinationIndicator} Attribute Type
-     * which has the OID {@code 2.5.4.27}.
+     * Returns a reference to the {@code destinationIndicator} Attribute Type which has the OID {@code 2.5.4.27}.
      *
      * @return A reference to the {@code destinationIndicator} Attribute Type.
      */
@@ -1362,8 +1382,7 @@
     }
 
     /**
-     * Returns a reference to the {@code distinguishedName} Attribute Type which
-     * has the OID {@code 2.5.4.49}.
+     * Returns a reference to the {@code distinguishedName} Attribute Type which has the OID {@code 2.5.4.49}.
      *
      * @return A reference to the {@code distinguishedName} Attribute Type.
      */
@@ -1372,8 +1391,7 @@
     }
 
     /**
-     * Returns a reference to the {@code ditContentRules} Attribute Type which
-     * has the OID {@code 2.5.21.2}.
+     * Returns a reference to the {@code ditContentRules} Attribute Type which has the OID {@code 2.5.21.2}.
      *
      * @return A reference to the {@code ditContentRules} Attribute Type.
      */
@@ -1382,8 +1400,7 @@
     }
 
     /**
-     * Returns a reference to the {@code ditStructureRules} Attribute Type which
-     * has the OID {@code 2.5.21.1}.
+     * Returns a reference to the {@code ditStructureRules} Attribute Type which has the OID {@code 2.5.21.1}.
      *
      * @return A reference to the {@code ditStructureRules} Attribute Type.
      */
@@ -1392,8 +1409,7 @@
     }
 
     /**
-     * Returns a reference to the {@code dnQualifier} Attribute Type which has
-     * the OID {@code 2.5.4.46}.
+     * Returns a reference to the {@code dnQualifier} Attribute Type which has the OID {@code 2.5.4.46}.
      *
      * @return A reference to the {@code dnQualifier} Attribute Type.
      */
@@ -1402,8 +1418,7 @@
     }
 
     /**
-     * Returns a reference to the {@code enhancedSearchGuide} Attribute Type
-     * which has the OID {@code 2.5.4.47}.
+     * Returns a reference to the {@code enhancedSearchGuide} Attribute Type which has the OID {@code 2.5.4.47}.
      *
      * @return A reference to the {@code enhancedSearchGuide} Attribute Type.
      */
@@ -1412,8 +1427,7 @@
     }
 
     /**
-     * Returns a reference to the {@code entryDN} Attribute Type which has the
-     * OID {@code 1.3.6.1.1.20}.
+     * Returns a reference to the {@code entryDN} Attribute Type which has the OID {@code 1.3.6.1.1.20}.
      *
      * @return A reference to the {@code entryDN} Attribute Type.
      */
@@ -1422,8 +1436,7 @@
     }
 
     /**
-     * Returns a reference to the {@code entryUUID} Attribute Type which has the
-     * OID {@code 1.3.6.1.1.16.4}.
+     * Returns a reference to the {@code entryUUID} Attribute Type which has the OID {@code 1.3.6.1.1.16.4}.
      *
      * @return A reference to the {@code entryUUID} Attribute Type.
      */
@@ -1432,19 +1445,16 @@
     }
 
     /**
-     * Returns a reference to the {@code facsimileTelephoneNumber} Attribute
-     * Type which has the OID {@code 2.5.4.23}.
+     * Returns a reference to the {@code facsimileTelephoneNumber} Attribute Type which has the OID {@code 2.5.4.23}.
      *
-     * @return A reference to the {@code facsimileTelephoneNumber} Attribute
-     *         Type.
+     * @return A reference to the {@code facsimileTelephoneNumber} Attribute Type.
      */
     public static AttributeType getFacsimileTelephoneNumberAttributeType() {
         return FACSIMILE_TELEPHONE_NUMBER_ATTRIBUTE_TYPE;
     }
 
     /**
-     * Returns a reference to the {@code generationQualifier} Attribute Type
-     * which has the OID {@code 2.5.4.44}.
+     * Returns a reference to the {@code generationQualifier} Attribute Type which has the OID {@code 2.5.4.44}.
      *
      * @return A reference to the {@code generationQualifier} Attribute Type.
      */
@@ -1453,8 +1463,7 @@
     }
 
     /**
-     * Returns a reference to the {@code givenName} Attribute Type which has the
-     * OID {@code 2.5.4.42}.
+     * Returns a reference to the {@code givenName} Attribute Type which has the OID {@code 2.5.4.42}.
      *
      * @return A reference to the {@code givenName} Attribute Type.
      */
@@ -1463,8 +1472,7 @@
     }
 
     /**
-     * Returns a reference to the {@code governingStructureRule} Attribute Type
-     * which has the OID {@code 2.5.21.10}.
+     * Returns a reference to the {@code governingStructureRule} Attribute Type which has the OID {@code 2.5.21.10}.
      *
      * @return A reference to the {@code governingStructureRule} Attribute Type.
      */
@@ -1473,8 +1481,7 @@
     }
 
     /**
-     * Returns a reference to the {@code houseIdentifier} Attribute Type which
-     * has the OID {@code 2.5.4.51}.
+     * Returns a reference to the {@code houseIdentifier} Attribute Type which has the OID {@code 2.5.4.51}.
      *
      * @return A reference to the {@code houseIdentifier} Attribute Type.
      */
@@ -1483,8 +1490,7 @@
     }
 
     /**
-     * Returns a reference to the {@code initials} Attribute Type which has the
-     * OID {@code 2.5.4.43}.
+     * Returns a reference to the {@code initials} Attribute Type which has the OID {@code 2.5.4.43}.
      *
      * @return A reference to the {@code initials} Attribute Type.
      */
@@ -1493,19 +1499,17 @@
     }
 
     /**
-     * Returns a reference to the {@code internationalISDNNumber} Attribute Type
-     * which has the OID {@code 2.5.4.25}.
+     * Returns a reference to the {@code internationalISDNNumber} Attribute Type which has the OID {@code 2.5.4.25}.
      *
-     * @return A reference to the {@code internationalISDNNumber} Attribute
-     *         Type.
+     * @return A reference to the {@code internationalISDNNumber} Attribute Type.
      */
     public static AttributeType getInternationalISDNNumberAttributeType() {
         return INTERNATIONAL_ISDN_NUMBER_ATTRIBUTE_TYPE;
     }
 
     /**
-     * Returns a reference to the {@code ldapSyntaxes} Attribute Type which has
-     * the OID {@code 1.3.6.1.4.1.1466.101.120.16}.
+     * Returns a reference to the {@code ldapSyntaxes} Attribute Type which has the OID
+     * {@code 1.3.6.1.4.1.1466.101.120.16}.
      *
      * @return A reference to the {@code ldapSyntaxes} Attribute Type.
      */
@@ -1514,8 +1518,7 @@
     }
 
     /**
-     * Returns a reference to the {@code l} Attribute Type which has the OID
-     * {@code 2.5.4.7}.
+     * Returns a reference to the {@code l} Attribute Type which has the OID {@code 2.5.4.7}.
      *
      * @return A reference to the {@code l} Attribute Type.
      */
@@ -1524,8 +1527,7 @@
     }
 
     /**
-     * Returns a reference to the {@code matchingRules} Attribute Type which has
-     * the OID {@code 2.5.21.4}.
+     * Returns a reference to the {@code matchingRules} Attribute Type which has the OID {@code 2.5.21.4}.
      *
      * @return A reference to the {@code matchingRules} Attribute Type.
      */
@@ -1534,8 +1536,7 @@
     }
 
     /**
-     * Returns a reference to the {@code matchingRuleUse} Attribute Type which
-     * has the OID {@code 2.5.21.8}.
+     * Returns a reference to the {@code matchingRuleUse} Attribute Type which has the OID {@code 2.5.21.8}.
      *
      * @return A reference to the {@code matchingRuleUse} Attribute Type.
      */
@@ -1544,8 +1545,7 @@
     }
 
     /**
-     * Returns a reference to the {@code member} Attribute Type which has the
-     * OID {@code 2.5.4.31}.
+     * Returns a reference to the {@code member} Attribute Type which has the OID {@code 2.5.4.31}.
      *
      * @return A reference to the {@code member} Attribute Type.
      */
@@ -1554,8 +1554,7 @@
     }
 
     /**
-     * Returns a reference to the {@code modifiersName} Attribute Type which has
-     * the OID {@code 2.5.18.4}.
+     * Returns a reference to the {@code modifiersName} Attribute Type which has the OID {@code 2.5.18.4}.
      *
      * @return A reference to the {@code modifiersName} Attribute Type.
      */
@@ -1564,8 +1563,7 @@
     }
 
     /**
-     * Returns a reference to the {@code modifyTimestamp} Attribute Type which
-     * has the OID {@code 2.5.18.2}.
+     * Returns a reference to the {@code modifyTimestamp} Attribute Type which has the OID {@code 2.5.18.2}.
      *
      * @return A reference to the {@code modifyTimestamp} Attribute Type.
      */
@@ -1574,8 +1572,7 @@
     }
 
     /**
-     * Returns a reference to the {@code name} Attribute Type which has the OID
-     * {@code 2.5.4.41}.
+     * Returns a reference to the {@code name} Attribute Type which has the OID {@code 2.5.4.41}.
      *
      * @return A reference to the {@code name} Attribute Type.
      */
@@ -1584,8 +1581,7 @@
     }
 
     /**
-     * Returns a reference to the {@code nameForms} Attribute Type which has the
-     * OID {@code 2.5.21.7}.
+     * Returns a reference to the {@code nameForms} Attribute Type which has the OID {@code 2.5.21.7}.
      *
      * @return A reference to the {@code nameForms} Attribute Type.
      */
@@ -1594,8 +1590,8 @@
     }
 
     /**
-     * Returns a reference to the {@code namingContexts} Attribute Type which
-     * has the OID {@code 1.3.6.1.4.1.1466.101.120.5}.
+     * Returns a reference to the {@code namingContexts} Attribute Type which has the OID
+     * {@code 1.3.6.1.4.1.1466.101.120.5}.
      *
      * @return A reference to the {@code namingContexts} Attribute Type.
      */
@@ -1604,8 +1600,7 @@
     }
 
     /**
-     * Returns a reference to the {@code objectClasses} Attribute Type which has
-     * the OID {@code 2.5.21.6}.
+     * Returns a reference to the {@code objectClasses} Attribute Type which has the OID {@code 2.5.21.6}.
      *
      * @return A reference to the {@code objectClasses} Attribute Type.
      */
@@ -1614,8 +1609,7 @@
     }
 
     /**
-     * Returns a reference to the {@code objectClass} Attribute Type which has
-     * the OID {@code 2.5.4.0}.
+     * Returns a reference to the {@code objectClass} Attribute Type which has the OID {@code 2.5.4.0}.
      *
      * @return A reference to the {@code objectClass} Attribute Type.
      */
@@ -1624,8 +1618,7 @@
     }
 
     /**
-     * Returns a reference to the {@code ou} Attribute Type which has the OID
-     * {@code 2.5.4.11}.
+     * Returns a reference to the {@code ou} Attribute Type which has the OID {@code 2.5.4.11}.
      *
      * @return A reference to the {@code ou} Attribute Type.
      */
@@ -1634,8 +1627,7 @@
     }
 
     /**
-     * Returns a reference to the {@code owner} Attribute Type which has the OID
-     * {@code 2.5.4.32}.
+     * Returns a reference to the {@code owner} Attribute Type which has the OID {@code 2.5.4.32}.
      *
      * @return A reference to the {@code owner} Attribute Type.
      */
@@ -1644,8 +1636,7 @@
     }
 
     /**
-     * Returns a reference to the {@code o} Attribute Type which has the OID
-     * {@code 2.5.4.10}.
+     * Returns a reference to the {@code o} Attribute Type which has the OID {@code 2.5.4.10}.
      *
      * @return A reference to the {@code o} Attribute Type.
      */
@@ -1654,19 +1645,16 @@
     }
 
     /**
-     * Returns a reference to the {@code physicalDeliveryOfficeName} Attribute
-     * Type which has the OID {@code 2.5.4.19}.
+     * Returns a reference to the {@code physicalDeliveryOfficeName} Attribute Type which has the OID {@code 2.5.4.19}.
      *
-     * @return A reference to the {@code physicalDeliveryOfficeName} Attribute
-     *         Type.
+     * @return A reference to the {@code physicalDeliveryOfficeName} Attribute Type.
      */
     public static AttributeType getPhysicalDeliveryOfficeNameAttributeType() {
         return PHYSICAL_DELIVERY_OFFICE_NAME_ATTRIBUTE_TYPE;
     }
 
     /**
-     * Returns a reference to the {@code postalAddress} Attribute Type which has
-     * the OID {@code 2.5.4.16}.
+     * Returns a reference to the {@code postalAddress} Attribute Type which has the OID {@code 2.5.4.16}.
      *
      * @return A reference to the {@code postalAddress} Attribute Type.
      */
@@ -1675,8 +1663,7 @@
     }
 
     /**
-     * Returns a reference to the {@code postalCode} Attribute Type which has
-     * the OID {@code 2.5.4.17}.
+     * Returns a reference to the {@code postalCode} Attribute Type which has the OID {@code 2.5.4.17}.
      *
      * @return A reference to the {@code postalCode} Attribute Type.
      */
@@ -1685,8 +1672,7 @@
     }
 
     /**
-     * Returns a reference to the {@code postOfficeBox} Attribute Type which has
-     * the OID {@code 2.5.4.18}.
+     * Returns a reference to the {@code postOfficeBox} Attribute Type which has the OID {@code 2.5.4.18}.
      *
      * @return A reference to the {@code postOfficeBox} Attribute Type.
      */
@@ -1695,19 +1681,16 @@
     }
 
     /**
-     * Returns a reference to the {@code preferredDeliveryMethod} Attribute Type
-     * which has the OID {@code 2.5.4.28}.
+     * Returns a reference to the {@code preferredDeliveryMethod} Attribute Type which has the OID {@code 2.5.4.28}.
      *
-     * @return A reference to the {@code preferredDeliveryMethod} Attribute
-     *         Type.
+     * @return A reference to the {@code preferredDeliveryMethod} Attribute Type.
      */
     public static AttributeType getPreferredDeliveryMethodAttributeType() {
         return PREFERRED_DELIVERY_METHOD_ATTRIBUTE_TYPE;
     }
 
     /**
-     * Returns a reference to the {@code registeredAddress} Attribute Type which
-     * has the OID {@code 2.5.4.26}.
+     * Returns a reference to the {@code registeredAddress} Attribute Type which has the OID {@code 2.5.4.26}.
      *
      * @return A reference to the {@code registeredAddress} Attribute Type.
      */
@@ -1716,8 +1699,7 @@
     }
 
     /**
-     * Returns a reference to the {@code roleOccupant} Attribute Type which has
-     * the OID {@code 2.5.4.33}.
+     * Returns a reference to the {@code roleOccupant} Attribute Type which has the OID {@code 2.5.4.33}.
      *
      * @return A reference to the {@code roleOccupant} Attribute Type.
      */
@@ -1726,8 +1708,7 @@
     }
 
     /**
-     * Returns a reference to the {@code searchGuide} Attribute Type which has
-     * the OID {@code 2.5.4.14}.
+     * Returns a reference to the {@code searchGuide} Attribute Type which has the OID {@code 2.5.4.14}.
      *
      * @return A reference to the {@code searchGuide} Attribute Type.
      */
@@ -1736,8 +1717,7 @@
     }
 
     /**
-     * Returns a reference to the {@code seeAlso} Attribute Type which has the
-     * OID {@code 2.5.4.34}.
+     * Returns a reference to the {@code seeAlso} Attribute Type which has the OID {@code 2.5.4.34}.
      *
      * @return A reference to the {@code seeAlso} Attribute Type.
      */
@@ -1746,8 +1726,7 @@
     }
 
     /**
-     * Returns a reference to the {@code serialNumber} Attribute Type which has
-     * the OID {@code 2.5.4.5}.
+     * Returns a reference to the {@code serialNumber} Attribute Type which has the OID {@code 2.5.4.5}.
      *
      * @return A reference to the {@code serialNumber} Attribute Type.
      */
@@ -1756,8 +1735,7 @@
     }
 
     /**
-     * Returns a reference to the {@code sn} Attribute Type which has the OID
-     * {@code 2.5.4.4}.
+     * Returns a reference to the {@code sn} Attribute Type which has the OID {@code 2.5.4.4}.
      *
      * @return A reference to the {@code sn} Attribute Type.
      */
@@ -1766,8 +1744,7 @@
     }
 
     /**
-     * Returns a reference to the {@code street} Attribute Type which has the
-     * OID {@code 2.5.4.9}.
+     * Returns a reference to the {@code street} Attribute Type which has the OID {@code 2.5.4.9}.
      *
      * @return A reference to the {@code street} Attribute Type.
      */
@@ -1776,8 +1753,7 @@
     }
 
     /**
-     * Returns a reference to the {@code structuralObjectClass} Attribute Type
-     * which has the OID {@code 2.5.21.9}.
+     * Returns a reference to the {@code structuralObjectClass} Attribute Type which has the OID {@code 2.5.21.9}.
      *
      * @return A reference to the {@code structuralObjectClass} Attribute Type.
      */
@@ -1786,8 +1762,7 @@
     }
 
     /**
-     * Returns a reference to the {@code st} Attribute Type which has the OID
-     * {@code 2.5.4.8}.
+     * Returns a reference to the {@code st} Attribute Type which has the OID {@code 2.5.4.8}.
      *
      * @return A reference to the {@code st} Attribute Type.
      */
@@ -1796,8 +1771,7 @@
     }
 
     /**
-     * Returns a reference to the {@code subschemaSubentry} Attribute Type which
-     * has the OID {@code 2.5.18.10}.
+     * Returns a reference to the {@code subschemaSubentry} Attribute Type which has the OID {@code 2.5.18.10}.
      *
      * @return A reference to the {@code subschemaSubentry} Attribute Type.
      */
@@ -1806,19 +1780,27 @@
     }
 
     /**
-     * Returns a reference to the {@code supportedAuthPasswordSchemes} Attribute
-     * Type which has the OID {@code 1.3.6.1.4.1.4203.1.3.3}.
+     * Returns a reference to the {@code supportedAlgorithms} Attribute Type which has the OID {@code 2.5.4.52}.
      *
-     * @return A reference to the {@code supportedAuthPasswordSchemes} Attribute
-     *         Type.
+     * @return A reference to the {@code supportedAlgorithms} Attribute Type.
+     */
+    public static AttributeType getSupportedAlgorithmsAttributeType() {
+        return SUPPORTED_ALGORITHMS_ATTRIBUTE_TYPE;
+    }
+
+    /**
+     * Returns a reference to the {@code supportedAuthPasswordSchemes} Attribute Type which has the OID
+     * {@code 1.3.6.1.4.1.4203.1.3.3}.
+     *
+     * @return A reference to the {@code supportedAuthPasswordSchemes} Attribute Type.
      */
     public static AttributeType getSupportedAuthPasswordSchemesAttributeType() {
         return SUPPORTED_AUTH_PASSWORD_SCHEMES_ATTRIBUTE_TYPE;
     }
 
     /**
-     * Returns a reference to the {@code supportedControl} Attribute Type which
-     * has the OID {@code 1.3.6.1.4.1.1466.101.120.13}.
+     * Returns a reference to the {@code supportedControl} Attribute Type which has the OID
+     * {@code 1.3.6.1.4.1.1466.101.120.13}.
      *
      * @return A reference to the {@code supportedControl} Attribute Type.
      */
@@ -1827,8 +1809,8 @@
     }
 
     /**
-     * Returns a reference to the {@code supportedExtension} Attribute Type
-     * which has the OID {@code 1.3.6.1.4.1.1466.101.120.7}.
+     * Returns a reference to the {@code supportedExtension} Attribute Type which has the OID
+     * {@code 1.3.6.1.4.1.1466.101.120.7}.
      *
      * @return A reference to the {@code supportedExtension} Attribute Type.
      */
@@ -1837,8 +1819,8 @@
     }
 
     /**
-     * Returns a reference to the {@code supportedFeatures} Attribute Type which
-     * has the OID {@code 1.3.6.1.4.1.4203.1.3.5}.
+     * Returns a reference to the {@code supportedFeatures} Attribute Type which has the OID
+     * {@code 1.3.6.1.4.1.4203.1.3.5}.
      *
      * @return A reference to the {@code supportedFeatures} Attribute Type.
      */
@@ -1847,8 +1829,8 @@
     }
 
     /**
-     * Returns a reference to the {@code supportedLDAPVersion} Attribute Type
-     * which has the OID {@code 1.3.6.1.4.1.1466.101.120.15}.
+     * Returns a reference to the {@code supportedLDAPVersion} Attribute Type which has the OID
+     * {@code 1.3.6.1.4.1.1466.101.120.15}.
      *
      * @return A reference to the {@code supportedLDAPVersion} Attribute Type.
      */
@@ -1857,19 +1839,17 @@
     }
 
     /**
-     * Returns a reference to the {@code supportedSASLMechanisms} Attribute Type
-     * which has the OID {@code 1.3.6.1.4.1.1466.101.120.14}.
+     * Returns a reference to the {@code supportedSASLMechanisms} Attribute Type which has the OID
+     * {@code 1.3.6.1.4.1.1466.101.120.14}.
      *
-     * @return A reference to the {@code supportedSASLMechanisms} Attribute
-     *         Type.
+     * @return A reference to the {@code supportedSASLMechanisms} Attribute Type.
      */
     public static AttributeType getSupportedSASLMechanismsAttributeType() {
         return SUPPORTED_SASL_MECHANISMS_ATTRIBUTE_TYPE;
     }
 
     /**
-     * Returns a reference to the {@code telephoneNumber} Attribute Type which
-     * has the OID {@code 2.5.4.20}.
+     * Returns a reference to the {@code telephoneNumber} Attribute Type which has the OID {@code 2.5.4.20}.
      *
      * @return A reference to the {@code telephoneNumber} Attribute Type.
      */
@@ -1878,19 +1858,16 @@
     }
 
     /**
-     * Returns a reference to the {@code teletexTerminalIdentifier} Attribute
-     * Type which has the OID {@code 2.5.4.22}.
+     * Returns a reference to the {@code teletexTerminalIdentifier} Attribute Type which has the OID {@code 2.5.4.22}.
      *
-     * @return A reference to the {@code teletexTerminalIdentifier} Attribute
-     *         Type.
+     * @return A reference to the {@code teletexTerminalIdentifier} Attribute Type.
      */
     public static AttributeType getTeletexTerminalIdentifierAttributeType() {
         return TELETEX_TERMINAL_IDENTIFIER_ATTRIBUTE_TYPE;
     }
 
     /**
-     * Returns a reference to the {@code telexNumber} Attribute Type which has
-     * the OID {@code 2.5.4.21}.
+     * Returns a reference to the {@code telexNumber} Attribute Type which has the OID {@code 2.5.4.21}.
      *
      * @return A reference to the {@code telexNumber} Attribute Type.
      */
@@ -1899,8 +1876,7 @@
     }
 
     /**
-     * Returns a reference to the {@code title} Attribute Type which has the OID
-     * {@code 2.5.4.12}.
+     * Returns a reference to the {@code title} Attribute Type which has the OID {@code 2.5.4.12}.
      *
      * @return A reference to the {@code title} Attribute Type.
      */
@@ -1909,8 +1885,7 @@
     }
 
     /**
-     * Returns a reference to the {@code uid} Attribute Type which has the OID
-     * {@code 0.9.2342.19200300.100.1.1}.
+     * Returns a reference to the {@code uid} Attribute Type which has the OID {@code 0.9.2342.19200300.100.1.1}.
      *
      * @return A reference to the {@code uid} Attribute Type.
      */
@@ -1919,8 +1894,7 @@
     }
 
     /**
-     * Returns a reference to the {@code uniqueMember} Attribute Type which has
-     * the OID {@code 2.5.4.50}.
+     * Returns a reference to the {@code uniqueMember} Attribute Type which has the OID {@code 2.5.4.50}.
      *
      * @return A reference to the {@code uniqueMember} Attribute Type.
      */
@@ -1929,8 +1903,16 @@
     }
 
     /**
-     * Returns a reference to the {@code userPassword} Attribute Type which has
-     * the OID {@code 2.5.4.35}.
+     * Returns a reference to the {@code userCertificate} Attribute Type which has the OID {@code 2.5.4.36}.
+     *
+     * @return A reference to the {@code userCertificate} Attribute Type.
+     */
+    public static AttributeType getUserCertificateAttributeType() {
+        return USER_CERTIFICATE_ATTRIBUTE_TYPE;
+    }
+
+    /**
+     * Returns a reference to the {@code userPassword} Attribute Type which has the OID {@code 2.5.4.35}.
      *
      * @return A reference to the {@code userPassword} Attribute Type.
      */
@@ -1939,8 +1921,7 @@
     }
 
     /**
-     * Returns a reference to the {@code vendorName} Attribute Type which has
-     * the OID {@code 1.3.6.1.1.4}.
+     * Returns a reference to the {@code vendorName} Attribute Type which has the OID {@code 1.3.6.1.1.4}.
      *
      * @return A reference to the {@code vendorName} Attribute Type.
      */
@@ -1949,8 +1930,7 @@
     }
 
     /**
-     * Returns a reference to the {@code vendorVersion} Attribute Type which has
-     * the OID {@code 1.3.6.1.1.5}.
+     * Returns a reference to the {@code vendorVersion} Attribute Type which has the OID {@code 1.3.6.1.1.5}.
      *
      * @return A reference to the {@code vendorVersion} Attribute Type.
      */
@@ -1959,8 +1939,7 @@
     }
 
     /**
-     * Returns a reference to the {@code x121Address} Attribute Type which has
-     * the OID {@code 2.5.4.24}.
+     * Returns a reference to the {@code x121Address} Attribute Type which has the OID {@code 2.5.4.24}.
      *
      * @return A reference to the {@code x121Address} Attribute Type.
      */
@@ -1969,8 +1948,7 @@
     }
 
     /**
-     * Returns a reference to the {@code x500UniqueIdentifier} Attribute Type
-     * which has the OID {@code 2.5.4.45}.
+     * Returns a reference to the {@code x500UniqueIdentifier} Attribute Type which has the OID {@code 2.5.4.45}.
      *
      * @return A reference to the {@code x500UniqueIdentifier} Attribute Type.
      */
@@ -1979,8 +1957,7 @@
     }
 
     /**
-     * Returns a reference to the {@code alias} Object Class which has the OID
-     * {@code 2.5.6.1}.
+     * Returns a reference to the {@code alias} Object Class which has the OID {@code 2.5.6.1}.
      *
      * @return A reference to the {@code alias} Object Class.
      */
@@ -1989,8 +1966,7 @@
     }
 
     /**
-     * Returns a reference to the {@code applicationProcess} Object Class which
-     * has the OID {@code 2.5.6.11}.
+     * Returns a reference to the {@code applicationProcess} Object Class which has the OID {@code 2.5.6.11}.
      *
      * @return A reference to the {@code applicationProcess} Object Class.
      */
@@ -1999,8 +1975,8 @@
     }
 
     /**
-     * Returns a reference to the {@code authPasswordObject} Object Class which
-     * has the OID {@code 1.3.6.1.4.1.4203.1.4.7}.
+     * Returns a reference to the {@code authPasswordObject} Object Class which has the OID
+     * {@code 1.3.6.1.4.1.4203.1.4.7}.
      *
      * @return A reference to the {@code authPasswordObject} Object Class.
      */
@@ -2009,8 +1985,25 @@
     }
 
     /**
-     * Returns a reference to the {@code country} Object Class which has the OID
-     * {@code 2.5.6.2}.
+     * Returns a reference to the {@code certificationAuthority} Object Class which has the OID {@code 2.5.6.16}.
+     *
+     * @return A reference to the {@code certificationAuthority} Object Class.
+     */
+    public static ObjectClass getCertificationAuthorityObjectClass() {
+        return CERTIFICATION_AUTHORITY_OBJECT_CLASS;
+    }
+
+    /**
+     * Returns a reference to the {@code certificationAuthority-V2} Object Class which has the OID {@code 2.5.6.16.2}.
+     *
+     * @return A reference to the {@code certificationAuthority-V2} Object Class.
+     */
+    public static ObjectClass getCertificationAuthorityV2ObjectClass() {
+        return CERTIFICATION_AUTHORITY_V2_OBJECT_CLASS;
+    }
+
+    /**
+     * Returns a reference to the {@code country} Object Class which has the OID {@code 2.5.6.2}.
      *
      * @return A reference to the {@code country} Object Class.
      */
@@ -2019,8 +2012,16 @@
     }
 
     /**
-     * Returns a reference to the {@code dcObject} Object Class which has the
-     * OID {@code 1.3.6.1.4.1.1466.344}.
+     * Returns a reference to the {@code cRLDistributionPoint} Object Class which has the OID {@code 2.5.6.19}.
+     *
+     * @return A reference to the {@code cRLDistributionPoint} Object Class.
+     */
+    public static ObjectClass getCRlDistributionPointObjectClass() {
+        return C_RL_DISTRIBUTION_POINT_OBJECT_CLASS;
+    }
+
+    /**
+     * Returns a reference to the {@code dcObject} Object Class which has the OID {@code 1.3.6.1.4.1.1466.344}.
      *
      * @return A reference to the {@code dcObject} Object Class.
      */
@@ -2029,8 +2030,16 @@
     }
 
     /**
-     * Returns a reference to the {@code device} Object Class which has the OID
-     * {@code 2.5.6.14}.
+     * Returns a reference to the {@code deltaCRL} Object Class which has the OID {@code 2.5.6.23}.
+     *
+     * @return A reference to the {@code deltaCRL} Object Class.
+     */
+    public static ObjectClass getDeltaCrlObjectClass() {
+        return DELTA_CRL_OBJECT_CLASS;
+    }
+
+    /**
+     * Returns a reference to the {@code device} Object Class which has the OID {@code 2.5.6.14}.
      *
      * @return A reference to the {@code device} Object Class.
      */
@@ -2039,8 +2048,8 @@
     }
 
     /**
-     * Returns a reference to the {@code extensibleObject} Object Class which
-     * has the OID {@code 1.3.6.1.4.1.1466.101.120.111}.
+     * Returns a reference to the {@code extensibleObject} Object Class which has the OID
+     * {@code 1.3.6.1.4.1.1466.101.120.111}.
      *
      * @return A reference to the {@code extensibleObject} Object Class.
      */
@@ -2049,8 +2058,7 @@
     }
 
     /**
-     * Returns a reference to the {@code groupOfNames} Object Class which has
-     * the OID {@code 2.5.6.9}.
+     * Returns a reference to the {@code groupOfNames} Object Class which has the OID {@code 2.5.6.9}.
      *
      * @return A reference to the {@code groupOfNames} Object Class.
      */
@@ -2059,8 +2067,7 @@
     }
 
     /**
-     * Returns a reference to the {@code groupOfUniqueNames} Object Class which
-     * has the OID {@code 2.5.6.17}.
+     * Returns a reference to the {@code groupOfUniqueNames} Object Class which has the OID {@code 2.5.6.17}.
      *
      * @return A reference to the {@code groupOfUniqueNames} Object Class.
      */
@@ -2069,8 +2076,7 @@
     }
 
     /**
-     * Returns a reference to the {@code locality} Object Class which has the
-     * OID {@code 2.5.6.3}.
+     * Returns a reference to the {@code locality} Object Class which has the OID {@code 2.5.6.3}.
      *
      * @return A reference to the {@code locality} Object Class.
      */
@@ -2079,8 +2085,7 @@
     }
 
     /**
-     * Returns a reference to the {@code organizationalPerson} Object Class
-     * which has the OID {@code 2.5.6.7}.
+     * Returns a reference to the {@code organizationalPerson} Object Class which has the OID {@code 2.5.6.7}.
      *
      * @return A reference to the {@code organizationalPerson} Object Class.
      */
@@ -2089,8 +2094,7 @@
     }
 
     /**
-     * Returns a reference to the {@code organizationalRole} Object Class which
-     * has the OID {@code 2.5.6.8}.
+     * Returns a reference to the {@code organizationalRole} Object Class which has the OID {@code 2.5.6.8}.
      *
      * @return A reference to the {@code organizationalRole} Object Class.
      */
@@ -2099,8 +2103,7 @@
     }
 
     /**
-     * Returns a reference to the {@code organizationalUnit} Object Class which
-     * has the OID {@code 2.5.6.5}.
+     * Returns a reference to the {@code organizationalUnit} Object Class which has the OID {@code 2.5.6.5}.
      *
      * @return A reference to the {@code organizationalUnit} Object Class.
      */
@@ -2109,8 +2112,7 @@
     }
 
     /**
-     * Returns a reference to the {@code organization} Object Class which has
-     * the OID {@code 2.5.6.4}.
+     * Returns a reference to the {@code organization} Object Class which has the OID {@code 2.5.6.4}.
      *
      * @return A reference to the {@code organization} Object Class.
      */
@@ -2119,8 +2121,7 @@
     }
 
     /**
-     * Returns a reference to the {@code person} Object Class which has the OID
-     * {@code 2.5.6.6}.
+     * Returns a reference to the {@code person} Object Class which has the OID {@code 2.5.6.6}.
      *
      * @return A reference to the {@code person} Object Class.
      */
@@ -2129,8 +2130,25 @@
     }
 
     /**
-     * Returns a reference to the {@code residentialPerson} Object Class which
-     * has the OID {@code 2.5.6.10}.
+     * Returns a reference to the {@code pkiCA} Object Class which has the OID {@code 2.5.6.22}.
+     *
+     * @return A reference to the {@code pkiCA} Object Class.
+     */
+    public static ObjectClass getPkiCaObjectClass() {
+        return PKI_CA_OBJECT_CLASS;
+    }
+
+    /**
+     * Returns a reference to the {@code pkiUser} Object Class which has the OID {@code 2.5.6.21}.
+     *
+     * @return A reference to the {@code pkiUser} Object Class.
+     */
+    public static ObjectClass getPkiUserObjectClass() {
+        return PKI_USER_OBJECT_CLASS;
+    }
+
+    /**
+     * Returns a reference to the {@code residentialPerson} Object Class which has the OID {@code 2.5.6.10}.
      *
      * @return A reference to the {@code residentialPerson} Object Class.
      */
@@ -2139,8 +2157,16 @@
     }
 
     /**
-     * Returns a reference to the {@code subschema} Object Class which has the
-     * OID {@code 2.5.20.1}.
+     * Returns a reference to the {@code strongAuthenticationUser} Object Class which has the OID {@code 2.5.6.15}.
+     *
+     * @return A reference to the {@code strongAuthenticationUser} Object Class.
+     */
+    public static ObjectClass getStrongAuthenticationUserObjectClass() {
+        return STRONG_AUTHENTICATION_USER_OBJECT_CLASS;
+    }
+
+    /**
+     * Returns a reference to the {@code subschema} Object Class which has the OID {@code 2.5.20.1}.
      *
      * @return A reference to the {@code subschema} Object Class.
      */
@@ -2149,8 +2175,7 @@
     }
 
     /**
-     * Returns a reference to the {@code top} Object Class which has the OID
-     * {@code 2.5.6.0}.
+     * Returns a reference to the {@code top} Object Class which has the OID {@code 2.5.6.0}.
      *
      * @return A reference to the {@code top} Object Class.
      */
@@ -2159,12 +2184,20 @@
     }
 
     /**
-     * Returns a reference to the {@code uidObject} Object Class which has the
-     * OID {@code 1.3.6.1.1.3.1}.
+     * Returns a reference to the {@code uidObject} Object Class which has the OID {@code 1.3.6.1.1.3.1}.
      *
      * @return A reference to the {@code uidObject} Object Class.
      */
     public static ObjectClass getUIDObjectObjectClass() {
         return UID_OBJECT_OBJECT_CLASS;
     }
+
+    /**
+     * Returns a reference to the {@code userSecurityInformation} Object Class which has the OID {@code 2.5.6.18}.
+     *
+     * @return A reference to the {@code userSecurityInformation} Object Class.
+     */
+    public static ObjectClass getUserSecurityInformationObjectClass() {
+        return USER_SECURITY_INFORMATION_OBJECT_CLASS;
+    }
 }
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CoreSchemaImpl.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CoreSchemaImpl.java
index 3c6ffe9..71768fa 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CoreSchemaImpl.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/CoreSchemaImpl.java
@@ -23,6 +23,7 @@
  *
  *      Copyright 2009-2010 Sun Microsystems, Inc.
  *      Portions copyright 2013-2014 ForgeRock AS.
+ *      Portions copyright 2014 Manuel Gaupp
  */
 package org.forgerock.opendj.ldap.schema;
 
@@ -57,6 +58,9 @@
     private static final Map<String, List<String>> RFC4519_ORIGIN = Collections.singletonMap(
             SCHEMA_PROPERTY_ORIGIN, Collections.singletonList("RFC 4519"));
 
+    private static final Map<String, List<String>> RFC4523_ORIGIN = Collections.singletonMap(
+            SCHEMA_PROPERTY_ORIGIN, Collections.singletonList("RFC 4523"));
+
     private static final Map<String, List<String>> RFC4530_ORIGIN = Collections.singletonMap(
             SCHEMA_PROPERTY_ORIGIN, Collections.singletonList("RFC 4530"));
 
@@ -80,6 +84,7 @@
         defaultObjectClasses(builder);
 
         addRFC4519(builder);
+        addRFC4523(builder);
         addRFC4530(builder);
         addRFC3045(builder);
         addRFC3112(builder);
@@ -550,6 +555,101 @@
                         .singleton("uid"), attrs, ObjectClassType.AUXILIARY, RFC4519_ORIGIN, false);
     }
 
+    private static void addRFC4523(final SchemaBuilder builder) {
+        builder.buildSyntax(SYNTAX_CERTLIST_OID).description(SYNTAX_CERTLIST_DESCRIPTION)
+                .extraProperties(RFC4523_ORIGIN).implementation(new CertificateListSyntaxImpl()).addToSchema();
+        builder.buildSyntax(SYNTAX_CERTPAIR_OID).description(SYNTAX_CERTPAIR_DESCRIPTION)
+                .extraProperties(RFC4523_ORIGIN).implementation(new CertificatePairSyntaxImpl()).addToSchema();
+        builder.buildSyntax(SYNTAX_CERTIFICATE_OID).description(SYNTAX_CERTIFICATE_DESCRIPTION)
+                .extraProperties(RFC4523_ORIGIN).implementation(new CertificateSyntaxImpl()).addToSchema();
+        builder.buildSyntax(SYNTAX_CERTIFICATE_EXACT_ASSERTION_OID)
+                .description(SYNTAX_CERTIFICATE_EXACT_ASSERTION_DESCRIPTION).extraProperties(RFC4523_ORIGIN)
+                .implementation(new CertificateExactAssertionSyntaxImpl()).addToSchema();
+        builder.buildSyntax(SYNTAX_SUPPORTED_ALGORITHM_OID).description(SYNTAX_SUPPORTED_ALGORITHM_DESCRIPTION)
+                .extraProperties(RFC4523_ORIGIN).implementation(new SupportedAlgorithmSyntaxImpl()).addToSchema();
+
+        builder.buildMatchingRule(EMR_CERTIFICATE_EXACT_OID).names(EMR_CERTIFICATE_EXACT_NAME)
+                .syntaxOID(SYNTAX_CERTIFICATE_EXACT_ASSERTION_OID).extraProperties(RFC4523_ORIGIN)
+                .implementation(new CertificateExactMatchingRuleImpl()).addToSchema();
+
+        builder.addAttributeType("2.5.4.36", Collections.singletonList("userCertificate"),
+                "X.509 user certificate", false, null, EMR_CERTIFICATE_EXACT_OID, null,
+                null, null, SYNTAX_CERTIFICATE_OID, false, false, false,
+                AttributeUsage.USER_APPLICATIONS, RFC4523_ORIGIN, false);
+        builder.addAttributeType("2.5.4.37", Collections.singletonList("cACertificate"),
+                "X.509 CA certificate", false, null, EMR_CERTIFICATE_EXACT_OID, null,
+                null, null, SYNTAX_CERTIFICATE_OID, false, false, false,
+                AttributeUsage.USER_APPLICATIONS, RFC4523_ORIGIN, false);
+        builder.addAttributeType("2.5.4.38", Collections.singletonList("authorityRevocationList"),
+                "X.509 authority revocation list", false, null, EMR_OCTET_STRING_OID, null,
+                null, null, SYNTAX_CERTLIST_OID, false, false, false,
+                AttributeUsage.USER_APPLICATIONS, RFC4523_ORIGIN, false);
+        builder.addAttributeType("2.5.4.39", Collections.singletonList("certificateRevocationList"),
+                "X.509 certificate revocation list", false, null, EMR_OCTET_STRING_OID, null,
+                null, null, SYNTAX_CERTLIST_OID, false, false, false,
+                AttributeUsage.USER_APPLICATIONS, RFC4523_ORIGIN, false);
+        builder.addAttributeType("2.5.4.40", Collections.singletonList("crossCertificatePair"),
+                "X.509 cross certificate pair", false, null, EMR_OCTET_STRING_OID, null,
+                null, null, SYNTAX_CERTPAIR_OID, false, false, false,
+                AttributeUsage.USER_APPLICATIONS, RFC4523_ORIGIN, false);
+        builder.addAttributeType("2.5.4.52", Collections.singletonList("supportedAlgorithms"),
+                "X.509 supported algorithms", false, null, EMR_OCTET_STRING_OID, null,
+                null, null, SYNTAX_SUPPORTED_ALGORITHM_OID, false, false, false,
+                AttributeUsage.USER_APPLICATIONS, RFC4523_ORIGIN, false);
+        builder.addAttributeType("2.5.4.53", Collections.singletonList("deltaRevocationList"),
+                "X.509 delta revocation list", false, null, EMR_OCTET_STRING_OID, null,
+                null, null, SYNTAX_CERTLIST_OID, false, false, false,
+                AttributeUsage.USER_APPLICATIONS, RFC4523_ORIGIN, false);
+
+        builder.addObjectClass("2.5.6.21", Collections.singletonList("pkiUser"),
+                "X.509 PKI User", false, Collections.singleton(TOP_OBJECTCLASS_NAME), EMPTY_STRING_SET,
+                Collections.singleton("userCertificate"), ObjectClassType.AUXILIARY, RFC4523_ORIGIN, false);
+
+        Set<String> attrs = new HashSet<String>();
+        attrs.add("cACertificate");
+        attrs.add("certificateRevocationList");
+        attrs.add("authorityRevocationList");
+        attrs.add("crossCertificatePair");
+
+        builder.addObjectClass("2.5.6.22", Collections.singletonList("pkiCA"),
+                "X.509 PKI Certificate Authority", false, Collections.singleton(TOP_OBJECTCLASS_NAME),
+                EMPTY_STRING_SET, attrs, ObjectClassType.AUXILIARY, RFC4523_ORIGIN, false);
+
+        attrs = new HashSet<String>();
+        attrs.add("certificateRevocationList");
+        attrs.add("authorityRevocationList");
+        attrs.add("deltaRevocationList");
+
+        builder.addObjectClass("2.5.6.19", Collections.singletonList("cRLDistributionPoint"),
+                "X.509 CRL distribution point", false, Collections.singleton(TOP_OBJECTCLASS_NAME),
+                Collections.singleton("cn"), attrs, ObjectClassType.STRUCTURAL, RFC4523_ORIGIN, false);
+
+        builder.addObjectClass("2.5.6.23", Collections.singletonList("deltaCRL"),
+                "X.509 delta CRL", false, Collections.singleton(TOP_OBJECTCLASS_NAME), EMPTY_STRING_SET,
+                Collections.singleton("deltaRevocationList"), ObjectClassType.AUXILIARY, RFC4523_ORIGIN, false);
+        builder.addObjectClass("2.5.6.15", Collections.singletonList("strongAuthenticationUser"),
+                "X.521 strong authentication user", false, Collections.singleton(TOP_OBJECTCLASS_NAME),
+                Collections.singleton("userCertificate"), EMPTY_STRING_SET, ObjectClassType.AUXILIARY,
+                RFC4523_ORIGIN, false);
+        builder.addObjectClass("2.5.6.18", Collections.singletonList("userSecurityInformation"),
+                "X.521 user security information", false, Collections.singleton(TOP_OBJECTCLASS_NAME), EMPTY_STRING_SET,
+                Collections.singleton("supportedAlgorithms"), ObjectClassType.AUXILIARY, RFC4523_ORIGIN, false);
+
+        attrs = new HashSet<String>();
+        attrs.add("authorityRevocationList");
+        attrs.add("certificateRevocationList");
+        attrs.add("cACertificate");
+
+        builder.addObjectClass("2.5.6.16", Collections.singletonList("certificationAuthority"),
+                "X.509 certificate authority", false, Collections.singleton(TOP_OBJECTCLASS_NAME), attrs,
+                Collections.singleton("crossCertificatePair"), ObjectClassType.AUXILIARY, RFC4523_ORIGIN, false);
+
+        builder.addObjectClass("2.5.6.16.2", Collections.singletonList("certificationAuthority-V2"),
+                "X.509 certificate authority, version 2", false, Collections.singleton("certificationAuthority"),
+                EMPTY_STRING_SET, Collections.singleton("deltaRevocationList"), ObjectClassType.AUXILIARY,
+                RFC4523_ORIGIN, false);
+    }
+
     private static void addRFC4530(final SchemaBuilder builder) {
         builder.buildSyntax(SYNTAX_UUID_OID).description(SYNTAX_UUID_DESCRIPTION).extraProperties(RFC4530_ORIGIN)
                 .implementation(new UUIDSyntaxImpl()).addToSchema();
@@ -854,12 +954,6 @@
                 .extraProperties(RFC4512_ORIGIN).implementation(new BitStringSyntaxImpl()).addToSchema();
         builder.buildSyntax(SYNTAX_BOOLEAN_OID).description(SYNTAX_BOOLEAN_DESCRIPTION).extraProperties(RFC4512_ORIGIN)
                 .implementation(new BooleanSyntaxImpl()).addToSchema();
-        builder.buildSyntax(SYNTAX_CERTLIST_OID).description(SYNTAX_CERTLIST_DESCRIPTION)
-                .extraProperties(RFC4512_ORIGIN).implementation(new CertificateListSyntaxImpl()).addToSchema();
-        builder.buildSyntax(SYNTAX_CERTPAIR_OID).description(SYNTAX_CERTPAIR_DESCRIPTION)
-                .extraProperties(RFC4512_ORIGIN).implementation(new CertificatePairSyntaxImpl()).addToSchema();
-        builder.buildSyntax(SYNTAX_CERTIFICATE_OID).description(SYNTAX_CERTIFICATE_DESCRIPTION)
-                .extraProperties(RFC4512_ORIGIN).implementation(new CertificateSyntaxImpl()).addToSchema();
         builder.buildSyntax(SYNTAX_COUNTRY_STRING_OID).description(SYNTAX_COUNTRY_STRING_DESCRIPTION)
                 .extraProperties(RFC4512_ORIGIN).implementation(new CountryStringSyntaxImpl()).addToSchema();
         builder.buildSyntax(SYNTAX_DELIVERY_METHOD_OID).description(SYNTAX_DELIVERY_METHOD_DESCRIPTION)
@@ -920,8 +1014,6 @@
                 .extraProperties(RFC2252_ORIGIN).implementation(new ProtocolInformationSyntaxImpl()).addToSchema();
         builder.buildSyntax(SYNTAX_SUBSTRING_ASSERTION_OID).description(SYNTAX_SUBSTRING_ASSERTION_DESCRIPTION)
                 .extraProperties(RFC4512_ORIGIN).implementation(new SubstringAssertionSyntaxImpl()).addToSchema();
-        builder.buildSyntax(SYNTAX_SUPPORTED_ALGORITHM_OID).description(SYNTAX_SUPPORTED_ALGORITHM_DESCRIPTION)
-                .extraProperties(RFC4512_ORIGIN).implementation(new SupportedAlgorithmSyntaxImpl()).addToSchema();
         builder.buildSyntax(SYNTAX_TELEPHONE_OID).description(SYNTAX_TELEPHONE_DESCRIPTION)
                 .extraProperties(RFC4512_ORIGIN).implementation(new TelephoneNumberSyntaxImpl()).addToSchema();
         builder.buildSyntax(SYNTAX_TELETEX_TERM_ID_OID).description(SYNTAX_TELETEX_TERM_ID_DESCRIPTION)
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/GenerateCoreSchema.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/GenerateCoreSchema.java
index 5571b7e..c76c950 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/GenerateCoreSchema.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/GenerateCoreSchema.java
@@ -22,6 +22,7 @@
  *
  *
  *      Copyright 2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 Manuel Gaupp
  */
 
 package org.forgerock.opendj.ldap.schema;
@@ -60,8 +61,8 @@
             }
 
             final String name = syntax.getDescription().replaceAll(" Syntax$", "");
-            final String fieldName =
-                    name.replace(" ", "_").toUpperCase(Locale.ENGLISH).concat("_SYNTAX");
+            final String fieldName = name.replace(" ", "_").replaceAll("[.-]", "")
+                    .toUpperCase(Locale.ENGLISH).concat("_SYNTAX");
             syntaxes.put(fieldName, syntax);
         }
 
@@ -93,7 +94,7 @@
                 continue;
             }
             final String name = objectClass.getNameOrOID();
-            final String fieldName = splitNameIntoWords(name).concat("_OBJECT_CLASS");
+            final String fieldName = splitNameIntoWords(name.replace("-", "")).concat("_OBJECT_CLASS");
 
             objectClasses.put(fieldName, objectClass);
         }
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java
index 845f874..8c62757 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java
@@ -23,6 +23,7 @@
  *
  *      Copyright 2009-2010 Sun Microsystems, Inc.
  *      Portions copyright 2011-2012 ForgeRock AS
+ *      Portions Copyright 2014 Manuel Gaupp
  */
 package org.forgerock.opendj.ldap.schema;
 
@@ -95,6 +96,11 @@
         }
 
         @Override
+        public boolean allowMalformedCertificates() {
+            return true;
+        }
+
+        @Override
         public boolean allowZeroLengthDirectoryStrings() {
             return false;
         }
@@ -316,6 +322,8 @@
 
         boolean allowMalformedJPEGPhotos();
 
+        boolean allowMalformedCertificates();
+
         boolean allowNonStandardTelephoneNumbers();
 
         boolean allowZeroLengthDirectoryStrings();
@@ -419,6 +427,11 @@
         }
 
         @Override
+        public boolean allowMalformedCertificates() {
+            return strictImpl.allowMalformedCertificates();
+        }
+
+        @Override
         public boolean allowNonStandardTelephoneNumbers() {
             return strictImpl.allowNonStandardTelephoneNumbers();
         }
@@ -658,6 +671,7 @@
         private final List<LocalizableMessage> warnings;
         private final String schemaName;
         private final boolean allowMalformedJPEGPhotos;
+        private final boolean allowMalformedCertificates;
         private final boolean allowNonStandardTelephoneNumbers;
         private final boolean allowZeroLengthDirectoryStrings;
         private final boolean allowMalformedNamesAndOptions;
@@ -666,6 +680,7 @@
 
         StrictImpl(final String schemaName, final boolean allowMalformedNamesAndOptions,
                 final boolean allowMalformedJPEGPhotos,
+                final boolean allowMalformedCertificates,
                 final boolean allowNonStandardTelephoneNumbers,
                 final boolean allowZeroLengthDirectoryStrings,
                 final Syntax defaultSyntax,
@@ -691,6 +706,7 @@
             this.schemaName = schemaName;
             this.allowMalformedNamesAndOptions = allowMalformedNamesAndOptions;
             this.allowMalformedJPEGPhotos = allowMalformedJPEGPhotos;
+            this.allowMalformedCertificates = allowMalformedCertificates;
             this.allowNonStandardTelephoneNumbers = allowNonStandardTelephoneNumbers;
             this.allowZeroLengthDirectoryStrings = allowZeroLengthDirectoryStrings;
             this.defaultSyntax = defaultSyntax;
@@ -727,6 +743,11 @@
         }
 
         @Override
+        public boolean allowMalformedCertificates() {
+            return allowMalformedCertificates;
+        }
+
+        @Override
         public boolean allowNonStandardTelephoneNumbers() {
             return allowNonStandardTelephoneNumbers;
         }
@@ -1349,6 +1370,7 @@
 
     Schema(final String schemaName, final boolean allowMalformedNamesAndOptions,
             final boolean allowMalformedJPEGPhotos,
+            final boolean allowMalformedCertificates,
             final boolean allowNonStandardTelephoneNumbers,
             final boolean allowZeroLengthDirectoryStrings,
             final Syntax defaultSyntax,
@@ -1373,9 +1395,9 @@
             final List<LocalizableMessage> warnings) {
         impl =
                 new StrictImpl(schemaName, allowMalformedNamesAndOptions, allowMalformedJPEGPhotos,
-                        allowNonStandardTelephoneNumbers, allowZeroLengthDirectoryStrings,
-                        defaultSyntax, defaultMatchingRule, numericOID2Syntaxes,
-                        numericOID2MatchingRules, numericOID2MatchingRuleUses,
+                        allowMalformedCertificates, allowNonStandardTelephoneNumbers,
+                        allowZeroLengthDirectoryStrings, defaultSyntax, defaultMatchingRule,
+                        numericOID2Syntaxes, numericOID2MatchingRules, numericOID2MatchingRuleUses,
                         numericOID2AttributeTypes, numericOID2ObjectClasses, numericOID2NameForms,
                         numericOID2ContentRules, id2StructureRules, name2MatchingRules,
                         name2MatchingRuleUses, name2AttributeTypes, name2ObjectClasses,
@@ -1426,6 +1448,21 @@
     }
 
     /**
+     * Returns {@code true} if the Certificate syntax defined for this
+     * schema allows values which do not conform to the X.509
+     * specifications.
+     * <p>
+     * By default this compatibility option is set to {@code true}.
+     *
+     * @return {@code true} if the Certificate syntax defined for this
+     *         schema allows values which do not conform to the X.509
+     *         specifications.
+     */
+    public boolean allowMalformedCertificates() {
+        return impl.allowMalformedCertificates();
+    }
+
+    /**
      * Returns {@code true} if the Telephone Number syntax defined for this
      * schema allows values which do not conform to the E.123 international
      * telephone number format.
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
index b65f9d0..fc5956a 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
@@ -23,6 +23,7 @@
  *
  *      Copyright 2009-2010 Sun Microsystems, Inc.
  *      Portions copyright 2011-2014 ForgeRock AS
+ *      Portions Copyright 2014 Manuel Gaupp
  */
 
 package org.forgerock.opendj.ldap.schema;
@@ -152,6 +153,7 @@
     private boolean allowZeroLengthDirectoryStrings;
     private boolean allowMalformedNamesAndOptions;
     private boolean allowMalformedJPEGPhotos;
+    private boolean allowMalformedCertificates;
 
     private String defaultSyntaxOID;
     private String defaultMatchingRuleOID;
@@ -2257,6 +2259,24 @@
     }
 
     /**
+     * Specifies whether or not the Certificate syntax should allow values which
+     * do not conform to the X.509 specifications.
+     * <p>
+     * By default this compatibility option is set to {@code true}.
+     *
+     * @param allowMalformedCertificates
+     *            {@code true} if the Certificate syntax should allow values
+     *            which do not conform to the X.509 specifications.
+     * @return A reference to this {@code SchemaBuilder}.
+     */
+    public SchemaBuilder allowMalformedCertificates(final boolean allowMalformedCertificates) {
+        lazyInitBuilder();
+
+        this.allowMalformedCertificates = allowMalformedCertificates;
+        return this;
+    }
+
+    /**
      * Specifies whether or not the Telephone Number syntax should allow values
      * which do not conform to the E.123 international telephone number format.
      * <p>
@@ -2526,7 +2546,7 @@
 
         final Schema schema =
                 new Schema(localSchemaName, allowMalformedNamesAndOptions,
-                        allowMalformedJPEGPhotos, allowNonStandardTelephoneNumbers,
+                        allowMalformedJPEGPhotos, allowMalformedCertificates, allowNonStandardTelephoneNumbers,
                         allowZeroLengthDirectoryStrings, defaultSyntax, defaultMatchingRule,
                         numericOID2Syntaxes, numericOID2MatchingRules, numericOID2MatchingRuleUses,
                         numericOID2AttributeTypes, numericOID2ObjectClasses, numericOID2NameForms,
@@ -2805,6 +2825,7 @@
         if (numericOID2Syntaxes == null) {
             allowMalformedNamesAndOptions = true;
             allowMalformedJPEGPhotos = true;
+            allowMalformedCertificates = true;
             allowNonStandardTelephoneNumbers = true;
             allowZeroLengthDirectoryStrings = false;
             defaultSyntaxOID = SchemaConstants.SYNTAX_OCTET_STRING_OID;
@@ -2838,6 +2859,7 @@
 
             allowMalformedNamesAndOptions = copyOnWriteSchema.allowMalformedNamesAndOptions();
             allowMalformedJPEGPhotos = copyOnWriteSchema.allowMalformedJPEGPhotos();
+            allowMalformedCertificates = copyOnWriteSchema.allowMalformedCertificates();
             allowNonStandardTelephoneNumbers = copyOnWriteSchema.allowNonStandardTelephoneNumbers();
             allowZeroLengthDirectoryStrings = copyOnWriteSchema.allowZeroLengthDirectoryStrings();
             defaultSyntaxOID = copyOnWriteSchema.getDefaultSyntax().getOID();
@@ -2853,6 +2875,7 @@
 
         this.allowMalformedNamesAndOptions = true;
         this.allowMalformedJPEGPhotos = true;
+        this.allowMalformedCertificates = true;
         this.allowNonStandardTelephoneNumbers = true;
         this.allowZeroLengthDirectoryStrings = false;
         this.defaultSyntaxOID = null;
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaConstants.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaConstants.java
index cd23d79..db275cb 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaConstants.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaConstants.java
@@ -22,6 +22,7 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 Manuel Gaupp
  */
 package org.forgerock.opendj.ldap.schema;
 
@@ -217,6 +218,16 @@
     public static final String EMR_CASE_IGNORE_LIST_OID = "2.5.13.11";
 
     /**
+     * The name for the certificateExactMatch equality matching rule.
+     */
+    public static final String EMR_CERTIFICATE_EXACT_NAME = "certificateExactMatch";
+
+    /**
+     * The OID for the certificateExactMatch equality matching rule.
+     */
+    public static final String EMR_CERTIFICATE_EXACT_OID = "2.5.13.34";
+
+    /**
      * The name for the directoryStringFirstComponentMatch equality matching
      * rule.
      */
@@ -699,6 +710,22 @@
     public static final String SYNTAX_CERTIFICATE_OID = "1.3.6.1.4.1.1466.115.121.1.8";
 
     /**
+     * The description for the certificate exact assertion attribute syntax.
+     */
+    public static final String SYNTAX_CERTIFICATE_EXACT_ASSERTION_DESCRIPTION = "X.509 Certificate Exact Assertion";
+
+    /**
+     * The name for the certificate exact assertion attribute syntax.
+     */
+    public static final String SYNTAX_CERTIFICATE_EXACT_ASSERTION_NAME = "CertificateExactAssertion";
+
+    /**
+     * The OID for the Certificate Exact Assertion syntax used for assertion
+     * values in extensible match filters.
+     */
+    public static final String SYNTAX_CERTIFICATE_EXACT_ASSERTION_OID = "1.3.6.1.1.15.1";
+
+    /**
      * The description for the certificate list attribute syntax.
      */
     public static final String SYNTAX_CERTLIST_DESCRIPTION = "Certificate List";
diff --git a/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties b/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties
index c546db1..4cba3a8 100755
--- a/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties
+++ b/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties
@@ -23,6 +23,7 @@
 #
 #      Copyright 2010 Sun Microsystems, Inc.
 #      Portions copyright 2011-2014 ForgeRock AS
+#      Portions Copyright 2014 Manuel Gaupp
 #
 ERR_ATTR_SYNTAX_UNKNOWN_APPROXIMATE_MATCHING_RULE=Unable to retrieve \
  approximate matching rule %s used as the default for the %s attribute syntax. \
@@ -474,7 +475,7 @@
 ERR_NAMEFORM_VALIDATION_FAIL=Validation of name form definition %s \
  failed and will be removed from the schema: %s
 ERR_NO_SUBSCHEMA_SUBENTRY_ATTR=The entry %s does not include \
- a subschemaSubentry attribute 
+ a subschemaSubentry attribute
 ERR_RDN_TYPE_NOT_FOUND=The RDN "%s" could not be parsed due to the \
  following reason: %s
 ERR_DN_TYPE_NOT_FOUND=The DN "%s" could not be parsed due to the \
@@ -493,6 +494,43 @@
 ERR_INVALID_SUBSCHEMA_SUBENTRY_ATTR=The entry %s includes \
  a subschemaSubentry attribute but it contains an invalid distinguished \
  name "%s": %s
+WARN_GSER_PATTERN_NO_MATCH=The GSER value does not contain a String matching \
+ the pattern %s at the current position: %s
+WARN_GSER_NO_VALID_SEPARATOR=The GSER value does not contain a separator at \
+ the current position: %s
+WARN_GSER_NO_VALID_STRING=The GSER value does not contain a valid String value \
+ at the current position: %s
+WARN_GSER_NO_VALID_INTEGER=The GSER value does not contain a valid integer \
+ value at the current position: %s
+WARN_GSER_NO_VALID_IDENTIFIER=The GSER value does not contain a valid \
+ identifier at the current position: %s
+WARN_GSER_SPACE_CHAR_EXPECTED=The GSER value does not contain a whitespace \
+ character at the current position: %s
+WARN_GSER_NO_VALID_IDENTIFIEDCHOICE=The GSER value does not contain a valid \
+ IdentifiedChoiceValue at the current position: %s
+ERR_MR_CERTIFICATE_MATCH_PARSE_ERROR=The value could not be parsed as an X.509 \
+ certificate: "%s"
+ERR_MR_CERTIFICATE_MATCH_INVALID_DN=The provided value "%s" could not be \
+ parsed as a valid distinguished name because an error occurred while trying \
+ to parse the DN portion:  %s
+ERR_MR_CERTIFICATE_MATCH_IDENTIFIER_NOT_FOUND=The identifier "%s" could not be \
+ found at the correct position
+ERR_MR_CERTIFICATE_MATCH_EXPECTED_END=The GSER value contains additional \
+ characters at the end of the assertion
+ERR_MR_CERTIFICATE_MATCH_GSER_INVALID=An error occured while parsing the GSER \
+ String: "%s"
+ERR_SYNTAX_CERTIFICATE_NOTVALID=The provided value is not a valid X.509 \
+ Certificate: %s
+ERR_SYNTAX_CERTIFICATE_ONLY_VALID_V23=The provided value is not a valid X.509 \
+ Certificate because "%s" is only valid in X.509 v2/v3
+ERR_SYNTAX_CERTIFICATE_ONLY_VALID_V3=The provided value is not a valid X.509 \
+ Certificate because "%s" is only valid in X.509 v3
+ERR_SYNTAX_CERTIFICATE_INVALID_VERSION=The provided value is not a valid X.509 \
+ Certificate because it contains an invalid version number (%d)
+ERR_SYNTAX_CERTIFICATE_INVALID_DER=The provided value is not a valid X.509 \
+ Certificate because it contains invalid DER encodings
+ERR_SYNTAX_CERTIFICATE_NO_ELEMENT_EXPECTED=The provided value is not a valid X.509 \
+ Certificate because it contains additional ASN.1 elements
 #
 # Core messages
 #
@@ -819,7 +857,7 @@
 ERR_SUBTREE_DELETE_INVALID_CONTROL_VALUE=Cannot decode the provided \
  subtree delete control because it contains a value
 ERR_ASN1_UNEXPECTED_TAG=Encountered unexpected tag while reading \
- ASN.1 element (expected=%d, got=%d)
+ ASN.1 element (expected=0x%02x, got=0x%02x)
 ERR_AUTHZIDREQ_CONTROL_HAS_VALUE=Cannot decode the provided \
  control as an authorization identity request control because the provided \
  control had a value but the authorization identity request control should not \
@@ -1396,7 +1434,7 @@
 REJECTED_CHANGE_FAIL_MODIFY=The entry "%s" could not be modified because the \
  entry does not exist
 REJECTED_CHANGE_FAIL_MODIFYDN=The entry "%s" could not be renamed because the \
- entry does not exist 
+ entry does not exist
 REJECTED_CHANGE_FAIL_MODIFYDN_DUPE=The entry "%s" could not be renamed because \
  there is already an entry with the same name
 FUNCTIONS_TO_INTEGER_FAIL=The provided value "%s" could not be parsed as an \
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/io/ASN1ReaderTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/io/ASN1ReaderTestCase.java
index bd59b1a..bbf6957 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/io/ASN1ReaderTestCase.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/io/ASN1ReaderTestCase.java
@@ -23,6 +23,7 @@
  *
  *      Copyright 2010 Sun Microsystems, Inc.
  *      Portions copyright 2012-2013 ForgeRock AS.
+ *      Portions Copyright 2014 Manuel Gaupp
  */
 package org.forgerock.opendj.io;
 
@@ -753,6 +754,36 @@
     }
 
     /**
+     * Tests the <CODE>skipElement</CODE> method providing a specific type.
+     */
+    @Test()
+    public void testSkipElementWithType() throws Exception {
+        final byte[] b =
+                new byte[] { 0x30, 0x09, 0x02, 0x01, 0x00, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02 };
+        final ASN1Reader reader = getReader(b, 0);
+        reader.readStartSequence();
+        reader.skipElement(ASN1.UNIVERSAL_INTEGER_TYPE);
+        reader.skipElement(ASN1.UNIVERSAL_INTEGER_TYPE);
+        assertEquals(reader.readInteger(), 2);
+        reader.readEndSequence();
+    }
+
+    /**
+     * Tests the <CODE>skipElement</CODE> method providing a wrong type.
+     */
+    @Test(expectedExceptions = { DecodeException.class, IOException.class })
+    public void testSkipElementWithWrongType() throws Exception {
+        final byte[] b =
+                new byte[] { 0x30, 0x09, 0x02, 0x01, 0x00, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02 };
+        final ASN1Reader reader = getReader(b, 0);
+        reader.readStartSequence();
+        reader.readInteger();
+        reader.skipElement(ASN1.UNIVERSAL_OCTET_STRING_TYPE);
+        assertEquals(reader.readInteger(), 2);
+        reader.readEndSequence();
+    }
+
+    /**
      * Gets the reader to be use for the unit tests.
      *
      * @param b
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/GSERParserTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/GSERParserTestCase.java
new file mode 100644
index 0000000..a4d25c4
--- /dev/null
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/GSERParserTestCase.java
@@ -0,0 +1,299 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2013-2014 Manuel Gaupp
+ */
+package org.forgerock.opendj.ldap;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
+/**
+ * This class tests the GSERParser.
+ */
+public class GSERParserTestCase extends SdkTestCase {
+
+    /**
+     * Try to create a GSER Parser with <CODE>null</CODE> as parameter.
+     */
+    @Test(expectedExceptions = { NullPointerException.class })
+    public void testGSERParserInitWithNull() throws Exception {
+        GSERParser parser = new GSERParser(null);
+    }
+
+    /**
+     * Test the <CODE>hasNext</CODE> method.
+     */
+    @Test()
+    public void testHasNext() throws Exception {
+        GSERParser parser = new GSERParser("0");
+        assertTrue(parser.hasNext());
+        assertEquals(parser.nextInteger(), 0);
+        assertFalse(parser.hasNext());
+    }
+
+    /**
+     * Test the <CODE>skipSP</CODE> method.
+     */
+    @Test()
+    public void testSkipSP() throws Exception {
+        String[] values = {" 42", "  42", "42"};
+        for (String value : values) {
+            GSERParser parser = new GSERParser(value);
+            assertEquals(parser.skipSP().nextInteger(), 42);
+            assertFalse(parser.hasNext());
+        }
+    }
+
+    /**
+     * Test the <CODE>skipMSP</CODE> method.
+     */
+    @Test()
+    public void testSkipMSP() throws Exception {
+        String[] values = {" 42", "  42", "           42"};
+        for (String value : values) {
+            GSERParser parser = new GSERParser(value);
+            assertEquals(parser.skipMSP().nextInteger(), 42);
+            assertFalse(parser.hasNext());
+        }
+    }
+
+    /**
+     * Verify that <CODE>skipMSP</CODE> requires at least one space.
+     */
+    @Test(expectedExceptions = { DecodeException.class })
+    public void testSkipMSPwithZeroSpaces() throws Exception {
+        GSERParser parser = new GSERParser("42");
+        parser.skipMSP();
+    }
+
+    /**
+     * Create data for the <CODE>testSequence</CODE> test case.
+     */
+    @DataProvider(name = "sequenceValues")
+    public Object[][] createSequenceValues() {
+        return new Object[][]{
+            {"{123,122}", true},
+            {"{ 123,1}", true},
+            {"{ 123   ,   1   }", true},
+            {"{0123,}", false},
+            {"{0123 42 }", false},
+            {"{123  , 11 ", false},
+            {" {123  , 11 ", false},
+            {" 123  , 11}", false}
+        };
+    }
+
+    /**
+     * Test sequence parsing.
+     */
+    @Test(dataProvider = "sequenceValues")
+    public void testSequence(String value, boolean expectedResult) throws Exception {
+        GSERParser parser = new GSERParser(value);
+        boolean result = true;
+        try {
+            parser.readStartSequence();
+            parser.nextInteger();
+            parser.skipSP().skipSeparator();
+            parser.nextInteger();
+            parser.readEndSequence();
+            if (parser.hasNext()) {
+                result = false;
+            }
+        } catch (DecodeException e) {
+            result = false;
+        }
+        assertEquals(expectedResult, result);
+    }
+
+    /**
+     * Create data for the <CODE>testString</CODE> test case.
+     */
+    @DataProvider(name = "stringValues")
+    public Object[][] createStringValues() {
+        return new Object[][]{
+            {"\"\"", true},
+            {"\"escaped\"\"dquotes\"", true},
+            {"\"valid Unicode \u00D6\u00C4\"", true},
+            {"\"only one \" \"", false},
+            {"invalid without dquotes", false},
+            {"\"missing end", false},
+            {"\"valid string\" with extra trailing characters", false}
+        };
+    }
+
+    /**
+     * Test the parsing of String values.
+     */
+    @Test(dataProvider = "stringValues")
+    public void testString(String value, boolean expectedResult) throws Exception {
+        GSERParser parser = new GSERParser(value);
+        boolean result = true;
+        try {
+            assertNotNull(parser.nextString());
+            if (parser.hasNext()) {
+                result = false;
+            }
+        } catch (DecodeException e) {
+            result = false;
+        }
+        assertEquals(expectedResult, result);
+    }
+
+    /**
+     * Create data for the <CODE>testInteger</CODE> test case.
+     */
+    @DataProvider(name = "integerValues")
+    public Object[][] createIntegerValues() {
+        return new Object[][]{
+            {"0123456", true},
+            {"42", true},
+            {"0", true},
+            {"", false},
+            {"0xFF", false},
+            {"NULL", false},
+            {"Not a Number", false}
+        };
+    }
+
+    /**
+     * Create data for the <CODE>testBigInteger</CODE> test case.
+     */
+    @DataProvider(name = "bigIntegerValues")
+    public Object[][] createBigIntegerValues() {
+        return new Object[][]{
+            {"0123456", true},
+            {"42", true},
+            {"0", true},
+            {"", false},
+            {"0xFF", false},
+            {"NULL", false},
+            {"Not a Number", false},
+            {"2147483648", true}
+        };
+    }
+
+    /**
+     * Test the parsing of Integer values.
+     */
+    @Test(dataProvider = "integerValues")
+    public void testInteger(String value, boolean expectedResult) throws Exception {
+        GSERParser parser = new GSERParser(value);
+        boolean result = true;
+        try {
+            parser.nextInteger();
+            if (parser.hasNext()) {
+                result = false;
+            }
+        } catch (DecodeException e) {
+            result = false;
+        }
+        assertEquals(expectedResult, result);
+    }
+
+    /**
+     * Test the parsing of BigInteger values.
+     */
+    @Test(dataProvider = "bigIntegerValues")
+    public void testBigInteger(String value, boolean expectedResult) throws Exception {
+        GSERParser parser = new GSERParser(value);
+        boolean result = true;
+        try {
+            parser.nextBigInteger();
+            if (parser.hasNext()) {
+                result = false;
+            }
+        } catch (DecodeException e) {
+            result = false;
+        }
+        assertEquals(expectedResult, result);
+    }
+
+    /**
+     * Create data for the <CODE>testNamedValueIdentifier</CODE> test case.
+     */
+    @DataProvider(name = "namedValueIdentifierValues")
+    public Object[][] createNamedValueIdentifierValues() {
+        return new Object[][]{
+            {"serialNumber ", true},
+            {"issuer ", true},
+            {"Serialnumber ", false},
+            {"0serialnumber ", false},
+            {"serial Number ", false},
+            {"missingSpace", false}
+        };
+    }
+
+    /**
+     * Test the parsing of NamedValue identifiers.
+     */
+    @Test(dataProvider = "namedValueIdentifierValues")
+    public void testNamedValueIdentifier(String value, boolean expectedResult) throws Exception {
+        GSERParser parser = new GSERParser(value);
+        boolean result = true;
+        try {
+            assertNotNull(parser.nextNamedValueIdentifier());
+            if (parser.hasNext()) {
+                result = false;
+            }
+        } catch (DecodeException e) {
+            result = false;
+        }
+        assertEquals(expectedResult, result);
+    }
+
+    /**
+     * Create data for the <CODE>testIdentifiedChoiceIdentifier</CODE> test
+     * case.
+     */
+    @DataProvider(name = "identifiedChoicdeIdentifierValues")
+    public Object[][] createIdentifiedChoicdeIdentifierValues() {
+        return new Object[][]{
+            {"serialNumber:", true},
+            {"issuer1:", true},
+            {"Serialnumber:", false},
+            {"0serialnumber:", false},
+            {"serial Number:", false},
+            {"missingColon", false}
+        };
+    }
+
+    /**
+     * Test the parsing of IdentifiedChoice identifiers.
+     */
+    @Test(dataProvider = "identifiedChoicdeIdentifierValues")
+    public void testIdentifiedChoicdeIdentifier(String value, boolean expectedResult) throws Exception {
+        GSERParser parser = new GSERParser(value);
+        boolean result = true;
+        try {
+            assertNotNull(parser.nextChoiceValueIdentifier());
+            if (parser.hasNext()) {
+                result = false;
+            }
+        } catch (DecodeException e) {
+            result = false;
+        }
+        assertEquals(expectedResult, result);
+    }
+}
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/CertificateExactMatchingRuleImplTest.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/CertificateExactMatchingRuleImplTest.java
new file mode 100644
index 0000000..e1ca1fd
--- /dev/null
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/CertificateExactMatchingRuleImplTest.java
@@ -0,0 +1,212 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Portions Copyright 2013-2014 Manuel Gaupp
+ */
+package org.forgerock.opendj.ldap.schema;
+
+import org.forgerock.opendj.ldap.Assertion;
+import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.ConditionResult;
+import org.forgerock.opendj.ldap.DecodeException;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.*;
+
+/**
+ * This class tests the certificateExactMatch matching rule.
+ */
+public class CertificateExactMatchingRuleImplTest extends SchemaTestCase {
+
+    /**
+     * Generate data for the certificateExactMatch matching rule test.
+     */
+    @DataProvider(name = "certificateExactMatchingRules")
+    public Object[][] createCertificateExactMatchingRuleTest() {
+        String validcert1
+            = "MIICpTCCAg6gAwIBAgIJALeoA6I3ZC/cMA0GCSqGSIb3DQEBBQUAMFYxCzAJBgNV"
+            + "BAYTAlVTMRMwEQYDVQQHEwpDdXBlcnRpb25lMRwwGgYDVQQLExNQcm9kdWN0IERl"
+            + "dmVsb3BtZW50MRQwEgYDVQQDEwtCYWJzIEplbnNlbjAeFw0xMjA1MDIxNjM0MzVa"
+            + "Fw0xMjEyMjExNjM0MzVaMFYxCzAJBgNVBAYTAlVTMRMwEQYDVQQHEwpDdXBlcnRp"
+            + "b25lMRwwGgYDVQQLExNQcm9kdWN0IERldmVsb3BtZW50MRQwEgYDVQQDEwtCYWJz"
+            + "IEplbnNlbjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEApysa0c9qc8FB8gIJ"
+            + "8zAb1pbJ4HzC7iRlVGhRJjFORkGhyvU4P5o2wL0iz/uko6rL9/pFhIlIMbwbV8sm"
+            + "mKeNUPitwiKOjoFDmtimcZ4bx5UTAYLbbHMpEdwSpMC5iF2UioM7qdiwpAfZBd6Z"
+            + "69vqNxuUJ6tP+hxtr/aSgMH2i8ECAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgB"
+            + "hvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYE"
+            + "FLlZD3aKDa8jdhzoByOFMAJDs2osMB8GA1UdIwQYMBaAFLlZD3aKDa8jdhzoByOF"
+            + "MAJDs2osMA0GCSqGSIb3DQEBBQUAA4GBAE5vccY8Ydd7by2bbwiDKgQqVyoKrkUg"
+            + "6CD0WRmc2pBeYX2z94/PWO5L3Fx+eIZh2wTxScF+FdRWJzLbUaBuClrxuy0Y5ifj"
+            + "axuJ8LFNbZtsp1ldW3i84+F5+SYT+xI67ZcoAtwx/VFVI9s5I/Gkmu9f9nxjPpK7"
+            + "1AIUXiE3Qcck";
+
+        String incompleteCert = "MIICpTCCAg6gAwIBAgIJALeoA6I3ZC/cMA0GCSqGSIb3DQEBBQUAMFYxCzAJBgNV";
+
+        String assertion = "{ serialNumber 13233831500277100508, issuer rdnSequence:\""
+                + "CN=Babs Jensen,OU=Product Development,L=Cupertione,C=US\" }";
+        String assertionWithSpaces = "{    serialNumber     13233831500277100508,  issuer  rdnSequence:\""
+                + "CN=Babs Jensen,OU=Product Development, L=Cupertione,C=US\" }";
+        String assertionDNencoded = "{ serialNumber 13233831500277100508, issuer rdnSequence:\""
+                + "cn=BABS Jensen,ou=Product Development,L=Cupertione,c=#5553\" }";
+        String assertionWrong = "{ serialNumber 13233831511277100508, issuer rdnSequence:\""
+                + "CN=Babs Jensen,OU=Product Development,L=Cupertione,C=US\" }";
+
+        return new Object[][]{
+            {ByteString.valueOfBase64(validcert1), ByteString.valueOf(assertion), ConditionResult.TRUE},
+            {ByteString.valueOfBase64(validcert1), ByteString.valueOf(assertionWithSpaces), ConditionResult.TRUE},
+            {ByteString.valueOfBase64(validcert1), ByteString.valueOf(assertionDNencoded), ConditionResult.TRUE},
+            {ByteString.valueOfBase64(validcert1), ByteString.valueOf(assertionWrong), ConditionResult.FALSE},
+            {ByteString.valueOfBase64(incompleteCert), ByteString.valueOfBase64(incompleteCert), ConditionResult.TRUE},
+            {ByteString.valueOfBase64(validcert1), ByteString.valueOfBase64(validcert1), ConditionResult.TRUE}
+        };
+    }
+
+    /**
+     * Generate valid assertion values for the certificateExactMatch matching
+     * rule test.
+     */
+    @DataProvider(name = "certificateExactMatchValidAssertionValues")
+    public Object[][] createCertificateExactMatchingRuleValidAssertionValues() {
+        return new Object[][]{
+            {"{serialNumber 123,issuer rdnSequence:\"c=DE\"}"},
+            {"{serialNumber 123,issuer rdnSequence:\"\"}"},
+            {"{serialNumber 0123,issuer rdnSequence:\"cn=issuer\"}"},
+            {"{  serialNumber  123,  issuer  rdnSequence:\"c=DE\"  }"},
+            {"{serialNumber 123,issuer rdnSequence:\"cn=escaped\"\"dquotes\"}"},
+            {"{serialNumber 123,issuer rdnSequence:\"cn=\u00D6\u00C4\"}"}
+        };
+    }
+
+    /**
+     * Generate invalid assertion values for the certificateExactMatch matching
+     * rule test.
+     */
+    @DataProvider(name = "certificateExactMatchInvalidAssertionValues")
+    public Object[][] createCertificateExactMatchingRuleInvalidAssertionValues() {
+        return new Object[][]{
+            {"{serialnumber 123,issuer rdnSequence:\"c=DE\"}"},
+            {"{serialNumber 123,issuer rdnSequence:\"invalid\"}"},
+            {"{serialNumber 0123,issuer rdnSequence: \"cn=issuer\"}"},
+            {"{  serialNumber  123  ,  issuer  rdnSequence:\"c=DE\"  }  trailing"}
+        };
+    }
+
+    /**
+     * Generate invalid atribute values for the certificateExactMatch matching
+     * rule test.
+     */
+    @DataProvider(name = "certificateExactMatchInvalidAttributeValues")
+    public Object[][] createCertificateExactMatchingRuleInvalidAttributeValues()
+            throws Exception {
+        String invalidcert1
+            = "MIICpTCCAg6gAwIBBQIJALeoA6I3ZC/cMA0GCSqGSIb3DQEBBQUAMFYxCzAJBgNV"
+            + "BAYTAlVTMRMwEQYDVQQHEwpDdXBlcnRpb25lMRwwGgYDVQQLExNQcm9kdWN0IERl"
+            + "dmVsb3BtZW50MRQwEgYDVQQDEwtCYWJzIEplbnNlbjAeFw0xMjA1MDIxNjM0MzVa"
+            + "Fw0xMjEyMjExNjM0MzVaMFYxCzAJBgNVBAYTAlVTMRMwEQYDVQQHEwpDdXBlcnRp"
+            + "b25lMRwwGgYDVQQLExNQcm9kdWN0IERldmVsb3BtZW50MRQwEgYDVQQDEwtCYWJz"
+            + "IEplbnNlbjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEApysa0c9qc8FB8gIJ"
+            + "8zAb1pbJ4HzC7iRlVGhRJjFORkGhyvU4P5o2wL0iz/uko6rL9/pFhIlIMbwbV8sm"
+            + "mKeNUPitwiKOjoFDmtimcZ4bx5UTAYLbbHMpEdwSpMC5iF2UioM7qdiwpAfZBd6Z"
+            + "69vqNxuUJ6tP+hxtr/aSgMH2i8ECAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgB"
+            + "hvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYE"
+            + "FLlZD3aKDa8jdhzoByOFMAJDs2osMB8GA1UdIwQYMBaAFLlZD3aKDa8jdhzoByOF"
+            + "MAJDs2osMA0GCSqGSIb3DQEBBQUAA4GBAE5vccY8Ydd7by2bbwiDKgQqVyoKrkUg"
+            + "6CD0WRmc2pBeYX2z94/PWO5L3Fx+eIZh2wTxScF+FdRWJzLbUaBuClrxuy0Y5ifj"
+            + "axuJ8LFNbZtsp1ldW3i84+F5+SYT+xI67ZcoAtwx/VFVI9s5I/Gkmu9f9nxjPpK7"
+            + "1AIUXiE3Qcck";
+
+        String brokencert1
+            = "MIICpTCCAg6gAwIBAgIJALeoA6I3ZC/cMA0GCSqGSIb3DQEBBQUAMFYxCzAJBgNV";
+
+        return new Object[][]{
+            {ByteString.valueOfBase64(invalidcert1)},
+            {ByteString.valueOfBase64(brokencert1)}
+        };
+    }
+
+    /**
+     * Get an instance of the matching rule.
+     *
+     * @return An instance of the matching rule to test.
+     */
+    protected MatchingRule getRule() {
+        return CoreSchema.getCertificateExactMatchingRule();
+    }
+
+    /**
+     * Test the normalization and the comparison of valid values.
+     */
+    @Test(dataProvider = "certificateExactMatchingRules")
+    public void certificateExactMatchingRules(ByteString attributeValue,
+            ByteString assertionValue, ConditionResult result) throws DecodeException {
+        MatchingRule rule = getRule();
+
+        // normalize the 2 provided values and check that they are equal
+        assertEquals(rule.getAssertion(assertionValue).matches(rule.normalizeAttributeValue(attributeValue)), result);
+    }
+
+    /**
+     * Test that valid assertion values are accepted.
+     */
+    @Test(dataProvider = "certificateExactMatchValidAssertionValues")
+    public void certificateExactMatchingRuleValidAssertionValues(String value)
+            throws DecodeException {
+        // Get the instance of the rule to be tested.
+        MatchingRule rule = getRule();
+
+        // normalize the provided assertion values
+        rule.getAssertion(ByteString.valueOf(value));
+    }
+
+    /**
+     * Test that invalid assertion values are rejected.
+     */
+    @Test(dataProvider = "certificateExactMatchInvalidAssertionValues",
+            expectedExceptions = { DecodeException.class })
+    public void certificateExactMatchingRuleInvalidAssertionValues(String value)
+            throws DecodeException {
+        // Get the instance of the rule to be tested.
+        MatchingRule rule = getRule();
+
+        // normalize the provided assertion value
+        rule.getAssertion(ByteString.valueOf(value));
+    }
+
+    /**
+     * Test that invalid attribute values are returned with the original
+     * ByteString.
+     */
+    @Test(dataProvider = "certificateExactMatchInvalidAttributeValues")
+    public void certificateExactMatchingRuleInvalidAttributeValues(ByteString value)
+            throws DecodeException {
+        // Get the instance of the rule to be tested.
+        MatchingRule rule = getRule();
+
+        // normalize the provided assertion value
+        Assertion normalizedAssertionValue = rule.getAssertion(value);
+        assertEquals(normalizedAssertionValue.matches(value), ConditionResult.TRUE);
+    }
+}
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/CertificateSyntaxTest.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/CertificateSyntaxTest.java
new file mode 100644
index 0000000..e89028c
--- /dev/null
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/CertificateSyntaxTest.java
@@ -0,0 +1,166 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2009 Sun Microsystems, Inc.
+ *      Portions copyright 2014 ForgeRock AS.
+ *      Portions Copyright 2014 Manuel Gaupp
+ */
+package org.forgerock.opendj.ldap.schema;
+
+import org.forgerock.i18n.LocalizableMessageBuilder;
+import org.forgerock.opendj.ldap.ByteString;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import static org.forgerock.opendj.ldap.schema.SchemaConstants.SYNTAX_CERTIFICATE_OID;
+import static org.testng.Assert.fail;
+
+/**
+ * Certificate syntax tests.
+ */
+public class CertificateSyntaxTest extends SchemaTestCase {
+
+    /**
+     * Create data for the testAcceptableValues test. This should be a table of
+     * tables with 2 elements. The first one should be the value to test, the
+     * second the expected result of the test.
+     *
+     * @return a table containing data for the testAcceptableValues Test.
+     */
+    @DataProvider(name = "acceptableValues")
+    public Object[][] createAcceptableValues() {
+        String validcert1
+            = "MIICpTCCAg6gAwIBAgIJALeoA6I3ZC/cMA0GCSqGSIb3DQEBBQUAMFYxCzAJBgNV"
+            + "BAYTAlVTMRMwEQYDVQQHEwpDdXBlcnRpb25lMRwwGgYDVQQLExNQcm9kdWN0IERl"
+            + "dmVsb3BtZW50MRQwEgYDVQQDEwtCYWJzIEplbnNlbjAeFw0xMjA1MDIxNjM0MzVa"
+            + "Fw0xMjEyMjExNjM0MzVaMFYxCzAJBgNVBAYTAlVTMRMwEQYDVQQHEwpDdXBlcnRp"
+            + "b25lMRwwGgYDVQQLExNQcm9kdWN0IERldmVsb3BtZW50MRQwEgYDVQQDEwtCYWJz"
+            + "IEplbnNlbjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEApysa0c9qc8FB8gIJ"
+            + "8zAb1pbJ4HzC7iRlVGhRJjFORkGhyvU4P5o2wL0iz/uko6rL9/pFhIlIMbwbV8sm"
+            + "mKeNUPitwiKOjoFDmtimcZ4bx5UTAYLbbHMpEdwSpMC5iF2UioM7qdiwpAfZBd6Z"
+            + "69vqNxuUJ6tP+hxtr/aSgMH2i8ECAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgB"
+            + "hvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYE"
+            + "FLlZD3aKDa8jdhzoByOFMAJDs2osMB8GA1UdIwQYMBaAFLlZD3aKDa8jdhzoByOF"
+            + "MAJDs2osMA0GCSqGSIb3DQEBBQUAA4GBAE5vccY8Ydd7by2bbwiDKgQqVyoKrkUg"
+            + "6CD0WRmc2pBeYX2z94/PWO5L3Fx+eIZh2wTxScF+FdRWJzLbUaBuClrxuy0Y5ifj"
+            + "axuJ8LFNbZtsp1ldW3i84+F5+SYT+xI67ZcoAtwx/VFVI9s5I/Gkmu9f9nxjPpK7"
+            + "1AIUXiE3Qcck";
+
+        String invalidcert1
+            = "MIICpTCCAg6gAwIBBQIJALeoA6I3ZC/cMA0GCSqGSIb3DQEBBQUAMFYxCzAJBgNV"
+            + "BAYTAlVTMRMwEQYDVQQHEwpDdXBlcnRpb25lMRwwGgYDVQQLExNQcm9kdWN0IERl"
+            + "dmVsb3BtZW50MRQwEgYDVQQDEwtCYWJzIEplbnNlbjAeFw0xMjA1MDIxNjM0MzVa"
+            + "Fw0xMjEyMjExNjM0MzVaMFYxCzAJBgNVBAYTAlVTMRMwEQYDVQQHEwpDdXBlcnRp"
+            + "b25lMRwwGgYDVQQLExNQcm9kdWN0IERldmVsb3BtZW50MRQwEgYDVQQDEwtCYWJz"
+            + "IEplbnNlbjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEApysa0c9qc8FB8gIJ"
+            + "8zAb1pbJ4HzC7iRlVGhRJjFORkGhyvU4P5o2wL0iz/uko6rL9/pFhIlIMbwbV8sm"
+            + "mKeNUPitwiKOjoFDmtimcZ4bx5UTAYLbbHMpEdwSpMC5iF2UioM7qdiwpAfZBd6Z"
+            + "69vqNxuUJ6tP+hxtr/aSgMH2i8ECAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgB"
+            + "hvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYE"
+            + "FLlZD3aKDa8jdhzoByOFMAJDs2osMB8GA1UdIwQYMBaAFLlZD3aKDa8jdhzoByOF"
+            + "MAJDs2osMA0GCSqGSIb3DQEBBQUAA4GBAE5vccY8Ydd7by2bbwiDKgQqVyoKrkUg"
+            + "6CD0WRmc2pBeYX2z94/PWO5L3Fx+eIZh2wTxScF+FdRWJzLbUaBuClrxuy0Y5ifj"
+            + "axuJ8LFNbZtsp1ldW3i84+F5+SYT+xI67ZcoAtwx/VFVI9s5I/Gkmu9f9nxjPpK7"
+            + "1AIUXiE3Qcck";
+
+        String brokencert1
+            = "MIICpTCCAg6gAwIBAgIJALeoA6I3ZC/cMA0GCSqGSIb3DQEBBQUAMFYxCzAJBgNV";
+
+        return new Object[][]{
+            {ByteString.valueOfBase64(validcert1), true},
+            {ByteString.valueOf(validcert1), false},
+            {ByteString.valueOfBase64(invalidcert1), false},
+            {ByteString.valueOfBase64(brokencert1), false},
+            {ByteString.valueOf("invalid"), false}
+        };
+    }
+
+    /**
+     * Test acceptable values for this syntax.
+     *
+     * @param value
+     *            The ByteString containing the value that will be tested
+     * @param result
+     *            The expected result of the test
+     */
+    @Test(dataProvider = "acceptableValues")
+    public void testAcceptableValues(ByteString value, Boolean result) {
+        // Make sure that the specified class can be instantiated as a task.
+        final Syntax syntax = getRule();
+
+        final LocalizableMessageBuilder reason = new LocalizableMessageBuilder();
+
+        // test the valueIsAcceptable method
+        final Boolean liveResult = syntax.valueIsAcceptable(value, reason);
+
+        if (liveResult != result) {
+            fail(syntax + ".valueIsAcceptable gave bad result for " + value.toString() + "reason : " + reason);
+        }
+
+        // call the getters
+        syntax.getApproximateMatchingRule();
+        syntax.getDescription();
+        syntax.getEqualityMatchingRule();
+        syntax.getOID();
+        syntax.getOrderingMatchingRule();
+        syntax.getSubstringMatchingRule();
+        syntax.hashCode();
+        syntax.isHumanReadable();
+        syntax.toString();
+    }
+
+    /**
+     * Test acceptable values for this syntax allowing malformed certificates.
+     *
+     * @param value
+     *            The ByteString containing the value that will be tested
+     * @param result
+     *            Expected result is ignored.
+     */
+    @Test(dataProvider = "acceptableValues")
+    public void testAllowMalformedCertificates(ByteString value, Boolean result) {
+        // Make sure that the specified class can be instantiated as a task.
+        SchemaBuilder builder = new SchemaBuilder(Schema.getCoreSchema()).allowMalformedCertificates(true);
+        final Syntax syntax = builder.toSchema().getSyntax(SYNTAX_CERTIFICATE_OID);
+
+        final LocalizableMessageBuilder reason = new LocalizableMessageBuilder();
+
+        // test the valueIsAcceptable method
+        final Boolean liveResult = syntax.valueIsAcceptable(value, reason);
+
+        if (!liveResult) {
+            fail(syntax + ".valueIsAcceptable gave bad result for " + value.toString() + "reason : " + reason);
+        }
+    }
+
+
+    /**
+     * Get an instance of the attribute syntax that must be tested.
+     *
+     * @return An instance of the attribute syntax that must be tested.
+     */
+    protected Syntax getRule() {
+        SchemaBuilder builder = new SchemaBuilder(Schema.getCoreSchema()).allowMalformedCertificates(false);
+        return builder.toSchema().getSyntax(SYNTAX_CERTIFICATE_OID);
+    }
+}
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java
index f8fcfdc..97e26a1 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SyntaxTestCase.java
@@ -22,6 +22,7 @@
  *
  *
  *      Copyright 2014 ForgeRock AS.
+ *      Portions Copyright 2014 Manuel Gaupp
  */
 
 package org.forgerock.opendj.ldap.schema;
@@ -399,7 +400,7 @@
         assertThat(syntax.getDescription()).isEqualTo("X.509 Certificate");
         assertThat(syntax.getExtraProperties().isEmpty()).isTrue();
         assertThat(syntax.getApproximateMatchingRule()).isNull();
-        assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("octetStringMatch");
+        assertThat(syntax.getEqualityMatchingRule().getNameOrOID()).isEqualTo("certificateExactMatch");
         assertThat(syntax.getOrderingMatchingRule().getNameOrOID()).isEqualTo("octetStringOrderingMatch");
         assertThat(syntax.getSubstringMatchingRule()).isNull();
         assertThat(syntax.isBEREncodingRequired()).isTrue();
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldif/LDIFChangeRecordReaderTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldif/LDIFChangeRecordReaderTestCase.java
index 3c9fe98..ae8338e 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldif/LDIFChangeRecordReaderTestCase.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldif/LDIFChangeRecordReaderTestCase.java
@@ -23,6 +23,7 @@
  *
  *      Copyright 2011 ForgeRock AS
  *      Portions copyright 2012 ForgeRock AS.
+ *      Portions Copyright 2014 Manuel Gaupp
  */
 
 package org.forgerock.opendj.ldif;
@@ -60,7 +61,6 @@
 import org.forgerock.opendj.ldap.requests.ModifyDNRequest;
 import org.forgerock.opendj.ldap.requests.ModifyRequest;
 import org.forgerock.opendj.ldap.schema.Schema;
-import org.forgerock.opendj.ldap.schema.SchemaBuilder;
 import org.forgerock.opendj.ldap.schema.SchemaValidationPolicy;
 import org.forgerock.opendj.ldap.schema.SchemaValidationPolicy.Action;
 import org.testng.annotations.Test;
@@ -1755,16 +1755,7 @@
         // @formatter:on
 
         final LDIFChangeRecordReader reader = new LDIFChangeRecordReader(strChangeRecord);
-
-        final SchemaBuilder scBuild = new SchemaBuilder();
-        // Adding the new schema containing the userCertificate
-        scBuild.addObjectClass("( 2.5.6.15 NAME 'strongAuthenticationUser"
-                + "' SUP top AUXILIARY MUST userCertificate )", false);
-        scBuild.addAttributeType(
-                "( 2.5.4.36 NAME 'userCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.8 )", false);
-        // Adding to default core schema
-        scBuild.addSchema(Schema.getCoreSchema(), false);
-        Schema schema = scBuild.toSchema();
+        Schema schema = Schema.getCoreSchema();
         reader.setSchema(schema);
         reader.setSchemaValidationPolicy(SchemaValidationPolicy.defaultPolicy());
 

--
Gitblit v1.10.0