50 lines
1.3 KiB
Dart
50 lines
1.3 KiB
Dart
// This file has been migrated.
|
|
|
|
library impl.digest.sha3;
|
|
|
|
import 'dart:typed_data';
|
|
|
|
import 'package:pointycastle/api.dart';
|
|
import 'package:pointycastle/src/impl/keccak_engine.dart';
|
|
import 'package:pointycastle/src/registry/registry.dart';
|
|
|
|
/// Implementation of SHA3 digest.
|
|
/// https://csrc.nist.gov/publications/detail/fips/202/final
|
|
class SHA3Digest extends KeccakEngine {
|
|
static final RegExp _sha3REGEX = RegExp(r'^SHA3-([0-9]+)$');
|
|
|
|
/// Intended for internal use.
|
|
static final FactoryConfig factoryConfig = DynamicFactoryConfig(
|
|
Digest,
|
|
_sha3REGEX,
|
|
(_, final Match match) => () {
|
|
var bitLength = int.parse(match.group(1)!);
|
|
return SHA3Digest(bitLength);
|
|
});
|
|
|
|
SHA3Digest([int? bitLength = 288]) {
|
|
switch (bitLength) {
|
|
case 224:
|
|
case 256:
|
|
case 384:
|
|
case 512:
|
|
init(bitLength!);
|
|
break;
|
|
default:
|
|
throw StateError(
|
|
'invalid bitLength ($bitLength) for SHA-3 must only be 224,256,384,512');
|
|
}
|
|
}
|
|
|
|
@override
|
|
String get algorithmName => 'SHA3-$fixedOutputLength';
|
|
|
|
@override
|
|
int doFinal(Uint8List out, int outOff) {
|
|
// FIPS 202 SHA3 https://github.com/PointyCastle/pointycastle/issues/128
|
|
absorbBits(0x02, 2);
|
|
squeeze(out, outOff, fixedOutputLength);
|
|
reset();
|
|
return digestSize;
|
|
}
|
|
}
|