1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.x509;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERBitString;
6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam/**
8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * The KeyUsage object.
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * <pre>
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *    id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *    KeyUsage ::= BIT STRING {
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *         digitalSignature        (0),
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *         nonRepudiation          (1),
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *         keyEncipherment         (2),
16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *         dataEncipherment        (3),
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *         keyAgreement            (4),
18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *         keyCertSign             (5),
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *         cRLSign                 (6),
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *         encipherOnly            (7),
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *         decipherOnly            (8) }
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * </pre>
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class KeyUsage
2570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    extends ASN1Object
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static final int        digitalSignature = (1 << 7);
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static final int        nonRepudiation   = (1 << 6);
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static final int        keyEncipherment  = (1 << 5);
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static final int        dataEncipherment = (1 << 4);
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static final int        keyAgreement     = (1 << 3);
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static final int        keyCertSign      = (1 << 2);
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static final int        cRLSign          = (1 << 1);
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static final int        encipherOnly     = (1 << 0);
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static final int        decipherOnly     = (1 << 15);
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    private DERBitString bitString;
3870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
3970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    public static KeyUsage getInstance(Object obj)   // needs to be DERBitString for other VMs
40c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
41c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        if (obj instanceof KeyUsage)
42c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
43c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            return (KeyUsage)obj;
44c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
4570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        else if (obj != null)
46c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
4770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom            return new KeyUsage(DERBitString.getInstance(obj));
48c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
49c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
5070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        return null;
5170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
5270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
5370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    public static KeyUsage fromExtensions(Extensions extensions)
5470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
5570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        return KeyUsage.getInstance(extensions.getExtensionParsedValue(Extension.keyUsage));
56c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
5770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Basic constructor.
60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @param usage - the bitwise OR of the Key Usage flags giving the
62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * allowed uses for the key.
63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * e.g. (KeyUsage.keyEncipherment | KeyUsage.dataEncipherment)
64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public KeyUsage(
66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int usage)
67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
6870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        this.bitString = new DERBitString(usage);
69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
7170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    private KeyUsage(
7270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        DERBitString bitString)
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
7470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        this.bitString = bitString;
7570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
7670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
7770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    public byte[] getBytes()
7870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
7970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        return bitString.getBytes();
8070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
8170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
8270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    public int getPadBits()
8370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
8470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        return bitString.getPadBits();
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public String toString()
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
8970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        byte[] data = bitString.getBytes();
9070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (data.length == 1)
92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return "KeyUsage: 0x" + Integer.toHexString(data[0] & 0xff);
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return "KeyUsage: 0x" + Integer.toHexString((data[1] & 0xff) << 8 | (data[0] & 0xff));
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
9770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
9870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    public ASN1Primitive toASN1Primitive()
9970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
10070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        return bitString;
10170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
103