porter/libsrc/porter/infra/crypto/crypto.h

1 ファイル

1.1 porter/libsrc/porter/infra/crypto/crypto.h

データ暗号化・復号モジュールの内部ヘッダー。

プラットフォームごとに異なる暗号 API を共通インターフェースで抽象化します。

OS 使用ライブラリ アルゴリズム
Linux OpenSSL (libcrypto) EVP_aes_256_gcm() / EVP_sha256() AES-256-GCM / SHA-256
Windows CNG (BCrypt) BCRYPT_AES_ALGORITHM / BCRYPT_SHA256_ALGORITHM AES-256-GCM / SHA-256

暗号化ペイロードのフォーマット:

[暗号文: src_len バイト] [GCM 認証タグ: POTR_CRYPTO_TAG_SIZE バイト]

ノンス構成 (12 バイト):

[session_id: 4B NBO] [seq_num: 4B NBO] [padding: 4B 0x00]

追加認証データ (AAD): PotrPacket ヘッダー 32 バイト (NBO ワイヤーフォーマット)。 ヘッダーの改ざんも認証タグで検知される。

1.1.1 作者

c-modernization-kit sample team

1.1.2 バージョン

1.0.0

1.1.3 日付

2026/03/12

1.1.4 インクルード元

crypto.h のインクルード元

1.1.5 インクルード先

crypto.h のインクルード先

1.1.6 著作権

Copyright (C) CompanyName, Ltd. 2026. All rights reserved.

2 関数

2.1 potr_encrypt

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 でデータを暗号化します。

2.1.1 引数

  • dst [out] 暗号化後データを格納するバッファ。
    内容: [暗号文: src_len バイト][GCM タグ: POTR_CRYPTO_TAG_SIZE バイト]
    dst == src の in-place 暗号化も可能。
  • dst_len [in,out] 入力: dst のバッファサイズ (>= src_len + POTR_CRYPTO_TAG_SIZE)。
    出力: 書き込んだバイト数 (= src_len + POTR_CRYPTO_TAG_SIZE)。
  • src [in] 平文データへのポインタ。
  • src_len [in] 平文データのバイト数。
  • key [in] AES-256 鍵 (POTR_CRYPTO_KEY_SIZE バイト)。
  • nonce [in] ノンス (POTR_CRYPTO_NONCE_SIZE バイト)。
  • aad [in] 追加認証データへのポインタ。NULL の場合は AAD なし。
  • aad_len [in] AAD のバイト数。

2.1.2 戻り値

成功時は 0、失敗時は -1 を返します。

2.2 potr_decrypt

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 でデータを復号し、認証タグを検証します。

2.2.1 引数

  • dst [out] 復号後データを格納するバッファ。
  • dst_len [in,out] 入力: dst のバッファサイズ (>= src_len - POTR_CRYPTO_TAG_SIZE)。
    出力: 書き込んだバイト数 (= src_len - POTR_CRYPTO_TAG_SIZE)。
  • src [in] 暗号化データへのポインタ。
    内容: [暗号文: src_len - POTR_CRYPTO_TAG_SIZE バイト][GCM タグ: POTR_CRYPTO_TAG_SIZE バイト]
  • src_len [in] 暗号化データのバイト数 (タグを含む)。>= POTR_CRYPTO_TAG_SIZE。
  • key [in] AES-256 鍵 (POTR_CRYPTO_KEY_SIZE バイト)。
  • nonce [in] ノンス (POTR_CRYPTO_NONCE_SIZE バイト)。
  • aad [in] 追加認証データへのポインタ。NULL の場合は AAD なし。
  • aad_len [in] AAD のバイト数。

2.2.2 戻り値

成功 (認証タグ検証 OK) 時は 0、失敗 (認証タグ不一致含む) 時は -1 を返します。

2.3 potr_passphrase_to_key

int potr_passphrase_to_key ( uint8_t *key, const uint8_t *passphrase, size_t passphrase_len )

任意のパスフレーズを SHA-256 ハッシュにより AES-256 鍵に変換します。

設定ファイルの encrypt_key に 64 文字 hex 以外の文字列が指定された場合に使用します。
入力バイト列の SHA-256 ダイジェストをそのまま鍵として使用します。
送受信の双方で同一のパスフレーズを指定すれば、同一の鍵が導出されます。

2.3.1 引数

  • key [out] 出力鍵バッファ (POTR_CRYPTO_KEY_SIZE = 32 バイト)。
  • passphrase [in] パスフレーズへのポインタ (任意のバイト列)。
  • passphrase_len [in] パスフレーズの長さ (バイト)。0 の場合も有効。

2.3.2 戻り値

成功時は 0、失敗時は -1 を返します。