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
18package org.apache.harmony.security.pkcs10;
19
20import java.util.List;
21import javax.security.auth.x500.X500Principal;
22import org.apache.harmony.security.asn1.ASN1Implicit;
23import org.apache.harmony.security.asn1.ASN1Integer;
24import org.apache.harmony.security.asn1.ASN1Sequence;
25import org.apache.harmony.security.asn1.ASN1SetOf;
26import org.apache.harmony.security.asn1.ASN1Type;
27import org.apache.harmony.security.asn1.BerInputStream;
28import org.apache.harmony.security.x501.AttributeTypeAndValue;
29import org.apache.harmony.security.x501.Name;
30import org.apache.harmony.security.x509.SubjectPublicKeyInfo;
31
32/**
33 * CertificationRequestInfo ::= SEQUENCE {
34 *   version Version,
35 *   subject Name,
36 *   subjectPublicKeyInfo SubjectPublicKeyInfo,
37 *   attributes [0] IMPLICIT Attributes }
38 *
39 * Version ::= INTEGER
40 *
41 * Attributes ::= SET OF Attribute
42 */
43public final class CertificationRequestInfo {
44    private final int version;
45
46    /** the value of subject field of the structure */
47    private final Name subject;
48
49    /** the value of subjectPublicKeyInfo field of the structure */
50    private final SubjectPublicKeyInfo subjectPublicKeyInfo;
51
52    /** the value of attributes field of the structure */
53    private final List<?> attributes;
54
55    /** the ASN.1 encoded form of CertificationRequestInfo */
56    private byte[] encoding;
57
58    private CertificationRequestInfo(int version, Name subject,
59            SubjectPublicKeyInfo subjectPublicKeyInfo, List<?> attributes, byte [] encoding) {
60        this.version = version;
61        this.subject = subject;
62        this.subjectPublicKeyInfo = subjectPublicKeyInfo;
63        this.attributes = attributes;
64        this.encoding = encoding;
65    }
66
67    public Name getSubject() {
68        return subject;
69    }
70
71    public int getVersion() {
72        return version;
73    }
74
75    /**
76     * Returns ASN.1 encoded form of this CertificationRequestInfo.
77     * @return a byte array containing ASN.1 encode form.
78     */
79    public byte[] getEncoded() {
80        if (encoding == null) {
81            encoding = ASN1.encode(this);
82        }
83        return encoding;
84    }
85
86    @Override public String toString() {
87        StringBuilder res = new StringBuilder();
88        res.append("-- CertificationRequestInfo:");
89        res.append("\n version: ");
90        res.append(version);
91        res.append("\n subject: ");
92        res.append(subject.getName(X500Principal.CANONICAL));
93        res.append("\n subjectPublicKeyInfo: ");
94        res.append("\n\t algorithm: ");
95        res.append(subjectPublicKeyInfo.getAlgorithmIdentifier().getAlgorithm());
96        res.append("\n\t public key: ").append(subjectPublicKeyInfo.getPublicKey());
97        res.append("\n attributes: ");
98        if (attributes != null) {
99            res.append(attributes.toString());
100        } else {
101            res.append("none");
102        }
103        res.append("\n-- CertificationRequestInfo End\n");
104        return res.toString();
105    }
106
107    public static final ASN1Sequence ASN1 = new ASN1Sequence(new ASN1Type[] {
108            ASN1Integer.getInstance(),              // version
109            Name.ASN1,                              // subject
110            SubjectPublicKeyInfo.ASN1,              // subjectPublicKeyInfo
111            new ASN1Implicit(0, new ASN1SetOf(
112                    AttributeTypeAndValue.ASN1))    // attributes
113            }) {
114
115        @Override protected Object getDecodedObject(BerInputStream in) {
116            Object[] values = (Object[]) in.content;
117            return new CertificationRequestInfo(
118                    ASN1Integer.toIntValue(values[0]),
119                    (Name) values[1],
120                    (SubjectPublicKeyInfo) values[2],
121                    (List<?>) values[3],
122                    in.getEncoded());
123        }
124
125        @Override protected void getValues(Object object, Object[] values) {
126            CertificationRequestInfo certReqInfo = (CertificationRequestInfo) object;
127            values[0] = ASN1Integer.fromIntValue(certReqInfo.version);
128            values[1] = certReqInfo.subject;
129            values[2] = certReqInfo.subjectPublicKeyInfo;
130            values[3] = certReqInfo.attributes;
131        }
132    };
133}
134
135