@ckb-ccc/core
Version:
Core of CCC - CKBer's Codebase
34 lines (33 loc) • 1.1 kB
JavaScript
import { secp256k1 } from "@noble/curves/secp256k1";
import { ripemd160 } from "@noble/hashes/ripemd160";
import { sha256 } from "@noble/hashes/sha256";
import { magicHash } from "bitcoinjs-message";
import bs58check from "bs58check";
import { bytesConcat, bytesFrom } from "../../bytes/index.js";
import { hexFrom } from "../../hex/index.js";
/**
* @public
*/
export function btcEcdsaPublicKeyHash(publicKey) {
return ripemd160(sha256(bytesFrom(publicKey)));
}
/**
* @public
*/
export function btcP2pkhAddressFromPublicKey(publicKey, network) {
return bs58check.encode(bytesConcat([network], btcEcdsaPublicKeyHash(publicKey)));
}
/**
* @public
*/
export function btcPublicKeyFromP2pkhAddress(address) {
return hexFrom(bs58check.decode(address).slice(1));
}
/**
* @public
*/
export function verifyMessageBtcEcdsa(message, signature, publicKey) {
const challenge = typeof message === "string" ? message : hexFrom(message).slice(2);
const rawSign = bytesFrom(signature, "base64").slice(1);
return secp256k1.verify(bytesFrom(rawSign), magicHash(challenge), publicKey);
}