1 package org.bouncycastle.asn1.x509;
3 import org.bouncycastle.crypto.Digest;
4 import org.bouncycastle.crypto.digests.SHA1Digest;
5 import org.bouncycastle.asn1.*;
9 * SubjectKeyIdentifier::= OCTET STRING
12 public class SubjectKeyIdentifier
13 implements DEREncodable
15 private byte[] keyidentifier;
17 public static SubjectKeyIdentifier getInstance(
21 return getInstance(ASN1OctetString.getInstance(obj, explicit));
24 public static SubjectKeyIdentifier getInstance(
27 if(obj == null || obj instanceof SubjectKeyIdentifier)
29 return (SubjectKeyIdentifier)obj;
32 if(obj instanceof SubjectPublicKeyInfo)
34 return new SubjectKeyIdentifier((SubjectPublicKeyInfo)obj);
37 if(obj instanceof ASN1OctetString)
39 return new SubjectKeyIdentifier((ASN1OctetString)obj);
42 throw new IllegalArgumentException("Invalid SubjectKeyIdentifier: " + obj.getClass().getName());
45 public SubjectKeyIdentifier(
48 this.keyidentifier=keyid;
51 public SubjectKeyIdentifier(
52 ASN1OctetString keyid)
54 this.keyidentifier=keyid.getOctets();
60 * Calulates the keyidentifier using a SHA1 hash over the BIT STRING
61 * from SubjectPublicKeyInfo as defined in RFC2459.
64 public SubjectKeyIdentifier(
65 SubjectPublicKeyInfo spki)
67 Digest digest = new SHA1Digest();
68 byte[] resBuf = new byte[digest.getDigestSize()];
70 byte[] bytes = spki.getPublicKeyData().getBytes();
71 digest.update(bytes, 0, bytes.length);
72 digest.doFinal(resBuf, 0);
73 this.keyidentifier=resBuf;
76 public byte[] getKeyIdentifier()
83 * SubjectKeyIdentifier := OCTET STRING
86 public DERObject getDERObject()
88 return new DEROctetString(keyidentifier);