

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# の使用 AWS Encryption SDK for C
<a name="c-language-using"></a>

このトピックでは、他のプログラミング言語の実装ではサポート AWS Encryption SDK for C されていない の機能の一部について説明します。

このセクションの例では、 AWS Encryption SDK for Cの[バージョン 2.0.*x*](about-versions.md) 以降の使用方法について説明します。前バージョンを使用する例については、GitHub の [aws-encryption-sdk-c](https://github.com/aws/aws-encryption-sdk-c/) リポジトリの[リリース](https://github.com/aws/aws-encryption-sdk-c/releases)リストで使用中のリリースを検索してください。

を使用したプログラミングの詳細については AWS Encryption SDK for C、[C の例](c-examples.md)、GitHub の [aws-encryption-sdk-c リポジトリ](https://github.com/aws/aws-encryption-sdk-c/)[の例](https://github.com/aws/aws-encryption-sdk-c/tree/master/examples)、および [AWS Encryption SDK for C API ドキュメント](https://aws.github.io/aws-encryption-sdk-c/html/)を参照してください。

「[キーリング](choose-keyring.md)」も参照してください。

**Topics**
+ [データの暗号化と復号の流れ](#c-language-using-pattern)
+ [参照カウント](#c-language-using-release)

## データの暗号化と復号の流れ
<a name="c-language-using-pattern"></a>

を使用する場合は AWS Encryption SDK for C、次のようなパターンに従います。[キーリング](concepts.md#keyring)の作成、キーリングを使用する [CMM](concepts.md#crypt-materials-manager) の作成、CMM (およびキーリング) を使用するセッションの作成、セッションの処理。

1. エラー文字列をロード  
C コードまたは C\$1\$1 コードで `aws_cryptosdk_load_error_strings()` メソッドを呼び出します。デバッグに非常に役立つエラー情報をロードします。  
`main` メソッド内でなど、1 回だけ呼び出す必要があります。  

```
/* Load error strings for debugging */
aws_cryptosdk_load_error_strings();
```

2. キーリングを作成します。  
データキーの暗号化に使用するラッピングキーで[キーリング](concepts.md#keyring)を設定します。この例では、1 つの[AWS KMS キーリング](use-kms-keyring.md)で キーリングを使用しますが AWS KMS key、代わりに任意のタイプのキーリングを使用できます。  
 AWS KMS key の暗号化キーリングで を識別するには AWS Encryption SDK for C、[キー ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN) または[エイリアス ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-alias-arn) を指定します。復号キーリングでは、キー ARN を使用する必要があります。詳細については、「[AWS KMS キーリング AWS KMS keys での の識別](use-kms-keyring.md#kms-keyring-id)」を参照してください。  

```
const char * KEY_ARN = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"    
struct aws_cryptosdk_keyring *kms_keyring = 
       Aws::Cryptosdk::KmsKeyring::Builder().Build(KEY_ARN);
```

3. セッションを作成します。  
では AWS Encryption SDK for C、セッションを使用して、サイズに関係なく、単一のプレーンテキストメッセージを**暗号化するか、単一の暗号テキストメッセージを復号します。セッションでは、そのプロセスを通じてメッセージの状態が維持されます。  
アロケーター、キーリング、モード (`AWS_CRYPTOSDK_ENCRYPT` または `AWS_CRYPTOSDK_DECRYPT`) を使用してセッションを設定します。セッションのモードを変更する必要がある場合は、`aws_cryptosdk_session_reset` メソッドを使用します。  
キーリングを使用してセッションを作成すると、 は自動的にデフォルトの暗号化マテリアルマネージャー (CMM) AWS Encryption SDK for C を作成します。このオブジェクトの作成、管理、破棄を行う必要はありません。  
例えば、次のセッションでは、ステップ 1 で定義したアロケーターとキーリングを使用します。データを暗号化する場合は、モードは `AWS_CRYPTOSDK_ENCRYPT` です。  

```
struct aws_cryptosdk_session * session = aws_cryptosdk_session_new_from_keyring_2(allocator, AWS_CRYPTOSDK_ENCRYPT, kms_keyring);
```

4. データを暗号化または復号します。  
セッションでデータを処理するには、`aws_cryptosdk_session_process` メソッドを使用します。入力バッファがプレーンテキスト全体を保持するのに十分なサイズであり、出力バッファが暗号化テキスト全体を保持するのに十分なサイズである場合は、`aws_cryptosdk_session_process_full` を呼び出すことができます。ただし、ストリーミングデータを処理する必要がある場合は、`aws_cryptosdk_session_process` をループで呼び出すことができます。例については、[file\$1streaming.cpp](https://github.com/aws/aws-encryption-sdk-c/blob/master/examples/file_streaming.cpp) の例を参照してください。`aws_cryptosdk_session_process_full` は AWS Encryption SDK 、バージョン 1.9.*x* および 2.2.*x* で導入されています。  
セッションでデータを暗号化するように設定されている場合、プレーンテキストフィールドは入力、暗号化テキストフィールドは出力を表します。`plaintext` フィールドは、暗号化するメッセージを保持しており、`ciphertext` フィールドは、暗号化メソッドによって返る[暗号化されたメッセージ](message-format.md)を取得します。  

```
/* Encrypting data */
aws_cryptosdk_session_process_full(session,
                                   ciphertext,
                                   ciphertext_buffer_size,
                                   &ciphertext_length,
                                   plaintext,
                                   plaintext_length)
```
セッションでデータを復号するように設定されている場合、暗号化テキストフィールドは入力、プレーンテキストフィールドは出力を表します。`ciphertext` フィールドは、暗号化メソッドより返る[暗号化されたメッセージ](message-format.md)を保持しており、`plaintext` フィールドは、復号メソッドより返るプレーンテキストメッセージを取得します。  
データを復号するには、`aws_cryptosdk_session_process_full` メソッドを呼び出します。  

```
/* Decrypting data */
aws_cryptosdk_session_process_full(session,
                                   plaintext,
                                   plaintext_buffer_size,
                                   &plaintext_length,
                                   ciphertext,
                                   ciphertext_length)
```

## 参照カウント
<a name="c-language-using-release"></a>

メモリリークを防ぐために、作成したすべてのオブジェクトへの参照はオブジェクトの使用が完了したら解放するようにします。それ以外の場合は、最終的にメモリリークが発生します。SDK には、この作業を簡略化するメソッドがあります。

次のいずれかの子オブジェクトを使用して親オブジェクトを作成すると、親オブジェクトは子オブジェクトへの参照を作成して管理します。
+ [キーリング](concepts.md#keyring) (キーリングを使用したセッションの作成など)
+ デフォルトの[暗号化マテリアルマネージャー](concepts.md#crypt-materials-manager) (CMM) (デフォルトの CMM を使用したセッションやカスタム CMM の作成など)
+ [データキーキャッシュ](data-key-caching.md) (キーリングとキャッシュを使用したキャッシュ CMM の作成など)

子オブジェクトへの独立参照が必要でない限り、親オブジェクトを作成したら子オブジェクトへの参照はすぐに解放できます。親オブジェクトが破棄されると、残っている子オブジェクトへの参照は解放されます。このパターンでは、各オブジェクトへの参照を必要な期間だけ保持することができます。また、参照の未開放が原因でメモリリークが発生することもありません。

作成した子オブジェクトへの参照の明示的な解放は、お客様が行う必要があります。SDK が作成したオブジェクトへの参照の管理は、お客様が行う必要はありません。SDK がオブジェクト (`aws_cryptosdk_caching_cmm_new_from_keyring` メソッドがセッションに追加するデフォルトの CMM など) を作成する場合は、SDK がオブジェクトとその参照の作成と破棄を管理します。

次の例では、[キーリング](concepts.md#keyring)を使用してセッションを作成すると、セッションはキーリングへの参照を作成し、セッションが破棄されるまでその参照を管理します。キーリングへの追加の参照を管理する必要がない場合は、セッションを作成したら `aws_cryptosdk_keyring_release` メソッドを使用してキーリングオブジェクトを解放できます。このメソッドでは、キーリングの参照カウントは減少します。`aws_cryptosdk_session_destroy` を呼び出してセッションを破棄すると、セッションのキーリングへの参照は解放されます。

```
// The session gets a reference to the keyring.
struct aws_cryptosdk_session *session =	
	aws_cryptosdk_session_new_from_keyring_2(alloc, AWS_CRYPTOSDK_ENCRYPT, keyring);

// After you create a session with a keyring, release the reference to the keyring object.
aws_cryptosdk_keyring_release(keyring);
```

複数のセッションでキーリングを再利用したり、CMM でアルゴリズムスイートを指定したりするなど、より複雑なタスクの場合は、オブジェクトへの独立参照を管理する必要があります。その場合は、解放のメソッドをすぐに呼び出さないでください。代わりに、セッションの破棄だけでなく、オブジェクトを使用しなくなったときにも参照を解放します。

この参照カウント手法は、[データキーキャッシュ](data-key-caching.md)用の CMM のキャッシングなど、代替 CMM を使用している場合にも機能します。キャッシュとキーリングからキャッシュ CMM を作成すると、キャッシュ CMM はその両方のオブジェクトへの参照を作成します。別のタスクでそれらが必要でない限り、キャッシュ CMM を作成したらキャッシュとキーリングへの独立参照はすぐに解放できます。その後、キャッシュ CMM を使用してセッションを作成するときに、キャッシュ CMM への参照を解放できます。

作成したオブジェクトへの参照の明示的な解放は、お客様が行う必要があります。メソッドが作成するオブジェクト (キャッシュ CMM の元になるデフォルトの CMM など) は、メソッドが管理します。

```
/ Create the caching CMM from a cache and a keyring.
struct aws_cryptosdk_cmm *caching_cmm = aws_cryptosdk_caching_cmm_new_from_keyring(allocator, cache, kms_keyring, NULL, 60, AWS_TIMESTAMP_SECS);

// Release your references to the cache and the keyring.
aws_cryptosdk_materials_cache_release(cache);
aws_cryptosdk_keyring_release(kms_keyring);

// Create a session with the caching CMM.
struct aws_cryptosdk_session *session = aws_cryptosdk_session_new_from_cmm_2(allocator, AWS_CRYPTOSDK_ENCRYPT, caching_cmm);

// Release your references to the caching CMM.
aws_cryptosdk_cmm_release(caching_cmm);

// ...

aws_cryptosdk_session_destroy(session);
```