front-end for lightning-to-fiat exchange at https://lnurl-pay.me
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

38 lines
1.3 KiB

const receiverPublicKey = "02d38170b929dc26be2192071756edd5fb94c4e0cf1aec352ce4c8245e635d9bed";
import {hkdf} from "@noble/hashes/hkdf";
import {sha256} from "@noble/hashes/sha256";
import * as jscrypto from "jscrypto";
import * as secp from "@noble/secp256k1";
import { bech32 } from 'bech32';
let receiverPoint;
function getReceiverPoint() {
if (receiverPoint)
return receiverPoint;
receiverPoint = secp.Point.fromHex(receiverPublicKey);
return receiverPoint;
}
const noIV = jscrypto.Hex.parse("00000000000000000000000000000000");
export function ecEncrypt(plainText) {
const pub = getReceiverPoint();
const iv = noIV;
const ek = secp.utils.randomPrivateKey();
const epk = secp.Point.fromPrivateKey(ek);
const sharedSecret = secp.getSharedSecret(ek, pub);
const key = hkdf(sha256,new Uint8Array([...epk.toRawBytes(),...sharedSecret]));
const jskkey = new jscrypto.Word32Array(key);
const ed = jscrypto.AES.encrypt(jscrypto.Utf8.parse(plainText),
jskkey,{mode:jscrypto.mode.GCM, padding:jscrypto.pad.NoPadding, iv: noIV});
const at = jscrypto.mode.GCM.mac(jscrypto.AES,jskkey,noIV,null,ed.cipherText,16);
const ctbytes = new Uint8Array([...at.toUint8Array(),
...epk.toRawBytes(true),
...ed.cipherText.toUint8Array()]);
const bech = bech32.encode("",bech32.toWords(ctbytes), 1024);
return bech.slice(1,-6)
}