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