mirror of
https://github.com/logos-storage/nim-nitro.git
synced 2026-01-03 22:23:10 +00:00
49 lines
1.2 KiB
Nim
49 lines
1.2 KiB
Nim
import pkg/nimcrypto
|
|
import pkg/secp256k1
|
|
import pkg/stew/byteutils
|
|
import ./state
|
|
|
|
export toPublicKey
|
|
|
|
type
|
|
PrivateKey* = SkSecretKey
|
|
PublicKey* = SkPublicKey
|
|
Signature* = SkRecoverableSignature
|
|
|
|
proc rng(data: var openArray[byte]): bool =
|
|
randomBytes(data) == data.len
|
|
|
|
proc random*(_: type PrivateKey): PrivateKey =
|
|
PrivateKey.random(rng).get()
|
|
|
|
proc `$`*(key: PrivateKey): string =
|
|
key.toHex()
|
|
|
|
proc parse*(_: type PrivateKey, s: string): PrivateKey =
|
|
SkSecretKey.fromHex(s).tryGet()
|
|
|
|
proc sign(key: PrivateKey, data: openArray[byte]): Signature =
|
|
let hash = keccak256.digest(data).data
|
|
key.signRecoverable(SkMessage(hash))
|
|
|
|
proc signMessage(key: PrivateKey, message: openArray[byte]): Signature =
|
|
# https://eips.ethereum.org/EIPS/eip-191
|
|
var data: seq[byte]
|
|
data.add("\x19Ethereum Signed Message:\n".toBytes)
|
|
data.add(($message.len).toBytes)
|
|
data.add(message)
|
|
key.sign(data)
|
|
|
|
proc sign*(key: PrivateKey, state: State): Signature =
|
|
key.signMessage(hashState(state))
|
|
|
|
proc `$`*(signature: Signature): string =
|
|
var bytes = signature.toRaw()
|
|
bytes[64] += 27
|
|
bytes.toHex()
|
|
|
|
proc parse*(_: type Signature, s: string): Signature =
|
|
var bytes = array[65, byte].fromHex(s)
|
|
bytes[64] -= 27
|
|
SkRecoverableSignature.fromRaw(bytes).tryGet()
|