import { ReadableStream as WebReadableStream } from 'web-streams-polyfill';import { createReadStream } from 'fs';
import { expect } from 'chai';import { generateKey, readKey, readKeys, readPrivateKey, PrivateKey, Key, PublicKey, revokeKey, readMessage, createMessage, Message, createCleartextMessage, encrypt, decrypt, sign, verify, config, enums, generateSessionKey, encryptSessionKey, decryptSessionKeys, LiteralDataPacket, PacketList, CompressedDataPacket, PublicKeyPacket, PublicSubkeyPacket, SecretKeyPacket, SecretSubkeyPacket, CleartextMessage, WebStream, NodeStream,} from '../..';
(async () => {
const keyOptions = { userIDs: [{ email: 'user@corp.co' }], config: { v5Keys: true } }; const { privateKey: privateKeyArmored, publicKey: publicKeyArmored } = await generateKey(keyOptions); const { privateKey: privateKeyBinary } = await generateKey({ ...keyOptions, format: 'binary' }); const { privateKey, publicKey, revocationCertificate } = await generateKey({ ...keyOptions, format: 'object' }); expect(privateKey).to.be.instanceOf(PrivateKey); expect(publicKey).to.be.instanceOf(PublicKey); expect(typeof revocationCertificate).to.equal('string'); const privateKeys = [privateKey]; const publicKeys = [privateKey.toPublic()];
expect(await readKeys({ armoredKeys: publicKeyArmored })).to.have.lengthOf(1); const parsedKey: Key = await readKey({ armoredKey: publicKeyArmored }); expect(parsedKey.armor(config)).to.equal(publicKeyArmored); expect(parsedKey.isPrivate()).to.be.false; const parsedPrivateKey: PrivateKey = await readPrivateKey({ armoredKey: privateKeyArmored }); expect(parsedPrivateKey.isPrivate()).to.be.true; const parsedBinaryPrivateKey: PrivateKey = await readPrivateKey({ binaryKey: privateKeyBinary }); expect(parsedBinaryPrivateKey.isPrivate()).to.be.true; const unusedPublicKey: PublicKey = parsedKey;
if (parsedKey.isPrivate()) { expect(parsedKey.isDecrypted()).to.be.true; } else { try { parsedKey.isDecrypted(); } catch (e) {} } (await privateKey.update(privateKey)).isDecrypted(); (await privateKey.toPublic().update(privateKey)).isDecrypted(); try { (await privateKey.toPublic().update(privateKey.toPublic())).isDecrypted(); } catch (e) {}
await revokeKey({ key: privateKey }); try { await revokeKey({ key: publicKey }); } catch (e) {} const { privateKey: revokedPrivateKey, publicKey: revokedPublicKey } = await revokeKey({ key: privateKey, revocationCertificate, format: 'object' }); expect(revokedPrivateKey).to.be.instanceOf(PrivateKey); expect(revokedPublicKey).to.be.instanceOf(PublicKey); const revokedKeyPair = await revokeKey({ key: publicKey, revocationCertificate, format: 'object' }); try { revokedKeyPair.privateKey.armor(); } catch (e) {} expect(revokedKeyPair.privateKey).to.be.null; expect(revokedKeyPair.publicKey).to.be.instanceOf(PublicKey);
const text = 'hello'; const textMessage = await createMessage({ text: 'hello', format: 'text' }); const encryptedArmor: string = await encrypt({ encryptionKeys: publicKeys, message: textMessage }); expect(encryptedArmor).to.include('-----BEGIN PGP MESSAGE-----');
const binary = new Uint8Array([1, 2]); const binaryMessage = await createMessage({ binary }); const encryptedBinary: Uint8Array = await encrypt({ encryptionKeys: publicKeys, message: binaryMessage, format: 'binary' }); expect(encryptedBinary).to.be.instanceOf(Uint8Array);
const encryptedTextMessage = await readMessage({ armoredMessage: encryptedArmor }); const decryptedText = await decrypt({ decryptionKeys: privateKeys, message: encryptedTextMessage }); const decryptedTextData: string = decryptedText.data; expect(decryptedTextData).to.equal(text);
const encryptedBinaryMessage = await readMessage({ binaryMessage: encryptedBinary }); const decryptedBinary = await decrypt({ decryptionKeys: privateKeys, message: encryptedBinaryMessage, format: 'binary' }); const decryptedBinaryData: Uint8Array = decryptedBinary.data; expect(decryptedBinaryData).to.deep.equal(binary);
const encryptedBinaryObject: Message<Uint8Array> = await encrypt({ encryptionKeys: publicKeys, message: binaryMessage, format: 'object' }); expect(encryptedBinaryObject).to.be.instanceOf(Message); const encryptedTextObject: Message<string> = await encrypt({ encryptionKeys: publicKeys, message: textMessage, format: 'object' }); expect(encryptedTextObject).to.be.instanceOf(Message);
const sessionKeys = await decryptSessionKeys({ message: await readMessage({ binaryMessage: encryptedBinary }), decryptionKeys: privateKeys }); expect(sessionKeys).to.have.length(1); const armoredEncryptedSessionKeys: string = await encryptSessionKey({ ...sessionKeys[0], passwords: 'pass', algorithm: 'aes128', aeadAlgorithm: 'eax' }); expect(armoredEncryptedSessionKeys).to.include('-----BEGIN PGP MESSAGE-----'); const encryptedSessionKeys: Message<any> = await encryptSessionKey({ ...sessionKeys[0], passwords: 'pass', algorithm: 'aes128', aeadAlgorithm: 'eax', format: 'object' }); expect(encryptedSessionKeys).to.be.instanceOf(Message); const newSessionKey = await generateSessionKey({ encryptionKeys: privateKey.toPublic() }); expect(newSessionKey.data).to.exist; expect(newSessionKey.algorithm).to.exist;
const cleartextMessage = await createCleartextMessage({ text: 'hello' }); const clearSignedArmor = await sign({ signingKeys: privateKeys, message: cleartextMessage }); expect(clearSignedArmor).to.include('-----BEGIN PGP SIGNED MESSAGE-----'); const clearSignedObject: CleartextMessage = await sign({ signingKeys: privateKeys, message: cleartextMessage, format: 'object' }); expect(clearSignedObject).to.be.instanceOf(CleartextMessage); try { await sign({ signingKeys: publicKeys, message: cleartextMessage }); } catch (e) {} try { await sign({ signingKeys: parsedKey, message: cleartextMessage }); } catch (e) {}
const textSignedArmor: string = await sign({ signingKeys: privateKeys, message: textMessage }); expect(textSignedArmor).to.include('-----BEGIN PGP MESSAGE-----'); const textSignedBinary: Uint8Array = await sign({ signingKeys: privateKeys, message: binaryMessage, format: 'binary' }); expect(textSignedBinary).to.be.instanceOf(Uint8Array); const binarySignedObject: Message<Uint8Array> = await sign({ signingKeys: privateKeys, message: binaryMessage, format: 'object' }); expect(binarySignedObject).to.be.instanceOf(Message); const textSignedObject: Message<string> = await sign({ signingKeys: privateKeys, message: textMessage, format: 'object' }); expect(textSignedObject).to.be.instanceOf(Message);
const signedMessage = await readMessage({ armoredMessage: textSignedArmor }); const verifiedText = await verify({ verificationKeys: publicKeys, message: signedMessage }); const verifiedTextData: string = verifiedText.data; expect(verifiedTextData).to.equal(text);
const message = await readMessage({ binaryMessage: textSignedBinary }); const verifiedBinary = await verify({ verificationKeys: publicKeys, message, format: 'binary' }); const verifiedBinaryData: Uint8Array = verifiedBinary.data; expect(verifiedBinaryData).to.deep.equal(binary); await verify({ verificationKeys: privateKeys, message, format: 'binary' });
const packets = new PacketList(); expect(packets.push()).to.equal(0); expect(packets.push(new LiteralDataPacket())).to.equal(1); packets.map(packet => packet.write); packets.map((packet: LiteralDataPacket) => packet.getText()); try { new PacketList().push(1); } catch (e) {}
const literalPackets = new PacketList<LiteralDataPacket>(); literalPackets.push(new LiteralDataPacket()); literalPackets[0].write(); literalPackets.map((packet: LiteralDataPacket) => packet); packets.push(...literalPackets); literalPackets.push(...packets); new PacketList<LiteralDataPacket>().push(new CompressedDataPacket()); new PacketList<PublicKeyPacket>().push(new PublicSubkeyPacket()); new PacketList<SecretKeyPacket>().push(new SecretSubkeyPacket());
expect(LiteralDataPacket.tag).to.equal(enums.packet.literalData);
await createMessage({ binary: new WebReadableStream<string>() }); await createMessage({ text: new WebReadableStream<Uint8Array>() }); try { const nodeTextStream = createReadStream('non-existent-file', { encoding: 'utf8' }); const messageFromNodeTextStream = await createMessage({ text: nodeTextStream }); (await encrypt({ message: messageFromNodeTextStream, passwords: 'password', format: 'armored' })) as NodeStream<string>; } catch (err) {} const webTextStream = new WebReadableStream<string>(); const messageFromWebTextStream = await createMessage({ text: webTextStream }); (await encrypt({ message: messageFromWebTextStream, passwords: 'password', format: 'armored' })) as WebStream<string>; messageFromWebTextStream.getText() as WebStream<string>; messageFromWebTextStream.getLiteralData() as WebStream<Uint8Array>;
try { const nodeBinaryStream = createReadStream('non-existent-file'); const messageFromNodeBinaryStream = await createMessage({ binary: nodeBinaryStream }); (await encrypt({ message: messageFromNodeBinaryStream, passwords: 'password', format: 'binary' })) as NodeStream<Uint8Array>; } catch (err) {} const webBinaryStream = new WebReadableStream<Uint8Array>(); const messageFromWebBinaryStream = await createMessage({ binary: webBinaryStream }); (await encrypt({ message: messageFromWebBinaryStream, passwords: 'password', format: 'binary' })) as WebStream<Uint8Array>; messageFromWebBinaryStream.getText() as WebStream<string>; messageFromWebBinaryStream.getLiteralData() as WebStream<Uint8Array>;
console.log('TypeScript definitions are correct');})().catch(e => { console.error('TypeScript definitions tests failed by throwing the following error'); console.error(e); process.exit(1);});