soter_status_t soter_sym_aead_decrypt_final(soter_sym_ctx_t *ctx, const void* auth_tag, const size_t auth_tag_length) { SOTER_CHECK_PARAM(auth_tag!=NULL); SOTER_CHECK_PARAM(auth_tag_length>=SOTER_AES_GCM_AUTH_TAG_LENGTH); SOTER_CHECK(ctx!=NULL); SOTER_IF_FAIL(EVP_CIPHER_CTX_ctrl(&(ctx->evp_sym_ctx), EVP_CTRL_GCM_SET_TAG, SOTER_AES_GCM_AUTH_TAG_LENGTH, (void*)auth_tag), soter_sym_aead_decrypt_destroy(ctx)); return soter_sym_aead_ctx_final(ctx, false); }
soter_status_t soter_rsa_key_pair_gen_export_key(soter_rsa_key_pair_gen_t* ctx, void* key, size_t* key_length, bool isprivate){ EVP_PKEY *pkey; SOTER_CHECK_PARAM(ctx); pkey = EVP_PKEY_CTX_get0_pkey(ctx->pkey_ctx); SOTER_CHECK_PARAM(pkey); SOTER_CHECK_PARAM(EVP_PKEY_RSA == EVP_PKEY_id(pkey)); if (isprivate) { return soter_engine_specific_to_rsa_priv_key((const soter_engine_specific_rsa_key_t *)pkey, (soter_container_hdr_t *)key, key_length); } else { return soter_engine_specific_to_rsa_pub_key((const soter_engine_specific_rsa_key_t *)pkey, (soter_container_hdr_t *)key, key_length); } }
soter_status_t soter_rsa_key_pair_gen_cleanup(soter_rsa_key_pair_gen_t* ctx){ SOTER_CHECK_PARAM(ctx); if (ctx->pkey_ctx) { EVP_PKEY_CTX_free(ctx->pkey_ctx); } return SOTER_SUCCESS; }
soter_status_t soter_sym_aead_encrypt_final(soter_sym_ctx_t *ctx, void* auth_tag, size_t* auth_tag_length){ SOTER_CHECK_PARAM(auth_tag!=NULL); if((*auth_tag_length)<SOTER_AES_GCM_AUTH_TAG_LENGTH){ (*auth_tag_length)=SOTER_AES_GCM_AUTH_TAG_LENGTH; return SOTER_BUFFER_TOO_SMALL; } SOTER_CHECK(soter_sym_aead_ctx_final(ctx, true)==SOTER_SUCCESS); SOTER_CHECK(EVP_CIPHER_CTX_ctrl(&(ctx->evp_sym_ctx), EVP_CTRL_GCM_GET_TAG, SOTER_AES_GCM_AUTH_TAG_LENGTH, auth_tag)); (*auth_tag_length)=SOTER_AES_GCM_AUTH_TAG_LENGTH; return SOTER_SUCCESS; }
soter_status_t soter_rsa_key_pair_gen_destroy(soter_rsa_key_pair_gen_t* ctx){ SOTER_CHECK_PARAM(ctx); SOTER_CHECK(soter_rsa_key_pair_gen_cleanup(ctx)==SOTER_SUCCESS); free(ctx); return SOTER_SUCCESS; }