#include "privkey.h" #include "pubkey.h" #include "utils.h" #include #include #include #include bool pubkey_from_der(secp256k1_context *secpctx, const u8 *der, size_t len, struct pubkey *key) { if (len != PUBKEY_DER_LEN) return false; if (!secp256k1_ec_pubkey_parse(secpctx, &key->pubkey, memcheck(der, len), len)) return false; return true; } void pubkey_to_der(secp256k1_context *secpctx, u8 der[PUBKEY_DER_LEN], const struct pubkey *key) { size_t outlen = PUBKEY_DER_LEN; if (!secp256k1_ec_pubkey_serialize(secpctx, der, &outlen, &key->pubkey, SECP256K1_EC_COMPRESSED)) abort(); assert(outlen == PUBKEY_DER_LEN); } /* Pubkey from privkey */ bool pubkey_from_privkey(secp256k1_context *secpctx, const struct privkey *privkey, struct pubkey *key) { if (!secp256k1_ec_pubkey_create(secpctx, &key->pubkey, privkey->secret)) return false; return true; } bool pubkey_from_hexstr(secp256k1_context *secpctx, const char *derstr, size_t slen, struct pubkey *key) { size_t dlen; unsigned char der[PUBKEY_DER_LEN]; dlen = hex_data_size(slen); if (dlen != sizeof(der)) return false; if (!hex_decode(derstr, slen, der, dlen)) return false; return pubkey_from_der(secpctx, der, dlen, key); } char *pubkey_to_hexstr(const tal_t *ctx, secp256k1_context *secpctx, const struct pubkey *key) { unsigned char der[PUBKEY_DER_LEN]; pubkey_to_der(secpctx, der, key); return tal_hexstr(ctx, der, sizeof(der)); } bool pubkey_eq(const struct pubkey *a, const struct pubkey *b) { return structeq(&a->pubkey, &b->pubkey); }