mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-03 03:50:58 +00:00
feat(legacy): implement CoSi verification
This commit is contained in:
parent
b92c5c21f9
commit
f4425a3ac1
@ -856,3 +856,47 @@ void slip21_derive_path(Slip21Node *inout, const uint8_t *label,
|
|||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t *slip21_key(const Slip21Node *node) { return &node->data[32]; }
|
const uint8_t *slip21_key(const Slip21Node *node) { return &node->data[32]; }
|
||||||
|
|
||||||
|
bool cryptoCosiVerify(const ed25519_signature signature, const uint8_t *message,
|
||||||
|
const size_t message_len, const int threshold,
|
||||||
|
const ed25519_public_key *pubkeys,
|
||||||
|
const int pubkeys_count, const uint8_t sigmask)
|
||||||
|
|
||||||
|
{
|
||||||
|
if (sigmask == 0 || threshold < 1 || pubkeys_count < 1 || pubkeys_count > 8) {
|
||||||
|
// invalid parameters:
|
||||||
|
// - sigmask must specify at least one signer
|
||||||
|
// - at least one signature must be required
|
||||||
|
// - at least one pubkey must be provided
|
||||||
|
// - at most 8 pubkeys are supported (bit size of sigmask)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (sigmask >= (1 << pubkeys_count)) {
|
||||||
|
// sigmask indicates more signers than provided pubkeys
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ed25519_public_key selected_keys[8] = {0};
|
||||||
|
int N = 0;
|
||||||
|
for (int i = 0; i < pubkeys_count; i++) {
|
||||||
|
if (sigmask & (1 << i)) {
|
||||||
|
memcpy(selected_keys[N], pubkeys[i], sizeof(ed25519_public_key));
|
||||||
|
N++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (N < threshold) {
|
||||||
|
// not enough signatures
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ed25519_public_key pk_combined = {0};
|
||||||
|
int res = ed25519_cosi_combine_publickeys(pk_combined, selected_keys, N);
|
||||||
|
if (res != 0) {
|
||||||
|
// error combining public keys
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = ed25519_sign_open(message, message_len, pk_combined, signature);
|
||||||
|
return res == 0;
|
||||||
|
}
|
||||||
|
@ -93,6 +93,11 @@ int cryptoMultisigFingerprint(const MultisigRedeemScriptType *multisig,
|
|||||||
|
|
||||||
int cryptoIdentityFingerprint(const IdentityType *identity, uint8_t *hash);
|
int cryptoIdentityFingerprint(const IdentityType *identity, uint8_t *hash);
|
||||||
|
|
||||||
|
bool cryptoCosiVerify(const ed25519_signature signature, const uint8_t *message,
|
||||||
|
const size_t message_len, const int threshold,
|
||||||
|
const ed25519_public_key *pubkeys,
|
||||||
|
const int pubkeys_count, const uint8_t sigmask);
|
||||||
|
|
||||||
bool coin_path_check(const CoinInfo *coin, InputScriptType script_type,
|
bool coin_path_check(const CoinInfo *coin, InputScriptType script_type,
|
||||||
uint32_t address_n_count, const uint32_t *address_n,
|
uint32_t address_n_count, const uint32_t *address_n,
|
||||||
bool has_multisig, PathSchema unlock, bool full_check);
|
bool has_multisig, PathSchema unlock, bool full_check);
|
||||||
|
Loading…
Reference in New Issue
Block a user