Home | History | Annotate | Download | only in pkcs10
      1 /*
      2  * Licensed to the Apache Software Foundation (ASF) under one or more
      3  * contributor license agreements.  See the NOTICE file distributed with
      4  * this work for additional information regarding copyright ownership.
      5  * The ASF licenses this file to You under the Apache License, Version 2.0
      6  * (the "License"); you may not use this file except in compliance with
      7  * the License.  You may obtain a copy of the License at
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     13  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     14  * License for the specific language governing permissions and limitations under
     15  * the License.
     16  */
     17 
     18 package org.apache.harmony.security.pkcs10;
     19 
     20 import org.apache.harmony.security.asn1.ASN1BitString;
     21 import org.apache.harmony.security.asn1.ASN1Sequence;
     22 import org.apache.harmony.security.asn1.ASN1Type;
     23 import org.apache.harmony.security.asn1.BerInputStream;
     24 import org.apache.harmony.security.asn1.BitString;
     25 import org.apache.harmony.security.x509.AlgorithmIdentifier;
     26 
     27 /**
     28  * The class implements the ASN.1 DER encoding and decoding of the PKCS#10
     29  * Certificate Signing Request (CSR). Its ASN notation is as follows:
     30  *
     31  * CertificationRequest ::= SEQUENCE {
     32  *   certificationRequestInfo CertificationRequestInfo,
     33  *   signatureAlgorithm SignatureAlgorithmIdentifier,
     34  *   signature Signature
     35  * }
     36  *
     37  * SignatureAlgorithmIdentifier ::= AlgorithmIdentifier
     38  *
     39  * Signature ::= BIT STRING
     40  */
     41 public final class CertificationRequest {
     42 
     43     /** the value of certificationRequestInfo field of the structure */
     44     private CertificationRequestInfo info;
     45 
     46     /** the value of signatureAlgorithm field of the structure */
     47     private AlgorithmIdentifier algId;
     48 
     49     /** the value of signature field of the structure */
     50     private byte[] signature;
     51 
     52     /** the ASN.1 encoded form of CertificationRequest */
     53     private byte[] encoding;
     54 
     55     public CertificationRequest(CertificationRequestInfo info,
     56             AlgorithmIdentifier algId, byte[] signature) {
     57         this.info = info;
     58         this.algId = algId;
     59         this.signature = signature.clone();
     60     }
     61 
     62     private CertificationRequest(CertificationRequestInfo info,
     63             AlgorithmIdentifier algId, byte[] signature, byte[] encoding) {
     64         this(info, algId, signature);
     65         this.encoding = encoding;
     66     }
     67 
     68     public CertificationRequestInfo getInfo() {
     69         return info;
     70     }
     71 
     72     public byte[] getSignature() {
     73         byte[] result = new byte[signature.length];
     74         System.arraycopy(signature, 0, result, 0, signature.length);
     75         return result;
     76     }
     77 
     78     /**
     79      * Returns ASN.1 encoded form of this CertificationRequest value.
     80      * @return a byte array containing ASN.1 encode form.
     81      */
     82     public byte[] getEncoded() {
     83         if (encoding == null) {
     84             encoding = CertificationRequest.ASN1.encode(this);
     85         }
     86         return encoding;
     87     }
     88 
     89     public static final ASN1Sequence ASN1 = new ASN1Sequence(new ASN1Type[] {
     90             CertificationRequestInfo.ASN1,  // info
     91             AlgorithmIdentifier.ASN1,       // signatureAlgorithm
     92             ASN1BitString.getInstance() })  // signature
     93     {
     94 
     95         public Object getDecodedObject(BerInputStream in) {
     96             Object[] values = (Object[]) in.content;
     97             return new CertificationRequest(
     98                     (CertificationRequestInfo) values[0],
     99                     (AlgorithmIdentifier) values[1],
    100                     ((BitString) values[2]).bytes,
    101                     in.getEncoded());
    102         }
    103 
    104         protected void getValues(Object object, Object[] values) {
    105             CertificationRequest certReq = (CertificationRequest) object;
    106             values[0] = certReq.info;
    107             values[1] = certReq.algId;
    108             values[2] = new BitString(certReq.signature, 0);
    109         }
    110     };
    111 }
    112 
    113