1
Cu.import("resource://services-sync/util.js");
4
let cryptoSvc = Svc.Crypto;
6
// First, do a normal run with expected usage... Generate a random key and
7
// iv, encrypt and decrypt a string.
8
var iv = cryptoSvc.generateRandomIV();
9
do_check_eq(iv.length, 24);
11
var key = cryptoSvc.generateRandomKey();
12
do_check_eq(key.length, 44);
14
var mySecret = "bacon is a vegetable";
15
var cipherText = cryptoSvc.encrypt(mySecret, key, iv);
16
do_check_eq(cipherText.length, 44);
18
var clearText = cryptoSvc.decrypt(cipherText, key, iv);
19
do_check_eq(clearText.length, 20);
21
// Did the text survive the encryption round-trip?
22
do_check_eq(clearText, mySecret);
23
do_check_neq(cipherText, mySecret); // just to be explicit
26
// Do some more tests with a fixed key/iv, to check for reproducable results.
27
cryptoSvc.algorithm = Ci.IWeaveCrypto.AES_128_CBC;
28
key = "St1tFCor7vQEJNug/465dQ==";
29
iv = "oLjkfrLIOnK2bDRvW4kXYA==";
31
// Test small input sizes
33
cipherText = cryptoSvc.encrypt(mySecret, key, iv);
34
clearText = cryptoSvc.decrypt(cipherText, key, iv);
35
do_check_eq(cipherText, "OGQjp6mK1a3fs9k9Ml4L3w==");
36
do_check_eq(clearText, mySecret);
39
cipherText = cryptoSvc.encrypt(mySecret, key, iv);
40
clearText = cryptoSvc.decrypt(cipherText, key, iv);
41
do_check_eq(cipherText, "96iMl4vhOxFUW/lVHHzVqg==");
42
do_check_eq(clearText, mySecret);
45
cipherText = cryptoSvc.encrypt(mySecret, key, iv);
46
clearText = cryptoSvc.decrypt(cipherText, key, iv);
47
do_check_eq(cipherText, "olpPbETRYROCSqFWcH2SWg==");
48
do_check_eq(clearText, mySecret);
51
cipherText = cryptoSvc.encrypt(mySecret, key, iv);
52
clearText = cryptoSvc.decrypt(cipherText, key, iv);
53
do_check_eq(cipherText, "rRbpHGyVSZizLX/x43Wm+Q==");
54
do_check_eq(clearText, mySecret);
57
cipherText = cryptoSvc.encrypt(mySecret, key, iv);
58
clearText = cryptoSvc.decrypt(cipherText, key, iv);
59
do_check_eq(cipherText, "HeC7miVGDcpxae9RmiIKAw==");
60
do_check_eq(clearText, mySecret);
62
// Test non-ascii input
63
// ("testuser1" using similar-looking glyphs)
64
mySecret = String.fromCharCode(355, 277, 349, 357, 533, 537, 101, 345, 185);
65
cipherText = cryptoSvc.encrypt(mySecret, key, iv);
66
clearText = cryptoSvc.decrypt(cipherText, key, iv);
67
do_check_eq(cipherText, "Pj4ixByXoH3SU3JkOXaEKPgwRAWplAWFLQZkpJd5Kr4=");
68
do_check_eq(clearText, mySecret);
70
// Tests input spanning a block boundary (AES block size is 16 bytes)
71
mySecret = "123456789012345";
72
cipherText = cryptoSvc.encrypt(mySecret, key, iv);
73
clearText = cryptoSvc.decrypt(cipherText, key, iv);
74
do_check_eq(cipherText, "e6c5hwphe45/3VN/M0bMUA==");
75
do_check_eq(clearText, mySecret);
77
mySecret = "1234567890123456";
78
cipherText = cryptoSvc.encrypt(mySecret, key, iv);
79
clearText = cryptoSvc.decrypt(cipherText, key, iv);
80
do_check_eq(cipherText, "V6aaOZw8pWlYkoIHNkhsP1JOIQF87E2vTUvBUQnyV04=");
81
do_check_eq(clearText, mySecret);
83
mySecret = "12345678901234567";
84
cipherText = cryptoSvc.encrypt(mySecret, key, iv);
85
clearText = cryptoSvc.decrypt(cipherText, key, iv);
86
do_check_eq(cipherText, "V6aaOZw8pWlYkoIHNkhsP5GvxWJ9+GIAS6lXw+5fHTI=");
87
do_check_eq(clearText, mySecret);
90
// Test with 192 bit key.
91
cryptoSvc.algorithm = Ci.IWeaveCrypto.AES_192_CBC;
92
key = "iz35tuIMq4/H+IYw2KTgow==";
93
iv = "TJYrvva2KxvkM8hvOIvWp3xgjTXgq5Ss";
94
mySecret = "i like pie";
96
cipherText = cryptoSvc.encrypt(mySecret, key, iv);
97
clearText = cryptoSvc.decrypt(cipherText, key, iv);
98
do_check_eq(cipherText, "DLGx8BWqSCLGG7i/xwvvxg==");
99
do_check_eq(clearText, mySecret);
101
// Test with 256 bit key.
102
cryptoSvc.algorithm = Ci.IWeaveCrypto.AES_256_CBC;
103
key = "c5hG3YG+NC61FFy8NOHQak1ZhMEWO79bwiAfar2euzI=";
104
iv = "gsgLRDaxWvIfKt75RjuvFWERt83FFsY2A0TW+0b2iVk=";
105
mySecret = "i like pie";
107
cipherText = cryptoSvc.encrypt(mySecret, key, iv);
108
clearText = cryptoSvc.decrypt(cipherText, key, iv);
109
do_check_eq(cipherText, "o+ADtdMd8ubzNWurS6jt0Q==");
110
do_check_eq(clearText, mySecret);
113
// Test with bogus inputs
114
cryptoSvc.algorithm = Ci.IWeaveCrypto.AES_128_CBC;
115
key = "St1tFCor7vQEJNug/465dQ==";
116
iv = "oLjkfrLIOnK2bDRvW4kXYA==";
117
mySecret = "does thunder read testcases?";
118
cipherText = cryptoSvc.encrypt(mySecret, key, iv);
119
do_check_eq(cipherText, "T6fik9Ros+DB2ablH9zZ8FWZ0xm/szSwJjIHZu7sjPs=");
121
var badkey = "badkeybadkeybadkeybadk==";
122
var badiv = "badivbadivbadivbadivbad==";
123
var badcipher = "crapinputcrapinputcrapinputcrapinputcrapinp=";
128
clearText = cryptoSvc.decrypt(cipherText, badkey, iv);
132
do_check_true(failure);
136
clearText = cryptoSvc.decrypt(cipherText, key, badiv);
140
do_check_true(failure);
144
clearText = cryptoSvc.decrypt(cipherText, badkey, badiv);
148
do_check_true(failure);
152
clearText = cryptoSvc.decrypt(badcipher, key, iv);
156
do_check_true(failure);