Skip to content

Instantly share code, notes, and snippets.

@Dolu89
Last active October 13, 2022 12:31
Show Gist options
  • Save Dolu89/fa52c0211591f69f280367cc18578f14 to your computer and use it in GitHub Desktop.
Save Dolu89/fa52c0211591f69f280367cc18578f14 to your computer and use it in GitHub Desktop.
Test LUD-13
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