AuthorityKeyIdentifier.java
上传用户:lior1029
上传日期:2013-05-07
资源大小:209k
文件大小:5k
源码类别:

CA认证

开发平台:

Java

  1. package org.bouncycastle.asn1.x509;
  2. import java.math.BigInteger;
  3. import java.util.Enumeration;
  4. import org.bouncycastle.crypto.Digest;
  5. import org.bouncycastle.crypto.digests.SHA1Digest;
  6. import org.bouncycastle.asn1.*;
  7. /**
  8.  * <pre>
  9.  * id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::=  { id-ce 35 }
  10.  *
  11.  *   AuthorityKeyIdentifier ::= SEQUENCE {
  12.  *      keyIdentifier             [0] IMPLICIT KeyIdentifier           OPTIONAL,
  13.  *      authorityCertIssuer       [1] IMPLICIT GeneralNames            OPTIONAL,
  14.  *      authorityCertSerialNumber [2] IMPLICIT CertificateSerialNumber OPTIONAL  }
  15.  *
  16.  *   KeyIdentifier ::= OCTET STRING
  17.  * </pre>
  18.  *
  19.  */
  20. public class AuthorityKeyIdentifier
  21.     implements DEREncodable, DERTags
  22. {
  23.     ASN1OctetString keyidentifier=null;
  24.     GeneralNames certissuer=null;
  25.     DERInteger certserno=null;
  26.     public static AuthorityKeyIdentifier getInstance(
  27.         ASN1TaggedObject obj,
  28.         boolean          explicit)
  29.     {
  30.         return getInstance(ASN1Sequence.getInstance(obj, explicit));
  31.     }
  32.     public static AuthorityKeyIdentifier getInstance(
  33.         Object  obj)
  34.     {
  35.         if (obj instanceof AuthorityKeyIdentifier)
  36.         {
  37.             return (AuthorityKeyIdentifier)obj;
  38.         }
  39.         else if (obj instanceof ASN1Sequence)
  40.         {
  41.             return new AuthorityKeyIdentifier((ASN1Sequence)obj);
  42.         }
  43.         throw new IllegalArgumentException("unknown object in factory");
  44.     }
  45.     public AuthorityKeyIdentifier(
  46.         ASN1Sequence   seq)
  47.     {
  48.         Enumeration     e = seq.getObjects();
  49.         while (e.hasMoreElements())
  50.         {
  51.             DERTaggedObject o = (DERTaggedObject)e.nextElement();
  52.             switch (o.getTagNo())
  53.             {
  54.             case 0:
  55.                 this.keyidentifier = ASN1OctetString.getInstance(o, false);
  56.                 break;
  57.             case 1:
  58.                 this.certissuer = GeneralNames.getInstance(o, false);
  59.                 break;
  60.             case 2:
  61.                 this.certserno = DERInteger.getInstance(o, false);
  62.                 break;
  63.             default:
  64.                 throw new IllegalArgumentException("illegal tag");
  65.             }
  66.         }
  67.     }
  68.     /**
  69.      *
  70.      * Calulates the keyidentifier using a SHA1 hash over the BIT STRING
  71.      * from SubjectPublicKeyInfo as defined in RFC2459.
  72.      *
  73.      * Example of making a AuthorityKeyIdentifier:
  74.      * <pre>
  75.      *   SubjectPublicKeyInfo apki = new SubjectPublicKeyInfo((ASN1Sequence)new DERInputStream(
  76.      *       new ByteArrayInputStream(publicKey.getEncoded())).readObject());
  77.      *   AuthorityKeyIdentifier aki = new AuthorityKeyIdentifier(apki);
  78.      * </pre>
  79.      *
  80.      **/
  81.     public AuthorityKeyIdentifier(
  82.         SubjectPublicKeyInfo    spki)
  83.     {
  84.         Digest  digest = new SHA1Digest();
  85.         byte[]  resBuf = new byte[digest.getDigestSize()];
  86.         byte[] bytes = spki.getPublicKeyData().getBytes();
  87.         digest.update(bytes, 0, bytes.length);
  88.         digest.doFinal(resBuf, 0);
  89.         this.keyidentifier = new DEROctetString(resBuf);
  90.     }
  91.     /**
  92.      * create an AuthorityKeyIdentifier with the GeneralNames tag and
  93.      * the serial number provided as well.
  94.      */
  95.     public AuthorityKeyIdentifier(
  96.         SubjectPublicKeyInfo    spki,
  97.         GeneralNames            name,
  98.         BigInteger              serialNumber)
  99.     {
  100.         Digest  digest = new SHA1Digest();
  101.         byte[]  resBuf = new byte[digest.getDigestSize()];
  102.         byte[] bytes = spki.getPublicKeyData().getBytes();
  103.         digest.update(bytes, 0, bytes.length);
  104.         digest.doFinal(resBuf, 0);
  105.         this.keyidentifier = new DEROctetString(resBuf);
  106.         this.certissuer = name;
  107.         this.certserno = new DERInteger(serialNumber);
  108.     }
  109.     public byte[] getKeyIdentifier()
  110.     {
  111.         if (keyidentifier != null)
  112.         {
  113.             return keyidentifier.getOctets();
  114.         }
  115.         return null;
  116.     }
  117.      /**
  118.      * <pre>
  119.      *   AuthorityKeyIdentifier ::= SEQUENCE {
  120.      *      keyIdentifier             [0] IMPLICIT KeyIdentifier           OPTIONAL,
  121.      *      authorityCertIssuer       [1] IMPLICIT GeneralNames            OPTIONAL,
  122.      *      authorityCertSerialNumber [2] IMPLICIT CertificateSerialNumber OPTIONAL  }
  123.      *
  124.      *   KeyIdentifier ::= OCTET STRING
  125.      * </pre>
  126.      */
  127.     public DERObject getDERObject()
  128.     {
  129.         ASN1EncodableVector  v = new ASN1EncodableVector();
  130.         if (keyidentifier != null)
  131.         {
  132.             v.add(new DERTaggedObject(false, 0, keyidentifier));
  133.         }
  134.         if (certissuer != null)
  135.         {
  136.             v.add(new DERTaggedObject(false, 1, certissuer));
  137.         }
  138.         if (certserno != null)
  139.         {
  140.             v.add(new DERTaggedObject(false, 2, certserno));
  141.         }
  142.         return new DERSequence(v);
  143.     }
  144.     public String toString()
  145.     {
  146.         return ("AuthorityKeyIdentifier: KeyID(" + this.keyidentifier.getOctets() + ")");
  147.     }
  148. }