blob: 84e24c75713039528bd148ac312110eaa677fa25 [file] [log] [blame] [edit]
// See file LICENSE for more information.
library api.key_derivators;
import 'dart:typed_data';
import 'package:pointycastle/api.dart';
import 'package:pointycastle/ecc/api.dart';
/// [CipherParameters] used by PBKDF2.
class Pbkdf2Parameters extends CipherParameters {
final Uint8List salt;
final int iterationCount;
final int desiredKeyLength;
Pbkdf2Parameters(this.salt, this.iterationCount, this.desiredKeyLength);
}
/// [CipherParameters] for the scrypt password based key derivation function.
class ScryptParameters implements CipherParameters {
final int N;
final int r;
final int p;
final int desiredKeyLength;
final Uint8List salt;
ScryptParameters(this.N, this.r, this.p, this.desiredKeyLength, this.salt);
}
/// Generates [CipherParameters] for HKDF key derivation function.
class HkdfParameters extends CipherParameters {
final Uint8List ikm; // the input keying material or seed
final int desiredKeyLength;
final Uint8List?
salt; // the salt to use, may be null for a salt for hashLen zeros
final Uint8List?
info; // the info to use, may be null for an info field of zero bytes
final bool skipExtract;
HkdfParameters._(this.ikm, this.desiredKeyLength,
[this.salt, this.info, this.skipExtract = false]);
factory HkdfParameters(ikm, desiredKeyLength,
[salt, info, skipExtract = false]) {
if (ikm == null) {
throw ArgumentError('IKM (input keying material) should not be null');
}
if (salt == null || salt.length == 0) {
salt = null;
}
return HkdfParameters._(
ikm, desiredKeyLength, salt, info ?? Uint8List(0), skipExtract);
}
}
/// The Argon2 parameters.
class Argon2Parameters extends CipherParameters {
static const int ARGON2_d = 0x00;
static const int ARGON2_i = 0x01;
static const int ARGON2_id = 0x02;
static const int ARGON2_VERSION_10 = 0x10;
static const int ARGON2_VERSION_13 = 0x13;
static const int DEFAULT_ITERATIONS = 3;
static const int DEFAULT_MEMORY_COST = 12;
static const int DEFAULT_LANES = 1;
static const int DEFAULT_TYPE = ARGON2_i;
static const int DEFAULT_VERSION = ARGON2_VERSION_13;
final int type;
final int desiredKeyLength;
final Uint8List _salt;
final Uint8List? _secret;
final Uint8List? _additional;
final int iterations;
final int memory;
final int lanes;
final int version;
Argon2Parameters(
this.type,
this._salt, {
required this.desiredKeyLength,
Uint8List? secret,
Uint8List? additional,
this.iterations = DEFAULT_ITERATIONS,
int? memoryPowerOf2,
int? memory,
this.lanes = DEFAULT_LANES,
this.version = DEFAULT_VERSION,
}) : memory = memoryPowerOf2 != null
? 1 << memoryPowerOf2
: (memory ?? (1 << DEFAULT_MEMORY_COST)),
_secret = secret,
_additional = additional;
Uint8List get salt => _salt;
Uint8List? get secret => _secret;
Uint8List? get additional => _additional;
void clear() {
_salt.clear();
_secret?.clear();
_additional?.clear();
}
@override
String toString() {
return 'Argon2Parameters{ type: $type, iterations: $iterations, memory: $memory, lanes: $lanes, version: $version }';
}
}
class ECDHKDFParameters extends CipherParameters {
final ECPrivateKey privateKey;
final ECPublicKey publicKey;
ECDHKDFParameters(this.privateKey, this.publicKey);
}