Home | History | Annotate | Download | only in x509
      1 package org.bouncycastle.asn1.x509;
      2 
      3 import org.bouncycastle.asn1.ASN1Object;
      4 import org.bouncycastle.asn1.ASN1Primitive;
      5 import org.bouncycastle.asn1.DERBitString;
      6 
      7 /**
      8  * The KeyUsage object.
      9  * <pre>
     10  *    id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }
     11  *
     12  *    KeyUsage ::= BIT STRING {
     13  *         digitalSignature        (0),
     14  *         nonRepudiation          (1),
     15  *         keyEncipherment         (2),
     16  *         dataEncipherment        (3),
     17  *         keyAgreement            (4),
     18  *         keyCertSign             (5),
     19  *         cRLSign                 (6),
     20  *         encipherOnly            (7),
     21  *         decipherOnly            (8) }
     22  * </pre>
     23  */
     24 public class KeyUsage
     25     extends ASN1Object
     26 {
     27     public static final int        digitalSignature = (1 << 7);
     28     public static final int        nonRepudiation   = (1 << 6);
     29     public static final int        keyEncipherment  = (1 << 5);
     30     public static final int        dataEncipherment = (1 << 4);
     31     public static final int        keyAgreement     = (1 << 3);
     32     public static final int        keyCertSign      = (1 << 2);
     33     public static final int        cRLSign          = (1 << 1);
     34     public static final int        encipherOnly     = (1 << 0);
     35     public static final int        decipherOnly     = (1 << 15);
     36 
     37     private DERBitString bitString;
     38 
     39     public static KeyUsage getInstance(Object obj)   // needs to be DERBitString for other VMs
     40     {
     41         if (obj instanceof KeyUsage)
     42         {
     43             return (KeyUsage)obj;
     44         }
     45         else if (obj != null)
     46         {
     47             return new KeyUsage(DERBitString.getInstance(obj));
     48         }
     49 
     50         return null;
     51     }
     52 
     53     public static KeyUsage fromExtensions(Extensions extensions)
     54     {
     55         return KeyUsage.getInstance(extensions.getExtensionParsedValue(Extension.keyUsage));
     56     }
     57 
     58     /**
     59      * Basic constructor.
     60      *
     61      * @param usage - the bitwise OR of the Key Usage flags giving the
     62      * allowed uses for the key.
     63      * e.g. (KeyUsage.keyEncipherment | KeyUsage.dataEncipherment)
     64      */
     65     public KeyUsage(
     66         int usage)
     67     {
     68         this.bitString = new DERBitString(usage);
     69     }
     70 
     71     private KeyUsage(
     72         DERBitString bitString)
     73     {
     74         this.bitString = bitString;
     75     }
     76 
     77     /**
     78      * Return true if a given usage bit is set, false otherwise.
     79      *
     80      * @param usages combination of usage flags.
     81      * @return true if all bits are set, false otherwise.
     82      */
     83     public boolean hasUsages(int usages)
     84     {
     85         return (bitString.intValue() & usages) == usages;
     86     }
     87 
     88     public byte[] getBytes()
     89     {
     90         return bitString.getBytes();
     91     }
     92 
     93     public int getPadBits()
     94     {
     95         return bitString.getPadBits();
     96     }
     97 
     98     public String toString()
     99     {
    100         byte[] data = bitString.getBytes();
    101 
    102         if (data.length == 1)
    103         {
    104             return "KeyUsage: 0x" + Integer.toHexString(data[0] & 0xff);
    105         }
    106         return "KeyUsage: 0x" + Integer.toHexString((data[1] & 0xff) << 8 | (data[0] & 0xff));
    107     }
    108 
    109     public ASN1Primitive toASN1Primitive()
    110     {
    111         return bitString;
    112     }
    113 }
    114