diff options
author | David Hook <dgh@cryptoworkshop.com> | 2013-05-31 11:07:45 +0400 |
---|---|---|
committer | David Hook <dgh@cryptoworkshop.com> | 2013-05-31 11:07:45 +0400 |
commit | 2b976f5364cfdbc37d3086019d93483c983eb80b (patch) | |
tree | cb846af3fd1d43f9c2562a1fb2d06b997ad8f229 /core/src/main/java/org/bouncycastle/asn1/eac/CVCertificateRequest.java | |
parent | 5f714bd92fbd780d22406f4bc3681be005f6f04a (diff) |
initial reshuffle
Diffstat (limited to 'core/src/main/java/org/bouncycastle/asn1/eac/CVCertificateRequest.java')
-rw-r--r-- | core/src/main/java/org/bouncycastle/asn1/eac/CVCertificateRequest.java | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/core/src/main/java/org/bouncycastle/asn1/eac/CVCertificateRequest.java b/core/src/main/java/org/bouncycastle/asn1/eac/CVCertificateRequest.java new file mode 100644 index 00000000..dcbc8f1d --- /dev/null +++ b/core/src/main/java/org/bouncycastle/asn1/eac/CVCertificateRequest.java @@ -0,0 +1,170 @@ +package org.bouncycastle.asn1.eac; + +import java.io.IOException; +import java.util.Enumeration; + +import org.bouncycastle.asn1.ASN1EncodableVector; +import org.bouncycastle.asn1.ASN1Object; +import org.bouncycastle.asn1.ASN1ObjectIdentifier; +import org.bouncycastle.asn1.ASN1ParsingException; +import org.bouncycastle.asn1.ASN1Primitive; +import org.bouncycastle.asn1.ASN1Sequence; +import org.bouncycastle.asn1.BERTags; +import org.bouncycastle.asn1.DERApplicationSpecific; +import org.bouncycastle.asn1.DEROctetString; + +//import java.math.BigInteger; + + +public class CVCertificateRequest + extends ASN1Object +{ + private CertificateBody certificateBody; + + private byte[] innerSignature = null; + private byte[] outerSignature = null; + + private int valid; + + private static int bodyValid = 0x01; + private static int signValid = 0x02; + + private CVCertificateRequest(DERApplicationSpecific request) + throws IOException + { + if (request.getApplicationTag() == EACTags.AUTHENTIFICATION_DATA) + { + ASN1Sequence seq = ASN1Sequence.getInstance(request.getObject(BERTags.SEQUENCE)); + + initCertBody(DERApplicationSpecific.getInstance(seq.getObjectAt(0))); + + outerSignature = DERApplicationSpecific.getInstance(seq.getObjectAt(seq.size() - 1)).getContents(); + } + else + { + initCertBody(request); + } + } + + private void initCertBody(DERApplicationSpecific request) + throws IOException + { + if (request.getApplicationTag() == EACTags.CARDHOLDER_CERTIFICATE) + { + ASN1Sequence seq = ASN1Sequence.getInstance(request.getObject(BERTags.SEQUENCE)); + for (Enumeration en = seq.getObjects(); en.hasMoreElements();) + { + DERApplicationSpecific obj = DERApplicationSpecific.getInstance(en.nextElement()); + switch (obj.getApplicationTag()) + { + case EACTags.CERTIFICATE_CONTENT_TEMPLATE: + certificateBody = CertificateBody.getInstance(obj); + valid |= bodyValid; + break; + case EACTags.STATIC_INTERNAL_AUTHENTIFICATION_ONE_STEP: + innerSignature = obj.getContents(); + valid |= signValid; + break; + default: + throw new IOException("Invalid tag, not an CV Certificate Request element:" + obj.getApplicationTag()); + } + } + } + else + { + throw new IOException("not a CARDHOLDER_CERTIFICATE in request:" + request.getApplicationTag()); + } + } + + public static CVCertificateRequest getInstance(Object obj) + { + if (obj instanceof CVCertificateRequest) + { + return (CVCertificateRequest)obj; + } + else if (obj != null) + { + try + { + return new CVCertificateRequest(DERApplicationSpecific.getInstance(obj)); + } + catch (IOException e) + { + throw new ASN1ParsingException("unable to parse data: " + e.getMessage(), e); + } + } + + return null; + } + + ASN1ObjectIdentifier signOid = null; + ASN1ObjectIdentifier keyOid = null; + + public static byte[] ZeroArray = new byte[]{0}; + + + String strCertificateHolderReference; + + byte[] encodedAuthorityReference; + + int ProfileId; + + /** + * Returns the body of the certificate template + * + * @return the body. + */ + public CertificateBody getCertificateBody() + { + return certificateBody; + } + + /** + * Return the public key data object carried in the request + * @return the public key + */ + public PublicKeyDataObject getPublicKey() + { + return certificateBody.getPublicKey(); + } + + public byte[] getInnerSignature() + { + return innerSignature; + } + + public byte[] getOuterSignature() + { + return outerSignature; + } + + byte[] certificate = null; + protected String overSignerReference = null; + + public boolean hasOuterSignature() + { + return outerSignature != null; + } + + byte[] encoded; + + PublicKeyDataObject iso7816PubKey = null; + + public ASN1Primitive toASN1Primitive() + { + ASN1EncodableVector v = new ASN1EncodableVector(); + + v.add(certificateBody); + + try + { + v.add(new DERApplicationSpecific(false, EACTags.STATIC_INTERNAL_AUTHENTIFICATION_ONE_STEP, new DEROctetString(innerSignature))); + } + catch (IOException e) + { + throw new IllegalStateException("unable to convert signature!"); + } + + return new DERApplicationSpecific(EACTags.CARDHOLDER_CERTIFICATE, v); + } +} |