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