Example usage for org.bouncycastle.asn1 ASN1TaggedObject getInstance

List of usage examples for org.bouncycastle.asn1 ASN1TaggedObject getInstance

Introduction

In this page you can find the example usage for org.bouncycastle.asn1 ASN1TaggedObject getInstance.

Prototype

static public ASN1TaggedObject getInstance(ASN1TaggedObject obj, boolean explicit) 

Source Link

Usage

From source file:ca.trustpoint.m2m.M2mCertificateFactory.java

License:Apache License

/**
 * Parses the given ASN.1 sequence and return the corresponding {@link M2mCertificate
 * M2MCertificate} object./*from   w ww.j  a v  a 2  s  . c  o  m*/
 *
 * @param seq ASN.1 sequence containing TBS data.
 * @param cert A M2MCertificate object.
 * @throw InvalidKeyException if public key is invalid.
 * @throw IOException if parsing error.
 * @throw URISyntaxException if URI field is invalid.
 */
private void parseTbsCertificate(ASN1Sequence seq, M2mCertificate cert)
        throws InvalidKeyException, IOException, URISyntaxException {
    if (seq.size() < 2) {
        throw new IOException("no enough data for TBS certificate in sequence");
    }

    // Set tbsCertificate
    for (int i = 0; i < seq.size(); i++) {
        ASN1TaggedObject obj = (ASN1TaggedObject) seq.getObjectAt(i);
        TbsCertificateFields tag = TbsCertificateFields.getInstance(obj.getTagNo());

        switch (tag) {
        case SERIAL_NUMBER:
            ASN1OctetString serialNumber = ASN1OctetString.getInstance(obj, false);
            cert.setSerialNumber(serialNumber.getOctets());
            break;
        case CA_ALGORITHM:
            ASN1ObjectIdentifier cAAlgorithm = ASN1ObjectIdentifier.getInstance(obj, false);

            if (cert.getCaKeyDefinition() == null) {
                cert.setCaKeyDefinition(new KeyAlgorithmDefinition());
            }

            cert.getCaKeyDefinition().setAlgorithm(parseKeyAlgorithmDefinitionAlgorithm(cAAlgorithm));
            break;
        case CA_ALGORITHM_PARAMETERS:
            ASN1OctetString cAAlgParams = ASN1OctetString.getInstance(obj, false);

            if (cert.getCaKeyDefinition() == null) {
                cert.setCaKeyDefinition(new KeyAlgorithmDefinition());
            }

            cert.getCaKeyDefinition().setParameters(cAAlgParams.getOctets());
            break;
        case ISSUER:
            ASN1Sequence issuerSeq = ASN1Sequence.getInstance(obj, false);
            cert.setIssuer(parseEntityName(issuerSeq));
            break;
        case VALID_FROM:
            ASN1OctetString validFrom = ASN1OctetString.getInstance(obj, false);
            BigInteger dateTimeBInt = new BigInteger(validFrom.getOctets());

            // date in sequence is second, converts to millisecond for constructing Date
            long dateTime = dateTimeBInt.longValue() * 1000;

            cert.setValidFrom(new Date(dateTime));
            break;
        case VALID_DURATION:
            ASN1OctetString validDuration = ASN1OctetString.getInstance(obj, false);
            BigInteger duration = new BigInteger(validDuration.getOctets());

            cert.setValidDuration(new Integer(duration.intValue()));
            break;
        case SUBJECT:
            ASN1Sequence subjectSeq = ASN1Sequence.getInstance(obj, false);
            cert.setSubject(parseEntityName(subjectSeq));
            break;
        case PUBLIC_KEY_ALGORITHM:
            ASN1ObjectIdentifier pKAlgorithm = ASN1ObjectIdentifier.getInstance(obj, false);

            if (cert.getPublicKeyDefinition() == null) {
                cert.setPublicKeyDefinition(new KeyAlgorithmDefinition());
            }

            cert.getPublicKeyDefinition().setAlgorithm(parseKeyAlgorithmDefinitionAlgorithm(pKAlgorithm));
            break;
        case PUBLIC_KEY_ALGORITHM_PARAMETERS:
            ASN1OctetString pKAlgParams = ASN1OctetString.getInstance(obj, false);

            if (cert.getPublicKeyDefinition() == null) {
                cert.setPublicKeyDefinition(new KeyAlgorithmDefinition());
            }

            cert.getPublicKeyDefinition().setParameters(pKAlgParams.getOctets());
            break;
        case PUBLIC_KEY:
            ASN1OctetString pubKey = ASN1OctetString.getInstance(obj, false);
            byte[] rawPublicKey = pubKey.getOctets();

            cert.setIsPublicKeyCompressed(KeyConversionUtils.isCompressedEcPoint(rawPublicKey));

            PublicKey publicKey = KeyConversionUtils.convertRawBytestoEcPublicKey(rawPublicKey);
            cert.setPublicKey(publicKey);
            break;
        case AUTHORITY_KEY_ID:
            ASN1Sequence authKeyIdSeq = ASN1Sequence.getInstance(obj, false);
            cert.setAuthorityKeyIdentifier(parseAuthorityKeyIdentifier(authKeyIdSeq));
            break;
        case SUBJECT_KEY_ID:
            ASN1OctetString subjKeyId = ASN1OctetString.getInstance(obj, false);
            cert.setSubjectKeyIdentifier(subjKeyId.getOctets());
            break;
        case KEY_USAGE:
            ASN1OctetString keyUsageObj = ASN1OctetString.getInstance(obj, false);
            KeyUsage keyUsage = new KeyUsage(keyUsageObj.getEncoded());
            cert.setKeyUsage(keyUsage);
            break;
        case BASIC_CONSTRAINTS:
            ASN1Integer basicConstraints = ASN1Integer.getInstance(obj, false);
            cert.setBasicConstraints(basicConstraints.getValue().intValue());
            break;
        case CERTIFICATE_POLICY:
            ASN1ObjectIdentifier certPolicy = ASN1ObjectIdentifier.getInstance(obj, false);
            cert.setCertificatePolicy(certPolicy.getId());
            break;
        case SUBJECT_ALTERNATE_NAME:
            ASN1TaggedObject subjectAltNameObj = ASN1TaggedObject.getInstance(obj, true);
            cert.setSubjectAlternativeName(parseGeneralName(subjectAltNameObj));
            break;
        case ISSUER_ALTERNATE_NAME:
            ASN1TaggedObject issuerAltNameObj = ASN1TaggedObject.getInstance(obj, true);
            cert.setIssuerAlternativeName(parseGeneralName(issuerAltNameObj));
            break;
        case EXTENDED_KEY_USAGE:
            ASN1ObjectIdentifier extendedKeyUsage = ASN1ObjectIdentifier.getInstance(obj, false);
            cert.setExtendedKeyUsage(extendedKeyUsage.getId());
            break;
        case AUTHENTICATION_INFO_ACCESS_OCSP:
            DERIA5String authInfoAccessOCSPObj = DERIA5String.getInstance(obj, false);
            URI authInfoAccessOCSP = new URI(authInfoAccessOCSPObj.getString());
            cert.setAuthenticationInfoAccessOcsp(authInfoAccessOCSP);
            break;
        case CRL_DISTRIBUTION_POINT_URI:
            DERIA5String cRLDistribPointURIObj = DERIA5String.getInstance(obj, false);
            URI cRLDistribPointURI = new URI(cRLDistribPointURIObj.getString());
            cert.setCrlDistributionPointUri(cRLDistribPointURI);
            break;
        case EXTENSIONS:
            ASN1Sequence x509extensionsSeq = ASN1Sequence.getInstance(obj, false);
            parseX509extensions(x509extensionsSeq, cert);
            break;
        default:
            throw new IOException("unknow TBS certificate field number: " + tag.getTagNumber());
        }
    }
}

From source file:ca.trustpoint.m2m.M2mCertificateFactory.java

License:Apache License

/**
 * Parses ASN.1 sequence to construct an {@link AuthorityKeyIdentifier} object.
 *
 * @param seq An ASN.1 sequence.//from   w w w . j  av  a 2s  .c o  m
 * @return An instance of {@link AuthorityKeyIdentifier} constructed from seq.
 * @throw IOException if parsing error or data invalid.
 */
private AuthorityKeyIdentifier parseAuthorityKeyIdentifier(ASN1Sequence seq) throws IOException {
    if (seq.size() < 1) {
        throw new IOException("no authKeyId data in sequence");
    } else if (seq.size() > 3) {
        throw new IOException("too much authKeyId data in sequence: " + seq.size());
    }

    AuthorityKeyIdentifier authKeyId = new AuthorityKeyIdentifier();

    for (int i = 0; i < seq.size(); i++) {
        ASN1TaggedObject obj = (ASN1TaggedObject) seq.getObjectAt(i);

        switch (obj.getTagNo()) {
        case AuthorityKeyIdentifier.INDEX_KEY_IDENTIFIER:
            ASN1OctetString identifierObj = ASN1OctetString.getInstance(obj, false);
            authKeyId.setKeyIdentifier(identifierObj.getOctets());
            break;
        case AuthorityKeyIdentifier.INDEX_AUTH_CERT_ISSUER:
            ASN1TaggedObject authCertIssuerObj = ASN1TaggedObject.getInstance(obj, true);
            authKeyId.setCertificateIssuer(parseGeneralName(authCertIssuerObj));
            break;
        case AuthorityKeyIdentifier.INDEX_AUTH_CERT_SERIAL_NUM:
            ASN1OctetString authCertSerialNumObj = ASN1OctetString.getInstance(obj, false);
            BigInteger serialNumber = new BigInteger(authCertSerialNumObj.getOctets());
            authKeyId.setCertificateSerialNumber(serialNumber);
            break;
        default:
            throw new IOException("unknown authKeyId index: " + obj.getTagNo());
        }
    }

    if (!authKeyId.isValid()) {
        throw new IOException("invalid AuthorityKeyIdentifier instance parsed from ASN.1 sequence");
    }

    return authKeyId;
}