import { Converter } from './converter'; import { ECKCDSA } from './ec-kcdsa'; import * as CryptoJS from 'crypto-js'; /** * Verify a signature for given message * * * Method: * ``` * * h1 = sha256(sha256(transactionHex)_keygen(sha256(transactionHex_privateKey)).publicKey) * == * sha256(sha256(transactionHex)_verify(v, h1, publickey)) = h2 * ``` * @see [[generateSignature]] * @param signature The signature to be verified * @param messageHex The message data in hexadecimal representation * @param publicKey The public key * @return _true_, if signature is valid, otherwise _false_ * @module crypto */ export const verifySignature = (signature: string, messageHex: string, publicKey: string): boolean => { // get bytes const signatureBytes = Converter.convertHexStringToByteArray(signature); const publicKeyBytes = Converter.convertHexStringToByteArray(publicKey); const v = signatureBytes.slice(0, 32); const h1 = signatureBytes.slice(32); const y = ECKCDSA.verify(v, h1, publicKeyBytes); const m = Converter.convertWordArrayToByteArray(CryptoJS.SHA256(CryptoJS.enc.Hex.parse(messageHex))); const m_y = m.concat(y); const h2 = Converter.convertWordArrayToByteArray(CryptoJS.SHA256(Converter.convertByteArrayToWordArray(m_y))); // Convert to hex const h1hex = Converter.convertByteArrayToHexString(h1); const h2hex = Converter.convertByteArrayToHexString(h2); // compare return h1hex === h2hex; };