int olsrd_mdp_sign(co_obj_t *self, co_obj_t **output, co_obj_t *params) { int msg_len = 0, ret = 0, sig_buf_len; unsigned char *msg = NULL, *sig_buf = NULL; /** skipping some error checking for performance reasons */ // CHECK(IS_LIST(params) && co_list_length(params) == 2,"Invalid params"); msg_len = co_obj_data((char**)&msg,co_list_element(params,1)); sig_buf_len = SIGNATURE_BYTES + msg_len + 1; sig_buf = calloc(sig_buf_len,sizeof(unsigned char)); CHECK(serval_create_signature((unsigned char*)_LIST_ELEMENT(params,0), msg, msg_len, sig_buf, sig_buf_len),"Failed to sign OLSRd packet"); CMD_OUTPUT("sig",co_bin8_create((char*)(sig_buf+msg_len),SIGNATURE_BYTES,0)); ret = 1; error: if (sig_buf) free(sig_buf); return ret; }
int olsrd_mdp_init(co_obj_t *self, co_obj_t **output, co_obj_t *params) { keyring_file *mdp_keyring = NULL; unsigned char *mdp_key = NULL; int mdp_key_len = 0; unsigned char packedSid[SID_SIZE] = {0}; CHECK(IS_LIST(params) && co_list_length(params) == 2,"Invalid params"); size_t sid_len = co_str_len(co_list_element(params,1)); char *sid_str = _LIST_ELEMENT(params,1); CHECK(sid_len == 2*SID_SIZE + 1 && str_is_subscriber_id(sid_str) == 1,"Invalid SID"); stowSid(packedSid,0,sid_str); CHECK(serval_init_keyring(packedSid, SID_SIZE, _LIST_ELEMENT(params,0), co_str_len(co_list_element(params,0)), &mdp_keyring, &mdp_key, &mdp_key_len), "Failed to initialize Serval keyring"); CMD_OUTPUT("key",co_bin8_create((char*)mdp_key,mdp_key_len,0)); return 1; error: return 0; }
int olsrd_mdp_init(co_obj_t *self, co_obj_t **output, co_obj_t *params) { svl_crypto_ctx *ctx = NULL; CHECK(IS_LIST(params) && co_list_length(params) == 2, "Invalid params"); size_t sid_len = co_str_len(co_list_element(params, 1)); char *sid_str = _LIST_ELEMENT(params, 1); CHECK(sid_len == (2 * SID_SIZE) + 1 && str_is_subscriber_id(sid_str) == 1, "Invalid SID"); ctx = svl_crypto_ctx_new(); stowSid(ctx->sid, 0, sid_str); ctx->keyring_path = _LIST_ELEMENT(params, 0); ctx->keyring_len = co_str_len(co_list_element(params, 0)) - 1; CHECK_ERR(ctx->keyring_len < PATH_MAX,"Keyring path too long"); CHECK(serval_init_keyring(ctx), "Failed to initialize Serval keyring"); CMD_OUTPUT("key", co_bin8_create((char*)ctx->sas_private, crypto_sign_SECRETKEYBYTES, 0)); return 1; error: if (ctx) svl_crypto_ctx_free(ctx); return 0; }
int co_request_append_bin(co_obj_t *request, const char *s, const size_t slen) { CHECK_MEM(request); CHECK_MEM(s); CHECK(IS_LIST(request), "Not a valid request."); CHECK(slen < UINT32_MAX, "Binary is too large."); if(slen > UINT16_MAX) return co_list_append(request, co_bin32_create(s, slen, 0)); if(slen > UINT8_MAX) return co_list_append(request, co_bin16_create(s, slen, 0)); return co_list_append(request, co_bin8_create(s, slen, 0)); error: return 0; }
int olsrd_mdp_sign(co_obj_t *self, co_obj_t **output, co_obj_t *params) { int ret = 0; svl_crypto_ctx *ctx = svl_crypto_ctx_new(); /** skipping some error checking for performance reasons */ // CHECK(IS_LIST(params) && co_list_length(params) == 2, "Invalid params"); ctx->msg_len = co_obj_data((char**)&ctx->msg, co_list_element(params, 1)); memcpy(ctx->sas_private,_LIST_ELEMENT(params, 0),crypto_sign_SECRETKEYBYTES); CHECK(serval_create_signature(ctx), "Failed to sign OLSRd packet"); CMD_OUTPUT("sig", co_bin8_create((char*)ctx->signature, SIGNATURE_BYTES, 0)); ret = 1; error: svl_crypto_ctx_free(ctx); return ret; }