1
10import java.util.*;
11import java.util.logging.Logger;
12import java.security.*;
13
14
15public class KeyUsage {
16 public static final int MAX_KEYUSAGE_INDEX = 8;
17
18 public static final int DIGITAL_SIGNATURE = 0;
19 public static final int NON_REPUDIATION = 1;
20 public static final int KEY_ENCIPHERMENT = 2;
21 public static final int DATA_ENCIPHERMENT = 3;
22 public static final int KEY_AGREEMENT = 4;
23 public static final int KEY_CERTSIGN = 5;
24 public static final int CRL_SIGN = 6;
25 public static final int ENCIPHER_ONLY = 7;
26 public static final int DECIPHER_ONLY = 8;
27 public static final String[] keyUsageString = new String[] {
28 "digitalSignature",
29 "nonRepudiation",
30 "keyEncipherment",
31 "dataEncipherment",
32 "keyAgreement",
33 "keyCertSign",
34 "cRLSign",
35 "encipherOnly",
36 "decipherOnly" };
37
38 private boolean[] keyUsage = new boolean[MAX_KEYUSAGE_INDEX + 1];
39
40 public KeyUsage(){
41 }
43
44 public KeyUsage(boolean[] keyUsage){
45 if (keyUsage == null)
46 return;
47 for (int i = 0; (i < this.keyUsage.length) || (i < keyUsage.length); i++){
48 this.keyUsage[i] = keyUsage[i];
49 }
50 }
51
52 public void setKeyUsage(String kuString, boolean flag){
53 for (int i = 0; i < keyUsage.length; i++){
54 if (keyUsageString[i].equalsIgnoreCase(kuString)){
55 keyUsage[i] = flag;
56 }
57 }
58 }
59
60 public void setKeyUsage(int index, boolean flag){
61 if (index >= 0 && index <= MAX_KEYUSAGE_INDEX)
62 keyUsage[index] = flag;
63 }
64
65 public String getKeyUsageString(){
66 StringBuffer sb = new StringBuffer();
67 boolean first = true;
68 for (int i = 0; i < this.keyUsage.length; i++){
69 if (keyUsage[i]){
70 if (first){
71 first = false;
72 } else {
73 sb.append(", ");
74 }
75 sb.append(keyUsageString[i]);
76 }
77 }
78 return sb.toString();
79 }
80
81 public static String getKeyUsageString(int index){
82 if (index >= 0 && index <= MAX_KEYUSAGE_INDEX)
83 return keyUsageString[index];
84 return null;
85 }
86
87 public byte[] getBitString(){
88 byte[] value = new byte[2];
89 int mask = 0x80;
90 for (int i = 0; i < 8; i++){
91 if (keyUsage[i])
92 value[0] |= (byte)mask;
93 mask >>= 1;
94 }
95 mask = 0x80;
96 if (keyUsage[8])
97 value[1] = (byte)mask;
98 return value;
99 }
00
01 public int getNumUnusedBits(){
02 return 7;
03 }
04
05 public static void main(String[] args) throws Exception {
06 KeyUsage ku = new KeyUsage();
07 ku.setKeyUsage("crlSign", true);
08 System.out.println("KeyUsage: " + ku.getKeyUsageString());
09 ku.setKeyUsage("nonRepudiation", true);
10 System.out.println("KeyUsage: " + ku.getKeyUsageString());
11 }
12}