int serval_verify_client(const char *sid_str, const size_t sid_len, const unsigned char *msg, const size_t msg_len, const char *sig, const size_t sig_len, const char *keyring_path, const size_t keyring_len) { int verdict = 0; char sas_str[2*SAS_SIZE+1] = {0}; unsigned char packedSid[SID_SIZE] = {0}; CHECK(sid_len == 2*SID_SIZE,"Invalid SID length"); CHECK(sig_len == 2*SIGNATURE_BYTES,"Invalid signature length"); CHECK(str_is_subscriber_id(sid_str) != 0,"Invalid SID"); stowSid(packedSid,0,sid_str); CHECK(serval_init_keyring(packedSid, SID_SIZE, keyring_path, keyring_len, &keyring, NULL, NULL), "Failed to initialize Serval keyring"); struct subscriber *sub = find_subscriber(packedSid, SID_SIZE, 1); // get Serval identity described by given SID CHECK(sub,"Failed to fetch Serval subscriber"); CHECK(keyring_send_sas_request_client(sub),"SAS request failed"); CHECK(sub->sas_valid,"Could not validate the signing key!"); CHECK(sub->sas_public[0],"Could not validate the signing key!"); CHECK(tohex(sas_str,sub->sas_public,SAS_SIZE),"Failed to convert signing key"); verdict = cmd_serval_verify(sas_str,2*SAS_SIZE, msg,msg_len,sig,sig_len); error: return verdict; }
/* Used by serval-client */ int serval_verify_client(svl_crypto_ctx *ctx) { CHECK(ctx && ctx->sid[0] && ctx->msg && ctx->signature[0] && ctx->keyring_path, "Invalid ctx"); CHECK(serval_init_keyring(ctx), "Failed to initialize Serval keyring"); struct subscriber *sub = find_subscriber(ctx->sid, SID_SIZE, 1); // get Serval identity described by given SID CHECK(sub, "Failed to fetch Serval subscriber"); CHECK(keyring_send_sas_request_client(sub), "SAS request failed"); CHECK(sub->sas_valid, "Could not validate the signing key!"); CHECK(sub->sas_public[0], "Could not validate the signing key!"); memcpy(ctx->sas_public,sub->sas_public,crypto_sign_PUBLICKEYBYTES); return cmd_serval_verify(ctx); error: return 0; }