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.ASN1Enumerated;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Type;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * CRL Entry's Reason Code Extension (OID = 2.5.29.21).
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  id-ce-cRLReason OBJECT IDENTIFIER ::= { id-ce 21 }
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  -- reasonCode ::= { CRLReason }
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  CRLReason ::= ENUMERATED {
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       unspecified             (0),
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       keyCompromise           (1),
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       cACompromise            (2),
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       affiliationChanged      (3),
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       superseded              (4),
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       cessationOfOperation    (5),
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       certificateHold         (6),
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       removeFromCRL           (8),
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       privilegeWithdrawn      (9),
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *       aACompromise           (10)
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  }
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (as specified in RFC 3280 http://www.ietf.org/rfc/rfc3280.txt)
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
455c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilsonpublic final class ReasonCode extends ExtensionValue {
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // predefined reason code values
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final byte UNSPECIFIED = 0;
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final byte KEY_COMPROMISE = 1;
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final byte CA_COMPROMISE = 2;
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final byte AFFILIATION_CHANGED = 3;
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final byte SUPERSEDED = 4;
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final byte CESSATION_OF_OPERATION = 5;
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final byte CERTIFICATE_HOLD = 6;
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final byte REMOVE_FROM_CRL = 8;
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final byte PRIVILEGE_WITHDRAWN = 9;
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final byte AA_COMPROMISE = 10;
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // the reason code value
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final byte code;
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ReasonCode(byte[] encoding) throws IOException {
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(encoding);
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.code = ((byte[]) ASN1.decode(encoding))[0];
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
675c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    @Override public byte[] getEncoded() {
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (encoding == null) {
69866e7ae17a3da81a02b0b144e0c9c2b3196d293aElliott Hughes            encoding = ASN1.encode(new byte[] { code });
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return encoding;
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
748216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes    @Override public void dumpValue(StringBuilder sb, String prefix) {
758216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        sb.append(prefix).append("Reason Code: [ ");
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        switch (code) {
778216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        case UNSPECIFIED:
788216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            sb.append("unspecified");
798216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            break;
808216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        case KEY_COMPROMISE:
818216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            sb.append("keyCompromise");
828216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            break;
838216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        case CA_COMPROMISE:
848216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            sb.append("cACompromise");
858216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            break;
868216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        case AFFILIATION_CHANGED:
878216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            sb.append("affiliationChanged");
888216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            break;
898216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        case SUPERSEDED:
908216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            sb.append("superseded");
918216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            break;
928216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        case CESSATION_OF_OPERATION:
938216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            sb.append("cessationOfOperation");
948216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            break;
958216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        case CERTIFICATE_HOLD:
968216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            sb.append("certificateHold");
978216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            break;
988216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        case REMOVE_FROM_CRL:
998216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            sb.append("removeFromCRL");
1008216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            break;
1018216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        case PRIVILEGE_WITHDRAWN:
1028216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            sb.append("privilegeWithdrawn");
1038216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            break;
1048216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        case AA_COMPROMISE:
1058216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            sb.append("aACompromise");
1068216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            break;
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1088216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        sb.append(" ]\n");
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ASN.1 Encoder/Decoder.
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1142f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    public static final ASN1Type ASN1 = ASN1Enumerated.getInstance();
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
116