| @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(''); |
| } |
| } |
| }); |
| } |