Example usage for org.bouncycastle.asn1.x500 AttributeTypeAndValue getValue

List of usage examples for org.bouncycastle.asn1.x500 AttributeTypeAndValue getValue

Introduction

In this page you can find the example usage for org.bouncycastle.asn1.x500 AttributeTypeAndValue getValue.

Prototype

public ASN1Encodable getValue() 

Source Link

Usage

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

License:Apache License

/**
 * Creates a new instance./*from  w  w w .  j  a v a 2s  . c o m*/
 *
 * @param x509Certificate X.509 certificate to use as trust anchor.
 * @throws IllegalArgumentException if x509Certificate is null.
 */
public M2mTrustAnchor(X509Certificate x509Certificate) throws IllegalArgumentException {
    if (x509Certificate == null) {
        throw new IllegalArgumentException("x509Certificate cannot be null.");
    }

    X500Name x500Name = JcaX500NameUtil.getSubject(x509Certificate);
    EntityName caName = new EntityName();
    int attributeCount = 0;

    for (RDN rdn : x500Name.getRDNs()) {
        AttributeTypeAndValue attr = rdn.getFirst();
        EntityNameAttributeId attributeId;

        if (BCStyle.C.equals(attr.getType())) {
            attributeId = EntityNameAttributeId.Country;
        } else if (BCStyle.O.equals(attr.getType())) {
            attributeId = EntityNameAttributeId.Organization;
        } else if (BCStyle.OU.equals(attr.getType())) {
            attributeId = EntityNameAttributeId.OrganizationalUnit;
        } else if (BCStyle.DN_QUALIFIER.equals(attr.getType())) {
            attributeId = EntityNameAttributeId.DistinguishedNameQualifier;
        } else if (BCStyle.ST.equals(attr.getType())) {
            attributeId = EntityNameAttributeId.StateOrProvince;
        } else if (BCStyle.L.equals(attr.getType())) {
            attributeId = EntityNameAttributeId.Locality;
        } else if (BCStyle.CN.equals(attr.getType())) {
            attributeId = EntityNameAttributeId.CommonName;
        } else if (BCStyle.SN.equals(attr.getType())) {
            attributeId = EntityNameAttributeId.SerialNumber;
        } else if (BCStyle.DC.equals(attr.getType())) {
            attributeId = EntityNameAttributeId.DomainComponent;
        } else {
            // Unsupported attribute.
            continue;
        }

        caName.addAttribute(new EntityNameAttribute(attributeId, IETFUtils.valueToString(attr.getValue())));
        attributeCount++;

        if (attributeCount == EntityName.MAXIMUM_ATTRIBUTES) {
            // We have reached the maximum number of attributes for an EntityName, so stop here.
            break;
        }
    }

    this.caName = caName;
    this.publicKey = x509Certificate.getPublicKey();
    certificate = null;
}

From source file:com.foilen.smalltools.crypt.bouncycastle.cert.RSACertificate.java

License:Open Source License

/**
 * Get the first certificate's common name.
 *
 * @return the common name/*w w w.j  a  v a2s.c o  m*/
 */
public String getCommonName() {
    AssertTools.assertNotNull(certificateHolder, "The certificate is not set");
    X500Name subject = certificateHolder.getSubject();
    for (RDN rdn : subject.getRDNs()) {
        AttributeTypeAndValue first = rdn.getFirst();
        if (OID_COMMON_NAME.equals(first.getType().toString())) {
            return first.getValue().toString();
        }
    }
    return null;
}

From source file:com.foilen.smalltools.crypt.bouncycastle.cert.RSACertificate.java

License:Open Source License

/**
 * Get the certificate's common names./*from   w w w  .  j av  a 2 s .c  o  m*/
 *
 * @return the common names
 */
public Set<String> getCommonNames() {
    AssertTools.assertNotNull(certificateHolder, "The certificate is not set");
    X500Name subject = certificateHolder.getSubject();
    Set<String> commonNames = new HashSet<>();
    for (RDN rdn : subject.getRDNs()) {
        ASN1Primitive primitive = rdn.toASN1Primitive();
        if (primitive instanceof ASN1Set) {
            ASN1Set asn1Set = (ASN1Set) primitive;
            for (int i = 0; i < asn1Set.size(); ++i) {
                AttributeTypeAndValue next = AttributeTypeAndValue.getInstance(asn1Set.getObjectAt(i));
                if (OID_COMMON_NAME.equals(next.getType().toString())) {
                    commonNames.add(next.getValue().toString());
                }
            }
        }
    }
    return commonNames;
}

From source file:com.google.bitcoin.protocols.payments.PaymentSession.java

License:Apache License

/**
 * Uses the provided PKI method to find the corresponding public key and verify the provided signature.
 * Returns null if no PKI method was specified in the {@link Protos.PaymentRequest}.
 *///from   w w w.  j  a v a 2 s.co  m
public @Nullable PkiVerificationData verifyPki() throws PaymentRequestException {
    try {
        if (pkiVerificationData != null)
            return pkiVerificationData;
        if (paymentRequest.getPkiType().equals("none"))
            // Nothing to verify. Everything is fine. Move along.
            return null;

        String algorithm;
        if (paymentRequest.getPkiType().equals("x509+sha256"))
            algorithm = "SHA256withRSA";
        else if (paymentRequest.getPkiType().equals("x509+sha1"))
            algorithm = "SHA1withRSA";
        else
            throw new PaymentRequestException.InvalidPkiType(
                    "Unsupported PKI type: " + paymentRequest.getPkiType());

        Protos.X509Certificates protoCerts = Protos.X509Certificates.parseFrom(paymentRequest.getPkiData());
        if (protoCerts.getCertificateCount() == 0)
            throw new PaymentRequestException.InvalidPkiData(
                    "No certificates provided in message: server config error");

        // Parse the certs and turn into a certificate chain object. Cert factories can parse both DER and base64.
        // The ordering of certificates is defined by the payment protocol spec to be the same as what the Java
        // crypto API requires - convenient!
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        List<X509Certificate> certs = Lists.newArrayList();
        for (ByteString bytes : protoCerts.getCertificateList())
            certs.add((X509Certificate) certificateFactory.generateCertificate(bytes.newInput()));
        CertPath path = certificateFactory.generateCertPath(certs);

        // Retrieves the most-trusted CAs from keystore.
        PKIXParameters params = new PKIXParameters(createKeyStore(trustStorePath));
        // Revocation not supported in the current version.
        params.setRevocationEnabled(false);

        // Now verify the certificate chain is correct and trusted. This let's us get an identity linked pubkey.
        CertPathValidator validator = CertPathValidator.getInstance("PKIX");
        PKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult) validator.validate(path, params);
        PublicKey publicKey = result.getPublicKey();
        // OK, we got an identity, now check it was used to sign this message.
        Signature signature = Signature.getInstance(algorithm);
        // Note that we don't use signature.initVerify(certs.get(0)) here despite it being the most obvious
        // way to set it up, because we don't care about the constraints specified on the certificates: any
        // cert that links a key to a domain name or other identity will do for us.
        signature.initVerify(publicKey);
        Protos.PaymentRequest.Builder reqToCheck = paymentRequest.toBuilder();
        reqToCheck.setSignature(ByteString.EMPTY);
        signature.update(reqToCheck.build().toByteArray());
        if (!signature.verify(paymentRequest.getSignature().toByteArray()))
            throw new PaymentRequestException.PkiVerificationException(
                    "Invalid signature, this payment request is not valid.");

        // Signature verifies, get the names from the identity we just verified for presentation to the user.
        final X509Certificate cert = certs.get(0);
        X500Principal principal = cert.getSubjectX500Principal();
        // At this point the Java crypto API falls flat on its face and dies - there's no clean way to get the
        // different parts of the certificate name except for parsing the string. That's hard because of various
        // custom escaping rules and the usual crap. So, use Bouncy Castle to re-parse the string into binary form
        // again and then look for the names we want. Fail!
        org.bouncycastle.asn1.x500.X500Name name = new X500Name(principal.getName());
        String entityName = null, orgName = null;
        for (RDN rdn : name.getRDNs()) {
            AttributeTypeAndValue pair = rdn.getFirst();
            if (pair.getType().equals(RFC4519Style.cn))
                entityName = ((ASN1String) pair.getValue()).getString();
            else if (pair.getType().equals(RFC4519Style.o))
                orgName = ((ASN1String) pair.getValue()).getString();
        }
        if (entityName == null && orgName == null) {
            // This cert might not be an SSL cert. Just grab the first "subject alt name" if present, e.g. for
            // S/MIME certs.
            final Iterator<List<?>> it = cert.getSubjectAlternativeNames().iterator();
            List<?> list;
            // email addresses have a type code of one.
            if (it.hasNext() && (list = it.next()) != null && (Integer) list.get(0) == 1)
                entityName = (String) list.get(1);
            if (entityName == null)
                throw new PaymentRequestException.PkiVerificationException(
                        "Could not extract name from certificate");
        }
        // Everything is peachy. Return some useful data to the caller.
        PkiVerificationData data = new PkiVerificationData(entityName, orgName, publicKey,
                result.getTrustAnchor());
        // Cache the result so we don't have to re-verify if this method is called again.
        pkiVerificationData = data;
        return data;
    } catch (InvalidProtocolBufferException e) {
        // Data structures are malformed.
        throw new PaymentRequestException.InvalidPkiData(e);
    } catch (CertificateException e) {
        // The X.509 certificate data didn't parse correctly.
        throw new PaymentRequestException.PkiVerificationException(e);
    } catch (NoSuchAlgorithmException e) {
        // Should never happen so don't make users have to think about it. PKIX is always present.
        throw new RuntimeException(e);
    } catch (InvalidAlgorithmParameterException e) {
        throw new RuntimeException(e);
    } catch (CertPathValidatorException e) {
        // The certificate chain isn't known or trusted, probably, the server is using an SSL root we don't
        // know about and the user needs to upgrade to a new version of the software (or import a root cert).
        throw new PaymentRequestException.PkiVerificationException(e);
    } catch (InvalidKeyException e) {
        // Shouldn't happen if the certs verified correctly.
        throw new PaymentRequestException.PkiVerificationException(e);
    } catch (SignatureException e) {
        // Something went wrong during hashing (yes, despite the name, this does not mean the sig was invalid).
        throw new PaymentRequestException.PkiVerificationException(e);
    } catch (IOException e) {
        throw new PaymentRequestException.PkiVerificationException(e);
    } catch (KeyStoreException e) {
        throw new RuntimeException(e);
    }
}

From source file:com.nkapps.billing.services.AuthServiceImpl.java

public Subject extractSubject(CertificateInfoLocal certificateInfo) {
    String tin, name, organization, address, email, role;
    Short ns10Code, ns11Code, kind;

    HashMap<String, String> subjectInfos = new HashMap<>();
    X500Name x500 = new X500Name(certificateInfo.getSubjectName());

    for (RDN rdn : x500.getRDNs()) {
        AttributeTypeAndValue tv = rdn.getFirst();
        String v = tv.getValue().toString().trim().replaceAll("\\s+", " ");
        if (!v.trim().isEmpty())
            subjectInfos.put(BCStyle.INSTANCE.oidToDisplayName(tv.getType()), v);
    }// www  .  java2  s  .  co  m
    role = certificateInfo.getRoleName();

    Subject subject = new Subject();
    // set subject datas
    subject.setRole(role);

    return subject;
}

From source file:eu.emi.security.authn.x509.helpers.proxy.ProxyHelper.java

License:Open Source License

public static String getLastCN(X500Name x500Name) throws IllegalArgumentException {
    RDN[] rdns = x500Name.getRDNs();
    if (rdns.length == 0)
        throw new IllegalArgumentException("The DN is empty");
    RDN last = rdns[rdns.length - 1];/*from  w w w  .  j  a  va2s.  com*/

    if (last.isMultiValued())
        throw new IllegalArgumentException("The DN is ended with a multivalued RDN");
    AttributeTypeAndValue cn = last.getFirst();
    if (!cn.getType().equals(BCStyle.CN))
        throw new IllegalArgumentException("The DN is not ended with a CN AVA");

    return IETFUtils.valueToString(cn.getValue());
}

From source file:mitm.common.security.certificate.X500PrincipalInspector.java

License:Open Source License

private String rDNToString(RDN rdn) {
    String result = null;//from   w  ww .jav a 2s  .  c om

    if (rdn.isMultiValued()) {
        /*
         * We currently do not support multi-value RDNs so if multi valued, combine them into one 
         * string with +
         */
        AttributeTypeAndValue[] values = rdn.getTypesAndValues();

        StrBuilder sb = new StrBuilder();

        for (AttributeTypeAndValue value : values) {
            sb.appendSeparator('+');
            sb.append(IETFUtils.valueToString(value.getValue()));

            result = sb.toString();
        }
    } else {
        result = IETFUtils.valueToString(rdn.getFirst().getValue());
    }

    return StringUtils.defaultString(result);
}

From source file:net.ripe.rpki.commons.crypto.x509cert.X509ResourceCertificateParser.java

License:BSD License

private boolean hasOneValidCn(X500Name principal) {
    RDN[] cns = principal.getRDNs(BCStyle.CN);
    if (cns.length != 1) {
        return false;
    }/*from  w w w .  ja  v  a 2s.  c  om*/
    AttributeTypeAndValue firstCn = cns[0].getFirst();
    if (firstCn == null) {
        return false;
    }
    ASN1Encodable firstCnValue = firstCn.getValue();
    return firstCnValue != null && isPrintableString(firstCnValue);
}

From source file:net.sf.keystore_explorer.crypto.x509.X509CertUtil.java

License:Open Source License

private static String extractCommonName(X500Name name) {
    for (RDN rdn : name.getRDNs()) {
        AttributeTypeAndValue atav = rdn.getFirst();

        if (atav.getType().equals(BCStyle.CN)) {
            return atav.getValue().toString();
        }/*from   w w  w . j a va 2  s.  co  m*/
    }

    return null;
}

From source file:net.sf.keystore_explorer.crypto.x509.X509Ext.java

License:Open Source License

private String getDistributionPointNameString(DistributionPointName distributionPointName, String baseIndent)
        throws IOException {
    // @formatter:off

    /*//  w  w  w . ja  v  a 2  s  .c om
     * DistributionPointName ::= CHOICE { fullname [0] GeneralNames,
     * nameRelativeToCRLIssuer [1] RelativeDistinguishedName }
     *
     * RelativeDistinguishedName ::= SET SIZE (1 .. MAX) OF
     * AttributeTypeAndValue
     *
     * AttributeTypeAndValue ::= ASN1Sequence { type AttributeType, value
     * AttributeValue }
     */

    // @formatter: on

    StringBuilder sb = new StringBuilder();

    sb.append(baseIndent);
    sb.append(res.getString("DistributionPointName"));
    sb.append(NEWLINE);

    if (distributionPointName.getType() == DistributionPointName.FULL_NAME) {
        sb.append(baseIndent);
        sb.append(INDENT);
        sb.append(res.getString("DistributionPointFullName"));
        sb.append(NEWLINE);

        GeneralNames generalNames = GeneralNames.getInstance(distributionPointName.getName());

        for (GeneralName generalName : generalNames.getNames()) {
            sb.append(baseIndent);
            sb.append(INDENT);
            sb.append(INDENT);
            sb.append(GeneralNameUtil.toString(generalName));
            sb.append(NEWLINE);
        }
    } else {
        // DistributionPointName.TAG_NAMERELATIVETOCRLISSUER
        sb.append(baseIndent);
        sb.append(INDENT);
        sb.append(res.getString("DistributionPointNameRelativeToCrlIssuer"));
        sb.append(NEWLINE);

        RDN rdn = RDN.getInstance(distributionPointName.getName());

        for (AttributeTypeAndValue attributeTypeAndValue : rdn.getTypesAndValues()) {
            ASN1ObjectIdentifier attributeType = attributeTypeAndValue.getType();
            ASN1Encodable attributeValue = attributeTypeAndValue.getValue();

            String attributeTypeStr = getAttributeTypeString(attributeType);
            String attributeValueStr = getAttributeValueString(attributeType, attributeValue);

            sb.append(baseIndent);
            sb.append(INDENT);
            sb.append(INDENT);
            sb.append(MessageFormat.format("{0}={1}", attributeTypeStr, attributeValueStr));
            sb.append(NEWLINE);
        }
    }

    return sb.toString();
}