SECP256K1(3em)
secp256k1 π
okay so this is the secp256k1 manual page from section 3em, and it's literally the libsecp256k1 bindings for Emilua. Bestie, we are in cryptographic group-chat territory now. β¨
β¨ NAME β¨
secp256k1 β libsecp256k1 bindings for Emilua. That's the whole name vibe, no cap.
πΈ SYNOPSIS πΈ
local secp256k1 = require 'secp256k1'
π FUNCTIONS π
Every function below is exactly as listed. If a length or value is specified, it's mandatory β not a suggestion, bestie. π«Ά
new() β context
Constructor. Periodt.
clone(self) β context
Copy a context object. Lowkey straightforward.
randomize(self[, seed32: byte_span]) β integer
If provided, seed32 must have length=32.
ec_pubkey_parse(self, pubkey: byte_span, input: byte_span) β integer
pubkey must have length=64.
input must have length>0.
ec_pubkey_serialize(self, output: byte_span, pubkey: byte_span, format: "compressed"|"uncompressed") β integer, integer
output must have length=65 if format=uncompressed or length=33 if format=compressed.
pubkey must have length=64.
ec_pubkey_cmp(self, pubkey1: byte_span, pubkey2: byte_span) β integer
pubkey1 must have length=64.
pubkey2 must have length=64.
ecdsa_signature_parse_compact(self, sig: byte_span, input64: byte_span) β integer
sig must have length=64.
input64 must have length=64.
ecdsa_signature_parse_der(self, sig: byte_span, input: byte_span) β integer
sig must have length=64.
input must have length>0.
ecdsa_signature_serialize_der(self, output: byte_span, sig: byte_span) β integer, integer
output must have length>0.
sig must have length=64.
ecdsa_signature_serialize_compact(self, output64: byte_span, sig: byte_span) β integer
output64 must have length=64.
sig must have length=64.
ecdsa_verify(self, sig: byte_span, msghash32: byte_span, pubkey: byte_span) β integer
sig must have length=64.
msghash32 must have length=32.
pubkey must have length=64.
ecdsa_signature_normalize(self, sigout: byte_span|nil, sigin: byte_span) β integer
If provided, sigout must have length=64.
sigin must have length=64.
ecdsa_sign(self, sig: byte_span, msghash32: byte_span, seckey: byte_span, nonce: "rfc6979"|nil, ndata: byte_span|nil) β integer
sig must have length=64.
msghash32 must have length=32.
seckey must have length=32.
If provided, ndata must have a length that depends on nonce's value:
nonce = nilβndatalength =32nonce = "rfc6979"βndatalength =32
ec_seckey_verify(self, seckey: byte_span) β integer
seckey must have length=32.
ec_pubkey_create(self, pubkey: byte_span, seckey: byte_span) β integer
pubkey must have length=64.
seckey must have length=32.
ec_seckey_negate(self, seckey: byte_span) β integer
seckey must have length=32.
ec_pubkey_negate(self, pubkey: byte_span) β integer
pubkey must have length=64.
ec_seckey_tweak_add(self, seckey: byte_span, tweak32: byte_span) β integer
seckey must have length=32.
tweak32 must have length=32.
ec_pubkey_tweak_add(self, pubkey: byte_span, tweak32: byte_span) β integer
pubkey must have length=64.
tweak32 must have length=32.
ec_seckey_tweak_mul(self, seckey: byte_span, tweak32: byte_span) β integer
seckey must have length=32.
tweak32 must have length=32.
ec_pubkey_tweak_mul(self, pubkey: byte_span, tweak32: byte_span) β integer
pubkey must have length=64.
tweak32 must have length=32.
ec_pubkey_combine(self, out: byte_span, ins: byte_span[]) β integer
out must have length=64.
ins must contain at least 1 element. Each element must have length=64.
tagged_sha256(self, hash32: byte_span, tag: byte_span, msg: byte_span) β integer
hash32 must have length=32.
tag must have length>0.
msg must have length>0.
ecdh(self, output: byte_span, pubkey: byte_span, seckey: byte_span, hash: "sha256"|nil) β integer
output must have a length that depends on hash's value:
hash = nilβoutputlength =32hash = "sha256"βoutputlength =32
pubkey must have length=64.
seckey must have length=32.
ecdsa_recoverable_signature_parse_compact(self, sig: byte_span, input64: byte_span, recid: integer) β integer
sig must have length=65.
input64 must have length=64.
ecdsa_recoverable_signature_convert(self, sig: byte_span, sigin: byte_span) β integer
sig must have length=64.
sigin must have length=65.
ecdsa_recoverable_signature_serialize_compact(self, output64: byte_span, sig: byte_span) β integer, integer
output64 must have length=64.
sig must have length=65.
ecdsa_sign_recoverable(self, sig: byte_span, msghash32: byte_span, seckey: byte_span, nonce: "rfc6979"|nil, ndata: byte_span|nil) β integer
sig must have length=65.
msghash32 must have length=32.
seckey must have length=32.
If provided, ndata must have a length that depends on nonce's value:
nonce = nilβndatalength =32nonce = "rfc6979"βndatalength =32
ecdsa_recover(self, pubkey: byte_span, sig: byte_span, msghash32: byte_span) β integer
pubkey must have length=64.
sig must have length=65.
msghash32 must have length=32.
xonly_pubkey_parse(self, pubkey: byte_span, input32: byte_span) β integer
pubkey must have length=64.
input32 must have length=32.
xonly_pubkey_serialize(self, output32: byte_span, pubkey: byte_span) β integer
output32 must have length=32.
pubkey must have length=64.
xonly_pubkey_cmp(self, pk1: byte_span, pk2: byte_span) β integer
pk1 must have length=64.
pk2 must have length=64.
xonly_pubkey_from_pubkey(self, xonly_pubkey: byte_span, pubkey: byte_span) β integer, integer
xonly_pubkey must have length=64.
pubkey must have length=64.
xonly_pubkey_tweak_add(self, output_pubkey: byte_span, internal_pubkey: byte_span, tweak32: byte_span) β integer
output_pubkey must have length=64.
internal_pubkey must have length=64.
tweak32 must have length=32.
xonly_pubkey_tweak_add_check(self, tweaked_pubkey32: byte_span, tweaked_pk_parity: integer, internal_pubkey: byte_span, tweak32: byte_span) β integer
tweaked_pubkey32 must have length=32.
internal_pubkey must have length=64.
tweak32 must have length=32.
keypair_create(self, keypair: byte_span, seckey: byte_span) β integer
keypair must have length=96.
seckey must have length=32.
keypair_sec(self, seckey: byte_span, keypair: byte_span) β integer
seckey must have length=32.
keypair must have length=96.
keypair_pub(self, pubkey: byte_span, keypair: byte_span) β integer
pubkey must have length=64.
keypair must have length=96.
keypair_xonly_pub(self, pubkey: byte_span, keypair: byte_span) β integer, integer
pubkey must have length=64.
keypair must have length=96.
keypair_xonly_tweak_add(self, keypair: byte_span, tweak32: byte_span) β integer
keypair must have length=96.
tweak32 must have length=32.
schnorrsig_sign32(self, sig64: byte_span, msg32: byte_span, keypair: byte_span, aux_rand32: byte_span|nil) β integer
sig64 must have length=64.
msg32 must have length=32.
keypair must have length=96.
If provided, aux_rand32 must have length=32.
schnorrsig_sign_custom(self, sig64: byte_span, msg: byte_span|nil, keypair: byte_span, extraparams: { magic: byte_span|nil, nonce: "bip340"|nil, ndata: byte_span|nil }|nil) β integer
sig64 must have length=64.
keypair must have length=96.
extraparams.magic: byte_span = byte_span.append("\xDA\x6F\xB3\x8C")
If provided, magic must have length=4.
extraparams.nonce: "bip340"|nil β nonce generation function.
extraparams.ndata: byte_span|nil β if provided, ndata must have a length that depends on nonce's value:
nonce = nilβndatalength =32nonce = "bip340"βndatalength =32
schnorrsig_verify(self, sig64: byte_span, msg: byte_span|nil, pubkey: byte_span) β integer
sig64 must have length=64.
pubkey must have length=64.
ellswift_encode(self, ell64: byte_span, pubkey: byte_span, rnd32: byte_span) β integer
ell64 must have length=64.
pubkey must have length=64.
rnd32 must have length=32.
ellswift_decode(self, pubkey: byte_span, ell64: byte_span) β integer
pubkey must have length=64.
ell64 must have length=64.
ellswift_create(self, ell64: byte_span, seckey32: byte_span, auxrnd32: byte_span|nil) β integer
ell64 must have length=64.
seckey32 must have length=32.
If provided, auxrnd32 must have length=32.
ellswift_xdh(self, output: byte_span, ell_a64: byte_span, ell_b64: byte_span,
seckey32: byte_span, party: boolean, hash: "prefix"|"bip324",
data: byte_span|nil) β integer
okay bestie so this one is the ElligatorSwift β¨Diffie-Hellmanβ¨ moment β and it hands you back an integer π
πΈ the parameter glow-up checklist
outputβ the buffer where the shared secret lands. Its length is not a free-for-all, it depends on whathashyou passed π (see the lil table below).ell_a64β must havelength=64. no exceptions, she's measured πell_b64β must havelength=64too. twin energy πseckey32β must havelength=32. your secret key stays snatched ποΈpartyβ aboolean, telling the function which side of the handshake you are π«hashβ one of"prefix"or"bip324". pick your fighter βοΈdataβ abyte_spanornil, and its length also depends onhash. when the field is unused,datamust benilβ like, actually nil, not "nil-ish" π
π¦ output's length, by hash
"prefix"β32"bip324"β32
(both 32! cute, consistent, no notes π)
π data's length, by hash
"prefix"β64"bip324"β unused β sodatamust benil
β οΈ fr fr do not get cute with these lengths. Ifhashis"bip324"and you hand over a non-nildata, that's you ignoring the spec, not the spec ignoring you π
and that's the whole page, bestie!! π«Ά this lil beauty ships as part of Emilua 0.12.1, dated the extremely iconic 1980-01-01 β yes that date is real, yes it's a whole vibe βπ go forth and do your elliptic-curve thing πβ¨
π¦ where this page comes from
- nixos 26.05: emilua-secp256k1 0.5.1
- nixpkgs unstable: emilua-secp256k1 0.5.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms