key = PGPPublicKey.addCertification(key, uid, sig);
keyEnc = key.getEncoded();
PGPSignatureGenerator sGen = new PGPSignatureGenerator(PublicKeyAlgorithmTags.RSA_GENERAL, HashAlgorithmTags.SHA1, "BC");
sGen.initSign(PGPSignature.KEY_REVOCATION, secretKey.extractPrivateKey(passPhrase, "BC"));
sig = sGen.generateCertification(key);
key = PGPPublicKey.addCertification(key, sig);
keyEnc = key.getEncoded();
PGPPublicKeyRing tmpRing = new PGPPublicKeyRing(keyEnc);
key = tmpRing.getPublicKey();
Iterator sgIt = key.getSignaturesOfType(PGPSignature.KEY_REVOCATION);
sig = (PGPSignature)sgIt.next();
sig.initVerify(key, "BC");
if (!sig.verifyCertification(key))
{
fail("failed to verify revocation certification");
}
//
// use of PGPKeyPair
//
PGPKeyPair pgpKp = new PGPKeyPair(PGPPublicKey.RSA_GENERAL , kp.getPublic(), kp.getPrivate(), new Date());
PGPPublicKey k1 = pgpKp.getPublicKey();
PGPPrivateKey k2 = pgpKp.getPrivateKey();
k1.getEncoded();
mixedTest(k2, k1);
//
// key pair generation - AES_256 encryption.
//
kp = kpg.generateKeyPair();
secretKey = new PGPSecretKey(PGPSignature.DEFAULT_CERTIFICATION, PublicKeyAlgorithmTags.RSA_GENERAL, kp.getPublic(), kp.getPrivate(), new Date(), "fred", SymmetricKeyAlgorithmTags.AES_256, passPhrase, null, null, new SecureRandom(), "BC");
secretKey.extractPrivateKey(passPhrase, "BC");
secretKey.encode(new ByteArrayOutputStream());
//
// secret key password changing.
//
String newPass = "newPass";
secretKey = PGPSecretKey.copyWithNewPassword(secretKey, passPhrase, newPass.toCharArray(), secretKey.getKeyEncryptionAlgorithm(), new SecureRandom(), "BC");
secretKey.extractPrivateKey(newPass.toCharArray(), "BC");
secretKey.encode(new ByteArrayOutputStream());
key = secretKey.getPublicKey();
key.encode(new ByteArrayOutputStream());
it = key.getUserIDs();
uid = (String)it.next();
it = key.getSignaturesForID(uid);
sig = (PGPSignature)it.next();
sig.initVerify(key, "BC");
if (!sig.verifyCertification(uid, key))
{
fail("failed to verify certification");
}
pgpPrivKey = secretKey.extractPrivateKey(newPass.toCharArray(), "BC");
//
// signature generation
//
String data = "hello world!";
bOut = new ByteArrayOutputStream();
ByteArrayInputStream testIn = new ByteArrayInputStream(data.getBytes());
sGen = new PGPSignatureGenerator(PublicKeyAlgorithmTags.RSA_GENERAL, HashAlgorithmTags.SHA1, "BC");
sGen.initSign(PGPSignature.BINARY_DOCUMENT, pgpPrivKey);
PGPCompressedDataGenerator cGen = new PGPCompressedDataGenerator(
PGPCompressedData.ZIP);
BCPGOutputStream bcOut = new BCPGOutputStream(
cGen.open(new UncloseableOutputStream(bOut)));
sGen.generateOnePassVersion(false).encode(bcOut);
PGPLiteralDataGenerator lGen = new PGPLiteralDataGenerator();
Date testDate = new Date((System.currentTimeMillis() / 1000) * 1000);
OutputStream lOut = lGen.open(
new UncloseableOutputStream(bcOut),
PGPLiteralData.BINARY,
"_CONSOLE",
data.getBytes().length,
testDate);
while ((ch = testIn.read()) >= 0)
{
lOut.write(ch);
sGen.update((byte)ch);
}
lOut.close();
sGen.generate().encode(bcOut);
bcOut.close();
//
// verify generated signature
//
pgpFact = new PGPObjectFactory(bOut.toByteArray());
c1 = (PGPCompressedData)pgpFact.nextObject();
pgpFact = new PGPObjectFactory(c1.getDataStream());
p1 = (PGPOnePassSignatureList)pgpFact.nextObject();
ops = p1.get(0);
p2 = (PGPLiteralData)pgpFact.nextObject();
if (!p2.getModificationTime().equals(testDate))
{
fail("Modification time not preserved: " + p2.getModificationTime() + " " + testDate);
}
dIn = p2.getInputStream();
ops.initVerify(secretKey.getPublicKey(), "BC");
while ((ch = dIn.read()) >= 0)
{
ops.update((byte)ch);
}
p3 = (PGPSignatureList)pgpFact.nextObject();
if (!ops.verify(p3.get(0)))
{
fail("Failed generated signature check");
}
//
// signature generation - version 3
//
bOut = new ByteArrayOutputStream();
testIn = new ByteArrayInputStream(data.getBytes());
PGPV3SignatureGenerator sGenV3 = new PGPV3SignatureGenerator(PGPPublicKey.RSA_GENERAL, PGPUtil.SHA1, "BC");
sGen.initSign(PGPSignature.BINARY_DOCUMENT, pgpPrivKey);
cGen = new PGPCompressedDataGenerator(
PGPCompressedData.ZIP);
bcOut = new BCPGOutputStream(cGen.open(bOut));
sGen.generateOnePassVersion(false).encode(bcOut);
lGen = new PGPLiteralDataGenerator();
lOut = lGen.open(
new UncloseableOutputStream(bcOut),
PGPLiteralData.BINARY,
"_CONSOLE",
data.getBytes().length,
testDate);
while ((ch = testIn.read()) >= 0)
{
lOut.write(ch);
sGen.update((byte)ch);
}
lOut.close();
sGen.generate().encode(bcOut);
bcOut.close();
//
// verify generated signature