logos-chat/src/chat/crypto.nim

36 lines
894 B
Nim
Raw Normal View History

2025-07-05 14:54:19 -07:00
import proto_types
2025-10-15 14:49:41 -07:00
import strformat
2025-07-16 16:17:22 -07:00
import crypto/ecdh
2025-07-05 14:54:19 -07:00
import std/[sysrand]
2025-07-16 16:17:22 -07:00
import results
2025-10-15 14:49:41 -07:00
import utils
2025-07-05 14:54:19 -07:00
2025-07-16 16:17:22 -07:00
export PublicKey, PrivateKey, bytes, createRandomKey, loadPrivateKeyFromBytes, loadPublicKeyFromBytes,
getPublicKey, Dh, Result, get_addr, `$`
2025-07-05 14:54:19 -07:00
proc encrypt_plain*[T: EncryptableTypes](frame: T): EncryptedPayload =
return EncryptedPayload(
plaintext: Plaintext(payload: encode(frame)),
)
proc decrypt_plain*[T: EncryptableTypes](ciphertext: Plaintext, t: typedesc[
T]): Result[T, string] =
let obj = decode(ciphertext.payload, T)
if obj.isErr:
return err("Protobuf decode failed: " & obj.error)
result = ok(obj.get())
2025-07-16 16:17:22 -07:00
proc generate_key*(): PrivateKey =
createRandomKey().get()
2025-07-05 14:54:19 -07:00
2025-10-15 16:13:06 -07:00
proc toHex*(key: PublicKey): string =
bytesToHex(key.bytes())
2025-10-15 14:49:41 -07:00
proc `$`*(key: PublicKey): string =
2025-10-15 16:13:06 -07:00
let byteStr = toHex(key)
fmt"{byteStr[0..3]}..{byteStr[^4 .. ^1]}"