30 const uint8_t *src,
size_t src_len,
33 const uint8_t *aad,
size_t aad_len)
39 if (dst == NULL || dst_len == NULL || (src == NULL && src_len > 0)
40 || key == NULL || nonce == NULL
46 ctx = EVP_CIPHER_CTX_new();
52 if (EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL) != 1)
54 EVP_CIPHER_CTX_free(ctx);
59 if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN,
62 EVP_CIPHER_CTX_free(ctx);
66 if (EVP_EncryptInit_ex(ctx, NULL, NULL, key, nonce) != 1)
68 EVP_CIPHER_CTX_free(ctx);
73 if (aad != NULL && aad_len > 0)
75 if (EVP_EncryptUpdate(ctx, NULL, &outl, aad, (
int)aad_len) != 1)
77 EVP_CIPHER_CTX_free(ctx);
86 if (EVP_EncryptUpdate(ctx, dst, &outl, src, (
int)src_len) != 1)
88 EVP_CIPHER_CTX_free(ctx);
94 if (EVP_EncryptFinal_ex(ctx, dst + outl, &final_len) != 1)
96 EVP_CIPHER_CTX_free(ctx);
101 if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG,
105 EVP_CIPHER_CTX_free(ctx);
111 EVP_CIPHER_CTX_free(ctx);
117 const uint8_t *src,
size_t src_len,
119 const uint8_t *nonce,
120 const uint8_t *aad,
size_t aad_len){
126 if (dst == NULL || dst_len == NULL || src == NULL
128 || key == NULL || nonce == NULL)
135 if (plain_len > 0 && *dst_len < plain_len)
140 ctx = EVP_CIPHER_CTX_new();
146 if (EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL) != 1)
148 EVP_CIPHER_CTX_free(ctx);
152 if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN,
155 EVP_CIPHER_CTX_free(ctx);
159 if (EVP_DecryptInit_ex(ctx, NULL, NULL, key, nonce) != 1)
161 EVP_CIPHER_CTX_free(ctx);
165 if (aad != NULL && aad_len > 0)
167 if (EVP_DecryptUpdate(ctx, NULL, &outl, aad, (
int)aad_len) != 1)
169 EVP_CIPHER_CTX_free(ctx);
178 if (EVP_DecryptUpdate(ctx, dst, &outl, src, (
int)plain_len) != 1)
180 EVP_CIPHER_CTX_free(ctx);
191 if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG,
194 EVP_CIPHER_CTX_free(ctx);
200 if (EVP_DecryptFinal_ex(ctx, dst + outl, &final_len) != 1)
202 EVP_CIPHER_CTX_free(ctx);
206 *dst_len = plain_len;
208 EVP_CIPHER_CTX_free(ctx);
214 const uint8_t *passphrase,
215 size_t passphrase_len)
220 if (key == NULL || (passphrase == NULL && passphrase_len > 0))
225 ctx = EVP_MD_CTX_new();
231 if (EVP_DigestInit_ex(ctx, EVP_sha256(), NULL) != 1
232 || EVP_DigestUpdate(ctx,
233 (passphrase != NULL) ? passphrase : (
const uint8_t *)
"",
235 || EVP_DigestFinal_ex(ctx, key, &out_len) != 1)
237 EVP_MD_CTX_free(ctx);
241 EVP_MD_CTX_free(ctx);
int potr_encrypt(uint8_t *dst, size_t *dst_len, const uint8_t *src, size_t src_len, const uint8_t *key, const uint8_t *nonce, const uint8_t *aad, size_t aad_len)
AES-256-GCM でデータを暗号化します。
int potr_decrypt(uint8_t *dst, size_t *dst_len, const uint8_t *src, size_t src_len, const uint8_t *key, const uint8_t *nonce, const uint8_t *aad, size_t aad_len)
AES-256-GCM でデータを復号し、認証タグを検証します。