EDDSAPrivateKey constructor
EDDSAPrivateKey({
- required EDPoint generator,
- required List<
int> privateKey, - required EllipticCurveTypes type,
Implementation
factory EDDSAPrivateKey(
{required EDPoint generator,
required List<int> privateKey,
required EllipticCurveTypes type}) {
final int baselen = generator.curve.baselen;
if (privateKey.length != generator.curve.baselen &&
privateKey.length != generator.curve.baselen * 2) {
throw CryptoException(
'Incorrect size of private key, expected: $baselen or ${baselen * 2} bytes');
}
switch (type) {
case EllipticCurveTypes.ed25519:
case EllipticCurveTypes.ed25519Blake2b:
if (privateKey.length != generator.curve.baselen) {
throw CryptoException(
'Incorrect size of private key, expected: $baselen bytes');
}
final extendedKey = switch (type) {
EllipticCurveTypes.ed25519Blake2b =>
BLAKE2b().update(privateKey).digest(),
_ => SHA512().update(privateKey).digest()
};
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: privateKey,
publicKey: EDDSAPublicKey(generator, pubkey),
secret: secret,
extendedKey: extendedKey.sublist(baselen));
case EllipticCurveTypes.ed25519Kholaw:
final List<int> privateKeyPart = privateKey.sublist(0, baselen);
final List<int> extendedKey = privateKey.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 CryptoException("");
}
}