Skip to content

Commit 1bf8831

Browse files
committed
Add openssl-ecdh-sample
1 parent acf7f1c commit 1bf8831

File tree

3 files changed

+228
-0
lines changed

3 files changed

+228
-0
lines changed

openssl-ecdh-sample/Cargo.lock

+163
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

openssl-ecdh-sample/Cargo.toml

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[package]
2+
name = "openssl-ecdh-sample"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
anyhow = "1.0.95"
8+
base64 = "0.22.1"
9+
openssl = "0.10.70"

openssl-ecdh-sample/src/main.rs

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
use base64::{prelude::BASE64_STANDARD_NO_PAD, Engine};
2+
use openssl::{
3+
derive::Deriver,
4+
pkey::{Id, PKey, Private, Public},
5+
};
6+
7+
struct State {
8+
private_key: PKey<Private>,
9+
public_key: PKey<Public>,
10+
}
11+
12+
fn generate_key() -> anyhow::Result<State> {
13+
let private_key = PKey::generate_x25519()?;
14+
let public_key = {
15+
let raw = private_key.raw_public_key()?;
16+
PKey::public_key_from_raw_bytes(&raw, Id::X25519)?
17+
};
18+
Ok(State {
19+
private_key,
20+
public_key,
21+
})
22+
}
23+
24+
fn key_exchange(state: &State, peer_public_key: &PKey<Public>) -> anyhow::Result<Vec<u8>> {
25+
let mut deriver = Deriver::new(&state.private_key)?;
26+
deriver.set_peer(peer_public_key)?;
27+
Ok(deriver.derive_to_vec()?)
28+
}
29+
30+
fn main() -> anyhow::Result<()> {
31+
let alice = generate_key()?;
32+
let bob = generate_key()?;
33+
34+
println!(
35+
"alice/public_key = {}",
36+
BASE64_STANDARD_NO_PAD.encode(alice.public_key.public_key_to_der()?)
37+
);
38+
println!(
39+
" bob/public_key = {}",
40+
BASE64_STANDARD_NO_PAD.encode(bob.public_key.public_key_to_der()?)
41+
);
42+
43+
let alice_secret = key_exchange(&alice, &bob.public_key)?;
44+
let bob_secret = key_exchange(&bob, &alice.public_key)?;
45+
46+
println!(
47+
"alice/shared_secret = {}",
48+
BASE64_STANDARD_NO_PAD.encode(alice_secret)
49+
);
50+
println!(
51+
" bob/shared_secret = {}",
52+
BASE64_STANDARD_NO_PAD.encode(bob_secret)
53+
);
54+
55+
Ok(())
56+
}

0 commit comments

Comments
 (0)