Closed ezy closed 3 years ago
Solved with input from the fantastic Project Serum discord devs. High level solution is to use libs that are also used in the sol-wallet-adapter repo, namely tweetnacl
and bs58
:
const signatureUint8 = base58.decode(args.signature);
const nonceUint8 = new TextEncoder().encode(user?.nonce);
const pubKeyUint8 = base58.decode(user?.publicAddress);
nacl.sign.detached.verify(nonceUint8, signatureUint8, pubKeyUint8)
// true
For any devs who read this that might be implementing this sort of functionality, it may be preferable to use https://www.npmjs.com/package/elliptic as the uint8Array format introduced by tweetnacl
means that to send signatures via JSON requires encoding/decoding using the bs58 lib, when elliptic handles hex strings by default.
Having created a signed message I'm unsure how to use the resulting signature to verify the message using the publicKey.
My use case is: I'm wanting to use a Solana Wallet to login to an API server with a pattern like:
GET message: String (from API server)
sign message with privateKey
POST signature (to API server)
verify signature with stored publicKey
I've attempted to use
crypto.verify
to decode the signed message on the API side but am a bit out of my depth digging into Buffers and elliptic curves:I'm pretty sure I'm going about this the wrong way and there must be an obvious method I'm missing.
Ideally it seems like there should be a verify function to consume the output of
const signed = await wallet.sign(data, "hex");
Something like:
But after 3 days of pushing hard I'm starting to hit my limits and my brain is failing. Any help or direction where to look much appreciated 🙏