- Add VariableSpec class with magnitude field validation - Add Formula class supporting multiple input/output variables - Support d4rt_code as string or object with code field - Add comprehensive tests for parsing and serialization - Fix broken test import in pruebas_d4rt_test.dart Follows README.md format requirements exactly
104 lines
3.4 KiB
Dart
104 lines
3.4 KiB
Dart
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
// ignore_for_file: lines_longer_than_80_chars
|
|
|
|
import 'dart:async';
|
|
import 'dart:convert';
|
|
|
|
import 'package:crypto/crypto.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
void main() {
|
|
group('SHA2-384', () {
|
|
group('with a chunked converter', () {
|
|
test('add may not be called after close', () {
|
|
var sink =
|
|
sha384.startChunkedConversion(StreamController<Digest>().sink);
|
|
sink.close();
|
|
expect(() => sink.add([0]), throwsStateError);
|
|
});
|
|
|
|
test('close may be called multiple times', () {
|
|
var sink =
|
|
sha384.startChunkedConversion(StreamController<Digest>().sink);
|
|
sink.close();
|
|
sink.close();
|
|
sink.close();
|
|
sink.close();
|
|
});
|
|
|
|
test('close closes the underlying sink', () {
|
|
var inner = ChunkedConversionSink<Digest>.withCallback(
|
|
expectAsync1((accumulated) {
|
|
expect(accumulated.length, equals(1));
|
|
expect(
|
|
accumulated.first.toString(),
|
|
equals(
|
|
'38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b'),
|
|
);
|
|
}));
|
|
|
|
var outer = sha384.startChunkedConversion(inner);
|
|
outer.close();
|
|
});
|
|
});
|
|
});
|
|
|
|
group('SHA2-512', () {
|
|
group('with a chunked converter', () {
|
|
test('add may not be called after close', () {
|
|
var sink =
|
|
sha512.startChunkedConversion(StreamController<Digest>().sink);
|
|
sink.close();
|
|
expect(() => sink.add([0]), throwsStateError);
|
|
});
|
|
|
|
test('close may be called multiple times', () {
|
|
var sink =
|
|
sha512.startChunkedConversion(StreamController<Digest>().sink);
|
|
sink.close();
|
|
sink.close();
|
|
sink.close();
|
|
sink.close();
|
|
});
|
|
|
|
test('close closes the underlying sink', () {
|
|
var inner = ChunkedConversionSink<Digest>.withCallback(
|
|
expectAsync1((accumulated) {
|
|
expect(accumulated.length, equals(1));
|
|
expect(
|
|
accumulated.first.toString(),
|
|
equals(
|
|
'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e'));
|
|
}));
|
|
|
|
var outer = sha512.startChunkedConversion(inner);
|
|
outer.close();
|
|
});
|
|
});
|
|
|
|
test('128 bit padding', () {
|
|
final salts = [
|
|
'AAAA{3FXhiiyc5gGWlRrVQ2RlJ.6xj.DKvf6l0bJxqh0BzA}'.codeUnits,
|
|
'AAAA{3FXhiiyc5gGWlRrVQ.2RlJ6xj.DKvf6l0bJxqh0BzA}'.codeUnits,
|
|
'AAAA{rFXhiiyc5gGWlVQ.2RlJ6xj.DKvf6lFXhiiyc5gGWl0}'.codeUnits,
|
|
];
|
|
|
|
const results = [
|
|
'nYg7eEsF/P7/l1AO0w8JFNNomS1gC76VE7Eg7Dpet+Dh6XiScDntYEU4tVItXp67evaLFvtMpW2uVJBZVKrBPw==',
|
|
'TXNM4uk1Iwr2cYisWSdFifXdjfNiJTGEmNaMtqYrwJoS3JXpL1rebPKPfKudbFQGpcgJkLLhhpfnLzULBqq8KA==',
|
|
'ckPYMDuPJjc73qHXQZiJgCskNG8mj9cPqFNsqYqxcBbQESgkWChoibAN7ssJrnoMFIpz9HwsBwMtt3z/KDUh9w==',
|
|
];
|
|
|
|
for (var i = 0; i < salts.length; i++) {
|
|
var digest = <int>[];
|
|
for (var run = 0; run < 2000; run++) {
|
|
digest = sha512.convert([...digest, ...salts[i]]).bytes;
|
|
}
|
|
expect(base64.encode(digest), results[i]);
|
|
}
|
|
});
|
|
});
|
|
}
|