33static int bcrypt_aes_gcm(BOOL is_encrypt,
45 BCRYPT_ALG_HANDLE h_alg = NULL;
46 BCRYPT_KEY_HANDLE h_key = NULL;
48 BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO auth_info;
51 status = BCryptOpenAlgorithmProvider(&h_alg, BCRYPT_AES_ALGORITHM, NULL, 0);
52 if (!BCRYPT_SUCCESS(status))
57 status = BCryptSetProperty(h_alg, BCRYPT_CHAINING_MODE,
58 (PUCHAR)BCRYPT_CHAIN_MODE_GCM,
59 sizeof(BCRYPT_CHAIN_MODE_GCM), 0);
60 if (!BCRYPT_SUCCESS(status))
62 BCryptCloseAlgorithmProvider(h_alg, 0);
66 status = BCryptGenerateSymmetricKey(h_alg, &h_key, NULL, 0,
68 if (!BCRYPT_SUCCESS(status))
70 BCryptCloseAlgorithmProvider(h_alg, 0);
74 BCRYPT_INIT_AUTH_MODE_INFO(auth_info);
75 auth_info.pbNonce = (PUCHAR)nonce;
77 auth_info.pbAuthData = (PUCHAR)aad;
78 auth_info.cbAuthData = (aad != NULL) ? (ULONG)aad_len : 0U;
79 auth_info.pbTag = (PUCHAR)tag;
80 auth_info.cbTag = tag_len;
84 status = BCryptEncrypt(h_key,
85 (PUCHAR)src, (ULONG)src_len,
88 (PUCHAR)dst, (ULONG)*dst_len,
93 status = BCryptDecrypt(h_key,
94 (PUCHAR)src, (ULONG)src_len,
97 (PUCHAR)dst, (ULONG)*dst_len,
101 BCryptDestroyKey(h_key);
102 BCryptCloseAlgorithmProvider(h_alg, 0);
104 if (!BCRYPT_SUCCESS(status))
109 *dst_len = (size_t)out_len;
115 const uint8_t *src,
size_t src_len,
117 const uint8_t *nonce,
118 const uint8_t *aad,
size_t aad_len)
123 if (dst == NULL || dst_len == NULL || (src == NULL && src_len > 0)
124 || key == NULL || nonce == NULL
134 static const uint8_t empty_src[1] = { 0 };
135 const uint8_t *actual_src = (src != NULL) ? src : empty_src;
137 if (bcrypt_aes_gcm(TRUE,
156 const uint8_t *src,
size_t src_len,
158 const uint8_t *nonce,
159 const uint8_t *aad,
size_t aad_len)
163 if (dst == NULL || dst_len == NULL || src == NULL
165 || key == NULL || nonce == NULL)
172 if (plain_len > 0 && *dst_len < plain_len)
179 return bcrypt_aes_gcm(FALSE,
184 (uint8_t *)(src + plain_len),
190 const uint8_t *passphrase,
191 size_t passphrase_len)
193 BCRYPT_ALG_HANDLE h_alg = NULL;
194 BCRYPT_HASH_HANDLE h_hash = NULL;
196 static const uint8_t empty[1] = { 0 };
197 const uint8_t *data = (passphrase != NULL) ? passphrase : empty;
198 ULONG data_len = (passphrase != NULL) ? (ULONG)passphrase_len : 0UL;
200 if (key == NULL || (passphrase == NULL && passphrase_len > 0))
205 status = BCryptOpenAlgorithmProvider(&h_alg, BCRYPT_SHA256_ALGORITHM, NULL, 0);
206 if (!BCRYPT_SUCCESS(status))
211 status = BCryptCreateHash(h_alg, &h_hash, NULL, 0, NULL, 0, 0);
212 if (!BCRYPT_SUCCESS(status))
214 BCryptCloseAlgorithmProvider(h_alg, 0);
218 status = BCryptHashData(h_hash, (PUCHAR)data, data_len, 0);
219 if (!BCRYPT_SUCCESS(status))
221 BCryptDestroyHash(h_hash);
222 BCryptCloseAlgorithmProvider(h_alg, 0);
228 BCryptDestroyHash(h_hash);
229 BCryptCloseAlgorithmProvider(h_alg, 0);
231 return BCRYPT_SUCCESS(status) ? 0 : -1;
int potr_passphrase_to_key(uint8_t *key, const uint8_t *passphrase, size_t passphrase_len)
任意のパスフレーズを SHA-256 ハッシュにより AES-256 鍵に変換します。
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 でデータを復号し、認証タグを検証します。
#define POTR_CRYPTO_NONCE_SIZE
AES-256-GCM ノンスサイズ (バイト)。session_id (4B NBO) + flags (2B NBO) + seq_or_ack_num (4B NBO) + padding (2B...
#define POTR_CRYPTO_KEY_SIZE
AES-256-GCM 鍵サイズ (バイト)。設定ファイルの encrypt_key に 64 文字 hex で指定する。
#define POTR_CRYPTO_TAG_SIZE
AES-256-GCM 認証タグサイズ (バイト)。暗号文の直後に付加する。