126 lines
3.3 KiB
Dart
126 lines
3.3 KiB
Dart
// 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);
|
|
}
|