1 /**
2  * Contains bindings for some noise functions
3  */
4 module noise;
5 
6 int NOISE_ID(char ch, int num)
7 {
8     return ((cast(int) ch) << 8) | num;
9 }
10 
11 extern (C) pure nothrow @nogc
12 {
13     import core.stdc.stdint;
14 
15     struct NoiseHandshakeState
16     {
17     }
18 
19     struct NoiseDHState
20     {
21     }
22 
23     struct NoiseCipherState
24     {
25     }
26 
27     struct NoiseBuffer
28     {
29         uint8_t* data;
30         size_t size;
31         size_t max_size;
32     }
33 
34     int noise_handshakestate_new_by_name(NoiseHandshakeState** state,
35         const char* protocol_name, int role);
36     int noise_handshakestate_free(NoiseHandshakeState* state);
37     NoiseDHState* noise_handshakestate_get_local_keypair_dh(const NoiseHandshakeState* state);
38     size_t noise_dhstate_get_private_key_length(const NoiseDHState* state);
39     int noise_dhstate_set_keypair_private(NoiseDHState* state,
40         const uint8_t* private_key, size_t private_key_len);
41     int noise_handshakestate_start(NoiseHandshakeState* state);
42     int noise_handshakestate_write_message(NoiseHandshakeState* state,
43         NoiseBuffer* message, const NoiseBuffer* payload);
44     int noise_handshakestate_read_message(NoiseHandshakeState* state,
45         NoiseBuffer* message, NoiseBuffer* payload);
46     int noise_handshakestate_split(NoiseHandshakeState* state,
47         NoiseCipherState** send, NoiseCipherState** receive);
48     int noise_handshakestate_get_action(const NoiseHandshakeState* state);
49     int noise_cipherstate_encrypt(NoiseCipherState* state, NoiseBuffer* buffer);
50     int noise_cipherstate_decrypt(NoiseCipherState* state, NoiseBuffer* buffer);
51     int noise_dhstate_get_public_key(const NoiseDHState* state,
52         uint8_t* public_key, size_t public_key_len);
53     NoiseDHState* noise_handshakestate_get_remote_public_key_dh(const NoiseHandshakeState* state);
54     size_t noise_dhstate_get_public_key_length(const NoiseDHState* state);
55     int noise_cipherstate_free(NoiseCipherState* state);
56     int noise_init();
57     int noise_dhstate_new_by_id(NoiseDHState** state, int id);
58     int noise_dhstate_free(NoiseDHState* state);
59     int noise_dhstate_generate_keypair(NoiseDHState* state);
60     int noise_dhstate_get_keypair(const NoiseDHState* state,
61         uint8_t* private_key, size_t private_key_len, uint8_t* public_key, size_t public_key_len);
62 
63     int noise_strerror(int err, char* buf, size_t size);
64 
65     enum NOISE_DH_CURVE25519 = NOISE_ID('D', 1);
66 
67     enum NOISE_ROLE_INITIATOR = NOISE_ID('R', 1);
68     enum NOISE_ROLE_RESPONDER = NOISE_ID('R', 2);
69 
70     enum NOISE_ACTION_NONE = 0;
71     enum NOISE_ACTION_WRITE_MESSAGE = NOISE_ID('A', 1);
72     enum NOISE_ACTION_READ_MESSAGE = NOISE_ID('A', 2);
73     enum NOISE_ACTION_FAILED = NOISE_ID('A', 3);
74     enum NOISE_ACTION_SPLIT = NOISE_ID('A', 4);
75     enum NOISE_ACTION_COMPLETE = NOISE_ID('A', 5);
76 
77     enum NOISE_ERROR_NONE = 0;
78     enum NOISE_ERROR_NO_MEMORY = NOISE_ID('E', 1);
79     enum NOISE_ERROR_UNKNOWN_ID = NOISE_ID('E', 2);
80     enum NOISE_ERROR_UNKNOWN_NAME = NOISE_ID('E', 3);
81     enum NOISE_ERROR_MAC_FAILURE = NOISE_ID('E', 4);
82     enum NOISE_ERROR_NOT_APPLICABLE = NOISE_ID('E', 5);
83     enum NOISE_ERROR_SYSTEM = NOISE_ID('E', 6);
84     enum NOISE_ERROR_REMOTE_KEY_REQUIRED = NOISE_ID('E', 7);
85     enum NOISE_ERROR_LOCAL_KEY_REQUIRED = NOISE_ID('E', 8);
86     enum NOISE_ERROR_PSK_REQUIRED = NOISE_ID('E', 9);
87     enum NOISE_ERROR_INVALID_LENGTH = NOISE_ID('E', 10);
88     enum NOISE_ERROR_INVALID_PARAM = NOISE_ID('E', 11);
89     enum NOISE_ERROR_INVALID_STATE = NOISE_ID('E', 12);
90     enum NOISE_ERROR_INVALID_NONCE = NOISE_ID('E', 13);
91     enum NOISE_ERROR_INVALID_PRIVATE_KEY = NOISE_ID('E', 14);
92     enum NOISE_ERROR_INVALID_PUBLIC_KEY = NOISE_ID('E', 15);
93     enum NOISE_ERROR_INVALID_FORMAT = NOISE_ID('E', 16);
94     enum NOISE_ERROR_INVALID_SIGNATURE = NOISE_ID('E', 17);
95 }
96 
97 void noise_buffer_init(ref NoiseBuffer buffer)
98 {
99     buffer.data = null;
100     buffer.size = 0;
101     buffer.max_size = 0;
102 }
103 
104 void noise_buffer_set_output(ref NoiseBuffer buffer, uint8_t* ptr, size_t len)
105 {
106     buffer.data = ptr;
107     buffer.size = 0;
108     buffer.max_size = len;
109 }
110 
111 void noise_buffer_set_input(ref NoiseBuffer buffer, uint8_t* ptr, size_t len)
112 {
113     buffer.data = ptr;
114     buffer.size = len;
115     buffer.max_size = len;
116 }
117 
118 void noise_buffer_set_inout(ref NoiseBuffer buffer, uint8_t* ptr, size_t len, size_t max)
119 {
120     buffer.data = ptr;
121     buffer.size = len;
122     buffer.max_size = max;
123 }