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 8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 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, WITHOUT 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * License for the specific language governing permissions and limitations under 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.security.pkcs10; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.List; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.security.auth.x500.X500Principal; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Implicit; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Integer; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Sequence; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1SetOf; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.ASN1Type; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.asn1.BerInputStream; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.x501.AttributeTypeAndValue; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.x501.Name; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.x509.SubjectPublicKeyInfo; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 335c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson * CertificationRequestInfo ::= SEQUENCE { 345c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson * version Version, 355c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson * subject Name, 365c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson * subjectPublicKeyInfo SubjectPublicKeyInfo, 375c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson * attributes [0] IMPLICIT Attributes } 385c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson * 395c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson * Version ::= INTEGER 405c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson * 415c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson * Attributes ::= SET OF Attribute 425c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson */ 435c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilsonpublic final class CertificationRequestInfo { 445c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson private final int version; 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 465c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson /** the value of subject field of the structure */ 475c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson private final Name subject; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 495c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson /** the value of subjectPublicKeyInfo field of the structure */ 505c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson private final SubjectPublicKeyInfo subjectPublicKeyInfo; 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 525c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson /** the value of attributes field of the structure */ 535c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson private final List<?> attributes; 54f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 555c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson /** the ASN.1 encoded form of CertificationRequestInfo */ 565c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson private byte[] encoding; 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 585c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson private CertificationRequestInfo(int version, Name subject, 595c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson SubjectPublicKeyInfo subjectPublicKeyInfo, List<?> attributes, byte [] encoding) { 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.version = version; 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.subject = subject; 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.subjectPublicKeyInfo = subjectPublicKeyInfo; 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.attributes = attributes; 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.encoding = encoding; 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Name getSubject() { 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return subject; 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getVersion() { 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return version; 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 74f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns ASN.1 encoded form of this CertificationRequestInfo. 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a byte array containing ASN.1 encode form. 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte[] getEncoded() { 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (encoding == null) { 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project encoding = ASN1.encode(this); 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return encoding; 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 865c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson @Override public String toString() { 872f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes StringBuilder res = new StringBuilder(); 88f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes res.append("-- CertificationRequestInfo:"); 89f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes res.append("\n version: "); 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project res.append(version); 91f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes res.append("\n subject: "); 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project res.append(subject.getName(X500Principal.CANONICAL)); 93f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes res.append("\n subjectPublicKeyInfo: "); 945c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson res.append("\n\t algorithm: "); 955c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson res.append(subjectPublicKeyInfo.getAlgorithmIdentifier().getAlgorithm()); 965c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson res.append("\n\t public key: ").append(subjectPublicKeyInfo.getPublicKey()); 97f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes res.append("\n attributes: "); 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (attributes != null) { 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project res.append(attributes.toString()); 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 101f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes res.append("none"); 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 103f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes res.append("\n-- CertificationRequestInfo End\n"); 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return res.toString(); 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final ASN1Sequence ASN1 = new ASN1Sequence(new ASN1Type[] { 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ASN1Integer.getInstance(), // version 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Name.ASN1, // subject 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SubjectPublicKeyInfo.ASN1, // subjectPublicKeyInfo 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new ASN1Implicit(0, new ASN1SetOf( 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project AttributeTypeAndValue.ASN1)) // attributes 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }) { 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1155c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson @Override protected Object getDecodedObject(BerInputStream in) { 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object[] values = (Object[]) in.content; 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CertificationRequestInfo( 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ASN1Integer.toIntValue(values[0]), 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (Name) values[1], 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (SubjectPublicKeyInfo) values[2], 1215c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson (List<?>) values[3], 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project in.getEncoded()); 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 124f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 1255c27fb80ffd335aa45dc8829ba3ecbc18c01e4e8Jesse Wilson @Override protected void getValues(Object object, Object[] values) { 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CertificationRequestInfo certReqInfo = (CertificationRequestInfo) object; 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project values[0] = ASN1Integer.fromIntValue(certReqInfo.version); 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project values[1] = certReqInfo.subject; 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project values[2] = certReqInfo.subjectPublicKeyInfo; 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project values[3] = certReqInfo.attributes; 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 135