65 const uint8_t* peer_pubkey,
68 if (!privkey || !peer_pubkey || !shared_out) {
73 if (peer_pubkey[0] != 0x04) {
78 mbedtls_ecp_group grp;
83 mbedtls_ecp_group_init(&grp);
85 mbedtls_ecp_point_init(&Q);
86 mbedtls_ecp_point_init(&S);
92 ret = mbedtls_ecp_group_load(&grp, MBEDTLS_ECP_DP_SECP256R1);
98 ret = mbedtls_mpi_read_binary(&d, privkey, 32);
104 ret = mbedtls_mpi_read_binary(&
ECP_POINT_X(Q), peer_pubkey + 1, 32);
109 ret = mbedtls_mpi_read_binary(&
ECP_POINT_Y(Q), peer_pubkey + 33, 32);
120 ret = mbedtls_ecp_check_pubkey(&grp, &Q);
127 ret = mbedtls_ecp_mul(&grp, &S, &d, &Q,
hw_random, NULL);
133 ret = mbedtls_mpi_write_binary(&
ECP_POINT_X(S), shared_out, 32);
142 mbedtls_ecp_group_free(&grp);
143 mbedtls_mpi_free(&d);
144 mbedtls_ecp_point_free(&Q);
145 mbedtls_ecp_point_free(&S);
154 if (!privkey_out || !pubkey_out) {
158 mbedtls_ecp_group grp;
162 mbedtls_ecp_group_init(&grp);
163 mbedtls_mpi_init(&d);
164 mbedtls_ecp_point_init(&Q);
166 bool success =
false;
170 ret = mbedtls_ecp_group_load(&grp, MBEDTLS_ECP_DP_SECP256R1);
176 ret = mbedtls_ecp_gen_keypair(&grp, &d, &Q,
hw_random, NULL);
182 ret = mbedtls_mpi_write_binary(&d, privkey_out, 32);
188 pubkey_out[0] = 0x04;
189 ret = mbedtls_mpi_write_binary(&
ECP_POINT_X(Q), pubkey_out + 1, 32);
194 ret = mbedtls_mpi_write_binary(&
ECP_POINT_Y(Q), pubkey_out + 33, 32);
202 mbedtls_ecp_group_free(&grp);
203 mbedtls_mpi_free(&d);
204 mbedtls_ecp_point_free(&Q);
215 if (!privkey || !pubkey_out) {
219 mbedtls_ecp_group grp;
223 mbedtls_ecp_group_init(&grp);
224 mbedtls_mpi_init(&d);
225 mbedtls_ecp_point_init(&Q);
227 bool success =
false;
231 ret = mbedtls_ecp_group_load(&grp, MBEDTLS_ECP_DP_SECP256R1);
237 ret = mbedtls_mpi_read_binary(&d, privkey, 32);
243 ret = mbedtls_ecp_mul(&grp, &Q, &d, &grp.G,
hw_random, NULL);
249 pubkey_out[0] = 0x04;
250 ret = mbedtls_mpi_write_binary(&
ECP_POINT_X(Q), pubkey_out + 1, 32);
255 ret = mbedtls_mpi_write_binary(&
ECP_POINT_Y(Q), pubkey_out + 33, 32);
263 mbedtls_ecp_group_free(&grp);
264 mbedtls_mpi_free(&d);
265 mbedtls_ecp_point_free(&Q);
static int hw_random(void *ctx, unsigned char *buf, size_t len)
Hardware RNG callback used by MbedTLS.
bool ecdh_p256_compute_shared_secret(uint8_t *privkey, const uint8_t *peer_pubkey, uint8_t *shared_out)
Computes ECDH shared secret on P-256 using local private key and peer public key.