twonly-app-dependencies/pointycastle/lib/key_derivators/pkcs5s1_parameter_generator.dart
2025-12-07 16:10:41 +01:00

75 lines
1.9 KiB
Dart

import 'dart:typed_data';
import 'package:pointycastle/api.dart';
import 'package:pointycastle/src/registry/registry.dart';
class PKCS5S1ParameterGenerator implements PBEParametersGenerator {
static final FactoryConfig factoryConfig = DynamicFactoryConfig.suffix(
PBEParametersGenerator,
'/PKCS5S1',
(_, final Match match) => () {
var mac = Digest(match.group(1)!);
return PKCS5S1ParameterGenerator(mac);
});
Digest digest;
PKCS5S1ParameterGenerator(this.digest);
late Uint8List password;
late Uint8List salt;
late int iterationCount;
@override
void init(Uint8List password, Uint8List salt, int iterationCount) {
this.password = password;
this.salt = salt;
this.iterationCount = iterationCount;
}
Uint8List generateDerivedKey() {
var digestBytes = Uint8List(digest.digestSize);
digest.update(password, 0, password.length);
digest.update(salt, 0, salt.length);
digest.doFinal(digestBytes, 0);
for (var i = 1; i < iterationCount; i++) {
digest.update(digestBytes, 0, digestBytes.length);
digest.doFinal(digestBytes, 0);
}
return digestBytes;
}
@override
KeyParameter generateDerivedParameters(int keySize) {
if (keySize > digest.digestSize) {
throw ArgumentError("Can't generate a derived key $keySize bytes long.");
}
var dKey = generateDerivedKey();
return KeyParameter(dKey);
}
@override
ParametersWithIV generateDerivedParametersWithIV(int keySize, int ivSize) {
keySize = keySize;
ivSize = ivSize;
if ((keySize + ivSize) > digest.digestSize) {
throw ArgumentError(
"Can't generate a derived key ${keySize + ivSize} bytes long.");
}
var dKey = generateDerivedKey();
return ParametersWithIV(KeyParameter(dKey), dKey);
}
@override
KeyParameter generateDerivedMacParameters(int keySize) {
return generateDerivedParameters(keySize);
}
}