200 lines
8.9 KiB
C
200 lines
8.9 KiB
C
#ifndef NSIGNER_CLIENT_H
|
|
#define NSIGNER_CLIENT_H
|
|
|
|
#include "../resources/nostr_core_lib/cjson/cJSON.h"
|
|
#include "nsigner_auth.h"
|
|
|
|
/* Selector for key derivation/role in n_signer requests. */
|
|
typedef struct {
|
|
int has_nostr_index;
|
|
int nostr_index;
|
|
char role[64];
|
|
} nt_nsigner_selector_t;
|
|
|
|
static inline nt_nsigner_selector_t nsigner_selector_default(void) {
|
|
nt_nsigner_selector_t s;
|
|
s.has_nostr_index = 1;
|
|
s.nostr_index = 0;
|
|
s.role[0] = '\0';
|
|
return s;
|
|
}
|
|
|
|
/* Error codes */
|
|
#define NT_NSIGNER_OK 0
|
|
#define NT_NSIGNER_E_IO -1
|
|
#define NT_NSIGNER_E_DENIED -2
|
|
#define NT_NSIGNER_E_UNAUTH -3
|
|
#define NT_NSIGNER_E_PARSE -4
|
|
#define NT_NSIGNER_E_ERROR -5
|
|
#define NT_NSIGNER_E_AUTH -6
|
|
|
|
/*
|
|
* Enumerate running nsigner instances by reading /proc/net/unix.
|
|
* Returns 0 on success. Caller must free each name and the array.
|
|
* Names are returned WITHOUT the leading '@'.
|
|
*/
|
|
int nsigner_list(char ***names_out, int *count_out);
|
|
|
|
/*
|
|
* Connect to an nsigner abstract namespace socket.
|
|
* Returns file descriptor >= 0 on success, -1 on failure.
|
|
* The name should NOT include the leading '@'.
|
|
*/
|
|
int nsigner_connect(const char *name);
|
|
|
|
/*
|
|
* Send a JSON-RPC request and receive the response.
|
|
* Uses 4-byte big-endian length-prefixed framing.
|
|
* read_timeout_ms: timeout for reading response (use 60000 for prompt-requiring methods).
|
|
* Returns NT_NSIGNER_OK on success with response in *response_out (caller must cJSON_Delete).
|
|
* On error returns one of the NT_NSIGNER_E_* codes.
|
|
*/
|
|
int nsigner_rpc(int fd, const cJSON *request, cJSON **response_out, int read_timeout_ms);
|
|
|
|
/*
|
|
* High-level helpers (each opens a connection, sends RPC, closes).
|
|
* socket_name: without '@' prefix.
|
|
* role: the role selector string (e.g. "main").
|
|
*/
|
|
int nsigner_get_public_key(const char *socket_name, const nt_nsigner_selector_t *selector, char *out_hex_65);
|
|
|
|
int nsigner_sign_event(const char *socket_name, const nt_nsigner_selector_t *selector,
|
|
const char *unsigned_event_json, char **signed_event_json_out);
|
|
|
|
int nsigner_nip04_encrypt(const char *socket_name, const nt_nsigner_selector_t *selector,
|
|
const char *peer_pub_hex, const char *plaintext, char **cipher_out);
|
|
|
|
int nsigner_nip04_decrypt(const char *socket_name, const nt_nsigner_selector_t *selector,
|
|
const char *peer_pub_hex, const char *ciphertext, char **plain_out);
|
|
|
|
int nsigner_nip44_encrypt(const char *socket_name, const nt_nsigner_selector_t *selector,
|
|
const char *peer_pub_hex, const char *plaintext, char **cipher_out);
|
|
|
|
int nsigner_nip44_decrypt(const char *socket_name, const nt_nsigner_selector_t *selector,
|
|
const char *peer_pub_hex, const char *ciphertext, char **plain_out);
|
|
|
|
/*
|
|
* URL helpers for FIPS/TCP transport.
|
|
* URL format: http://host:port (path/query ignored if present).
|
|
*/
|
|
int nsigner_get_public_key_url(const char *url, const nt_nsigner_selector_t *selector,
|
|
const nt_nsigner_auth_ctx_t *auth, char *out_hex_65);
|
|
|
|
int nsigner_sign_event_url(const char *url, const nt_nsigner_selector_t *selector,
|
|
const nt_nsigner_auth_ctx_t *auth,
|
|
const char *unsigned_event_json, char **signed_event_json_out);
|
|
|
|
int nsigner_nip04_encrypt_url(const char *url, const nt_nsigner_selector_t *selector,
|
|
const nt_nsigner_auth_ctx_t *auth,
|
|
const char *peer_pub_hex, const char *plaintext, char **cipher_out);
|
|
|
|
int nsigner_nip04_decrypt_url(const char *url, const nt_nsigner_selector_t *selector,
|
|
const nt_nsigner_auth_ctx_t *auth,
|
|
const char *peer_pub_hex, const char *ciphertext, char **plain_out);
|
|
|
|
int nsigner_nip44_encrypt_url(const char *url, const nt_nsigner_selector_t *selector,
|
|
const nt_nsigner_auth_ctx_t *auth,
|
|
const char *peer_pub_hex, const char *plaintext, char **cipher_out);
|
|
|
|
int nsigner_nip44_decrypt_url(const char *url, const nt_nsigner_selector_t *selector,
|
|
const nt_nsigner_auth_ctx_t *auth,
|
|
const char *peer_pub_hex, const char *ciphertext, char **plain_out);
|
|
|
|
/*
|
|
* Persistent URL session helpers.
|
|
* Open once and reuse the fd for all RPC calls to keep a stable TCP source port.
|
|
*/
|
|
int nsigner_session_open_url(const char *url);
|
|
void nsigner_session_close(int fd);
|
|
|
|
int nsigner_session_get_public_key(int *fd_inout,
|
|
const char *url,
|
|
const nt_nsigner_selector_t *selector,
|
|
const nt_nsigner_auth_ctx_t *auth,
|
|
char *out_hex_65);
|
|
|
|
int nsigner_session_sign_event(int *fd_inout,
|
|
const char *url,
|
|
const nt_nsigner_selector_t *selector,
|
|
const nt_nsigner_auth_ctx_t *auth,
|
|
const char *unsigned_event_json,
|
|
char **signed_event_json_out);
|
|
|
|
int nsigner_session_nip04_encrypt(int *fd_inout,
|
|
const char *url,
|
|
const nt_nsigner_selector_t *selector,
|
|
const nt_nsigner_auth_ctx_t *auth,
|
|
const char *peer_pub_hex,
|
|
const char *plaintext,
|
|
char **cipher_out);
|
|
|
|
int nsigner_session_nip04_decrypt(int *fd_inout,
|
|
const char *url,
|
|
const nt_nsigner_selector_t *selector,
|
|
const nt_nsigner_auth_ctx_t *auth,
|
|
const char *peer_pub_hex,
|
|
const char *ciphertext,
|
|
char **plain_out);
|
|
|
|
int nsigner_session_nip44_encrypt(int *fd_inout,
|
|
const char *url,
|
|
const nt_nsigner_selector_t *selector,
|
|
const nt_nsigner_auth_ctx_t *auth,
|
|
const char *peer_pub_hex,
|
|
const char *plaintext,
|
|
char **cipher_out);
|
|
|
|
int nsigner_session_nip44_decrypt(int *fd_inout,
|
|
const char *url,
|
|
const nt_nsigner_selector_t *selector,
|
|
const nt_nsigner_auth_ctx_t *auth,
|
|
const char *peer_pub_hex,
|
|
const char *ciphertext,
|
|
char **plain_out);
|
|
|
|
/*
|
|
* qrexec helpers for cross-qube n_signer transport.
|
|
* target_qube: destination signer qube (e.g. "nsigner-vault").
|
|
* service_name: qrexec service name (e.g. "qubes.NsignerRpc").
|
|
*/
|
|
int nsigner_qrexec_get_public_key(const char *target_qube,
|
|
const char *service_name,
|
|
const nt_nsigner_selector_t *selector,
|
|
char *out_hex_65);
|
|
|
|
int nsigner_qrexec_sign_event(const char *target_qube,
|
|
const char *service_name,
|
|
const nt_nsigner_selector_t *selector,
|
|
const char *unsigned_event_json,
|
|
char **signed_event_json_out);
|
|
|
|
int nsigner_qrexec_nip04_encrypt(const char *target_qube,
|
|
const char *service_name,
|
|
const nt_nsigner_selector_t *selector,
|
|
const char *peer_pub_hex,
|
|
const char *plaintext,
|
|
char **cipher_out);
|
|
|
|
int nsigner_qrexec_nip04_decrypt(const char *target_qube,
|
|
const char *service_name,
|
|
const nt_nsigner_selector_t *selector,
|
|
const char *peer_pub_hex,
|
|
const char *ciphertext,
|
|
char **plain_out);
|
|
|
|
int nsigner_qrexec_nip44_encrypt(const char *target_qube,
|
|
const char *service_name,
|
|
const nt_nsigner_selector_t *selector,
|
|
const char *peer_pub_hex,
|
|
const char *plaintext,
|
|
char **cipher_out);
|
|
|
|
int nsigner_qrexec_nip44_decrypt(const char *target_qube,
|
|
const char *service_name,
|
|
const nt_nsigner_selector_t *selector,
|
|
const char *peer_pub_hex,
|
|
const char *ciphertext,
|
|
char **plain_out);
|
|
|
|
#endif /* NSIGNER_CLIENT_H */
|