/* * otp_pad.h — OTP pad state for n_signer (one pad per session). * * Bound at startup via otp_pad_bind(); accessed by the otp_encrypt / * otp_decrypt dispatcher verbs. See plans/otp_nostr_integration.md. */ #ifndef NSIGNER_OTP_PAD_H #define NSIGNER_OTP_PAD_H #include #include #ifdef __cplusplus extern "C" { #endif /* Version string stamped into ASCII-armored output. */ #define NSIGNER_OTP_VERSION "v0.0.2-otp" /* Returns 1 if a pad has been bound at startup, 0 otherwise. */ int otp_pad_is_bound(void); /* Return the bound pad's 64-char hex checksum, or NULL if unbound. */ const char *otp_pad_chksum(void); /* Return the bound pad's directory, or NULL if unbound. */ const char *otp_pad_dir(void); /* Current offset (bytes consumed) of the bound pad, or 0 if unbound. */ uint64_t otp_pad_current_offset(void); /* Total size in bytes of the bound pad, or 0 if unbound. */ uint64_t otp_pad_size(void); /* * Bind a pad at startup. Returns 0 on success, non-zero on error. * `pads_dir` is the directory containing .pad and .state. * `pad_spec` is a full 64-char chksum or a unique prefix. * `allow_blkback` non-zero skips the blkback guard (for qvm-block testing). */ int otp_pad_bind(const char *pads_dir, const char *pad_spec, int allow_blkback); /* Unbind and zeroize all pad state. Idempotent. */ void otp_pad_unbind(void); /* * Encrypt plaintext bytes with the bound pad. * * `encoding` is "ascii" (default) or "binary". * On success returns 0 and sets: * *out_payload — malloc'd, caller frees (NUL-terminated for ascii) * *out_payload_len — length of payload * *out_new_offset — pad offset after this encryption */ int otp_pad_encrypt(const unsigned char *plaintext, size_t pt_len, const char *encoding, char **out_payload, size_t *out_payload_len, uint64_t *out_new_offset); /* * Decrypt a ciphertext (ASCII armor or binary .otp blob) with the bound pad. * * `encoding` is "ascii", "binary", or NULL (auto-detect by magic bytes). * On success returns 0 and sets: * *out_plaintext — malloc'd, caller frees * *out_pt_len — length of plaintext */ int otp_pad_decrypt(const char *input, size_t input_len, const char *encoding, unsigned char **out_plaintext, size_t *out_pt_len); #ifdef __cplusplus } #endif #endif /* NSIGNER_OTP_PAD_H */