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 Project/**
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* @author Alexander Y. Kleymenov
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* @version $Revision$
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.security.x509;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Explicit;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Implicit;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Sequence;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Type;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.security.asn1.BerInputStream;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.security.internal.nls.Messages;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The class encapsulates the ASN.1 DER encoding/decoding work
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with the DistributionPoint structure which is the part of X.509 CRL
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (as specified in RFC 3280 -
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Internet X.509 Public Key Infrastructure.
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Certificate and Certificate Revocation List (CRL) Profile.
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  http://www.ietf.org/rfc/rfc3280.txt):
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <pre>
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  CRLDistributionPoints ::= SEQUENCE SIZE (1..MAX) OF DistributionPoint
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  DistributionPoint ::= SEQUENCE {
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        distributionPoint       [0]     DistributionPointName OPTIONAL,
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        reasons                 [1]     ReasonFlags OPTIONAL,
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        cRLIssuer               [2]     GeneralNames OPTIONAL
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  }
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  DistributionPointName ::= CHOICE {
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        fullName                [0]     GeneralNames,
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        nameRelativeToCRLIssuer [1]     RelativeDistinguishedName
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  }
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  ReasonFlags ::= BIT STRING {
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        unused                  (0),
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        keyCompromise           (1),
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        cACompromise            (2),
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        affiliationChanged      (3),
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        superseded              (4),
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        cessationOfOperation    (5),
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        certificateHold         (6),
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        privilegeWithdrawn      (7),
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *        aACompromise            (8)
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  }
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </pre>
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class DistributionPoint {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final DistributionPointName distributionPoint;
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final ReasonFlags reasons;
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final GeneralNames cRLIssuer;
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public DistributionPoint() {
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        distributionPoint = null;
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        reasons = null;
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cRLIssuer = null;
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public DistributionPoint(DistributionPointName distributionPoint,
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ReasonFlags reasons, GeneralNames cRLIssuer) {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ((reasons != null) && (distributionPoint == null)
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                && (cRLIssuer == null)) {
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException(
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Messages.getString("security.17F")); //$NON-NLS-1$
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.distributionPoint = distributionPoint;
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.reasons = reasons;
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.cRLIssuer = cRLIssuer;
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Places the string representation of extension value
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * into the StringBuffer object.
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void dumpValue(StringBuffer buffer, String prefix) {
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer.append(prefix);
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer.append("Distribution Point: [\n"); //$NON-NLS-1$
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (distributionPoint != null) {
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            distributionPoint.dumpValue(buffer, prefix + "  "); //$NON-NLS-1$
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (reasons != null) {
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            reasons.dumpValue(buffer, prefix + "  "); //$NON-NLS-1$
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (cRLIssuer != null) {
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buffer.append(prefix);
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buffer.append("  CRL Issuer: [\n"); //$NON-NLS-1$
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cRLIssuer.dumpValue(buffer, prefix + "    "); //$NON-NLS-1$
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buffer.append(prefix);
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buffer.append("  ]\n"); //$NON-NLS-1$
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer.append(prefix);
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buffer.append("]\n"); //$NON-NLS-1$
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Custom X.509 decoder.
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final ASN1Sequence ASN1 = new ASN1Sequence(new ASN1Type[] {
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ASN1Explicit(0, DistributionPointName.ASN1),
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ASN1Implicit(1, ReasonFlags.ASN1),
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ASN1Implicit(2, GeneralNames.ASN1)
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }) {
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            setOptional(0);
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            setOptional(1);
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            setOptional(2);
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected Object getDecodedObject(BerInputStream in) throws IOException {
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object[] values = (Object[]) in.content;
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new DistributionPoint((DistributionPointName) values[0],
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    (ReasonFlags) values[1], (GeneralNames) values[2]);
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected void getValues(Object object, Object[] values) {
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            DistributionPoint dp = (DistributionPoint) object;
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            values[0] = dp.distributionPoint;
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            values[1] = dp.reasons;
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            values[2] = dp.cRLIssuer;
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    };
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
146