diff --git a/src/hsm/cmd_bip_slip.c b/src/hsm/cmd_bip_slip.c index 86c7384..44363cf 100644 --- a/src/hsm/cmd_bip_slip.c +++ b/src/hsm/cmd_bip_slip.c @@ -24,6 +24,8 @@ const uint8_t *k1_seed = (const uint8_t *)"Bitcoin seed"; const uint8_t *p1_seed = (const uint8_t *)"Nist256p1 seed"; const uint8_t *sym_seed = (const uint8_t *)"Symmetric key seed"; +mbedtls_ecp_keypair hd_context = {0}; +uint8_t hd_keytype = 0; int node_derive_bip_child(const mbedtls_ecp_keypair *parent, const uint8_t cpar[32], const uint8_t *i, mbedtls_ecp_keypair *child, uint8_t cchild[32]) { uint8_t data[1+32+4], I[64], *iL = I, *iR = I + 32; @@ -261,5 +263,13 @@ int cmd_bip_slip() { } mbedtls_ecp_keypair_free(&ctx); } + else if (p1 == 0x10) { + uint8_t chain[32] = {0}, fgpt[4] = {0}, last_node[4] = {0}, nodes = 0; + int r = node_derive_path(apdu.data, apdu.nc, &hd_context, chain, fgpt, &nodes, last_node, &hd_keytype); + if (r != CCID_OK) { + mbedtls_ecp_keypair_free(&hd_context); + return SW_EXEC_ERROR(); + } + } return SW_OK(); } diff --git a/src/hsm/cmd_signature.c b/src/hsm/cmd_signature.c index 56d8d63..7a6d482 100644 --- a/src/hsm/cmd_signature.c +++ b/src/hsm/cmd_signature.c @@ -14,13 +14,16 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - +#include "sc_hsm.h" #include "crypto_utils.h" #include "sc_hsm.h" #include "asn1.h" #include "mbedtls/oid.h" #include "random.h" +extern mbedtls_ecp_keypair hd_context; +extern uint8_t hd_keytype; + //----- /* From OpenSC */ static const uint8_t hdr_md5[] = { @@ -281,6 +284,25 @@ int cmd_signature() { res_APDU_size = olen; mbedtls_ecdsa_free(&ctx); } + else if (p2 == ALGO_HD) { + size_t olen = 0; + uint8_t buf[MBEDTLS_ECDSA_MAX_LEN]; + if (hd_context.grp.id == MBEDTLS_ECP_DP_NONE) { + return SW_CONDITIONS_NOT_SATISFIED(); + } + if (hd_keytype != 0x1 && hd_keytype != 0x2) { + return SW_INCORRECT_PARAMS(); + } + md = MBEDTLS_MD_SHA256; + if (mbedtls_ecdsa_write_signature(&hd_context, md, apdu.data, apdu.nc, buf, MBEDTLS_ECDSA_MAX_LEN, + &olen, random_gen, NULL) != 0) { + mbedtls_ecdsa_free(&hd_context); + return SW_EXEC_ERROR(); + } + memcpy(res_APDU, buf, olen); + res_APDU_size = olen; + mbedtls_ecdsa_free(&hd_context); + } else { return SW_INCORRECT_P1P2(); } diff --git a/src/hsm/sc_hsm.h b/src/hsm/sc_hsm.h index 3211d4a..e80de37 100644 --- a/src/hsm/sc_hsm.h +++ b/src/hsm/sc_hsm.h @@ -58,6 +58,7 @@ extern const uint8_t sc_hsm_aid[]; #define ALGO_EC_DH 0x80 /* ECDH key derivation */ #define ALGO_EC_DH_AUTPUK 0x83 #define ALGO_EC_DH_XKEK 0x84 +#define ALGO_HD 0xA0 #define ALGO_WRAP 0x92 #define ALGO_UNWRAP 0x93