• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

google / webcrypto.dart / 25232696112

01 May 2026 08:53PM UTC coverage: 90.337% (-0.1%) from 90.474%
25232696112

push

github

web-flow
ci: trim browser matrix and cache Android AVD (#266)

3730 of 4129 relevant lines covered (90.34%)

1.31 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

82.26
/lib/src/testing/webcrypto/aesctr.dart
1
// Copyright 2020 Google LLC
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//      http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14

15
library aesctr_test;
16

17
import 'package:webcrypto/webcrypto.dart';
18
import '../utils/utils.dart';
19
import '../utils/testrunner.dart';
20
import '../utils/detected_runtime.dart';
21

22
final runner = TestRunner.symmetric<AesCtrSecretKey>(
3✔
23
  algorithm: 'AES-CTR',
24
  importPrivateRawKey: (keyData, keyImportParams) =>
1✔
25
      AesCtrSecretKey.importRawKey(keyData),
1✔
26
  exportPrivateRawKey: (key) => key.exportRawKey(),
2✔
27
  importPrivatePkcs8Key: null, // not supported
28
  exportPrivatePkcs8Key: null,
29
  importPrivateJsonWebKey: (jsonWebKeyData, keyImportParams) =>
1✔
30
      AesCtrSecretKey.importJsonWebKey(jsonWebKeyData),
1✔
31
  exportPrivateJsonWebKey: (key) => key.exportJsonWebKey(),
2✔
32
  generateKey: (generateKeyPairParams) =>
×
33
      AesCtrSecretKey.generateKey(generateKeyPairParams['length']),
×
34
  encryptBytes: (key, data, encryptParams) => key.encryptBytes(
2✔
35
    data,
36
    bytesFromJson(encryptParams, 'counter')!,
1✔
37
    encryptParams['length'],
1✔
38
  ),
39
  encryptStream: (key, data, encryptParams) => key.encryptStream(
2✔
40
    data,
41
    bytesFromJson(encryptParams, 'counter')!,
1✔
42
    encryptParams['length'],
1✔
43
  ),
44
  decryptBytes: (key, data, decryptParams) => key.decryptBytes(
2✔
45
    data,
46
    bytesFromJson(decryptParams, 'counter')!,
1✔
47
    decryptParams['length'],
1✔
48
  ),
49
  decryptStream: (key, data, decryptParams) => key.decryptStream(
2✔
50
    data,
51
    bytesFromJson(decryptParams, 'counter')!,
1✔
52
    decryptParams['length'],
1✔
53
  ),
54
  testData: _testData,
1✔
55
);
56

57
void main() async {
×
58
  log('generate AES-CTR test case');
×
59
  await runner.generate(
×
60
    generateKeyParams: {'length': 256},
×
61
    importKeyParams: {},
×
62
    encryptDecryptParams: {
×
63
      'counter': bytesToJson(List.generate(16, (i) => 0xfe)),
×
64
      'length': 9,
65
    },
66
    maxPlaintext: 80,
67
  );
68
  log('--------------------');
×
69

70
  await runner.tests().runTests();
×
71
}
72

73
// Allow single quotes for hardcoded testData written as JSON:
74
// ignore_for_file: prefer_single_quotes
75
final _testData = [
3✔
76
  {
1✔
77
    "name": "A128CTR/64 generated on boringssl/linux at 2020-01-19T16:40:39",
78
    "privateRawKeyData": "VPhdE6z4820SUnBmesDBSw==",
79
    "privateJsonWebKeyData": {
1✔
80
      "kty": "oct",
81
      "use": "enc",
82
      "alg": "A128CTR",
83
      "k": "VPhdE6z4820SUnBmesDBSw",
84
    },
85
    "plaintext": "dXJpcyBxdWlzIG1hdHRpcyBtYXNzYS4gUGhhc2VsbHVzIGNvbnZhbGxp",
86
    "ciphertext": "LnHSulNxQ6y+Z2rC2g8QQURwQWrI53qMPajfaef3cA0jaL+yAd3syGfz",
87
    "importKeyParams": {},
1✔
88
    "encryptDecryptParams": {
1✔
89
      "counter": "AAEECRAZJDFAUWR5kKnE4Q==",
90
      "length": 64,
91
    },
92
  },
93
  {
1✔
94
    "name": "A128CTR/64 generated on chrome/linux at 2020-01-19T16:40:46",
95
    "privateRawKeyData": "sx/x9PWRAq+IjUKJOGpDVA==",
96
    "privateJsonWebKeyData": {
1✔
97
      "kty": "oct",
98
      "alg": "A128CTR",
99
      "k": "sx_x9PWRAq-IjUKJOGpDVA",
100
    },
101
    "plaintext":
102
        "RXRpYW0gc3VzY2lwaXQgZXN0IHZlbCBoZW5kcmVyaXQgYmxhbmRpdC4gTnVsbGFt",
103
    "ciphertext":
104
        "LiahUAh0wPHi2GfXs9RjESf7Govs9Rc4EZvJQ1SB1qM/vYdIznBSXHkBUw5SyoM3",
105
    "importKeyParams": {},
1✔
106
    "encryptDecryptParams": {
1✔
107
      "counter": "AAEECRAZJDFAUWR5kKnE4Q==",
108
      "length": 64,
109
    },
110
  },
111
  {
1✔
112
    "name": "A128CTR/64 generated on firefox/linux at 2020-01-19T16:40:51",
113
    "privateRawKeyData": "tauul1rFz1pQSzowPHc1Bg==",
114
    "privateJsonWebKeyData": {
1✔
115
      "kty": "oct",
116
      "alg": "A128CTR",
117
      "k": "tauul1rFz1pQSzowPHc1Bg",
118
    },
119
    "plaintext": "bnQuIEluIGhlbmRyZXJpdCBwb3N1ZXJlIGxhY3VzIHZlbAp2YXJpdXMuIA==",
120
    "ciphertext":
121
        "Yvs4qLHAvfNP02lurZAX6khEG6YoARHFAvniYkn7olEh9/G21no8a/ksWA==",
122
    "importKeyParams": {},
1✔
123
    "encryptDecryptParams": {
1✔
124
      "counter": "AAEECRAZJDFAUWR5kKnE4Q==",
125
      "length": 64,
126
    },
127
  },
128
  {
1✔
129
    "name": "A256CTR/9 generated on boringssl/linux at 2020-01-21T22:27:46",
130
    "privateRawKeyData": "kytWTrsvIRYO8TqaGToZIAAys5BTxSk3rZ+uz97bcII=",
131
    "privateJsonWebKeyData": {
1✔
132
      "kty": "oct",
133
      "use": "enc",
134
      "alg": "A256CTR",
135
      "k": "kytWTrsvIRYO8TqaGToZIAAys5BTxSk3rZ-uz97bcII",
136
    },
137
    "plaintext": "dCBzYXBpZW4uIFBy",
138
    "ciphertext": "bSKocP19wU2keXkL",
139
    "importKeyParams": {},
1✔
140
    "encryptDecryptParams": {
1✔
141
      "counter": "/v7+/v7+/v7+/v7+/v7+/g==",
142
      "length": 9,
143
    },
144
  },
145
  {
1✔
146
    "name": "A256CTR/9 generated on chrome/linux at 2020-01-21T22:27:52",
147
    "privateRawKeyData": "WngeqRJDQN8vkhSxSPAM5+XQKqKZTv90uur/A5sX4Zk=",
148
    "privateJsonWebKeyData": {
1✔
149
      "kty": "oct",
150
      "alg": "A256CTR",
151
      "k": "WngeqRJDQN8vkhSxSPAM5-XQKqKZTv90uur_A5sX4Zk",
152
    },
153
    "plaintext":
154
        "IG5pYmguCgpTZWQgbW9sbGlzIHNhcGllbiBpbiBncmF2aWRhIGF1Y3Rvci4gQWVuZWFuIG5pYmggdG9ydG8=",
155
    "ciphertext":
156
        "Nj5naY4AWDSbh3taXM4k2Ys7gDlJJSmE4rBS2TQkYXf0DcO7G9pov5EQEXrrKk/LjGITblQI1GkCi9ndwl4=",
157
    "importKeyParams": {},
1✔
158
    "encryptDecryptParams": {
1✔
159
      "counter": "/v7+/v7+/v7+/v7+/v7+/g==",
160
      "length": 9,
161
    },
162
  },
163
  // HACK: Exclude counter rollover test data on Firefox, where it is broken:
164
  // https://hg.mozilla.org/projects/nss/file/38f1c92a5e1175bb8388768a209ac0efdabd1bd7/lib/freebl/ctr.c#l86
165
  ...(nullOnFirefox(_rolloverTestData) ?? <Map>[]),
3✔
166
];
167

168
final _rolloverTestData = [
3✔
169
  {
1✔
170
    "name":
171
        "A128CTR/2 counter rollover, generated on boringssl/linux at 2020-01-21T22:17:08",
172
    "privateRawKeyData": "mkHLvTc/F5evWm7OAMz1Ag==",
173
    "privateJsonWebKeyData": {
1✔
174
      "kty": "oct",
175
      "use": "enc",
176
      "alg": "A128CTR",
177
      "k": "mkHLvTc_F5evWm7OAMz1Ag",
178
    },
179
    "plaintext":
180
        "cwpjb21tb2RvIGF0IHNpdCBhbWV0IG1pLiBQZWxsZW50ZXNxdWUgdmVoaWN1bGEgbA==",
181
    "ciphertext":
182
        "74m8tH2wT2MCrtw3Qr5SUTqfOPGUGzIeRnqB8psPFu4eujcjm2VgLv+LuJubZbrdkg==",
183
    "importKeyParams": {},
1✔
184
    "encryptDecryptParams": {
1✔
185
      "counter": "/v7+/v7+/v7+/v7+/v7+/g==",
186
      "length": 2,
187
    },
188
  },
189
  {
1✔
190
    "name":
191
        "A128CTR/2 counter rollover, generated chrome/linux at 2020-01-21T22:17:15",
192
    "privateRawKeyData": "ge2ewKf9LqaW1SHZnYYKTA==",
193
    "privateJsonWebKeyData": {
1✔
194
      "kty": "oct",
195
      "alg": "A128CTR",
196
      "k": "ge2ewKf9LqaW1SHZnYYKTA",
197
    },
198
    "plaintext":
199
        "UHJhZXNlbnQgZmVybWVudHVtIGVyYXQgdml0YWUgbGlndWxhCnByZXRpdW0gaW1wZQ==",
200
    "ciphertext":
201
        "elVwRCpfN3QT3om7mtNMvBWkPZfgla606PRdlEl529D7W7WDYz486NRVGlUI6qfJ8A==",
202
    "importKeyParams": {},
1✔
203
    "encryptDecryptParams": {
1✔
204
      "counter": "/v7+/v7+/v7+/v7+/v7+/g==",
205
      "length": 2,
206
    },
207
  },
208
];
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc