| // See file LICENSE for more information. |
| |
| library impl.digest.keccak; |
| |
| 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 Keccak digest. |
| class KeccakDigest extends KeccakEngine { |
| static final RegExp _keccakREGEX = RegExp(r'^Keccak\/([0-9]+)$'); |
| |
| /// Intended for internal use. |
| static final FactoryConfig factoryConfig = DynamicFactoryConfig( |
| Digest, |
| _keccakREGEX, |
| (_, final Match match) => () { |
| var bitLength = int.parse(match.group(1)!); |
| return KeccakDigest(bitLength); |
| }); |
| |
| KeccakDigest([int bitLength = 288]) { |
| switch (bitLength) { |
| case 128: |
| case 224: |
| case 256: |
| case 288: |
| case 384: |
| case 512: |
| init(bitLength); |
| break; |
| default: |
| throw StateError( |
| 'invalid bitLength ($bitLength) for Keccak must only be 128,224,256,288,384,512'); |
| } |
| } |
| |
| @override |
| String get algorithmName => 'Keccak/$fixedOutputLength'; |
| |
| @override |
| int doFinal(Uint8List out, int outOff) { |
| squeeze(out, outOff, fixedOutputLength); |
| reset(); |
| return digestSize; |
| } |
| } |