1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.security.x509;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Type;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1BitString;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Key Usage Extension (OID = 2.5.29.15).
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The ASN.1 definition for Key Usage Extension is:
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <pre>
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * KeyUsage ::= BIT STRING {
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     digitalSignature        (0),
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     nonRepudiation          (1),
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     keyEncipherment         (2),
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     dataEncipherment        (3),
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     keyAgreement            (4),
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     keyCertSign             (5),
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     cRLSign                 (6),
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     encipherOnly            (7),
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     decipherOnly            (8)
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * }
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </pre>
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (as specified in RFC 3280 http://www.ietf.org/rfc/rfc3280.txt)
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class KeyUsage extends ExtensionValue {
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The names of the usages.
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final String[] USAGES = {
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        "digitalSignature", //$NON-NLS-1$
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        "nonRepudiation", //$NON-NLS-1$
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        "keyEncipherment", //$NON-NLS-1$
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        "dataEncipherment", //$NON-NLS-1$
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        "keyAgreement", //$NON-NLS-1$
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        "keyCertSign", //$NON-NLS-1$
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        "cRLSign", //$NON-NLS-1$
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        "encipherOnly", //$NON-NLS-1$
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        "decipherOnly", //$NON-NLS-1$
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    };
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // the value of extension
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final boolean[] keyUsage;
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates the extension object corresponding to the given key usage.
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public KeyUsage(boolean[] keyUsage) {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.keyUsage = keyUsage;
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates the extension object on the base of its encoded form.
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public KeyUsage(byte[] encoding) throws IOException {
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(encoding);
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.keyUsage = (boolean[]) ASN1.decode(encoding);
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean[] getKeyUsage() {
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return keyUsage;
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the encoded of the object.
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a byte array containing ASN.1 encoded form.
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public byte[] getEncoded() {
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (encoding == null) {
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            encoding = ASN1.encode(keyUsage);
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return encoding;
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Places the string representation of extension value
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * into the StringBuffer object.
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void dumpValue(StringBuffer buffer, String prefix) {
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer.append(prefix).append("KeyUsage [\n"); //$NON-NLS-1$
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i=0; i<keyUsage.length; i++) {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (keyUsage[i]) {
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buffer.append(prefix).append("  ") //$NON-NLS-1$
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    .append(USAGES[i]).append('\n');
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer.append(prefix).append("]\n"); //$NON-NLS-1$
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * X.509 Extension value encoder/decoder.
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final ASN1Type ASN1 = new ASN1BitString.ASN1NamedBitList(9);
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
117