agree static method

Uint8List agree(
  1. List<int> privateKey,
  2. List<int> peerPublicKey
)

The 32-byte shared secret between privateKey and peerPublicKey.

Throws OpenSSLException for an all-zero result (small-order peer point), which OpenSSL rejects.

Implementation

static Uint8List agree(List<int> privateKey, List<int> peerPublicKey) =>
    using((arena) {
      final mine = rawPrivateKey(arena, algorithm, privateKey);
      final peer = rawPublicKey(arena, algorithm, peerPublicKey);
      final ctx = checkNotNull(
        ssl.EVP_PKEY_CTX_new(mine, nullptr),
        'EVP_PKEY_CTX_new',
      );
      arena.using(ctx, ssl.EVP_PKEY_CTX_free);
      checkOne(ssl.EVP_PKEY_derive_init(ctx), 'EVP_PKEY_derive_init');
      checkOne(
        ssl.EVP_PKEY_derive_set_peer(ctx, peer),
        'EVP_PKEY_derive_set_peer',
      );
      final len = arena<Size>()..value = keyLength;
      final out = secretBuffer(arena, keyLength);
      checkOne(ssl.EVP_PKEY_derive(ctx, out, len), 'EVP_PKEY_derive');
      return fromNative(out, len.value);
    });