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 }