75 lines
1.9 KiB
Dart
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);
|
|
}
|
|
}
|