I’m having trouble to match the fireblocks header signature with the payload. I am getting false every time after the verification.
Code snippet:
const signature = req.headers['fireblocks-signature'];
const publicKey = process.env.FIREBLOCKS_WEBHOOK_API_PUBLIC_KEY;
const verifier = crypto.createVerify('RSA-SHA512');
const message = JSON.stringify(req.payload);
verifier.write(message);
verifier.end();
const isVerified = verifier.verify(publicKey, signature, 'base64');
console.log('Verified:', isVerified);
Request Headers:
{
"x-forwarded-for":"18.189.135.42,172.31.35.148",
"x-forwarded-proto":"https,http",
"x-forwarded-port":"443,80",
"x-amzn-trace-id":"Root=1-6628f19e-0438edd11aa78ee218ad3b58",
"accept":"application/json, text/plain, */*",
"content-type":"application/json",
"fireblocks-signature":"nRK8gT/psgK7bC2JysRdgu/abUcnfvW0H/AJNKpWUhPEKb0+1VnOpap6xturPA6JegUOj9X8ek3TwHanVcquzqGXQ+vijJLUbzDcssbOlHgbD7staxyfFZmqGFW7SLETGSYpAg+FghacHD61MG+mEekIKgOVJkodUUhKwWwVZXFXtllvl27NXg6RVAbi0n/i4OgUHGSwarTUBgJFzmf6J/55qolBR0JtH20eWEimVXkM7gXxIZXjxhKuzM23QlCPNTaS/GyZNQ39r/yQ135z0c7jkDJjc5/R7A9KtiUMB+H5/7fnst19deuqefuiJLI5OYfkYrevFPy+aSi7FbHRkg==",
"fireblocks-api-version":"1.4.0",
"user-agent":"axios/0.27.2",
"x-datadog-trace-id":"8295036793575788319",
"x-datadog-parent-id":"8295036793575788319",
"x-datadog-sampling-priority":"2",
"x-datadog-tags":"_dd.p.dm=-3",
"traceparent":"00-0000000000000000731de403c7e14f1f-731de403c7e14f1f-01",
"tracestate":"dd=t.dm:-3;s:2",
"content-length":"1370",
"forwarded":"proto=http;host=preprod.apigateway.wind.app;for=\"172.31.35.148:16720\"",
"x-forwarded-host":"preprod.apigateway.wind.app",
"host":"localhost:3050"
}
Request Payload:
{
"type":"TRANSACTION_STATUS_UPDATED",
"tenantId":"5aac0205-326a-42e2-8401-37c4c6d582f9",
"timestamp":"1713959325730",
"data":{
"id":"12de2b59-25bf-45be-8623-7f53b22b9ccc",
"createdAt":"1713959314853",
"lastUpdated":"1713959315025",
"assetId":"AMOY_POLYGON_TEST",
"source":{
"id":"",
"type":"UNKNOWN",
"name":"External",
"subType":""
},
"destination":{
"id":"5",
"type":"VAULT_ACCOUNT",
"name":"user#24",
"subType":""
},
"amount":"0.001",
"networkFee":"0.000031500000315",
"netAmount":"0.001",
"sourceAddress":"0x03ed8856459faC1e27a950dc2C95261757162CEf",
"destinationAddress":"0xC0B6c89Ae4A037d72DA702308B6E431e13F152E1",
"destinationAddressDescription":"",
"destinationTag":"",
"status":"COMPLETED",
"txHash":"0x96c4cb805af26d42c7dd5097ea4e88d0da060e47395614f5f0e372defb5ea331",
"subStatus":"CONFIRMED",
"signedBy":[
],
"createdBy":"",
"rejectedBy":"",
"amountUSD":0,
"addressType":"",
"note":"",
"exchangeTxId":"",
"requestedAmount":"0.001",
"feeCurrency":"AMOY_POLYGON_TEST",
"operation":"TRANSFER",
"customerRefId":null,
"numOfConfirmations":"1",
"amountInfo":{
"amount":"0.001",
"requestedAmount":"0.001",
"netAmount":"0.001",
"amountUSD":null
},
"feeInfo":{
"networkFee":"0.000031500000315",
"gasPrice":"1.500000015"
},
"destinations":[
],
"externalTxId":null,
"blockInfo":{
"blockHeight":"6243175",
"blockHash":"0x4173cff12fae18946280f3f4060bc1f54b7f5ba547779d5a1394c8429934fa41"
},
"signedMessages":[
],
"index":0,
"assetType":"BASE_ASSET"
}
}
Sandbox Public API key got from Fireblocks Documentation:
FIREBLOCKS_WEBHOOK_API_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0+6wd9OJQpK60ZI7qnZG\njjQ0wNFUHfRv85Tdyek8+ahlg1Ph8uhwl4N6DZw5LwLXhNjzAbQ8LGPxt36RUZl5\nYlxTru0jZNKx5lslR+H4i936A4pKBjgiMmSkVwXD9HcfKHTp70GQ812+J0Fvti/v\n4nrrUpc011Wo4F6omt1QcYsi4GTI5OsEbeKQ24BtUd6Z1Nm/EP7PfPxeb4CP8KOH\nclM8K7OwBUfWrip8Ptljjz9BNOZUF94iyjJ/BIzGJjyCntho64ehpUYP8UJykLVd\nCGcu7sVYWnknf1ZGLuqqZQt4qt7cUUhFGielssZP9N9x7wzaAIFcT3yQ+ELDu1SZ\ndE4lZsf2uMyfj58V8GDOLLE233+LRsRbJ083x+e2mW5BdAGtGgQBusFfnmv5Bxqd\nHgS55hsna5725/44tvxll261TgQvjGrTxwe7e5Ia3d2Syc+e89mXQaI/+cZnylNP\nSwCCvx8mOM847T0XkVRX3ZrwXtHIA25uKsPJzUtksDnAowB91j7RJkjXxJcz3Vh1\n4k182UFOTPRW9jzdWNSyWQGl/vpe9oQ4c2Ly15+/toBo4YXJeDdDnZ5c/O+KKadc\nIMPBpnPrH/0O97uMPuED+nI6ISGOTMLZo35xJ96gPBwyG5s2QxIkKPXIrhgcgUnk\ntSM7QYNhlftT4/yVvYnk0YcCAwEAAQ==\n-----END PUBLIC KEY-----"