blob: ed7a5a30df351f0c19e1ed6e10b05102a022ab4a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Alexander Y. Kleymenov
*/
package org.apache.harmony.security.tests.x509;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.cert.CertificateFactory;
import java.util.Arrays;
import java.util.Date;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.apache.harmony.security.asn1.ASN1Integer;
import org.apache.harmony.security.x501.Name;
import org.apache.harmony.security.x509.AlgorithmIdentifier;
import org.apache.harmony.security.x509.Certificate;
import org.apache.harmony.security.x509.EDIPartyName;
import org.apache.harmony.security.x509.Extension;
import org.apache.harmony.security.x509.Extensions;
import org.apache.harmony.security.x509.GeneralName;
import org.apache.harmony.security.x509.GeneralNames;
import org.apache.harmony.security.x509.NameConstraints;
import org.apache.harmony.security.x509.ORAddress;
import org.apache.harmony.security.x509.OtherName;
import org.apache.harmony.security.x509.SubjectPublicKeyInfo;
import org.apache.harmony.security.x509.TBSCertificate;
import org.apache.harmony.security.x509.Validity;
/**
* Testing the encoding/decoding work of the following structure:
* (as specified in RFC 3280 -
* Internet X.509 Public Key Infrastructure.
* Certificate and Certificate Revocation List (CRL) Profile.
* http://www.ietf.org/rfc/rfc3280.txt):
* <p/>
* <pre>
* Certificate ::= SEQUENCE {
* tbsCertificate TBSCertificate,
* signatureAlgorithm AlgorithmIdentifier,
* signatureValue BIT STRING
* }
*
* TBSCertificate ::= SEQUENCE {
* version [0] EXPLICIT Version DEFAULT v1,
* serialNumber CertificateSerialNumber,
* signature AlgorithmIdentifier,
* issuer Name,
* validity Validity,
* subject Name,
* subjectPublicKeyInfo SubjectPublicKeyInfo,
* issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
* -- If present, version MUST be v2 or v3
* subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
* -- If present, version MUST be v2 or v3
* extensions [3] EXPLICIT Extensions OPTIONAL
* -- If present, version MUST be v3
* }
*
* Version ::= INTEGER { v1(0), v2(1), v3(2) }
*
* CertificateSerialNumber ::= INTEGER
*
* Validity ::= SEQUENCE {
* notBefore Time,
* notAfter Time
* }
*
* Time ::= CHOICE {
* utcTime UTCTime,
* generalTime GeneralizedTime
* }
*
* UniqueIdentifier ::= BIT STRING
*
* SubjectPublicKeyInfo ::= SEQUENCE {
* algorithm AlgorithmIdentifier,
* subjectPublicKey BIT STRING
* }
*
* Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
*
* Extension ::= SEQUENCE {
* extnID OBJECT IDENTIFIER,
* critical BOOLEAN DEFAULT FALSE,
* extnValue OCTET STRING
* }
* </pre>
*/
public class CertificateTest extends TestCase {
/**
* Certificate(TBSCertificate tbsCertificate, AlgorithmIdentifier
* signatureAlgorithm, byte[] signatureValue) method testing.
* Makes the certificate, gets its encoded form, makes new certificate
* from this encoded form by CertificateFactory, and decodes encoded
* form.
*/
public void testCertificate() throws Exception {
// make the TBSCertificate for Certificate
int version = 2; //v3
BigInteger serialNumber = BigInteger.valueOf(555L);
AlgorithmIdentifier signature = new AlgorithmIdentifier("1.2.3.44.555"); // random value
Name issuer = new Name("O=Certificate Issuer");
Validity validity = new Validity(new Date(100000000), new Date(200000000));
Name subject = new Name("O=Subject Organization");
SubjectPublicKeyInfo subjectPublicKeyInfo =
new SubjectPublicKeyInfo(new AlgorithmIdentifier("1.2.840.113549.1.1.2"),
new byte[10]);
boolean[] issuerUniqueID = new boolean[]
{ true, false, true, false, true, false, true, false }; // random value
boolean[] subjectUniqueID = new boolean[]
{ false, true, false, true, false, true, false, true }; // random value
// make the Extensions for TBSCertificate
// Subject Alternative Names
GeneralName[] san = new GeneralName[] {
new GeneralName(
new OtherName("1.2.3.4.5",
ASN1Integer.getInstance().encode(
BigInteger.valueOf(55L).toByteArray()))),
new GeneralName(1, "rfc@822.Name"),
new GeneralName(2, "dNSName"),
new GeneralName(new ORAddress()),
new GeneralName(4, "O=Organization"),
new GeneralName(new EDIPartyName("assigner", "party")),
new GeneralName(6, "http://Resource.Id"),
new GeneralName(new byte[] { 1, 1, 1, 1 }),
new GeneralName(8, "1.2.3.4444.55555")
};
GeneralNames sans = new GeneralNames(Arrays.asList(san));
Extension extension = new Extension("2.5.29.17", true, sans.getEncoded());
Extensions extensions = new Extensions();
extensions.addExtension(extension);
byte[] encoding = extensions.getEncoded();
Extensions.ASN1.decode(encoding);
TBSCertificate tbsCertificate = new TBSCertificate(version, serialNumber,
signature, issuer, validity, subject, subjectPublicKeyInfo,
issuerUniqueID, subjectUniqueID, extensions);
encoding = tbsCertificate.getEncoded();
TBSCertificate.ASN1.decode(encoding);
Certificate certificate = new Certificate(tbsCertificate, signature, new byte[10]);
encoding = certificate.getEncoded();
Certificate.ASN1.decode(encoding);
encoding = Certificate.ASN1.encode(certificate);
ByteArrayInputStream bais = new ByteArrayInputStream(encoding);
//try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
cf.generateCertificate(bais);
//} catch (CertificateException e) {
// there is no X.509 certificate factory implementation installed
//}
}
/**
* getTbsCertificate() method testing.
*/
public void testGetTbsCertificate() throws IOException {
// manually derived data:
byte[] encoding = new byte[] {
(byte) 0x30, (byte) 0x13, // NameConstraints
(byte) 0xa1, (byte) 0x11, // GeneralSubtrees (excludedSubtrees)
(byte) 0x30, (byte) 0x0f, // GeneralSubtree
(byte) 0xa0, (byte) 0x0a, // GeneralName
// OtherName:
(byte) 0x06, (byte) 0x03, // type-id (OID)
(byte) 0x00, (byte) 0x01, (byte) 0x02, // oid
(byte) 0xA0, (byte) 0x03, // value (raw)
1, 1, (byte) 0xff, // boolean
(byte) 0x80, (byte) 0x01, (byte) 0x00 // minimum
};
NameConstraints.ASN1.decode(encoding);
}
/**
* getSignatureAlgorithm() method testing.
*/
public void testGetSignatureAlgorithm() {
}
/**
* getSignatureValue() method testing.
*/
public void testGetSignatureValue() {
}
/**
* getValue() method testing.
*/
public void testGetValue() {
}
public static Test suite() {
return new TestSuite(CertificateTest.class);
}
}