예제 #1
0
    /**
     * Reads in a PKCS7 object. This returns a ContentInfo object suitable for use with the CMS API.
     *
     * @return the X509Certificate
     * @throws java.io.IOException if an I/O error occured
     */
    public Object parseObject(PemObject obj) throws IOException {
      try {
        ASN1InputStream aIn = new ASN1InputStream(obj.getContent());

        return ContentInfo.getInstance(aIn.readObject());
      } catch (Exception e) {
        throw new PEMException("problem parsing PKCS7 object: " + e.toString(), e);
      }
    }
  public void testSHA1WithRSAEncapsulated() throws Exception {
    List certList = new ArrayList();
    CMSTypedData msg = new CMSProcessableByteArray(TEST_MESSAGE.getBytes());

    certList.add(new X509CertificateHolder(keyCert.getEncoded()));

    DigestCalculatorProvider digCalcProv = new JcaDigestCalculatorProviderBuilder().build();

    CMSSignedDataGenerator gen = new CMSSignedDataGenerator();

    gen.addSignerInfoGenerator(
        new JcaSignerInfoGeneratorBuilder(digCalcProv)
            .build(
                new JcaContentSignerBuilder("SHA1withRSA").build(keyPair.getPrivate()), keyCert));

    gen.addCertificates(new CollectionStore(certList));

    CMSSignedData s = gen.generate(msg, true);

    ByteArrayInputStream bIn = new ByteArrayInputStream(s.getEncoded());
    ASN1InputStream aIn = new ASN1InputStream(bIn);

    s = new CMSSignedData(ContentInfo.getInstance(aIn.readObject()));

    Store certsAndCrls = s.getCertificates();

    SignerInformationStore signers = s.getSignerInfos();
    Collection c = signers.getSigners();
    Iterator it = c.iterator();

    while (it.hasNext()) {
      SignerInformation signer = (SignerInformation) it.next();
      Collection certCollection = certsAndCrls.getMatches(signer.getSID());
      Iterator certIt = certCollection.iterator();
      X509CertificateHolder cert = (X509CertificateHolder) certIt.next();

      assertEquals(true, signer.verify(new JcaSimpleSignerInfoVerifierBuilder().build(cert)));
    }
  }
예제 #3
0
  public void performTest() throws Exception {
    PEMParser pemRd = openPEMResource("test.pem");
    Object o;
    PEMKeyPair pemPair;
    KeyPair pair;

    while ((o = pemRd.readObject()) != null) {
      if (o instanceof KeyPair) {
        // pair = (KeyPair)o;

        // System.out.println(pair.getPublic());
        // System.out.println(pair.getPrivate());
      } else {
        // System.out.println(o.toString());
      }
    }

    // test bogus lines before begin are ignored.
    pemRd = openPEMResource("extratest.pem");

    while ((o = pemRd.readObject()) != null) {
      if (!(o instanceof X509CertificateHolder)) {
        fail("wrong object found");
      }
    }

    //
    // pkcs 7 data
    //
    pemRd = openPEMResource("pkcs7.pem");
    ContentInfo d = (ContentInfo) pemRd.readObject();

    if (!d.getContentType().equals(CMSObjectIdentifiers.envelopedData)) {
      fail("failed envelopedData check");
    }

    //
    // ECKey
    //
    pemRd = openPEMResource("eckey.pem");
    ASN1ObjectIdentifier ecOID = (ASN1ObjectIdentifier) pemRd.readObject();
    X9ECParameters ecSpec = ECNamedCurveTable.getByOID(ecOID);

    if (ecSpec == null) {
      fail("ecSpec not found for named curve");
    }

    pemPair = (PEMKeyPair) pemRd.readObject();

    pair = new JcaPEMKeyConverter().setProvider("BC").getKeyPair(pemPair);

    Signature sgr = Signature.getInstance("ECDSA", "BC");

    sgr.initSign(pair.getPrivate());

    byte[] message = new byte[] {(byte) 'a', (byte) 'b', (byte) 'c'};

    sgr.update(message);

    byte[] sigBytes = sgr.sign();

    sgr.initVerify(pair.getPublic());

    sgr.update(message);

    if (!sgr.verify(sigBytes)) {
      fail("EC verification failed");
    }

    if (!pair.getPublic().getAlgorithm().equals("ECDSA")) {
      fail("wrong algorithm name on public got: " + pair.getPublic().getAlgorithm());
    }

    if (!pair.getPrivate().getAlgorithm().equals("ECDSA")) {
      fail("wrong algorithm name on private");
    }

    //
    // ECKey -- explicit parameters
    //
    pemRd = openPEMResource("ecexpparam.pem");
    ecSpec = (X9ECParameters) pemRd.readObject();

    pemPair = (PEMKeyPair) pemRd.readObject();

    pair = new JcaPEMKeyConverter().setProvider("BC").getKeyPair(pemPair);

    sgr = Signature.getInstance("ECDSA", "BC");

    sgr.initSign(pair.getPrivate());

    message = new byte[] {(byte) 'a', (byte) 'b', (byte) 'c'};

    sgr.update(message);

    sigBytes = sgr.sign();

    sgr.initVerify(pair.getPublic());

    sgr.update(message);

    if (!sgr.verify(sigBytes)) {
      fail("EC verification failed");
    }

    if (!pair.getPublic().getAlgorithm().equals("ECDSA")) {
      fail("wrong algorithm name on public got: " + pair.getPublic().getAlgorithm());
    }

    if (!pair.getPrivate().getAlgorithm().equals("ECDSA")) {
      fail("wrong algorithm name on private");
    }

    //
    // writer/parser test
    //
    KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA", "BC");

    pair = kpGen.generateKeyPair();

    keyPairTest("RSA", pair);

    kpGen = KeyPairGenerator.getInstance("DSA", "BC");
    kpGen.initialize(512, new SecureRandom());
    pair = kpGen.generateKeyPair();

    keyPairTest("DSA", pair);

    //
    // PKCS7
    //
    ByteArrayOutputStream bOut = new ByteArrayOutputStream();
    PEMWriter pWrt = new PEMWriter(new OutputStreamWriter(bOut));

    pWrt.writeObject(d);

    pWrt.close();

    pemRd = new PEMParser(new InputStreamReader(new ByteArrayInputStream(bOut.toByteArray())));
    d = (ContentInfo) pemRd.readObject();

    if (!d.getContentType().equals(CMSObjectIdentifiers.envelopedData)) {
      fail("failed envelopedData recode check");
    }

    // OpenSSL test cases (as embedded resources)
    doOpenSslDsaTest("unencrypted");
    doOpenSslRsaTest("unencrypted");

    doOpenSslTests("aes128");
    doOpenSslTests("aes192");
    doOpenSslTests("aes256");
    doOpenSslTests("blowfish");
    doOpenSslTests("des1");
    doOpenSslTests("des2");
    doOpenSslTests("des3");
    doOpenSslTests("rc2_128");

    doOpenSslDsaTest("rc2_40_cbc");
    doOpenSslRsaTest("rc2_40_cbc");
    doOpenSslDsaTest("rc2_64_cbc");
    doOpenSslRsaTest("rc2_64_cbc");

    doDudPasswordTest("7fd98", 0, "corrupted stream - out of bounds length found");
    doDudPasswordTest("ef677", 1, "corrupted stream - out of bounds length found");
    doDudPasswordTest("800ce", 2, "unknown tag 26 encountered");
    doDudPasswordTest("b6cd8", 3, "DEF length 81 object truncated by 56");
    doDudPasswordTest("28ce09", 4, "DEF length 110 object truncated by 28");
    doDudPasswordTest("2ac3b9", 5, "DER length more than 4 bytes: 11");
    doDudPasswordTest("2cba96", 6, "DEF length 100 object truncated by 35");
    doDudPasswordTest("2e3354", 7, "DEF length 42 object truncated by 9");
    doDudPasswordTest("2f4142", 8, "DER length more than 4 bytes: 14");
    doDudPasswordTest("2fe9bb", 9, "DER length more than 4 bytes: 65");
    doDudPasswordTest("3ee7a8", 10, "DER length more than 4 bytes: 57");
    doDudPasswordTest("41af75", 11, "unknown tag 16 encountered");
    doDudPasswordTest("1704a5", 12, "corrupted stream detected");
    doDudPasswordTest(
        "1c5822", 13, "unknown object in getInstance: org.mightyfish.asn1.DERUTF8String");
    doDudPasswordTest("5a3d16", 14, "corrupted stream detected");
    doDudPasswordTest("8d0c97", 15, "corrupted stream detected");
    doDudPasswordTest("bc0daf", 16, "corrupted stream detected");
    doDudPasswordTest("aaf9c4d", 17, "corrupted stream - out of bounds length found");

    doNoPasswordTest();

    // encrypted private key test
    InputDecryptorProvider pkcs8Prov =
        new JceOpenSSLPKCS8DecryptorProviderBuilder().build("password".toCharArray());
    pemRd = openPEMResource("enckey.pem");

    PKCS8EncryptedPrivateKeyInfo encPrivKeyInfo = (PKCS8EncryptedPrivateKeyInfo) pemRd.readObject();
    JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");

    RSAPrivateCrtKey privKey =
        (RSAPrivateCrtKey) converter.getPrivateKey(encPrivKeyInfo.decryptPrivateKeyInfo(pkcs8Prov));

    if (!privKey.getPublicExponent().equals(new BigInteger("10001", 16))) {
      fail("decryption of private key data check failed");
    }

    // general PKCS8 test

    pemRd = openPEMResource("pkcs8test.pem");

    Object privInfo;

    while ((privInfo = pemRd.readObject()) != null) {
      if (privInfo instanceof PrivateKeyInfo) {
        privKey = (RSAPrivateCrtKey) converter.getPrivateKey(PrivateKeyInfo.getInstance(privInfo));
      } else {
        privKey =
            (RSAPrivateCrtKey)
                converter.getPrivateKey(
                    ((PKCS8EncryptedPrivateKeyInfo) privInfo).decryptPrivateKeyInfo(pkcs8Prov));
      }
      if (!privKey.getPublicExponent().equals(new BigInteger("10001", 16))) {
        fail("decryption of private key data check failed");
      }
    }
  }