@@ -7,98 +7,89 @@ const TEST_VECTORS = [
7
7
mode : "aes-128-ctr" ,
8
8
key : "2b7e151628aed2a6abf7158809cf4f3c" ,
9
9
iv : "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff" ,
10
- msg :
11
- "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
10
+ msg : "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
12
11
cypherText :
13
12
"874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee" ,
14
- pkcs7PaddingEnabled : false
13
+ pkcs7PaddingEnabled : false ,
15
14
} ,
16
15
// CTR uses no padding, so we test that here
17
16
{
18
17
mode : "aes-128-ctr" ,
19
18
key : "2b7e151628aed2a6abf7158809cf4f3c" ,
20
19
iv : "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff" ,
21
- msg :
22
- "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
20
+ msg : "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
23
21
cypherText :
24
22
"874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee" ,
25
- pkcs7PaddingEnabled : true
23
+ pkcs7PaddingEnabled : true ,
26
24
} ,
27
25
// Same as the previous one, but with default params
28
26
{
29
27
mode : undefined ,
30
28
key : "2b7e151628aed2a6abf7158809cf4f3c" ,
31
29
iv : "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff" ,
32
- msg :
33
- "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
30
+ msg : "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
34
31
cypherText :
35
32
"874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee" ,
36
- pkcs7PaddingEnabled : undefined
33
+ pkcs7PaddingEnabled : undefined ,
37
34
} ,
38
35
// CBC uses padding, but the NIST test vectors don't
39
36
{
40
37
mode : "aes-128-cbc" ,
41
38
key : "2b7e151628aed2a6abf7158809cf4f3c" ,
42
39
iv : "000102030405060708090a0b0c0d0e0f" ,
43
- msg :
44
- "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
40
+ msg : "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
45
41
cypherText :
46
42
"7649abac8119b246cee98e9b12e9197d5086cb9b507219ee95db113a917678b273bed6b8e3c1743b7116e69e222295163ff1caa1681fac09120eca307586e1a7" ,
47
- pkcs7PaddingEnabled : false
43
+ pkcs7PaddingEnabled : false ,
48
44
} ,
49
45
// We test that the padding is in fact PKCS#7 by first entrypting with its
50
46
// corresponding padding adding manually, and then with automatic padding
51
47
{
52
48
mode : "aes-128-cbc" ,
53
49
key : "2b7e151628aed2a6abf7158809cf4f3c" ,
54
50
iv : "000102030405060708090a0b0c0d0e0f" ,
55
- msg :
56
- "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c371010101010101010101010101010101010" ,
51
+ msg : "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c371010101010101010101010101010101010" ,
57
52
cypherText :
58
53
"7649abac8119b246cee98e9b12e9197d5086cb9b507219ee95db113a917678b273bed6b8e3c1743b7116e69e222295163ff1caa1681fac09120eca307586e1a78cb82807230e1321d3fae00d18cc2012" ,
59
- pkcs7PaddingEnabled : false
54
+ pkcs7PaddingEnabled : false ,
60
55
} ,
61
56
{
62
57
mode : "aes-128-cbc" ,
63
58
key : "2b7e151628aed2a6abf7158809cf4f3c" ,
64
59
iv : "000102030405060708090a0b0c0d0e0f" ,
65
- msg :
66
- "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
60
+ msg : "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
67
61
cypherText :
68
62
"7649abac8119b246cee98e9b12e9197d5086cb9b507219ee95db113a917678b273bed6b8e3c1743b7116e69e222295163ff1caa1681fac09120eca307586e1a78cb82807230e1321d3fae00d18cc2012" ,
69
- pkcs7PaddingEnabled : true
63
+ pkcs7PaddingEnabled : true ,
70
64
} ,
71
65
// Same applies for aes-256-cbc
72
66
{
73
67
mode : "aes-256-cbc" ,
74
68
key : "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4" ,
75
69
iv : "000102030405060708090a0b0c0d0e0f" ,
76
- msg :
77
- "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
70
+ msg : "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
78
71
cypherText :
79
72
"f58c4c04d6e5f1ba779eabfb5f7bfbd69cfc4e967edb808d679f777bc6702c7d39f23369a9d9bacfa530e26304231461b2eb05e2c39be9fcda6c19078c6a9d1b" ,
80
- pkcs7PaddingEnabled : false
73
+ pkcs7PaddingEnabled : false ,
81
74
} ,
82
75
{
83
76
mode : "aes-256-cbc" ,
84
77
key : "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4" ,
85
78
iv : "000102030405060708090a0b0c0d0e0f" ,
86
- msg :
87
- "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c371010101010101010101010101010101010" ,
79
+ msg : "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c371010101010101010101010101010101010" ,
88
80
cypherText :
89
81
"f58c4c04d6e5f1ba779eabfb5f7bfbd69cfc4e967edb808d679f777bc6702c7d39f23369a9d9bacfa530e26304231461b2eb05e2c39be9fcda6c19078c6a9d1b3f461796d6b0d6b2e0c2a72b4d80e644" ,
90
- pkcs7PaddingEnabled : false
82
+ pkcs7PaddingEnabled : false ,
91
83
} ,
92
84
{
93
85
mode : "aes-256-cbc" ,
94
86
key : "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4" ,
95
87
iv : "000102030405060708090a0b0c0d0e0f" ,
96
- msg :
97
- "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
88
+ msg : "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" ,
98
89
cypherText :
99
90
"f58c4c04d6e5f1ba779eabfb5f7bfbd69cfc4e967edb808d679f777bc6702c7d39f23369a9d9bacfa530e26304231461b2eb05e2c39be9fcda6c19078c6a9d1b3f461796d6b0d6b2e0c2a72b4d80e644" ,
100
- pkcs7PaddingEnabled : true
101
- }
91
+ pkcs7PaddingEnabled : true ,
92
+ } ,
102
93
] ;
103
94
104
95
describe ( "aes" , ( ) => {
@@ -151,4 +142,52 @@ describe("aes", () => {
151
142
)
152
143
) ;
153
144
} ) ;
145
+
146
+ it ( "aes-ctr bug (browser/node result mismatch)" , async ( ) => {
147
+ // NOTE: full 0xff iv causes difference on counter overflow in CTR mode
148
+ const iv = "ffffffffffffffffffffffffffffffff" ;
149
+ const vectors = [
150
+ {
151
+ msg : "efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378" ,
152
+ key : "ccc0b35ea59c51a1e45af00502966237" ,
153
+ iv,
154
+ mode : "aes-128-ctr" ,
155
+ result :
156
+ "15e356c67d266d3ca85cff4f6d92d11720aae32cdd28d5d9885836dacb1d213b" ,
157
+ } ,
158
+ {
159
+ msg : "efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378" ,
160
+ key : "ccc0b35ea59c51a1e45af00502966237ccc0b35ea59c51a1e45af00502966237" ,
161
+ iv,
162
+ mode : "aes-256-ctr" ,
163
+ result :
164
+ "010bb6dc10ea201bf2d586de4741309373c07b6ddf30ad8502adf4dd0bda2d23" ,
165
+ } ,
166
+ {
167
+ msg : "efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378" ,
168
+ key : "ccc0b35ea59c51a1e45af00502966237" ,
169
+ iv,
170
+ mode : "aes-128-ctr" ,
171
+ result :
172
+ "15e356c67d266d3ca85cff4f6d92d11720aae32cdd28d5d9885836dacb1d213b55f347e68f72acf46234d495f579fb45f9dcfc7dc688a9174f566d137ffc626c" ,
173
+ } ,
174
+ {
175
+ msg : "efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378" ,
176
+ key : "ccc0b35ea59c51a1e45af00502966237ccc0b35ea59c51a1e45af00502966237" ,
177
+ iv,
178
+ mode : "aes-256-ctr" ,
179
+ result :
180
+ "010bb6dc10ea201bf2d586de4741309373c07b6ddf30ad8502adf4dd0bda2d23c436b35e5dfa0a0088dcb6ae7328f1ec66212099222ee1c18983b58513cf5f4c" ,
181
+ } ,
182
+ ] ;
183
+ for ( const v of vectors ) {
184
+ const msg = hexToBytes ( v . msg ) ;
185
+ const key = hexToBytes ( v . key ) ;
186
+ const iv = hexToBytes ( v . iv ) ;
187
+ const res = await encrypt ( msg , key , iv , v . mode ) ;
188
+ deepStrictEqual ( toHex ( res ) , v . result ) ;
189
+ const clearText = await decrypt ( res , key , iv , v . mode ) ;
190
+ deepStrictEqual ( clearText , msg ) ;
191
+ }
192
+ } ) ;
154
193
} ) ;
0 commit comments