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 Project/**
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @author Alexander Y. Kleymenov
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @version $Revision$
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.security.x509;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.ArrayList;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Collection;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.List;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1SequenceOf;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Type;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.BerInputStream;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
34f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * The class encapsulates the ASN.1 DER encoding/decoding work
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with Certificate Policies structure which is a part of X.509 certificate
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (as specified in RFC 3280 -
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Internet X.509 Public Key Infrastructure.
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Certificate and Certificate Revocation List (CRL) Profile.
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  http://www.ietf.org/rfc/rfc3280.txt):
40f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   certificatePolicies ::= SEQUENCE SIZE (1..MAX) OF PolicyInformation
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
455c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilsonpublic final class CertificatePolicies extends ExtensionValue {
465c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    /** the values of policyInformation field of the structure */
475c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    private List<PolicyInformation> policyInformations;
485c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    /** the ASN.1 encoded form of CertificatePolicies */
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private byte[] encoding;
50f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs an object representing the value of CertificatePolicies.
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CertificatePolicies() {}
55f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
565c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    public static CertificatePolicies decode(byte[] encoding) throws IOException {
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        CertificatePolicies cps = ((CertificatePolicies) ASN1.decode(encoding));
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        cps.encoding = encoding;
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return cps;
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
61f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
625c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    private CertificatePolicies(List<PolicyInformation> policyInformations, byte[] encoding) {
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.policyInformations = policyInformations;
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.encoding = encoding;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the values of policyInformation field of the structure.
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
705c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    public List<PolicyInformation> getPolicyInformations() {
715c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson        return new ArrayList<PolicyInformation>(policyInformations);
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
745c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    public CertificatePolicies addPolicyInformation(PolicyInformation policyInformation) {
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        encoding = null;
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (policyInformations == null) {
775c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson            policyInformations = new ArrayList<PolicyInformation>();
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        policyInformations.add(policyInformation);
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns ASN.1 encoded form of this X.509 CertificatePolicies value.
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
865c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    @Override public byte[] getEncoded() {
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (encoding == null) {
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            encoding = ASN1.encode(this);
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return encoding;
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
938216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes    @Override public void dumpValue(StringBuilder sb, String prefix) {
948216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        sb.append(prefix).append("CertificatePolicies [\n");
955c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson        for (PolicyInformation policyInformation : policyInformations) {
968216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            sb.append(prefix);
978216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            sb.append("  ");
988216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            policyInformation.dumpValue(sb);
998216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            sb.append('\n');
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1018216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes        sb.append(prefix).append("]\n");
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ASN.1 DER X.509 CertificatePolicies encoder/decoder class.
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1075c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson    public static final ASN1Type ASN1 = new ASN1SequenceOf(PolicyInformation.ASN1) {
1085c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson        @Override public Object getDecodedObject(BerInputStream in) {
1095c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson            return new CertificatePolicies((List<PolicyInformation>) in.content, in.getEncoded());
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1125c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson        @Override public Collection getValues(Object object) {
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            CertificatePolicies cps = (CertificatePolicies) object;
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return cps.policyInformations;
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
118