directory-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From kayyag...@apache.org
Subject svn commit: r731310 - in /directory/shared/trunk/ldap/src: main/java/org/apache/directory/shared/ldap/codec/extended/operations/ main/java/org/apache/directory/shared/ldap/message/extended/ test/java/org/apache/directory/shared/ldap/codec/extended/oper...
Date Sun, 04 Jan 2009 18:26:09 GMT
Author: kayyagari
Date: Sun Jan  4 10:26:09 2009
New Revision: 731310

URL: http://svn.apache.org/viewvc?rev=731310&view=rev
Log:
source file for ASN1 codec for the new certificate generation/modification extended operation

Added:
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationContainer.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationDecoder.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationGrammar.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationObject.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationStatesEnum.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/extended/CertGenerationRequest.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/extended/CertGenerationResponse.java
    directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationRequestTest.java

Added: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationContainer.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationContainer.java?rev=731310&view=auto
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationContainer.java
(added)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationContainer.java
Sun Jan  4 10:26:09 2009
@@ -0,0 +1,79 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.shared.ldap.codec.extended.operations;
+
+import org.apache.directory.shared.asn1.ber.AbstractContainer;
+
+/**
+ * 
+ * A container for certificate generation request codec.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class CertGenerationContainer extends AbstractContainer
+{
+    /** CertGenerationObject */
+    private CertGenerationObject certGenObj;
+
+
+    /**
+     * Creates a new CertGenContainer object. We will store one
+     * grammar, it's enough ...
+     */
+    public CertGenerationContainer()
+    {
+        super();
+        stateStack = new int[1];
+        grammar = CertGenerationGrammar.getInstance();
+        states = CertGenerationStatesEnum.getInstance();
+    }
+
+
+    /**
+     * @return Returns the CertGenerationObject instance.
+     */
+    public CertGenerationObject getCertGenerationObject()
+    {
+        return certGenObj;
+    }
+
+
+    /**
+     * Set a CertGenerationObject Object into the container. It will be completed by
+     * the ldapDecoder.
+     * 
+     * @param certGenObj the CertGenerationObject to set.
+     */
+    public void setCertGenerationObject( CertGenerationObject certGenObj )
+    {
+        this.certGenObj = certGenObj;
+    }
+
+
+    /**
+     * Clean the container for the next decoding.
+     */
+    public void clean()
+    {
+        super.clean();
+        certGenObj = null;
+    }
+}

Added: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationDecoder.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationDecoder.java?rev=731310&view=auto
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationDecoder.java
(added)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationDecoder.java
Sun Jan  4 10:26:09 2009
@@ -0,0 +1,64 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.shared.ldap.codec.extended.operations;
+
+
+import java.nio.ByteBuffer;
+
+import org.apache.directory.shared.asn1.Asn1Object;
+import org.apache.directory.shared.asn1.ber.Asn1Decoder;
+import org.apache.directory.shared.asn1.codec.DecoderException;
+
+
+/**
+ * 
+ * A decoder for CertGenerationObject.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class CertGenerationDecoder extends Asn1Decoder
+{
+    /** The decoder */
+    private static final Asn1Decoder decoder = new Asn1Decoder();
+
+
+    /**
+     * Decode a PDU which must contain a CertGenRequest extended operation.
+     * Note that the stream of bytes much contain a full PDU, not a partial one.
+     * 
+     * @param stream The bytes to be decoded
+     * @return a CertGenerationObject object
+     * @throws DecoderException If the decoding failed
+     */
+    public Asn1Object decode( byte[] stream ) throws DecoderException
+    {
+        ByteBuffer bb = ByteBuffer.wrap( stream );
+        CertGenerationContainer container = new CertGenerationContainer();
+        decoder.decode( bb, container );
+        CertGenerationObject certGenObj = container.getCertGenerationObject();
+
+        // Clean the container for the next decoding
+        container.clean();
+
+        return certGenObj;
+    }
+
+}

Added: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationGrammar.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationGrammar.java?rev=731310&view=auto
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationGrammar.java
(added)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationGrammar.java
Sun Jan  4 10:26:09 2009
@@ -0,0 +1,254 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.shared.ldap.codec.extended.operations;
+
+
+import org.apache.directory.shared.asn1.ber.IAsn1Container;
+import org.apache.directory.shared.asn1.ber.grammar.AbstractGrammar;
+import org.apache.directory.shared.asn1.ber.grammar.GrammarAction;
+import org.apache.directory.shared.asn1.ber.grammar.GrammarTransition;
+import org.apache.directory.shared.asn1.ber.grammar.IGrammar;
+import org.apache.directory.shared.asn1.ber.grammar.IStates;
+import org.apache.directory.shared.asn1.ber.tlv.UniversalTag;
+import org.apache.directory.shared.asn1.ber.tlv.Value;
+import org.apache.directory.shared.asn1.codec.DecoderException;
+import org.apache.directory.shared.ldap.util.StringTools;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * This class implements the Certificate generation extended operation's ASN.1 grammer. 
+ * All the actions are declared in this class. As it is a singleton, 
+ * these declaration are only done once. The grammar is :
+ * 
+ * <pre>
+ *   CertGenerateObject ::= SEQUENCE 
+ *   {
+ *      targetDN        IA5String,
+ *      issuerDN        IA5String,
+ *      subjectDN       IA5String,
+ *      keyAlgorithm    IA5String
+ *   }
+ * </pre>
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev: 664290 $, $Date: 2008-06-07 11:58:06 +0530 (Sat, 07 Jun 2008) $, 
+ */
+
+public class CertGenerationGrammar extends AbstractGrammar
+{
+
+    /** logger */
+    private static final Logger LOG = LoggerFactory.getLogger( CertGenerationGrammar.class
);
+
+    /** Speedup for logs */
+    static final boolean IS_DEBUG = LOG.isDebugEnabled();
+
+    /** The instance of grammar. CertGenerationObjectGrammar is a singleton */
+    private static IGrammar instance = new CertGenerationGrammar();
+
+
+    public CertGenerationGrammar()
+    {
+        name = CertGenerationGrammar.class.getName();
+        statesEnum = CertGenerationStatesEnum.getInstance();
+
+        // Create the transitions table
+        super.transitions = new GrammarTransition[CertGenerationStatesEnum.LAST_CERT_GENERATION_STATE][256];
+
+        /**
+         * Transition from init state to certificate generation
+         * 
+         * CertGenerationObject ::= SEQUENCE {
+         *     ...
+         *     
+         * Creates the CertGenerationObject object
+         */
+        super.transitions[IStates.INIT_GRAMMAR_STATE][UniversalTag.SEQUENCE_TAG] = new GrammarTransition(
+            IStates.INIT_GRAMMAR_STATE, CertGenerationStatesEnum.CERT_GENERATION_REQUEST_SEQUENCE_STATE,
+            UniversalTag.SEQUENCE_TAG, new GrammarAction( "Init CertGenerationObject" )
+            {
+                public void action( IAsn1Container container )
+                {
+                    CertGenerationContainer certGenContainer = ( CertGenerationContainer
) container;
+                    CertGenerationObject certGenerationObject = new CertGenerationObject();
+                    certGenContainer.setCertGenerationObject( certGenerationObject );
+                    certGenContainer.grammarEndAllowed( true );
+                }
+            } );
+
+        /**
+         * Transition from certificate generation request to targetDN
+         *
+         * CertGenerationObject ::= SEQUENCE { 
+         *     targetDN IA5String,
+         *     ...
+         *     
+         * Set the targetDN value into the CertGenerationObject instance.
+         */
+        super.transitions[CertGenerationStatesEnum.CERT_GENERATION_REQUEST_SEQUENCE_STATE][UniversalTag.OCTET_STRING]
= new GrammarTransition(
+            CertGenerationStatesEnum.CERT_GENERATION_REQUEST_SEQUENCE_STATE, CertGenerationStatesEnum.TARGETDN_STATE,
+            UniversalTag.OCTET_STRING, new GrammarAction( "Set Cert Generation target DN
value" )
+            {
+                public void action( IAsn1Container container ) throws DecoderException
+                {
+                    CertGenerationContainer CertGenContainer = ( CertGenerationContainer
) container;
+                    Value value = CertGenContainer.getCurrentTLV().getValue();
+
+                    String targetDN = StringTools.utf8ToString( value.getData() );
+
+                    if ( IS_DEBUG )
+                    {
+                        LOG.debug( "Target DN = " + targetDN );
+                    }
+
+                    if ( targetDN != null && ( targetDN.trim().length() > 0 )
)
+                    {
+                        CertGenContainer.getCertGenerationObject().setTargetDN( targetDN
);
+                    }
+                    else
+                    {
+                        String msg = "failed to decode the target DN, it cannot be null or
empty it is '"
+                            + StringTools.dumpBytes( value.getData() );
+                        LOG.error( msg );
+                        throw new DecoderException( msg );
+                    }
+
+                    CertGenContainer.grammarEndAllowed( true );
+                }
+            } );
+
+        /**
+         * Transition from targetDN state to issuerDN
+         *
+         * CertGenerationObject ::= SEQUENCE { 
+         *     ...
+         *     issuerDN IA5String,
+         *     ...
+         *     
+         * Set the issuerDN value into the CertGenerationObject instance.
+         */
+        super.transitions[CertGenerationStatesEnum.TARGETDN_STATE][UniversalTag.OCTET_STRING]
= new GrammarTransition(
+            CertGenerationStatesEnum.TARGETDN_STATE, CertGenerationStatesEnum.ISSUER_STATE,
UniversalTag.OCTET_STRING,
+            new GrammarAction( "Set Cert Generation issuer DN value" )
+            {
+                public void action( IAsn1Container container ) throws DecoderException
+                {
+                    CertGenerationContainer CertGenContainer = ( CertGenerationContainer
) container;
+                    Value value = CertGenContainer.getCurrentTLV().getValue();
+
+                    String issuerDN = StringTools.utf8ToString( value.getData() );
+
+                    if ( IS_DEBUG )
+                    {
+                        LOG.debug( "Issuer DN = " + issuerDN );
+                    }
+
+                    if ( issuerDN != null && ( issuerDN.trim().length() > 0 )
)
+                    {
+                        CertGenContainer.getCertGenerationObject().setIssuerDN( issuerDN
);
+                    }
+                    CertGenContainer.grammarEndAllowed( true );
+                }
+            } );
+
+        /**
+         * Transition from issuerDN state to subjectDN
+         *
+         * CertGenerationObject ::= SEQUENCE {
+         *     ... 
+         *     subjectDN IA5String,
+         *     ...
+         *     
+         * Set the subjectDN value into the CertGenerationObject instance.
+         */
+        super.transitions[CertGenerationStatesEnum.ISSUER_STATE][UniversalTag.OCTET_STRING]
= new GrammarTransition(
+            CertGenerationStatesEnum.ISSUER_STATE, CertGenerationStatesEnum.SUBJECT_STATE,
UniversalTag.OCTET_STRING,
+            new GrammarAction( "Set Cert Generation subject DN value" )
+            {
+                public void action( IAsn1Container container ) throws DecoderException
+                {
+                    CertGenerationContainer CertGenContainer = ( CertGenerationContainer
) container;
+                    Value value = CertGenContainer.getCurrentTLV().getValue();
+
+                    String subjectDN = StringTools.utf8ToString( value.getData() );
+
+                    if ( IS_DEBUG )
+                    {
+                        LOG.debug( "subject DN = " + subjectDN );
+                    }
+
+                    if ( subjectDN != null && ( subjectDN.trim().length() > 0
) )
+                    {
+                        CertGenContainer.getCertGenerationObject().setSubjectDN( subjectDN
);
+                    }
+
+                    CertGenContainer.grammarEndAllowed( true );
+                }
+            } );
+
+        /**
+         * Transition from subjectDN state to keyAlgo
+         *
+         * CertGenerationObject ::= SEQUENCE { 
+         *     ...
+         *     issuerDN IA5String
+         *     
+         * Set the key algorithm value into the CertGenerationObject instance.
+         */
+        super.transitions[CertGenerationStatesEnum.SUBJECT_STATE][UniversalTag.OCTET_STRING]
= new GrammarTransition(
+            CertGenerationStatesEnum.SUBJECT_STATE, CertGenerationStatesEnum.KEY_ALGORITHM_STATE,
+            UniversalTag.OCTET_STRING, new GrammarAction( "Set Cert Generation key algorithm
value" )
+            {
+                public void action( IAsn1Container container ) throws DecoderException
+                {
+                    CertGenerationContainer CertGenContainer = ( CertGenerationContainer
) container;
+                    Value value = CertGenContainer.getCurrentTLV().getValue();
+
+                    String keyAlgorithm = StringTools.utf8ToString( value.getData() );
+
+                    if ( IS_DEBUG )
+                    {
+                        LOG.debug( "subject DN = " + keyAlgorithm );
+                    }
+
+                    if ( keyAlgorithm != null && ( keyAlgorithm.trim().length() >
0 ) )
+                    {
+                        CertGenContainer.getCertGenerationObject().setKeyAlgorithm( keyAlgorithm
);
+                    }
+
+                    CertGenContainer.grammarEndAllowed( true );
+                }
+            } );
+
+    }
+
+
+    /**
+     * This class is a singleton.
+     * 
+     * @return An instance on this grammar
+     */
+    public static IGrammar getInstance()
+    {
+        return instance;
+    }
+}

Added: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationObject.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationObject.java?rev=731310&view=auto
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationObject.java
(added)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationObject.java
Sun Jan  4 10:26:09 2009
@@ -0,0 +1,162 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.shared.ldap.codec.extended.operations;
+
+
+import java.nio.ByteBuffer;
+
+import org.apache.directory.shared.asn1.AbstractAsn1Object;
+import org.apache.directory.shared.asn1.ber.tlv.UniversalTag;
+import org.apache.directory.shared.asn1.ber.tlv.Value;
+import org.apache.directory.shared.asn1.codec.EncoderException;
+import org.apache.directory.shared.ldap.util.StringTools;
+
+
+/**
+ * 
+ * An extended operation for generating a public key Certificate.
+ * <pre>
+ *   CertGenerateObject ::= SEQUENCE 
+ *   {
+ *      targetDN        IA5String,
+ *      issuerDN        IA5String,
+ *      subjectDN       IA5String,
+ *      keyAlgorithm    IA5String
+ *   }
+ * </pre>
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class CertGenerationObject extends AbstractAsn1Object
+{
+
+    /** the DN of the server entry which will be updated*/
+    private String targetDN;
+
+    /** the issuer DN that will be set in the certificate*/
+    private String issuerDN;// = "CN=ApacheDS, OU=Directory, O=ASF, C=US";
+
+    /** the DN of the subject that is present in the certificate*/
+    private String subjectDN;// = "CN=ApacheDS, OU=Directory, O=ASF, C=US";
+
+    /** name of the algorithm used for generating the keys*/
+    private String keyAlgorithm;// = "RSA";
+
+    /** stores the length of the request*/
+    private int requestLength = 0;
+
+
+    @Override
+    public int computeLength()
+    {
+        int len = StringTools.getBytesUtf8( targetDN ).length;
+        requestLength = 1 + Value.getNbBytes( len ) + len;
+
+        len = StringTools.getBytesUtf8( issuerDN ).length;
+        requestLength += 1 + Value.getNbBytes( len ) + len;
+
+        len = StringTools.getBytesUtf8( subjectDN ).length;
+        requestLength += 1 + Value.getNbBytes( len ) + len;
+
+        len = StringTools.getBytesUtf8( keyAlgorithm ).length;
+        requestLength += 1 + Value.getNbBytes( len ) + len;
+
+        return 1 + Value.getNbBytes( requestLength ) + requestLength;
+    }
+
+
+    @Override
+    public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
+    {
+        ByteBuffer bb = ByteBuffer.allocate( computeLength() );
+
+        bb.put( UniversalTag.SEQUENCE_TAG );
+        bb.put( Value.getBytes( requestLength ) );
+
+        Value.encode( bb, targetDN );
+        Value.encode( bb, issuerDN );
+        Value.encode( bb, subjectDN );
+        Value.encode( bb, keyAlgorithm );
+
+        return bb;
+    }
+
+
+    public String getTargetDN()
+    {
+        return targetDN;
+    }
+
+
+    public void setTargetDN( String targetDN )
+    {
+        this.targetDN = targetDN;
+    }
+
+
+    public String getIssuerDN()
+    {
+        return issuerDN;
+    }
+
+
+    public void setIssuerDN( String issuerDN )
+    {
+        this.issuerDN = issuerDN;
+    }
+
+
+    public String getSubjectDN()
+    {
+        return subjectDN;
+    }
+
+
+    public void setSubjectDN( String subjectDN )
+    {
+        this.subjectDN = subjectDN;
+    }
+
+
+    public String getKeyAlgorithm()
+    {
+        return keyAlgorithm;
+    }
+
+
+    public void setKeyAlgorithm( String keyAlgorithm )
+    {
+        this.keyAlgorithm = keyAlgorithm;
+    }
+
+
+    @Override
+    public String toString()
+    {
+        StringBuilder sb = new StringBuilder();
+        sb.append( "Certficate Generation Object { " ).append( " Target DN: " ).append( targetDN
).append( ',' );
+        sb.append( " Issuer DN: " ).append( issuerDN ).append( ',' );
+        sb.append( " Subject DN: " ).append( subjectDN ).append( ',' );
+        sb.append( " Key Algorithm: " ).append( keyAlgorithm ).append( " }" );
+
+        return sb.toString();
+    }
+}

Added: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationStatesEnum.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationStatesEnum.java?rev=731310&view=auto
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationStatesEnum.java
(added)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationStatesEnum.java
Sun Jan  4 10:26:09 2009
@@ -0,0 +1,119 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.shared.ldap.codec.extended.operations;
+
+
+import org.apache.directory.shared.asn1.ber.grammar.IGrammar;
+import org.apache.directory.shared.asn1.ber.grammar.IStates;
+
+/**
+ * This class store the CertGeneration's grammar constants. It is also used
+ * for debugging purposes.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev: 664290 $, $Date: 2008-06-07 11:58:06 +0530 (Sat, 07 Jun 2008) $, 
+ */
+public class CertGenerationStatesEnum implements IStates
+{
+
+    /** start state*/
+    public static final int START_STATE = 0;
+
+    /** sequence*/
+    public static final int CERT_GENERATION_REQUEST_SEQUENCE_STATE = 1;
+
+    /** the target DN*/
+    public static final int TARGETDN_STATE = 2;
+
+    /** the issuer DN*/
+    public static final int ISSUER_STATE = 3;
+
+    /** the subject DN*/
+    public static final int SUBJECT_STATE = 4;
+
+    /** the key algorithm*/
+    public static final int KEY_ALGORITHM_STATE = 5;
+
+    /** terminal state */
+    public static final int LAST_CERT_GENERATION_STATE = 6;
+
+    private static String[] certGenerationString = new String[]
+        {
+          "START_STATE",
+          "CERT_GENERATION_REQUEST_SEQUENCE_STATE",
+          "TARGETDN_STATE", "ISSUER_STATE",
+          "SUBJECT_STATE",
+          "KEY_ALGORITHM_STATE"
+        };
+
+    /** a singleton instance*/
+    private static CertGenerationStatesEnum instance = new CertGenerationStatesEnum();
+
+    
+    /**
+     * Get the grammar name
+     * 
+     * @param grammar The grammar class
+     * @return The grammar name
+     */
+    public String getGrammarName( IGrammar grammar )
+    {
+        if ( grammar instanceof CertGenerationGrammar )
+        {
+            return "CERT_GENERATION_GRAMMER";
+        }
+        
+        return "UNKNOWN GRAMMAR";
+    }
+
+    
+    /**
+     * Get the grammar name
+     * 
+     * @param grammar The grammar code
+     * @return The grammar name
+     */
+    public String getGrammarName( int grammar )
+    {
+        return "CERT_GENERATION_GRAMMER";
+    }
+
+    
+    /**
+     * Get the string representing the state
+     * 
+     * @param state The state number
+     * @return The String representing the state
+     */
+    public String getState( int state )
+    {
+        return ( ( state == GRAMMAR_END ) ? "CERT_GENERATION_END_STATE" : certGenerationString[state]
);
+    }
+
+    /**
+     * Get an instance of this class
+     * 
+     * @return An instance on this class
+     */
+    public static IStates getInstance()
+    {
+        return instance;
+    }
+}

Added: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/extended/CertGenerationRequest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/extended/CertGenerationRequest.java?rev=731310&view=auto
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/extended/CertGenerationRequest.java
(added)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/extended/CertGenerationRequest.java
Sun Jan  4 10:26:09 2009
@@ -0,0 +1,202 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.shared.ldap.message.extended;
+
+
+import javax.naming.NamingException;
+import javax.naming.ldap.ExtendedResponse;
+
+import org.apache.directory.shared.asn1.codec.DecoderException;
+import org.apache.directory.shared.asn1.codec.EncoderException;
+import org.apache.directory.shared.ldap.codec.extended.operations.CertGenerationDecoder;
+import org.apache.directory.shared.ldap.codec.extended.operations.CertGenerationObject;
+import org.apache.directory.shared.ldap.message.ExtendedRequestImpl;
+import org.apache.directory.shared.ldap.message.ResultResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * 
+ * An extended operation requesting the server to generate a public/private key pair and
a certificate
+ * and store them in a specified target entry in the DIT.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class CertGenerationRequest extends ExtendedRequestImpl
+{
+    private CertGenerationObject certGenObj;
+
+    private static final Logger LOG = LoggerFactory.getLogger( CertGenerationRequest.class
);
+
+    public static final String EXTENSION_OID = "1.3.6.1.4.1.18060.0.1.6";
+
+    /**
+     * 
+     * Creates a new instance of CertGenerationRequest.
+     *
+     * @param messageId the message id
+     * @param targerDN the DN of target entry whose key and certificate values will be changed

+     * @param issuerDN DN to be used as the issuer's DN in the certificate
+     * @param subjectDN DN to be used as certificate's subject
+     * @param keyAlgorithm crypto algorithm name to be used for generating the keys
+     */
+    public CertGenerationRequest( int messageId, String targerDN, String issuerDN, String
subjectDN, String keyAlgorithm )
+    {
+        super( messageId );
+        setOid( EXTENSION_OID );
+        
+        this.certGenObj = new CertGenerationObject();
+        certGenObj.setTargetDN( targerDN );
+        certGenObj.setIssuerDN( issuerDN );
+        certGenObj.setSubjectDN( subjectDN );
+        certGenObj.setKeyAlgorithm( keyAlgorithm );
+    }
+
+
+    private void encodePayload() throws EncoderException
+    {
+        payload = certGenObj.encode( null ).array();
+    }
+
+
+    public void setPayload( byte[] payload )
+    {
+        CertGenerationDecoder decoder = new CertGenerationDecoder();
+        try
+        {
+            certGenObj = ( CertGenerationObject ) decoder.decode( payload );
+            if ( payload != null )
+            {
+                this.payload = new byte[payload.length];
+                System.arraycopy( payload, 0, this.payload, 0, payload.length );
+            }
+            else
+            {
+                this.payload = null;
+            }
+        }
+        catch ( DecoderException e )
+        {
+            LOG.error( "failed to decode payload", e );
+            throw new RuntimeException( e );
+        }
+    }
+
+
+    public ExtendedResponse createExtendedResponse( String id, byte[] berValue, int offset,
int length )
+        throws NamingException
+    {
+        return ( ExtendedResponse ) getResultResponse();
+    }
+
+
+    public byte[] getEncodedValue()
+    {
+        return getPayload();
+    }
+
+
+    public byte[] getPayload()
+    {
+        if ( payload == null )
+        {
+            try
+            {
+                encodePayload();
+            }
+            catch ( EncoderException e )
+            {
+                LOG.error( "Failed to encode payload CertGenerateRequest", e );
+                throw new RuntimeException( e );
+            }
+        }
+
+        if ( payload == null )
+        {
+            return null;
+        }
+
+        final byte[] copy = new byte[payload.length];
+        System.arraycopy( payload, 0, copy, 0, payload.length );
+        return copy;
+    }
+
+
+    public ResultResponse getResultResponse()
+    {
+        if ( response == null )
+        {
+            response = new CertGenerationResponse( getMessageId() );
+        }
+
+        return response;
+    }
+
+
+    public String getTargetDN()
+    {
+        return certGenObj.getTargetDN();
+    }
+
+
+    public void setTargetDN( String targetDN )
+    {
+        certGenObj.setTargetDN( targetDN );
+    }
+
+
+    public String getIssuerDN()
+    {
+        return certGenObj.getIssuerDN();
+    }
+
+
+    public void setIssuerDN( String issuerDN )
+    {
+        certGenObj.setIssuerDN( issuerDN );
+    }
+
+
+    public String getSubjectDN()
+    {
+        return certGenObj.getSubjectDN();
+    }
+
+
+    public void setSubjectDN( String subjectDN )
+    {
+        certGenObj.setSubjectDN( subjectDN );
+    }
+
+
+    public String getKeyAlgorithm()
+    {
+        return certGenObj.getKeyAlgorithm();
+    }
+
+
+    public void setKeyAlgorithm( String keyAlgorithm )
+    {
+        certGenObj.setKeyAlgorithm( keyAlgorithm );
+    }
+
+}

Added: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/extended/CertGenerationResponse.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/extended/CertGenerationResponse.java?rev=731310&view=auto
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/extended/CertGenerationResponse.java
(added)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/extended/CertGenerationResponse.java
Sun Jan  4 10:26:09 2009
@@ -0,0 +1,138 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.shared.ldap.message.extended;
+
+import org.apache.directory.shared.ldap.message.ExtendedResponseImpl;
+import org.apache.directory.shared.ldap.message.ResultCodeEnum;
+/**
+ * 
+ * The response sent back from the server after the CertGeneration extended operation is
performed.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class CertGenerationResponse extends ExtendedResponseImpl
+{
+
+    public static final String EXTENSION_OID = "1.3.6.1.4.1.18060.0.1.7";
+
+    private static final byte[] EMPTY_RESPONSE = new byte[0];
+
+
+    public CertGenerationResponse(int messageId, ResultCodeEnum rcode)
+    {
+        super( messageId, EXTENSION_OID );
+
+        switch ( rcode )
+        {
+            case SUCCESS :
+                break;
+            
+            case OPERATIONS_ERROR :
+                break;
+            
+            case INSUFFICIENT_ACCESS_RIGHTS :
+                break;
+            
+            default:
+                throw new IllegalArgumentException( "The result code can only be one of:
" + ResultCodeEnum.SUCCESS
+                    + ", " + ResultCodeEnum.OPERATIONS_ERROR + ", " + ResultCodeEnum.INSUFFICIENT_ACCESS_RIGHTS
);
+        }
+        
+        super.getLdapResult().setMatchedDn( null );
+        super.getLdapResult().setResultCode( rcode );
+    }
+
+
+    public CertGenerationResponse(int messageId)
+    {
+        super( messageId, EXTENSION_OID );
+        super.getLdapResult().setMatchedDn( null );
+        super.getLdapResult().setResultCode( ResultCodeEnum.SUCCESS );
+    }
+
+
+    // ------------------------------------------------------------------------
+    // ExtendedResponse Interface Method Implementations
+    // ------------------------------------------------------------------------
+
+    /**
+     * Gets the reponse OID specific encoded response values.
+     * 
+     * @return the response specific encoded response values.
+     */
+    public byte[] getResponse()
+    {
+        return EMPTY_RESPONSE;
+    }
+
+
+    /**
+     * Sets the reponse OID specific encoded response values.
+     * 
+     * @param value
+     *            the response specific encoded response values.
+     */
+    public void setResponse( byte[] value )
+    {
+        // do nothing here instead
+    }
+
+
+    /**
+     * Gets the OID uniquely identifying this extended response (a.k.a. its
+     * name).
+     * 
+     * @return the OID of the extended response type.
+     */
+    public String getResponseName()
+    {
+        return EXTENSION_OID;
+    }
+
+
+    /**
+     * Sets the OID uniquely identifying this extended response (a.k.a. its
+     * name).
+     * 
+     * @param oid
+     *            the OID of the extended response type.
+     */
+    public void setResponseName( String oid )
+    {
+        throw new UnsupportedOperationException( "the OID is fixed: " + EXTENSION_OID );
+    }
+
+
+    public boolean equals( Object obj )
+    {
+        if ( obj == this )
+        {
+            return true;
+        }
+
+        if ( obj instanceof CertGenerationResponse )
+        {
+            return true;
+        }
+
+        return false;
+    }
+}

Added: directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationRequestTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationRequestTest.java?rev=731310&view=auto
==============================================================================
--- directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationRequestTest.java
(added)
+++ directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/extended/operations/CertGenerationRequestTest.java
Sun Jan  4 10:26:09 2009
@@ -0,0 +1,186 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.shared.ldap.codec.extended.operations;
+
+
+import static org.junit.Assert.*;
+
+import java.nio.ByteBuffer;
+
+import org.apache.directory.shared.asn1.ber.Asn1Decoder;
+import org.apache.directory.shared.asn1.codec.DecoderException;
+import org.apache.directory.shared.asn1.codec.EncoderException;
+import org.apache.directory.shared.ldap.codec.LdapDecoder;
+import org.apache.directory.shared.ldap.util.StringTools;
+import org.junit.Test;
+
+
+/**
+ * 
+ * Test case for CertGenerate extended operation request.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class CertGenerationRequestTest
+{
+
+    /**
+     * test the decode operation
+     */
+    @Test
+    public void testCertGenrationDecode()
+    {
+        String dn = "uid=admin,ou=system";
+        String keyAlgo = "RSA";
+
+        Asn1Decoder decoder = new LdapDecoder();
+
+        int dnLen = dn.length();
+
+        // start Tag + L is 2 bytes
+        // the same value of DN is used for all target,issuer and subject DNs so
+        // it is ( ( OCTET_STRING Tag + Len ) + dnLen ) * 3 
+        // finally for keyAlgo ( OCTET_STRING Tag + Len ) + keyAlgoLen
+
+        int bufLen = 2 + ( ( 2 + dnLen ) * 3 ) + ( keyAlgo.length() + 2 );
+
+        ByteBuffer bb = ByteBuffer.allocate( bufLen );
+
+        bb.put( new byte[]
+            { 0x30, ( byte ) ( bufLen - 2 ) } ); // CertGenerateObject ::= SEQUENCE {
+
+        /*  targetDN IA5String,
+        *   issuerDN IA5String,
+        *   subjectDN IA5String,
+        *   keyAlgorithm IA5String
+        */
+        for ( int i = 0; i < 3; i++ )
+        {
+            bb.put( new byte[]
+                { 0x04, ( byte ) dnLen } );
+            for ( char c : dn.toCharArray() )
+            {
+                bb.put( ( byte ) c );
+            }
+        }
+        bb.put( new byte[]
+            { 0x04, 0x03, 'R', 'S', 'A' } );
+
+        String decodedPdu = StringTools.dumpBytes( bb.array() );
+        bb.flip();
+
+        CertGenerationContainer container = new CertGenerationContainer();
+        try
+        {
+            decoder.decode( bb, container );
+        }
+        catch ( DecoderException e )
+        {
+            e.printStackTrace();
+            fail( e.getMessage() );
+        }
+
+        CertGenerationObject certGenObj = container.getCertGenerationObject();
+        assertEquals( dn, certGenObj.getTargetDN() );
+        assertEquals( dn, certGenObj.getIssuerDN() );
+        assertEquals( dn, certGenObj.getSubjectDN() );
+        assertEquals( keyAlgo, certGenObj.getKeyAlgorithm() );
+
+        assertEquals( bufLen, certGenObj.computeLength() );
+
+        try
+        {
+            ByteBuffer encodedBuf = certGenObj.encode( null );
+            String encodedPdu = StringTools.dumpBytes( encodedBuf.array() );
+
+            assertEquals( decodedPdu, encodedPdu );
+        }
+        catch ( EncoderException e )
+        {
+            e.getMessage();
+            fail( e.getMessage() );
+        }
+
+    }
+
+
+    @Test
+    public void testCertGenrationDecodeWithoutTargetDN()
+    {
+        Asn1Decoder decoder = new LdapDecoder();
+
+        ByteBuffer bb = ByteBuffer.allocate( 5 );
+
+        bb.put( new byte[]
+            { 0x30, 0x03, // CertGenerateObject ::= SEQUENCE {
+              0x04, 0x01, ' ' } ); // empty targetDN value
+
+        String decodedPdu = StringTools.dumpBytes( bb.array() );
+        bb.flip();
+
+        CertGenerationContainer container = new CertGenerationContainer();
+
+        try
+        {
+            decoder.decode( bb, container );
+            fail( "shouldn't accept the empty targetDN" );
+        }
+        catch ( DecoderException e )
+        {
+            e.printStackTrace();
+            assertTrue( true );
+        }
+                
+    }
+    
+    
+    @Test
+    public void testNullvalues()
+    {
+        Asn1Decoder decoder = new LdapDecoder();
+        
+        ByteBuffer bb = ByteBuffer.allocate( 5 );
+
+        bb.put( new byte[]
+            { 0x30, 0x03, // CertGenerateObject ::= SEQUENCE {
+              0x04, 0x01, 'x' } ); // non empty DN string
+
+        CertGenerationContainer container = new CertGenerationContainer();
+        bb.flip();
+
+        try
+        {
+            decoder.decode( bb, container );
+        }
+        catch ( DecoderException e )
+        {
+            e.printStackTrace();
+            fail( e.getMessage() );
+        }
+
+        CertGenerationObject certGenObj = container.getCertGenerationObject();
+        
+        assertEquals( "x", certGenObj.getTargetDN() );
+        assertNull( certGenObj.getIssuerDN() );
+        assertNull( certGenObj.getSubjectDN() );
+        assertNull( certGenObj.getKeyAlgorithm() );
+    }
+}



Mime
View raw message