EDDSAPrivateKey constructor

EDDSAPrivateKey({
  1. required EDPoint generator,
  2. required List<int> secretKey,
  3. 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.",
      );
  }
}