EDDSAPrivateKey constructor

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