// Importa o cliente Dinamo HSM
const { hsm } = require("@dinamonetworks/hsm-dinamo");

// Define os parâmetros de conexão com o HSM
const options = {
host: "127.0.0.1",
authUsernamePassword: {
username: "master",
password: "12345678",
},
};

async function verifySignature() {
// Connecta ao HSM
const conn = await hsm.connect(options);

// Nome da chave
const keyName = "myKeyToVerifySignature";

// Cria uma nova chave
const key = await conn.blockchain.create(
keyName, // Nome da chave
hsm.enums.BLOCKCHAIN_KEYS.BITCOIN_MINI_KEY, // Tipo
true, // Se é exportável
true, // Se é temporária
hsm.enums.VERSION_OPTIONS.BIP32_TEST_NET // Versão
);

// Dados para serem aplicados a hash
const dataToHash = Buffer.from("Data to hash");
// Geração de hash com base nos dados
const hashedData = await conn.blockchain.hashData(
hsm.enums.BLOCKCHAIN_HASH_MODE.SHA256,
dataToHash
);

// Assina o hash
const signedHash = await conn.blockchain.sign(
hsm.enums.BLOCKCHAIN_SIG_TYPE.SIG_RAW_ECDSA, // Tipo da assinatura
hsm.enums.BLOCKCHAIN_HASH_MODE.KECCAK256, // Tipo do hash
hashedData, // Dados a serem assinados
keyName // Nome da chave
);

// Recupera a chave pública
const pubKeyRecovered = await conn.blockchain.pubKeyRecovery(
hsm.enums.BLOCKCHAIN_SIG_TYPE.SIG_RAW_ECDSA, // Tipo da assinatura
hsm.enums.BLOCKCHAIN_HASH_MODE.KECCAK256, // Modo do hash
hashedData, // Hash dos dados
signedHash // Assinatura
);

// Verifica a assinatura
const validSig = await conn.blockchain.verify(
hsm.enums.BLOCKCHAIN_SIG_TYPE.SIG_RAW_ECDSA, // Tipo da assinatura
hsm.enums.BLOCKCHAIN_HASH_MODE.KECCAK256, // Modo do hash
hashedData, // Hash dos dados
signedHash, // Assinatura
hsm.enums.BLOCKCHAIN_SIG_VERIFY_PUB_KEY_TYPE.SEC1_UNCOMP, // Tipo da chave pública
pubKeyRecovered // Chave pública
);

// Verifica se a assinatura é válida
if (validSig) {
console.log("Valid signature!");
} else {
console.log("Invalid signature!");
}

// Desconecta do HSM
await conn.disconnect();
}

// Execute a função verifySignature
verifySignature();