1 /*
2  * @(#) $Id: KeyUsage.java,v 1.2 2003/07/08 08:13:52 pankaj Exp $
3  *
4  * Copyright (c) 2002-03 by Pankaj Kumar (http://www.pankaj-k.net). 
5  * All rights reserved.
6  *
7  * The license governing the use of this file can be found in the 
8  * root directory of the containing software.
9  */
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        // No key usage set by default.
42    }
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}