0

I've written this working NodeJS/Javascript function:

/*
 * Calculate the Symmetric Key from the Public and Secret keys from two
 * different key pairs.
 * 
 * Note: symmetric_key(publicA, secretB) == symmetric_key(publicB, secretA)
 */
function symmetric_key(pkey, skey) {
        const ephemeral = crypto.createECDH('secp256k1');
        ephemeral.setPublicKey(pkey);
        const centre = crypto.createECDH('secp256k1');
        centre.setPrivateKey(skey);
        return centre.computeSecret(ephemeral.getPublicKey());
}

I'm trying to understand how I can use the Rust secp256k1 library to do the same.

Looking at secp256k1::SecretKey's methods I cannot see a direct equivalent.

  • What is that library's version of computeSecret() called?
  • If it doesn't have an analogous method, how can I compute the required secret?
fadedbee
  • 42,671
  • 44
  • 178
  • 308

1 Answers1

0

Found it: ECDH SharedSecret

Struct secp256k1::ecdh::SharedSecret

pub struct SharedSecret(_);

Enables two parties to create a shared secret without revealing their own secrets.

Examples

let s = Secp256k1::new();
let (sk1, pk1) = s.generate_keypair(&mut rand::thread_rng());
let (sk2, pk2) = s.generate_keypair(&mut rand::thread_rng());
let sec1 = SharedSecret::new(&pk2, &sk1);
let sec2 = SharedSecret::new(&pk1, &sk2);
assert_eq!(sec1, sec2);
fadedbee
  • 42,671
  • 44
  • 178
  • 308
  • Note: While this serves the same function, the shared secrets calculated in Rust do match those from NodeJS. See: https://stackoverflow.com/questions/76755083/rust-ecdh-does-not-produce-the-same-shared-secret-as-nodejs-javascript-and-c-imp – fadedbee Jul 24 '23 at 14:43