![]() |
![]() |
|
|
デジタル署名および暗号化情報の調査
公開鍵ソフトウェアでは、次の順序指定が適用されます。
プロセスは、ターゲットのメッセージ・バッファを引数に指定して tpenvelope() 関数を呼び出すことにより、この情報を取得します。tpenvelope() については、『BEA Tuxedo C 言語リファレンス』の tpenvelope(3c) リファレンス・ページを参照してください。
1 つのメッセージ・バッファに対して、デジタル署名の登録要求、デジタル署名、暗号化の登録要求、および暗号化エンベロープの複数のオカレンスが関連付けられる場合があります。これらのオカレンスは、最初の項目を 0 として、順番に連続する位置に格納されます。tpenvelope() の occurrence 入力パラメータは、要求された項目を示します。最後の項目より大きい値が occurrence に指定されている場合に tpenvelope() を呼び出すと、TPENOENT エラーが返されます。TPENOENT が返されるまで tpenvelope() を繰り返し呼び出すことにより、すべての項目を調べることができます。
送信側のプロセスでは通常、デジタル署名および暗号化の情報は、メッセージが送信されるまで保留状態になっています。受信側のプロセスでは、デジタル署名は既に検証され、暗号化と復号化は実行済みです。
送信側のプロセスが tpenvelope を呼び出したときの動作
送信側のプロセスが発信メッセージ・バッファを引数として tpenvelope() を呼び出すと、tpenvelope() は次のレポートを作成します。
tpenvelope() は、ステータスの情報のほか、デジタル署名または暗号化の登録要求に関連付けられたキー・ハンドルも返します。プロセスは、キー・ハンドルを引数として tpkey_getinfo(3c) 関数を呼び出し、キー・ハンドルに関する詳しい情報を取得できます。
受信側のプロセスが tpenvelope を呼び出したときの動作
プロセスがメッセージ・バッファを受信するときは、メッセージの内容だけを受信します。メッセージ・バッファに関連付けられているデジタル署名や暗号化エンベロープは受信しません。受信側のプロセスは、tpenvelope() を呼び出して、添付されたデジタル署名や暗号化エンベロープに関する情報を取得する必要があります。
受信側のプロセスが受信メッセージ・バッファを引数として tpenvelope() を呼び出すと、tpenvelope() は次のレポートを作成します。
デジタル署名は検証されました。
メッセージ・バッファの内容が変更されたため、デジタル署名は無効です。
署名者のデジタル証明書が変更されたため、デジタル署名は無効です。
署名者のデジタル証明書が取り消されたため、デジタル署名は無効です。
タイムスタンプが遠い将来の時刻を示しているため、デジタル署名は無効です。
署名者のデジタル証明書の有効期限が切れたため、デジタル署名は無効です。
タイムスタンプが古すぎるため、デジタル署名は無効です。
署名者のデジタル証明書が不明な認証局 (CA) によって発行されたため、デジタル署名は無効です。
暗号化エンベロープは有効です。
ターゲット受信者のデジタル証明書が変更されたため、暗号化エンベロープは無効です。ターゲット受信者は、メッセージ・バッファを受信しません。
ターゲット受信者のデジタル証明書が取り消されたため、暗号化エンベロープは無効です。ターゲット受信者は、メッセージ・バッファを受信しません。
ターゲット受信者のデジタル証明書の有効期限が切れたため、暗号化エンベロープは無効です。ターゲット受信者は、メッセージ・バッファを受信しません。
ターゲット受信者のデジタル証明書が不明な認証局 (CA) から発行されたため、暗号化エンベロープは無効です。ターゲット受信者は、メッセージ・バッファを受信しません。
tpenvelope() は、ステータスの情報のほか、デジタル署名または暗号化エンベロープに関連付けられたキー・ハンドルも返します。プロセスは、キー・ハンドルを引数として tpkey_getinfo(3c) 関数を呼び出し、キー・ハンドルに関する詳しい情報を取得できます。
受信側のプロセスが、メッセージ・バッファを受信した後で tpsign() を呼び出してデジタル署名要求を登録した場合、tpenvelope() は登録のステータスを TPSIGN_PENDING としてレポートします。同様に、受信側のプロセスが、メッセージ・バッファを受信した後で tpseal() を呼び出して暗号化 (封印) 要求を登録した場合は、tpenvelope() は登録のステータスを TPSEAL_PENDING としてレポートします。
受信側のプロセスが署名付きメッセージ・バッファを受信した後でその内容を変更すると、添付された署名は無効になります。その結果、tpenvelope() は署名を検証できないため、TPSIGN_TAMPERED_MESSAGE という署名ステータスをレポートします。
コンポジット署名ステータスについて
メッセージ・バッファに複数のデジタル署名がある場合、公開鍵ソフトウェアは、tpenvelope() と同等の内部関数を呼び出して、各デジタル署名の状態を調べます。次に、特定の規則に従い、複数のデジタル署名の状態を合成した「コンポジット署名ステータス」を生成します。次の表は、コンポジット署名ステータスを生成する規則を示しています。
TPSIGN_OK または TPSIGN_UNKNOWN のコンポジット署名ステータスが付いていないメッセージ・バッファは、受信されても破棄され、受信されなかったように扱われます。ATMI アプリケーションの UBBCONFIG ファイルの SIGNATURE_REQUIRED パラメータが Y (はい) に設定されている場合は、TPSIGN_OK のコンポジット署名ステータスが付いていないメッセージ・バッファを受信しても破棄され、受信されなかったように扱われます。詳細については、「受信メッセージに対する署名方針の適用」 を参照してください。
ただし、前の段落で説明した署名付きメッセージ・バッファの処理の例外は、tpimport(3c) 関数です。tpimport(3c) 関数は、コンポジット署名ステータスとは関係なく、受信したメッセージ・バッファを送信します。
tpenvelope のコード例
次のコード例は、tpenvelope() を使用して、メッセージ・バッファに関連付けられているデジタル署名と暗号化の情報を調べる方法を示します。
tpenvelope を使用する例
main(argc, argv)
int argc;
char *argv[];
#endif
{
TPKEY tu_key;
TPKEY sdo_key;
TPKEY output_key;
char *sendbuf, *rcvbuf;
int ret;
int occurrence = 0;
long status;
char principal_name[PNAME_LEN];
long pname_len = PNAME_LEN;
int found = 0;
.
.
.
output_key = NULL;
ret = tpenvelope(rcvbuf, 0, occurrence, &output_key,
&status, NULL, 0);
while (ret != -1) {
if (status == TPSIGN_OK) {
if (tpkey_getinfo(output_key, "PRINCIPAL",
principal_name, &pname_len, 0) == -1) {
(void) fprintf(stdout, "Unable to get information
about principal:%d(%s)\n",
tperrno, tpstrerror(tperrno));
tpfree(sendbuf);
tpfree(rcvbuf);
tpterm();
(void) tpkey_close(tu_key, 0);
(void) tpkey_close(sdo_key, 0);
(void) tpkey_close(output_key, 0);
exit(1);
}
/* リソースを必ず解放する */
(void) tpkey_close(output_key, 0);
output_key = NULL;
found = 1;
break;
}
/* リソースの解放を忘れないこと */
(void) tpkey_close(output_key, 0);
output_key = NULL;
occurrence++;
ret = tpenvelope(rcvbuf, 0, occurrence, &output_key,
&status, NULL, 0);
}
.
.
.
}
関連項目
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|