mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-22 21:30:56 +00:00
crypto: add ECDH session key generation
This commit is contained in:
parent
36b9d80120
commit
63696dc474
@ -27,6 +27,7 @@
|
|||||||
#include "layout.h"
|
#include "layout.h"
|
||||||
#include "curves.h"
|
#include "curves.h"
|
||||||
#include "secp256k1.h"
|
#include "secp256k1.h"
|
||||||
|
#include "macros.h"
|
||||||
|
|
||||||
uint32_t ser_length(uint32_t len, uint8_t *out)
|
uint32_t ser_length(uint32_t len, uint8_t *out)
|
||||||
{
|
{
|
||||||
@ -100,6 +101,25 @@ int gpgMessageSign(const HDNode *node, const uint8_t *message, size_t message_le
|
|||||||
return hdnode_sign_digest(node, message, signature + 1, NULL);
|
return hdnode_sign_digest(node, message, signature + 1, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cryptoGetECDHSessionKey(const HDNode *node, const uint8_t *peer_public_key, uint8_t *session_key)
|
||||||
|
{
|
||||||
|
curve_point point;
|
||||||
|
const ecdsa_curve *curve = node->curve->params;
|
||||||
|
if (!ecdsa_read_pubkey(curve, peer_public_key, &point)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
bignum256 k;
|
||||||
|
bn_read_be(node->private_key, &k);
|
||||||
|
point_multiply(curve, &k, &point, &point);
|
||||||
|
MEMSET_BZERO(&k, sizeof(k));
|
||||||
|
|
||||||
|
session_key[0] = 0x04;
|
||||||
|
bn_write_be(&point.x, session_key + 1);
|
||||||
|
bn_write_be(&point.y, session_key + 33);
|
||||||
|
MEMSET_BZERO(&point, sizeof(point));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int cryptoMessageSign(const CoinType *coin, const HDNode *node, const uint8_t *message, size_t message_len, uint8_t *signature)
|
int cryptoMessageSign(const CoinType *coin, const HDNode *node, const uint8_t *message, size_t message_len, uint8_t *signature)
|
||||||
{
|
{
|
||||||
SHA256_CTX ctx;
|
SHA256_CTX ctx;
|
||||||
|
@ -37,6 +37,9 @@ int sshMessageSign(const HDNode *node, const uint8_t *message, size_t message_le
|
|||||||
|
|
||||||
int gpgMessageSign(const HDNode *node, const uint8_t *message, size_t message_len, uint8_t *signature);
|
int gpgMessageSign(const HDNode *node, const uint8_t *message, size_t message_len, uint8_t *signature);
|
||||||
|
|
||||||
|
int cryptoGetECDHSessionKey(const HDNode *node, const uint8_t *peer_public_key, uint8_t *session_key);
|
||||||
|
|
||||||
|
|
||||||
int cryptoMessageSign(const CoinType *coin, const HDNode *node, const uint8_t *message, size_t message_len, uint8_t *signature);
|
int cryptoMessageSign(const CoinType *coin, const HDNode *node, const uint8_t *message, size_t message_len, uint8_t *signature);
|
||||||
|
|
||||||
int cryptoMessageVerify(const CoinType *coin, const uint8_t *message, size_t message_len, const uint8_t *address_raw, const uint8_t *signature);
|
int cryptoMessageVerify(const CoinType *coin, const uint8_t *message, size_t message_len, const uint8_t *address_raw, const uint8_t *signature);
|
||||||
|
Loading…
Reference in New Issue
Block a user