EDDSAPrivateKey constructor
EDDSAPrivateKey({
- required EDPoint generator,
- required List<
int> secretKey, - required EllipticCurveTypes type,
Implementation
factory EDDSAPrivateKey({
required EDPoint generator,
required List<int> secretKey,
required EllipticCurveTypes type,
}) {
final int baselen = generator.curve.baselen;
if (secretKey.length != generator.curve.baselen &&
secretKey.length != generator.curve.baselen * 2) {
throw ArgumentException.invalidOperationArguments(
"EDDSAPrivateKey",
name: "secretKey",
reason: "Invalid secret key bytes length.",
);
}
switch (type) {
case EllipticCurveTypes.ed25519:
case EllipticCurveTypes.ed25519Blake2b:
if (secretKey.length != generator.curve.baselen) {
throw ArgumentException.invalidOperationArguments(
"EDDSAPrivateKey",
name: "secretKey",
reason: "Invalid secret key bytes length.",
);
}
final extendedKey = switch (type) {
EllipticCurveTypes.ed25519Blake2b => BLAKE2b.hash(secretKey),
_ => SHA512.hash(secretKey),
};
final keyBytes = extendedKey.sublist(0, baselen);
final prunedKey = _keyPrune(keyBytes, generator);
final pubkey = Ed25519Utils.scalarMultBase(prunedKey);
final secret = BigintUtils.fromBytes(
prunedKey,
byteOrder: Endian.little,
);
return EDDSAPrivateKey._(
generator: generator,
privateKey: secretKey,
publicKey: EDDSAPublicKey(generator, pubkey),
secret: secret,
extendedKey: extendedKey.sublist(baselen),
);
case EllipticCurveTypes.ed25519Kholaw:
final List<int> privateKeyPart = secretKey.sublist(0, baselen);
final List<int> extendedKey = secretKey.sublist(baselen);
final pubkey = Ed25519Utils.scalarMultBase(privateKeyPart);
final secret = BigintUtils.fromBytes(
privateKeyPart,
byteOrder: Endian.little,
);
return EDDSAPrivateKey._(
generator: generator,
privateKey: privateKeyPart,
publicKey: EDDSAPublicKey(generator, pubkey),
secret: secret,
extendedKey: extendedKey,
);
default:
throw ArgumentException.invalidOperationArguments(
"EDDSAPrivateKey",
reason: "Unsupported secret key algorithm.",
);
}
}