• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.bouncycastle.asn1.x509;
2 
3 import java.io.IOException;
4 import java.util.Enumeration;
5 
6 import org.bouncycastle.asn1.ASN1Encodable;
7 import org.bouncycastle.asn1.ASN1EncodableVector;
8 import org.bouncycastle.asn1.ASN1InputStream;
9 import org.bouncycastle.asn1.ASN1Object;
10 import org.bouncycastle.asn1.ASN1Primitive;
11 import org.bouncycastle.asn1.ASN1Sequence;
12 import org.bouncycastle.asn1.ASN1TaggedObject;
13 import org.bouncycastle.asn1.DERBitString;
14 import org.bouncycastle.asn1.DERSequence;
15 
16 /**
17  * The object that contains the public key stored in a certficate.
18  * <p>
19  * The getEncoded() method in the public keys in the JCE produces a DER
20  * encoded one of these.
21  */
22 public class SubjectPublicKeyInfo
23     extends ASN1Object
24 {
25     private AlgorithmIdentifier     algId;
26     private DERBitString            keyData;
27 
getInstance( ASN1TaggedObject obj, boolean explicit)28     public static SubjectPublicKeyInfo getInstance(
29         ASN1TaggedObject obj,
30         boolean          explicit)
31     {
32         return getInstance(ASN1Sequence.getInstance(obj, explicit));
33     }
34 
getInstance( Object obj)35     public static SubjectPublicKeyInfo getInstance(
36         Object  obj)
37     {
38         if (obj instanceof SubjectPublicKeyInfo)
39         {
40             return (SubjectPublicKeyInfo)obj;
41         }
42         else if (obj != null)
43         {
44             return new SubjectPublicKeyInfo(ASN1Sequence.getInstance(obj));
45         }
46 
47         return null;
48     }
49 
SubjectPublicKeyInfo( AlgorithmIdentifier algId, ASN1Encodable publicKey)50     public SubjectPublicKeyInfo(
51         AlgorithmIdentifier algId,
52         ASN1Encodable       publicKey)
53         throws IOException
54     {
55         this.keyData = new DERBitString(publicKey);
56         this.algId = algId;
57     }
58 
SubjectPublicKeyInfo( AlgorithmIdentifier algId, byte[] publicKey)59     public SubjectPublicKeyInfo(
60         AlgorithmIdentifier algId,
61         byte[]              publicKey)
62     {
63         this.keyData = new DERBitString(publicKey);
64         this.algId = algId;
65     }
66 
67     /**
68      @deprecated use SubjectPublicKeyInfo.getInstance()
69      */
SubjectPublicKeyInfo( ASN1Sequence seq)70     public SubjectPublicKeyInfo(
71         ASN1Sequence  seq)
72     {
73         if (seq.size() != 2)
74         {
75             throw new IllegalArgumentException("Bad sequence size: "
76                     + seq.size());
77         }
78 
79         Enumeration         e = seq.getObjects();
80 
81         this.algId = AlgorithmIdentifier.getInstance(e.nextElement());
82         this.keyData = DERBitString.getInstance(e.nextElement());
83     }
84 
getAlgorithm()85     public AlgorithmIdentifier getAlgorithm()
86     {
87         return algId;
88     }
89 
90     /**
91      * @deprecated use getAlgorithm()
92      * @return    alg ID.
93      */
getAlgorithmId()94     public AlgorithmIdentifier getAlgorithmId()
95     {
96         return algId;
97     }
98 
99     /**
100      * for when the public key is an encoded object - if the bitstring
101      * can't be decoded this routine throws an IOException.
102      *
103      * @exception IOException - if the bit string doesn't represent a DER
104      * encoded object.
105      * @return the public key as an ASN.1 primitive.
106      */
parsePublicKey()107     public ASN1Primitive parsePublicKey()
108         throws IOException
109     {
110         ASN1InputStream         aIn = new ASN1InputStream(keyData.getOctets());
111 
112         return aIn.readObject();
113     }
114 
115     /**
116      * for when the public key is an encoded object - if the bitstring
117      * can't be decoded this routine throws an IOException.
118      *
119      * @exception IOException - if the bit string doesn't represent a DER
120      * encoded object.
121      * @deprecated use parsePublicKey
122      * @return the public key as an ASN.1 primitive.
123      */
getPublicKey()124     public ASN1Primitive getPublicKey()
125         throws IOException
126     {
127         ASN1InputStream         aIn = new ASN1InputStream(keyData.getOctets());
128 
129         return aIn.readObject();
130     }
131 
132     /**
133      * for when the public key is raw bits.
134      *
135      * @return the public key as the raw bit string...
136      */
getPublicKeyData()137     public DERBitString getPublicKeyData()
138     {
139         return keyData;
140     }
141 
142     /**
143      * Produce an object suitable for an ASN1OutputStream.
144      * <pre>
145      * SubjectPublicKeyInfo ::= SEQUENCE {
146      *                          algorithm AlgorithmIdentifier,
147      *                          publicKey BIT STRING }
148      * </pre>
149      */
toASN1Primitive()150     public ASN1Primitive toASN1Primitive()
151     {
152         ASN1EncodableVector  v = new ASN1EncodableVector();
153 
154         v.add(algId);
155         v.add(keyData);
156 
157         return new DERSequence(v);
158     }
159 }
160