229 lines
6.7 KiB
Dart
229 lines
6.7 KiB
Dart
import 'dart:typed_data';
|
|
|
|
import 'package:pointycastle/block/aes.dart';
|
|
import 'package:pointycastle/pointycastle.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
import '../test/src/helpers.dart';
|
|
|
|
void main() {
|
|
group('AES Engine', () {
|
|
blockCipherTest(0, AESEngine(), kp('80000000000000000000000000000000'),
|
|
'00000000000000000000000000000000', '0EDD33D3C621E546455BD8BA1418BEC8');
|
|
|
|
blockCipherTest(1, AESEngine(), kp('00000000000000000000000000000080'),
|
|
'00000000000000000000000000000000', '172AEAB3D507678ECAF455C12587ADB7');
|
|
|
|
blockCipherMCTTest(
|
|
2,
|
|
10000,
|
|
AESEngine(),
|
|
kp('00000000000000000000000000000000'),
|
|
'00000000000000000000000000000000',
|
|
'C34C052CC0DA8D73451AFE5F03BE297F');
|
|
|
|
blockCipherMCTTest(
|
|
3,
|
|
10000,
|
|
AESEngine(),
|
|
kp('5F060D3716B345C253F6749ABAC10917'),
|
|
'355F697E8B868B65B25A04E18D782AFA',
|
|
'ACC863637868E3E068D2FD6E3508454A');
|
|
|
|
blockCipherTest(
|
|
4,
|
|
AESEngine(),
|
|
kp('000000000000000000000000000000000000000000000000'),
|
|
'80000000000000000000000000000000',
|
|
'6CD02513E8D4DC986B4AFE087A60BD0C');
|
|
|
|
blockCipherMCTTest(
|
|
5,
|
|
10000,
|
|
AESEngine(),
|
|
kp('AAFE47EE82411A2BF3F6752AE8D7831138F041560631B114'),
|
|
'F3F6752AE8D7831138F041560631B114',
|
|
'77BA00ED5412DFF27C8ED91F3C376172');
|
|
|
|
blockCipherTest(
|
|
6,
|
|
AESEngine(),
|
|
kp('0000000000000000000000000000000000000000000000000000000000000000'),
|
|
'80000000000000000000000000000000',
|
|
'DDC6BF790C15760D8D9AEB6F9A75FD4E');
|
|
|
|
blockCipherMCTTest(
|
|
7,
|
|
10000,
|
|
AESEngine(),
|
|
kp('28E79E2AFC5F7745FCCABE2F6257C2EF4C4EDFB37324814ED4137C288711A386'),
|
|
'C737317FE0846F132B23C8C2A672CE22',
|
|
'E58B82BFBA53C0040DC610C642121168');
|
|
|
|
blockCipherTest(8, AESEngine(), kp('80000000000000000000000000000000'),
|
|
'00000000000000000000000000000000', '0EDD33D3C621E546455BD8BA1418BEC8');
|
|
|
|
blockCipherTest(9, AESEngine(), kp('00000000000000000000000000000080'),
|
|
'00000000000000000000000000000000', '172AEAB3D507678ECAF455C12587ADB7');
|
|
|
|
blockCipherMCTTest(
|
|
10,
|
|
10000,
|
|
AESEngine(),
|
|
kp('00000000000000000000000000000000'),
|
|
'00000000000000000000000000000000',
|
|
'C34C052CC0DA8D73451AFE5F03BE297F');
|
|
|
|
blockCipherMCTTest(
|
|
11,
|
|
10000,
|
|
AESEngine(),
|
|
kp('5F060D3716B345C253F6749ABAC10917'),
|
|
'355F697E8B868B65B25A04E18D782AFA',
|
|
'ACC863637868E3E068D2FD6E3508454A');
|
|
|
|
blockCipherTest(
|
|
12,
|
|
AESEngine(),
|
|
kp('000000000000000000000000000000000000000000000000'),
|
|
'80000000000000000000000000000000',
|
|
'6CD02513E8D4DC986B4AFE087A60BD0C');
|
|
|
|
blockCipherMCTTest(
|
|
13,
|
|
10000,
|
|
AESEngine(),
|
|
kp('AAFE47EE82411A2BF3F6752AE8D7831138F041560631B114'),
|
|
'F3F6752AE8D7831138F041560631B114',
|
|
'77BA00ED5412DFF27C8ED91F3C376172');
|
|
|
|
blockCipherTest(
|
|
14,
|
|
AESEngine(),
|
|
kp('0000000000000000000000000000000000000000000000000000000000000000'),
|
|
'80000000000000000000000000000000',
|
|
'DDC6BF790C15760D8D9AEB6F9A75FD4E');
|
|
|
|
blockCipherMCTTest(
|
|
15,
|
|
10000,
|
|
AESEngine(),
|
|
kp('28E79E2AFC5F7745FCCABE2F6257C2EF4C4EDFB37324814ED4137C288711A386'),
|
|
'C737317FE0846F132B23C8C2A672CE22',
|
|
'E58B82BFBA53C0040DC610C642121168');
|
|
|
|
blockCipherTest(16, AESEngine(), kp('80000000000000000000000000000000'),
|
|
'00000000000000000000000000000000', '0EDD33D3C621E546455BD8BA1418BEC8');
|
|
|
|
blockCipherTest(17, AESEngine(), kp('00000000000000000000000000000080'),
|
|
'00000000000000000000000000000000', '172AEAB3D507678ECAF455C12587ADB7');
|
|
|
|
blockCipherMCTTest(
|
|
18,
|
|
10000,
|
|
AESEngine(),
|
|
kp('00000000000000000000000000000000'),
|
|
'00000000000000000000000000000000',
|
|
'C34C052CC0DA8D73451AFE5F03BE297F');
|
|
|
|
blockCipherMCTTest(
|
|
19,
|
|
10000,
|
|
AESEngine(),
|
|
kp('5F060D3716B345C253F6749ABAC10917'),
|
|
'355F697E8B868B65B25A04E18D782AFA',
|
|
'ACC863637868E3E068D2FD6E3508454A');
|
|
|
|
blockCipherTest(
|
|
20,
|
|
AESEngine(),
|
|
kp('000000000000000000000000000000000000000000000000'),
|
|
'80000000000000000000000000000000',
|
|
'6CD02513E8D4DC986B4AFE087A60BD0C');
|
|
|
|
blockCipherMCTTest(
|
|
21,
|
|
10000,
|
|
AESEngine(),
|
|
kp('AAFE47EE82411A2BF3F6752AE8D7831138F041560631B114'),
|
|
'F3F6752AE8D7831138F041560631B114',
|
|
'77BA00ED5412DFF27C8ED91F3C376172');
|
|
|
|
blockCipherTest(
|
|
22,
|
|
AESEngine(),
|
|
kp('0000000000000000000000000000000000000000000000000000000000000000'),
|
|
'80000000000000000000000000000000',
|
|
'DDC6BF790C15760D8D9AEB6F9A75FD4E');
|
|
|
|
blockCipherMCTTest(
|
|
23,
|
|
10000,
|
|
AESEngine(),
|
|
kp('28E79E2AFC5F7745FCCABE2F6257C2EF4C4EDFB37324814ED4137C288711A386'),
|
|
'C737317FE0846F132B23C8C2A672CE22',
|
|
'E58B82BFBA53C0040DC610C642121168');
|
|
});
|
|
}
|
|
|
|
KeyParameter kp(String src) {
|
|
return KeyParameter(createUint8ListFromHexString(src));
|
|
}
|
|
|
|
void blockCipherTest(int id, BlockCipher cipher, CipherParameters parameters,
|
|
String input, String output) {
|
|
test('AES BlockCipher Test: $id ', () {
|
|
var input0 = createUint8ListFromHexString(input);
|
|
var output0 = createUint8ListFromHexString(output);
|
|
|
|
cipher.init(true, parameters);
|
|
var out = Uint8List(input0.length);
|
|
var p = 0;
|
|
while (p < input0.length) {
|
|
p += cipher.processBlock(input0, p, out, p);
|
|
}
|
|
|
|
expect(output0, equals(out), reason: '$id did not match output');
|
|
|
|
cipher.init(false, parameters);
|
|
out = Uint8List(output0.length);
|
|
p = 0;
|
|
while (p < output0.length) {
|
|
p += cipher.processBlock(output0, p, out, p);
|
|
}
|
|
|
|
expect(input0, equals(out), reason: '$id did not match input');
|
|
});
|
|
}
|
|
|
|
void blockCipherMCTTest(int id, int iterations, BlockCipher cipher,
|
|
CipherParameters parameters, String input, String output) {
|
|
test('AES BlockCipher MCT Test: $id ', () {
|
|
var input0 = createUint8ListFromHexString(input);
|
|
var output0 = createUint8ListFromHexString(output);
|
|
|
|
cipher.init(true, parameters);
|
|
var out = Uint8List(input0.length);
|
|
out.setRange(0, out.length, input0);
|
|
|
|
for (var i = 0; i != iterations; i++) {
|
|
var p = 0;
|
|
while (p < out.length) {
|
|
p += cipher.processBlock(out, p, out, p);
|
|
}
|
|
}
|
|
|
|
expect(output0, equals(out), reason: '$id did not match output');
|
|
|
|
cipher.init(false, parameters);
|
|
|
|
for (var i = 0; i != iterations; i++) {
|
|
var p = 0;
|
|
while (p < out.length) {
|
|
p += cipher.processBlock(out, p, out, p);
|
|
}
|
|
}
|
|
|
|
expect(input0, equals(out), reason: '$id did not match input');
|
|
});
|
|
}
|