blob: e6c8773bab4fb47027f8630215a82fcbc9bd0397 [file] [log] [blame]
@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('');
}
}
});
}