2013-10-11 15:30:03 -04:00
define ( function ( require ) {
'use strict' ;
var PGP = require ( 'js/crypto/pgp' ) ,
2014-07-01 17:28:44 -04:00
openpgp = require ( 'openpgp' ) ,
2013-10-11 15:30:03 -04:00
expect = chai . expect ;
describe ( 'PGP Crypto Api unit tests' , function ( ) {
2014-03-06 07:34:20 -05:00
this . timeout ( 20000 ) ;
2014-02-12 13:48:29 -05:00
2013-10-11 15:30:03 -04:00
var pgp ,
2013-10-11 15:54:43 -04:00
user = 'whiteout.test@t-online.de' ,
2013-10-11 15:30:03 -04:00
passphrase = 'asdf' ,
keySize = 512 ,
keyId = 'F6F60E9B42CDFF4C' ,
2014-01-24 07:26:29 -05:00
pubkey = '-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n' +
2014-07-07 06:29:13 -04:00
'Version: OpenPGP.js v0.7.1\r\n' +
2014-06-18 04:02:33 -04:00
'Comment: http://openpgpjs.org\r\n' +
'\r\n' +
'xk0EUlhMvAEB/2MZtCUOAYvyLFjDp3OBMGn3Ev8FwjzyPbIF0JUw+L7y2XR5\r\n' +
'RVGvbK88unV3cU/1tOYdNsXI6pSp/Ztjyv7vbBUAEQEAAc0pV2hpdGVvdXQg\r\n' +
'VXNlciA8d2hpdGVvdXQudGVzdEB0LW9ubGluZS5kZT7CXAQQAQgAEAUCUlhM\r\n' +
'vQkQ9vYOm0LN/0wAAAW4Af9C+kYW1AvNWmivdtr0M0iYCUjM9DNOQH1fcvXq\r\n' +
'IiN602mWrkd8jcEzLsW5IUNzVPLhrFIuKyBDTpLnC07Loce1\r\n' +
'=6XMW\r\n' +
'-----END PGP PUBLIC KEY BLOCK-----\r\n\r\n' ,
2014-01-24 07:26:29 -05:00
privkey = '-----BEGIN PGP PRIVATE KEY BLOCK-----\r\n' +
2014-07-07 06:29:13 -04:00
'Version: OpenPGP.js v0.7.1\r\n' +
2014-06-18 04:02:33 -04:00
'Comment: http://openpgpjs.org\r\n' +
'\r\n' +
'xcBeBFJYTLwBAf9jGbQlDgGL8ixYw6dzgTBp9xL/BcI88j2yBdCVMPi+8tl0\r\n' +
'eUVRr2yvPLp1d3FP9bTmHTbFyOqUqf2bY8r+72wVABEBAAH+AwMIhNB4ivtv\r\n' +
'Y2xg6VeMcjjHxZayESHACV+nQx5Tx6ev6xzIF1Qh72fNPDppLhFSFOuTTMsU\r\n' +
'kTN4c+BVYt29spH+cA1jcDAxQ2ULrNAXo+hheOqhpedTs8aCbcLFkJAS16hk\r\n' +
'YSk4OnJgp/z24rVju1SHRSFbgundPzmNgXeX9e8IkviGhhQ11Wc5YwVkx03t\r\n' +
'Z3MdDMF0jyhopbPIoBdyJB0dhvBh98w3JmwpYh9wjUA9MBHD1tvHpRmSZ3BM\r\n' +
'UCmATn2ZLWBRWiYqFbgDnL1GM80pV2hpdGVvdXQgVXNlciA8d2hpdGVvdXQu\r\n' +
'dGVzdEB0LW9ubGluZS5kZT7CXAQQAQgAEAUCUlhMvQkQ9vYOm0LN/0wAAAW4\r\n' +
'Af9C+kYW1AvNWmivdtr0M0iYCUjM9DNOQH1fcvXqIiN602mWrkd8jcEzLsW5\r\n' +
'IUNzVPLhrFIuKyBDTpLnC07Loce1\r\n' +
'=ULta\r\n' +
'-----END PGP PRIVATE KEY BLOCK-----\r\n' ;
2013-10-11 15:30:03 -04:00
beforeEach ( function ( ) {
pgp = new PGP ( ) ;
} ) ;
afterEach ( function ( ) { } ) ;
describe ( 'Generate key pair' , function ( ) {
2013-10-11 15:54:43 -04:00
it ( 'should fail' , function ( done ) {
pgp . generateKeys ( {
emailAddress : 'whiteout.test@t-onlinede' ,
keySize : keySize ,
passphrase : passphrase
} , function ( err , keys ) {
expect ( err ) . to . exist ;
expect ( keys ) . to . not . exist ;
done ( ) ;
} ) ;
} ) ;
it ( 'should fail' , function ( done ) {
pgp . generateKeys ( {
emailAddress : 'whiteout.testt-online.de' ,
keySize : keySize ,
passphrase : passphrase
} , function ( err , keys ) {
expect ( err ) . to . exist ;
expect ( keys ) . to . not . exist ;
done ( ) ;
} ) ;
} ) ;
2014-06-30 13:59:02 -04:00
it ( 'should work with passphrase' , function ( done ) {
2013-10-11 15:30:03 -04:00
pgp . generateKeys ( {
emailAddress : user ,
keySize : keySize ,
passphrase : passphrase
} , function ( err , keys ) {
expect ( err ) . to . not . exist ;
expect ( keys . keyId ) . to . exist ;
expect ( keys . privateKeyArmored ) . to . exist ;
expect ( keys . publicKeyArmored ) . to . exist ;
done ( ) ;
} ) ;
} ) ;
2014-06-30 13:59:02 -04:00
it ( 'should work without passphrase' , function ( done ) {
pgp . generateKeys ( {
emailAddress : user ,
keySize : keySize ,
passphrase : ''
} , function ( err , keys ) {
expect ( err ) . to . not . exist ;
expect ( keys . keyId ) . to . exist ;
expect ( keys . privateKeyArmored ) . to . exist ;
expect ( keys . publicKeyArmored ) . to . exist ;
done ( ) ;
} ) ;
} ) ;
2013-10-11 15:30:03 -04:00
} ) ;
describe ( 'Import/Export key pair' , function ( ) {
2013-10-11 16:10:50 -04:00
it ( 'should fail' , function ( done ) {
pgp . importKeys ( {
passphrase : 'asd' ,
privateKeyArmored : privkey ,
publicKeyArmored : pubkey
} , function ( err ) {
expect ( err ) . to . exist ;
2014-06-13 06:33:30 -04:00
expect ( err . message ) . to . equal ( 'Incorrect passphrase!' ) ;
2013-10-11 16:10:50 -04:00
pgp . exportKeys ( function ( err , keys ) {
expect ( err ) . to . exist ;
expect ( keys ) . to . not . exist ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2013-10-11 15:30:03 -04:00
it ( 'should work' , function ( done ) {
pgp . importKeys ( {
passphrase : passphrase ,
privateKeyArmored : privkey ,
publicKeyArmored : pubkey
} , function ( err ) {
expect ( err ) . to . not . exist ;
pgp . exportKeys ( function ( err , keys ) {
expect ( err ) . to . not . exist ;
expect ( keys . keyId ) . to . equal ( keyId ) ;
2014-01-24 07:26:29 -05:00
expect ( keys . privateKeyArmored . replace ( /\r/g , '' ) ) . to . equal ( privkey . replace ( /\r/g , '' ) ) ;
expect ( keys . publicKeyArmored . replace ( /\r/g , '' ) ) . to . equal ( pubkey . replace ( /\r/g , '' ) ) ;
2013-10-11 15:30:03 -04:00
done ( ) ;
} ) ;
} ) ;
2014-03-31 14:15:09 -04:00
} ) ;
} ) ;
describe ( 'Change passphrase of private key' , function ( ) {
2014-06-30 13:59:02 -04:00
it ( 'should work with new passphrase' , function ( done ) {
2014-03-31 14:15:09 -04:00
pgp . changePassphrase ( {
privateKeyArmored : privkey ,
oldPassphrase : passphrase ,
newPassphrase : 'yxcv'
} , function ( err , reEncryptedKey ) {
expect ( err ) . to . not . exist ;
expect ( reEncryptedKey ) . to . exist ;
pgp . importKeys ( {
passphrase : 'yxcv' ,
privateKeyArmored : reEncryptedKey ,
publicKeyArmored : pubkey
} , function ( err ) {
expect ( err ) . to . not . exist ;
done ( ) ;
} ) ;
} ) ;
2013-10-11 15:30:03 -04:00
} ) ;
2014-06-30 13:59:02 -04:00
it ( 'should work with empty passphrase' , function ( done ) {
pgp . changePassphrase ( {
privateKeyArmored : privkey ,
oldPassphrase : passphrase ,
newPassphrase : undefined
} , function ( err , reEncryptedKey ) {
expect ( err ) . to . not . exist ;
expect ( reEncryptedKey ) . to . exist ;
2014-04-11 12:39:13 -04:00
2014-06-30 13:59:02 -04:00
pgp . importKeys ( {
passphrase : undefined ,
privateKeyArmored : reEncryptedKey ,
publicKeyArmored : pubkey
} , function ( err ) {
expect ( err ) . to . not . exist ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2014-04-11 12:39:13 -04:00
it ( 'should fail when passphrases are equal' , function ( done ) {
pgp . changePassphrase ( {
privateKeyArmored : privkey ,
oldPassphrase : passphrase ,
newPassphrase : passphrase
} , function ( err , reEncryptedKey ) {
expect ( err ) . to . exist ;
expect ( reEncryptedKey ) . to . not . exist ;
done ( ) ;
} ) ;
} ) ;
it ( 'should fail when old passphrase is incorrect' , function ( done ) {
pgp . changePassphrase ( {
privateKeyArmored : privkey ,
oldPassphrase : 'asd' ,
newPassphrase : 'yxcv'
} , function ( err , reEncryptedKey ) {
expect ( err ) . to . exist ;
expect ( reEncryptedKey ) . to . not . exist ;
done ( ) ;
} ) ;
} ) ;
2013-10-11 15:30:03 -04:00
} ) ;
2014-01-24 07:26:29 -05:00
describe ( 'Encrypt/Sign/Decrypt/Verify' , function ( ) {
2013-12-05 12:30:10 -05:00
var message = 'asdfs\n\nThursday, Nov 21, 2013 7:38 PM asdf@example.com wrote:\n' +
'> asdf\n' +
'> \n' +
'> Thursday, Nov 21, 2013 7:32 PM asdf@example.com wrote:\n' +
'> > secret 3' ;
2014-07-04 11:58:25 -04:00
var wrongPubkey = '-----BEGIN PGP PUBLIC KEY BLOCK-----\r\nVersion: OpenPGP.js v.1.20131116\r\nComment: Whiteout Mail - http://whiteout.io\r\n\r\nxsBNBFKODs4BB/9iOF4THsjQMY+WEpT7ShgKxj4bHzRRaQkqczS4nZvP0U3g\r\nqeqCnbpagyeKXA+bhWFQW4GmXtgAoeD5PXs6AZYrw3tWNxLKu2Oe6Tp9K/XI\r\nxTMQ2wl4qZKDXHvuPsJ7cmgaWqpPyXtxA4zHHS3WrkI/6VzHAcI/y6x4szSB\r\nKgSuhI3hjh3s7TybUC1U6AfoQGx/S7e3WwlCOrK8GTClirN/2mCPRC5wuIft\r\nnkoMfA6jK8d2OPrJ63shy5cgwHOjQg/xuk46dNS7tkvGmbaa+X0PgqSKB+Hf\r\nYPPNS/ylg911DH9qa8BqYU2QpNh9jUKXSF+HbaOM+plWkCSAL7czV+R3ABEB\r\nAAHNLVdoaXRlb3V0IFVzZXIgPHNhZmV3aXRobWUudGVzdHVzZXJAZ21haWwu\r\nY29tPsLAXAQQAQgAEAUCUo4O2gkQ1/uT/N+/wjwAAN2cB/9gFRmAfvEQ2qz+\r\nWubmT2EsSSnjPMxzG4uyykFoa+TaZCWo2Xa2tQghmU103kEkQb1OEjRjpgwJ\r\nYX9Kghnl8DByM686L5AXnRyHP78qRJCLXSXl0AGicboUDp5sovaa4rswQceH\r\nvcdWgZ/mgHTRoiQeJddy9k+H6MPFiyFaVcFwegVsmpc+dCcC8yT+qh8ZIbyG\r\nRJU60PmKKN7LUusP+8DbSv39zCGJCBlVVKyA4MzdF5uM+sqTdXbKzOrT5DGd\r\nCZaox4s+w16Sq1rHzZKFWfQPfKLDB9pyA0ufCVRA3AF6BUi7G3ZqhZiHNhMP\r\nNvE45V/hS1PbZcfPVoUjE2qc1Ix1\r\n=7Wpe\r\n-----END PGP PUBLIC KEY BLOCK-----' ;
2013-10-11 15:30:03 -04:00
beforeEach ( function ( done ) {
pgp . importKeys ( {
passphrase : passphrase ,
privateKeyArmored : privkey ,
publicKeyArmored : pubkey
} , function ( err ) {
expect ( err ) . to . not . exist ;
done ( ) ;
} ) ;
} ) ;
2013-11-06 10:20:49 -05:00
describe ( 'Get KeyId' , function ( ) {
2014-03-05 14:14:23 -05:00
it ( 'should work without param' , function ( ) {
2013-11-06 10:20:49 -05:00
var keyId = pgp . getKeyId ( ) ;
expect ( keyId ) . to . equal ( 'F6F60E9B42CDFF4C' ) ;
} ) ;
2014-03-05 14:14:23 -05:00
it ( 'should work with param' , function ( ) {
var keyId = pgp . getKeyId ( pubkey ) ;
expect ( keyId ) . to . equal ( 'F6F60E9B42CDFF4C' ) ;
} ) ;
} ) ;
2013-11-06 10:20:49 -05:00
describe ( 'Get Fingerprint' , function ( ) {
2013-12-03 07:15:10 -05:00
it ( 'should work without param' , function ( ) {
2013-11-06 10:20:49 -05:00
var fingerprint = pgp . getFingerprint ( ) ;
expect ( fingerprint ) . to . equal ( '5856CEF789C3A307E8A1B976F6F60E9B42CDFF4C' ) ;
} ) ;
2013-12-03 07:15:10 -05:00
it ( 'should work with param' , function ( ) {
var fingerprint = pgp . getFingerprint ( pubkey ) ;
expect ( fingerprint ) . to . equal ( '5856CEF789C3A307E8A1B976F6F60E9B42CDFF4C' ) ;
} ) ;
2013-11-06 10:20:49 -05:00
} ) ;
2014-03-06 12:19:51 -05:00
describe ( 'getKeyParams' , function ( ) {
it ( 'should work with param' , function ( ) {
var params = pgp . getKeyParams ( pubkey ) ;
expect ( params . fingerprint ) . to . equal ( '5856CEF789C3A307E8A1B976F6F60E9B42CDFF4C' ) ;
expect ( params . _id ) . to . equal ( "F6F60E9B42CDFF4C" ) ;
expect ( params . bitSize ) . to . equal ( keySize ) ;
2014-04-11 12:39:13 -04:00
expect ( params . userId ) . to . equal ( "whiteout.test@t-online.de" ) ;
2014-06-18 04:02:33 -04:00
expect ( params . userIds [ 0 ] . name ) . to . equal ( "Whiteout User" ) ;
expect ( params . userIds [ 0 ] . emailAddress ) . to . equal ( "whiteout.test@t-online.de" ) ;
2014-04-11 12:39:13 -04:00
expect ( params . algorithm ) . to . equal ( "rsa_encrypt_sign" ) ;
} ) ;
it ( 'should work without param' , function ( ) {
var params = pgp . getKeyParams ( ) ;
expect ( params . fingerprint ) . to . equal ( '5856CEF789C3A307E8A1B976F6F60E9B42CDFF4C' ) ;
expect ( params . _id ) . to . equal ( "F6F60E9B42CDFF4C" ) ;
expect ( params . bitSize ) . to . equal ( keySize ) ;
2014-03-06 12:19:51 -05:00
expect ( params . userId ) . to . equal ( "whiteout.test@t-online.de" ) ;
2014-06-18 04:02:33 -04:00
expect ( params . userIds [ 0 ] . name ) . to . equal ( "Whiteout User" ) ;
expect ( params . userIds [ 0 ] . emailAddress ) . to . equal ( "whiteout.test@t-online.de" ) ;
2014-03-06 12:19:51 -05:00
expect ( params . algorithm ) . to . equal ( "rsa_encrypt_sign" ) ;
} ) ;
} ) ;
2014-07-01 14:58:34 -04:00
describe ( 'extractPublicKey' , function ( ) {
it ( 'should work' , function ( ) {
var pk = pgp . extractPublicKey ( privkey ) ;
expect ( pk ) . to . exist ;
expect ( pk ) . to . contain ( '-----BEGIN PGP PUBLIC KEY BLOCK-----' ) ;
} ) ;
} ) ;
2013-12-05 07:00:00 -05:00
describe ( 'Encrypt and sign' , function ( ) {
2013-11-14 07:57:52 -05:00
it ( 'should fail' , function ( done ) {
var input = null ;
pgp . encrypt ( input , [ pubkey ] , function ( err , ct ) {
expect ( err ) . to . exist ;
expect ( ct ) . to . not . exist ;
done ( ) ;
} ) ;
} ) ;
2013-10-11 15:30:03 -04:00
it ( 'should work' , function ( done ) {
pgp . encrypt ( message , [ pubkey ] , function ( err , ct ) {
expect ( err ) . to . not . exist ;
expect ( ct ) . to . exist ;
done ( ) ;
} ) ;
} ) ;
2014-07-01 17:28:44 -04:00
it ( 'should encrypt to myself if public keys are empty' , function ( done ) {
pgp . encrypt ( message , undefined , function ( err , ct ) {
expect ( err ) . to . not . exist ;
expect ( ct ) . to . exist ;
done ( ) ;
} ) ;
} ) ;
2013-10-11 15:30:03 -04:00
} ) ;
2013-12-05 07:00:00 -05:00
describe ( 'Decrypt and verify' , function ( ) {
var ciphertext ;
beforeEach ( function ( done ) {
pgp . encrypt ( message , [ pubkey ] , function ( err , ct ) {
expect ( err ) . to . not . exist ;
expect ( ct ) . to . exist ;
ciphertext = ct ;
done ( ) ;
} ) ;
} ) ;
2013-11-14 07:57:52 -05:00
it ( 'should fail' , function ( done ) {
var input = 'asdfa\rsdf' ;
pgp . decrypt ( input , pubkey , function ( err , pt ) {
expect ( err ) . to . exist ;
expect ( pt ) . to . not . exist ;
done ( ) ;
} ) ;
} ) ;
2013-10-11 15:30:03 -04:00
it ( 'should work' , function ( done ) {
2014-06-30 13:59:02 -04:00
pgp . decrypt ( ciphertext , pubkey , function ( err , pt , signValid ) {
expect ( err ) . to . not . exist ;
expect ( pt ) . to . equal ( message ) ;
expect ( signValid ) . to . be . true ;
done ( ) ;
} ) ;
} ) ;
2014-07-01 17:28:44 -04:00
it ( 'should work without signature' , function ( done ) {
var ct = openpgp . encryptMessage ( [ pgp . _publicKey ] , message ) ;
2014-06-30 13:59:02 -04:00
2014-07-01 17:28:44 -04:00
pgp . decrypt ( ct , undefined , function ( err , pt , signValid ) {
2013-10-11 15:30:03 -04:00
expect ( err ) . to . not . exist ;
2014-01-24 07:26:29 -05:00
expect ( pt ) . to . equal ( message ) ;
2014-06-30 13:59:02 -04:00
expect ( signValid ) . to . be . undefined ;
2013-10-11 15:30:03 -04:00
done ( ) ;
} ) ;
} ) ;
2014-07-01 17:28:44 -04:00
it ( 'should fail to verify if public keys are empty' , function ( done ) {
// setup another public key so that signature verification fails
pgp . _publicKey = openpgp . key . readArmored ( wrongPubkey ) . keys [ 0 ] ;
pgp . decrypt ( ciphertext , undefined , function ( err , pt , signValid ) {
expect ( err ) . to . not . exist ;
expect ( pt ) . to . equal ( message ) ;
expect ( signValid ) . to . be . null ;
done ( ) ;
} ) ;
} ) ;
it ( 'should decrypt but signValid should be null for wrong public key' , function ( done ) {
pgp . decrypt ( ciphertext , wrongPubkey , function ( err , pt , signValid ) {
expect ( err ) . to . not . exist ;
expect ( pt ) . to . equal ( message ) ;
expect ( signValid ) . to . be . null ;
done ( ) ;
} ) ;
} ) ;
2013-10-11 15:30:03 -04:00
} ) ;
2014-07-04 11:58:25 -04:00
describe ( 'Verify clearsigned message' , function ( ) {
var clearsigned ;
beforeEach ( function ( ) {
clearsigned = openpgp . signClearMessage ( pgp . _privateKey , 'this is a clearsigned message' ) ;
} ) ;
it ( 'should work' , function ( done ) {
pgp . verifyClearSignedMessage ( clearsigned , pubkey , function ( err , signaturesValid ) {
expect ( err ) . to . not . exist ;
expect ( signaturesValid ) . to . be . true ;
done ( ) ;
} ) ;
} ) ;
it ( 'should fail' , function ( done ) {
pgp . verifyClearSignedMessage ( clearsigned . replace ( 'clearsigned' , 'invalid' ) , pubkey , function ( err , signaturesValid ) {
expect ( err ) . to . not . exist ;
expect ( signaturesValid ) . to . be . false ;
done ( ) ;
} ) ;
} ) ;
2014-07-07 05:58:41 -04:00
it ( 'should be null for wrong public key' , function ( done ) {
2014-07-04 11:58:25 -04:00
pgp . verifyClearSignedMessage ( clearsigned , wrongPubkey , function ( err , signaturesValid ) {
expect ( err ) . to . not . exist ;
expect ( signaturesValid ) . to . be . null ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2013-10-11 15:30:03 -04:00
2014-07-04 11:58:25 -04:00
describe ( 'Verify detached signature' , function ( ) {
var signedMessage , signature ;
beforeEach ( function ( ) {
signedMessage = 'this is a signed message' ;
var clearsigned = openpgp . signClearMessage ( pgp . _privateKey , signedMessage ) ;
var signatureHeader = '-----BEGIN PGP SIGNATURE-----' ;
signature = signatureHeader + clearsigned . split ( signatureHeader ) . pop ( ) ;
} ) ;
it ( 'should work' , function ( done ) {
pgp . verifySignedMessage ( signedMessage , signature , pubkey , function ( err , signaturesValid ) {
expect ( err ) . to . not . exist ;
expect ( signaturesValid ) . to . be . true ;
done ( ) ;
} ) ;
} ) ;
it ( 'should fail' , function ( done ) {
pgp . verifySignedMessage ( signedMessage . replace ( 'signed' , 'invalid' ) , signature , pubkey , function ( err , signaturesValid ) {
expect ( err ) . to . not . exist ;
expect ( signaturesValid ) . to . be . false ;
done ( ) ;
} ) ;
} ) ;
it ( 'should be null for wrong public key' , function ( done ) {
pgp . verifySignedMessage ( signedMessage , signature , wrongPubkey , function ( err , signaturesValid ) {
expect ( err ) . to . not . exist ;
expect ( signaturesValid ) . to . be . null ;
done ( ) ;
} ) ;
} ) ;
} ) ;
} ) ;
2013-10-11 15:30:03 -04:00
} ) ;
} ) ;