Last active
October 13, 2022 12:31
-
-
Save Dolu89/fa52c0211591f69f280367cc18578f14 to your computer and use it in GitHub Desktop.
Test LUD-13
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const { mnemonicToSeed } = require("@scure/bip39"); | |
const ecc = require("tiny-secp256k1"); | |
const { BIP32Factory } = require("bip32"); | |
const bip32 = BIP32Factory(ecc); | |
const { HMAC, Hash } = require("fast-sha256"); | |
const secp256k1 = require("secp256k1"); | |
const lnurl = require("@zerologin/lnurl"); | |
const { CipherSeed } = require("aezeed"); | |
const axios = require("axios"); | |
const ZBase32 = require("@darkwolf/zbase32"); | |
const stringToUint8Array = (str) => { | |
return Uint8Array.from(str, (x) => x.charCodeAt(0)); | |
}; | |
const seedFromWords = async (mnemonic) => { | |
const seed = await mnemonicToSeed(mnemonic); | |
return Buffer.from(seed); | |
}; | |
const hexToUint8Array = (hexString) => { | |
return new Uint8Array( | |
hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)) | |
); | |
}; | |
const bytesToHexString = (bytes) => { | |
return bytes.reduce(function (memo, i) { | |
return memo + ("0" + i.toString(16)).slice(-2); //padd with leading 0 if <16 | |
}, ""); | |
}; | |
const sha256Hash = (buff) => { | |
return new Hash().update(buff).digest(); | |
}; | |
const SIGN_PREFIX = "Lightning Signed Message:"; | |
const CANONICAL_MESSAGE = | |
"DO NOT EVER SIGN THIS TEXT WITH YOUR PRIVATE KEYS! IT IS ONLY USED FOR DERIVATION OF LNURL-AUTH HASHING-KEY, DISCLOSING ITS SIGNATURE WILL COMPROMISE YOUR LNURL-AUTH IDENTITY AND MAY LEAD TO LOSS OF FUNDS!"; | |
const go2 = async () => { | |
const lnurlObject = lnurl.decode( | |
"LNURL1DP68GURN8GHJ7MR0VA5KUTNYDAK82TNYV4MZ7CTSDYHHVVF0D3H82UNV8A6XZEEAD3HKW6TWYE4NZ0FSXQCK2D3HXSCRGDP5VYMN2WPK8P3KZEFKXUMRYD3HXUEN2EFHV3JNSVRPXVEXGCNYXY6NXWP4X56NZWPEVYMRGEFHX93RGCTZXE3XZFNSW43XC6TRF9JR6EP48Y6KZCTYX5KNGDFEXVKNGCFNXCKNJWPSV5KNGVN9XPJNSCF5XSMKXVG30RYSY" | |
); | |
const domain = lnurlObject.domain; | |
const k1 = lnurlObject.k1; | |
const lnurlDecoded = lnurlObject.decoded; | |
const mnemonic3 = | |
"my 24 words from blixt"; | |
const cipherSeed1 = CipherSeed.fromMnemonic(mnemonic3); | |
const root = bip32.fromSeed(cipherSeed1.entropy); | |
let digest = sha256Hash([ | |
...Buffer.from(SIGN_PREFIX), | |
...Buffer.from(CANONICAL_MESSAGE), | |
]); | |
digest = sha256Hash(digest); | |
const signatureBuffer = root.sign(digest); | |
const signature = ZBase32.encode(signatureBuffer); | |
console.log({ signature: Buffer.from(signature) }); | |
// HERE, SIGNATURE RESULT IS NOT THE SAME AS MY BLIXT WALLET SIGNATURE USING THE SAME SEED | |
const hashingKey2 = sha256Hash(signature); | |
// 4. SERVICE domain name is extracted from auth LNURL and then service-specific linkingPrivKey is defined as PrivateKey(hmacSha256(hashingKey, service domain name)). | |
const linkingKeyPriv = new HMAC(hashingKey2) | |
.update(stringToUint8Array(domain)) | |
.digest(); | |
// Obtain the public key | |
const linkingKeyPub = secp256k1.publicKeyCreate(linkingKeyPriv, true); | |
// Sign the message | |
const signedMessage = secp256k1.ecdsaSign( | |
hexToUint8Array(k1), | |
linkingKeyPriv | |
); | |
const signedMessageDER = secp256k1.signatureExport(signedMessage.signature); | |
const url = | |
lnurlDecoded + | |
`&sig=${bytesToHexString(signedMessageDER)}` + | |
`&key=${bytesToHexString(linkingKeyPub)}`; | |
const result = await axios.get(url); | |
console.log(result.data); | |
}; | |
go2(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment