90 lines
3 KiB
Dart
90 lines
3 KiB
Dart
@TestOn('vm')
|
|
library test.stream.chacha20poly1305_test;
|
|
|
|
import 'dart:typed_data';
|
|
|
|
import 'package:pointycastle/macs/poly1305.dart';
|
|
import 'package:pointycastle/pointycastle.dart';
|
|
import 'package:pointycastle/src/utils.dart';
|
|
import 'package:pointycastle/stream/chacha20poly1305.dart';
|
|
import 'package:pointycastle/stream/chacha7539.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
import '../test/src/helpers.dart';
|
|
|
|
int i = 0;
|
|
|
|
void main() {
|
|
//Test from BC
|
|
var K = createUint8ListFromHexString(
|
|
'808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f');
|
|
var P = createUint8ListFromHexString(
|
|
'4c616469657320616e642047656e746c656d656e206f66207468652063'
|
|
'6c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6'
|
|
'c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20'
|
|
'776f756c642062652069742e');
|
|
var A = createUint8ListFromHexString('50515253c0c1c2c3c4c5c6c7');
|
|
var N = createUint8ListFromHexString('070000004041424344454647');
|
|
var C = createUint8ListFromHexString(
|
|
'd31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a73'
|
|
'6ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692'
|
|
'ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4'
|
|
'b7a9de576d26586cec64b6116');
|
|
var T = createUint8ListFromHexString('1ae10b594f09e26a7e902ecbd0600691');
|
|
runTest(K, P, A, N, C, T);
|
|
}
|
|
|
|
void runTest(Uint8List K, Uint8List P, Uint8List A, Uint8List N, Uint8List C,
|
|
Uint8List T) {
|
|
test('ChaChaPoly1305 Test #${++i}', () {
|
|
var parameters = AEADParameters(KeyParameter(K), T.length * 8, N, A);
|
|
var chaChaEngine = ChaCha20Poly1305(ChaCha7539Engine(), Poly1305())
|
|
..init(true, parameters);
|
|
var chaChaEngineDecrypt = ChaCha20Poly1305(ChaCha7539Engine(), Poly1305())
|
|
..init(false, parameters);
|
|
var enc = Uint8List(chaChaEngine.getOutputSize(P.length));
|
|
var len = chaChaEngine.processBytes(P, 0, P.length, enc, 0);
|
|
len += chaChaEngine.doFinal(enc, len);
|
|
if (enc.length != len) {
|
|
throw StateError('');
|
|
}
|
|
|
|
var mac = chaChaEngine.mac;
|
|
var data = Uint8List(P.length);
|
|
arrayCopy(enc, 0, data, 0, data.length);
|
|
var tail = Uint8List(enc.length - P.length);
|
|
arrayCopy(enc, P.length, tail, 0, tail.length);
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
|
if (data[i] != C[i]) {
|
|
throw StateError('');
|
|
}
|
|
}
|
|
|
|
for (var i = 0; i < mac.length; i++) {
|
|
if (T[i] != mac[i]) {
|
|
throw StateError('');
|
|
}
|
|
}
|
|
|
|
for (var i = 0; i < tail.length; i++) {
|
|
if (T[i] != tail[i]) {
|
|
throw StateError('');
|
|
}
|
|
}
|
|
|
|
var dec = Uint8List(chaChaEngineDecrypt.getOutputSize(enc.length));
|
|
len = chaChaEngineDecrypt.processBytes(enc, 0, enc.length, dec, 0);
|
|
len += chaChaEngineDecrypt.doFinal(dec, len);
|
|
mac = chaChaEngineDecrypt.mac;
|
|
|
|
data = Uint8List(C.length);
|
|
arrayCopy(dec, 0, data, 0, data.length);
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
|
if (P[i] != data[i]) {
|
|
throw StateError('');
|
|
}
|
|
}
|
|
});
|
|
}
|