ICEnroll3
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
証明書登録(エンロール)コントロールを表す複数のインターフェイスのうちの1つです。
メソッド 14
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
証明書または証明書チェーンを処理し、適切な証明書ストアに格納します。このメソッドは、要求証明書を受け取らない点で acceptPKCS7 メソッドと異なります。
| PKCS7 | LPWSTR | in | 証明書または証明書チェーンを含む文字列。 |
戻り値
VB
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
このメソッドがスクリプトから呼び出されると、証明書のインストールを許可するかどうかをユーザーに尋ねるユーザーインターフェイスが表示されます。
証明書登録コントロールオブジェクトを初期状態に戻し、コントロールを再利用できるようにします。このメソッドは ICEnroll3 インターフェイスで初めて定義されました。
戻り値
VB
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
署名操作および交換操作に対する現在の暗号化サービスプロバイダー(CSP)のサポート状況に関する情報を取得します。このメソッドは ICEnroll3 インターフェイスで初めて定義されました。
| pdwKeySpec | INT* | out | 現在の CSP が 交換キーおよび 署名キーをサポートしているかどうかを示すビットフラグを受け取る LONG へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
現在の CSP が交換キーおよび署名キーをサポートしているかどうかを示す値を返します。CSP がこのメソッドをサポートしていない場合は、エラーが返されます。解説(Remarks)
現在の CSP が交換キー、署名キー、またはその両方をサポートしているかどうかを判断するには、このメソッドを呼び出します。pdwKeySpec パラメーターには、次の定数(Wincrypt.h で定義)のうち1つ以上が格納されます。
例
DWORD dwKeySpec;
// Determine the supported key specifications.
// hr is HRESULT variable.
hr = pEnroll->GetSupportedKeySpec( &dwKeySpec );
if ( FAILED( hr ) )
printf("Failed GetSupportedKeySpec [%x]\n", hr);
else
{
printf("Exchange keys are %s. Signature keys are %s.\n",
dwKeySpec & AT_KEYEXCHANGE ? "supported" : "not supported",
dwKeySpec & AT_SIGNATURE ? "supported" : "not supported" );
}
署名キーおよび交換キーの最小キー長と最大キー長を取得します。
| fMin | BOOL | in | どちらのキー長(最小または最大)を取得するかを示すブール値。fMin が TRUE の場合は最小キー長を取得し、FALSE の場合は最大キー長を取得します。 |
| fExchange | BOOL | in | キーの種類を示すブール値。fExchange が TRUE の場合は交換キーのキー長を取得し、FALSE の場合は署名キーのキー長を取得します。 |
| pdwKeySize | INT* | out | キーの最小長または最大長(ビット単位)を受け取るポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、*pdwKeySize にはキーの最小長または最大長を表す値(ビット単位)が格納されます。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
キーの最小長または最大長を表す値(ビット単位)。解説(Remarks)
最小キー長と最大キー長を判断するには、このメソッドを呼び出します。CSP がこのメソッドをサポートしていない場合は、エラーが返されます。
例
DWORD dwExchMin, dwExchMax, dwSignMin, dwSignMax;
// Determine the minimum and maximum key length values.
// hr is HRESULT variable.
hr = pEnroll->GetKeyLen( TRUE, TRUE, &dwExchMin );
if ( FAILED( hr ) )
printf("Failed GetKeyLen for Exchange Minimum [%x]\n", hr);
else
printf("Exchange key Min: %d\n", dwExchMin);
hr = pEnroll->GetKeyLen( FALSE, TRUE, &dwExchMax );
if ( FAILED( hr ) )
printf("Failed GetKeyLen for Exchange Maximum [%x]\n", hr);
else
printf("Exchange key Max: %d\n", dwExchMax );
hr = pEnroll->GetKeyLen( TRUE, FALSE, &dwSignMin );
if ( FAILED( hr ) )
printf("Failed GetKeyLen for Signature Minimum [%x]\n", hr);
else
printf("Signature key Min: %d\n", dwSignMin );
hr = pEnroll->GetKeyLen( FALSE, FALSE, &dwSignMax );
if ( FAILED( hr ) )
printf("Failed GetKeyLen for Signature Maximum [%x]\n", hr);
else
printf("Signature key Max: %d\n", dwSignMax );
ICEnroll4::EnumAlgs メソッドは、指定されたアルゴリズムクラスに属し、現在の暗号化サービスプロバイダー(CSP)でサポートされている暗号化アルゴリズムの ID を取得します。
| dwIndex | INT | in | ID を取得するアルゴリズムの序数位置を指定します。最初のアルゴリズムを指定するには 0 を指定します。 |
| algClass | INT | in | 暗号化アルゴリズムのクラス。このメソッドが返す ID は、指定したクラスに属します。次のいずれかを指定します。 |
| pdwAlgID | INT* | out | 現在の CSP でサポートされている暗号化アルゴリズム ID を受け取る変数へのポインター。 |
戻り値
C++
戻り値は HRESULT です。S_OK は成功を示します。列挙するアルゴリズムがこれ以上ない場合は、値 ERROR_NO_MORE_ITEMS が返されます。VB
現在の CSP でサポートされている暗号化アルゴリズム ID。列挙するアルゴリズムがこれ以上ない場合は、値 ERROR_NO_MORE_ITEMS が返されます。解説(Remarks)
このメソッドで使用されるアルゴリズム ID およびクラスの定数については、Wincrypt.h を参照してください。
例
#include <windows.h>
#include <stdio.h>
#include <Xenroll.h>
DWORD dwAlgID;
DWORD dwIndex;
BSTR bstrAlgName = NULL;
HRESULT hr, hr2;
// Loop through the AlgIDs.
dwIndex = 0;
while ( TRUE )
{
// Enumerate the alg IDs for a specific class.
hr = pEnroll->EnumAlgs(dwIndex, ALG_CLASS_SIGNATURE, &dwAlgID);
if ( S_OK != hr )
{
break;
}
// Do something with the AlgID.
// For example, retrieve the corresponding name.
hr2 = pEnroll->GetAlgName( dwAlgID, &bstrAlgName);
if ( FAILED( hr2 ) )
printf("Failed GetAlgName [%x]\n", hr);
else
printf("AlgID: %d Name: %S\n", dwAlgID, bstrAlgName );
// Reuse the BSTR variable in next iteration.
if ( NULL != bstrAlgName )
{
SysFreeString( bstrAlgName );
bstrAlgName = NULL;
}
// Increment the index.
dwIndex++;
}
指定された ID から暗号化アルゴリズムの名前を取得します。このメソッドで取得される値は、現在の暗号化サービスプロバイダー(CSP)に依存します。このメソッドは ICEnroll3 インターフェイスで初めて定義されました。
| algID | INT | in | Wincrypt.h で定義されている、暗号化アルゴリズムを表す値。たとえば、CALG_MD2 は定義済みのアルゴリズム識別子です。このメソッドが成功するには、現在の CSP が algID のアルゴリズムをサポートしている必要があります。 |
| pbstr | LPWSTR* | out | 成功した場合、algID で指定されたアルゴリズムの名前を表す BSTR へのポインター。BSTR の使用が終わったら、SysFreeString 関数を呼び出して解放してください。 |
戻り値
C++
戻り値は HRESULT です。S_OK は成功を示します。CSP がこのメソッドをサポートしていない場合、または algID の暗号化アルゴリズムをサポートしていない場合は、エラーが返されます。VB
戻り値は、algID で指定されたアルゴリズムの名前を表す文字列です。CSP がこのメソッドをサポートしていない場合は、エラーが返されます。解説(Remarks)
このメソッドは、 EnumAlgs を呼び出して取得した ID を持つアルゴリズムの名前を表示するために使用できます。
暗号化アルゴリズムの定数は Wincrypt.h で定義されています。
例
BSTR bstrAlgName = NULL;
HRESULT hr;
// Retrieve the algorithm name.
// dwAlgID is a DWORD variable for an algorithm ID.
hr = pEnroll->GetAlgName( dwAlgID, &bstrAlgName);
if (FAILED(hr))
printf("Failed GetAlgName [%x]\n", hr);
else
printf("AlgID: %d Name: %S\n", dwAlgID, bstrAlgName );
// Free BSTR resource.
if ( NULL != bstrAlgName )
{
SysFreeString( bstrAlgName );
bstrAlgName = NULL;
}
新しいキーの生成時にエラーが発生した場合に証明書登録コントロールオブジェクトが実行する動作を決定するブール値を設定または取得します。(Put)
| fReuseHardwareKeyIfUnableToGenNew | BOOL | in | 新規キーを生成できない場合に既存のハードウェアキーを再利用するかどうかを指定する BOOL 値を渡す。 |
解説(Remarks)
このプロパティはブール値です。このプロパティは、NTE_TOKEN_KEYSET_STORAGE_FULL を返す 暗号化サービスプロバイダーにのみ影響します。これらの CSP は通常ハードウェアベースであり、スマートカードなどが例として挙げられます。このプロパティが true で、新しいキーの生成中にエラーが発生した場合、証明書登録コントロールオブジェクトは既存のハードウェアキーを再利用します。このプロパティが false で、新しいキーの生成中にエラーが発生した場合、証明書登録コントロールオブジェクトは既存のハードウェアキーを再利用せず、代わりに呼び出し元にエラーを渡します。
例
// Code to set the reuse H/W key status.
// hr is HRESULT variable.
hr = pEnroll->put_ReuseHardwareKeyIfUnableToGenNew( FALSE );
if ( FAILED( hr ) )
printf("Failed put_ReuseHardwareKeyIfUnableToGenNew [%x]\n", hr);
// Code to retrieve the reuse H/W key status.
BOOL bReuse;
hr = pEnroll->get_ReuseHardwareKeyIfUnableToGenNew( &bReuse );
if ( FAILED( hr ) )
printf("Failed get_ReuseHardwareKeyIfUnableToGenNew [%x]\n", hr);
else
printf("Hardware key %s be reused if unable"
" to generate a new key.\n", bReuse ? "will" : "will not");
新しいキーの生成時にエラーが発生した場合に証明書登録コントロールオブジェクトが実行する動作を決定するブール値を設定または取得します。(Get)
| fReuseHardwareKeyIfUnableToGenNew | BOOL* | out | 新規キーを生成できない場合に既存のハードウェアキーを再利用するかどうかを受け取る BOOL へのポインタである。 |
解説(Remarks)
このプロパティはブール値です。このプロパティは、NTE_TOKEN_KEYSET_STORAGE_FULL を返す 暗号化サービスプロバイダーにのみ影響します。これらの CSP は通常ハードウェアベースであり、スマートカードなどが例として挙げられます。このプロパティが true で、新しいキーの生成中にエラーが発生した場合、証明書登録コントロールオブジェクトは既存のハードウェアキーを再利用します。このプロパティが false で、新しいキーの生成中にエラーが発生した場合、証明書登録コントロールオブジェクトは既存のハードウェアキーを再利用せず、代わりに呼び出し元にエラーを渡します。
例
// Code to set the reuse H/W key status.
// hr is HRESULT variable.
hr = pEnroll->put_ReuseHardwareKeyIfUnableToGenNew( FALSE );
if ( FAILED( hr ) )
printf("Failed put_ReuseHardwareKeyIfUnableToGenNew [%x]\n", hr);
// Code to retrieve the reuse H/W key status.
BOOL bReuse;
hr = pEnroll->get_ReuseHardwareKeyIfUnableToGenNew( &bReuse );
if ( FAILED( hr ) )
printf("Failed get_ReuseHardwareKeyIfUnableToGenNew [%x]\n", hr);
else
printf("Hardware key %s be reused if unable"
" to generate a new key.\n", bReuse ? "will" : "will not");
PKCS の署名時に使用するハッシュアルゴリズムを設定または取得します。(Put)
| hashAlgID | INT | in | 使用するハッシュアルゴリズムの ID を渡す。 |
解説(Remarks)
このプロパティの値は、 EnumAlgs メソッドが返すような ハッシュアルゴリズム ID です。HashAlgID プロパティと HashAlgorithm プロパティの両方が設定されている場合は、最後に更新された方が PKCS #10 要求の署名に使用されるハッシュアルゴリズムを決定します。
例
// Code to set the hash algorithm ID.
// hr is HRESULT variable.
hr = pEnroll->put_HashAlgID( CALG_MD4 );
if ( FAILED( hr ) )
printf("Failed put_HashAlgID [%x]\n", hr);
// Code to retrieve the hash algorithm ID.
DWORD dwHashID;
hr = pEnroll->get_HashAlgID( &dwHashID );
if ( FAILED( hr ) )
printf("Failed get_HashAlgID [%x]\n", hr);
else
printf("HashAlgID: %d\n", dwHashID);
PKCS の署名時に使用するハッシュアルゴリズムを設定または取得します。(Get)
| hashAlgID | INT* | out | 現在のハッシュアルゴリズム ID を受け取る INT へのポインタである。 |
解説(Remarks)
このプロパティの値は、 EnumAlgs メソッドが返すような ハッシュアルゴリズム ID です。HashAlgID プロパティと HashAlgorithm プロパティの両方が設定されている場合は、最後に更新された方が PKCS #10 要求の署名に使用されるハッシュアルゴリズムを決定します。
例
// Code to set the hash algorithm ID.
// hr is HRESULT variable.
hr = pEnroll->put_HashAlgID( CALG_MD4 );
if ( FAILED( hr ) )
printf("Failed put_HashAlgID [%x]\n", hr);
// Code to retrieve the hash algorithm ID.
DWORD dwHashID;
hr = pEnroll->get_HashAlgID( &dwHashID );
if ( FAILED( hr ) )
printf("Failed get_HashAlgID [%x]\n", hr);
else
printf("HashAlgID: %d\n", dwHashID);
AT_KEYEXCHANGE 要求にデジタル署名および否認防止のキー使用法が含まれるかどうかを決定するブール値を設定または取得します。(Put)
| fLimitExchangeKeyToEncipherment | BOOL | in | 鍵交換キーの用途を暗号化のみに制限するかどうかを指定する BOOL 値を渡す。 |
解説(Remarks)
このプロパティはブール値であり、AT_KEYEXCHANGE 要求にのみ影響します。AT_SIGNATURE 要求には影響しません。
このプロパティの値が false の場合、AT_KEYEXCHANGE 要求には次のキー使用法が含まれます。
- CERT_DATA_ENCIPHERMENT_KEY_USAGE
- CERT_KEY_ENCIPHERMENT_KEY_USAGE
- CERT_DIGITAL_SIGNATURE_KEY_USAGE
- CERT_NON_REPUDIATION_KEY_USAGE
このプロパティの値が true の場合、AT_KEYEXCHANGE 要求には次のキー使用法が含まれます。
例
// Get the LimitExchangeKeyToEncipherment value.
BOOL bLimitKey;
HRESULT hr;
// pEnroll is previously instantiated ICEnroll interface pointer.
hr = pEnroll->get_LimitExchangeKeyToEncipherment(&bLimitKey);
if (FAILED(hr))
printf("Failed get_LimitExchangeKeyToEncipherment - %x\n", hr );
else
printf("LimitExchangeKeyToEncipherment: %s\n",
( bLimitKey ? "TRUE" : "FALSE"));
// Set the LimitExchangeKeyToEncipherment value.
hr = pEnroll->put_LimitExchangeKeyToEncipherment( TRUE );
if ( FAILED ( hr ) )
printf("Failed put_LimitExchangeKeyToEncipherment - %x\n", hr );
else
printf( "LimitExchangeKeyToEncipherment was set to TRUE\n" );
AT_KEYEXCHANGE 要求にデジタル署名および否認防止のキー使用法が含まれるかどうかを決定するブール値を設定または取得します。(Get)
| fLimitExchangeKeyToEncipherment | BOOL* | out | 鍵交換キーの用途を暗号化のみに制限するかどうかを受け取る BOOL へのポインタである。 |
解説(Remarks)
このプロパティはブール値であり、AT_KEYEXCHANGE 要求にのみ影響します。AT_SIGNATURE 要求には影響しません。
このプロパティの値が false の場合、AT_KEYEXCHANGE 要求には次のキー使用法が含まれます。
- CERT_DATA_ENCIPHERMENT_KEY_USAGE
- CERT_KEY_ENCIPHERMENT_KEY_USAGE
- CERT_DIGITAL_SIGNATURE_KEY_USAGE
- CERT_NON_REPUDIATION_KEY_USAGE
このプロパティの値が true の場合、AT_KEYEXCHANGE 要求には次のキー使用法が含まれます。
例
// Get the LimitExchangeKeyToEncipherment value.
BOOL bLimitKey;
HRESULT hr;
// pEnroll is previously instantiated ICEnroll interface pointer.
hr = pEnroll->get_LimitExchangeKeyToEncipherment(&bLimitKey);
if (FAILED(hr))
printf("Failed get_LimitExchangeKeyToEncipherment - %x\n", hr );
else
printf("LimitExchangeKeyToEncipherment: %s\n",
( bLimitKey ? "TRUE" : "FALSE"));
// Set the LimitExchangeKeyToEncipherment value.
hr = pEnroll->put_LimitExchangeKeyToEncipherment( TRUE );
if ( FAILED ( hr ) )
printf("Failed put_LimitExchangeKeyToEncipherment - %x\n", hr );
else
printf( "LimitExchangeKeyToEncipherment was set to TRUE\n" );
ICEnroll4::EnableSMIMECapabilities プロパティは、PKCS を有効にするかどうかを制御します。(Put)
| fEnableSMIMECapabilities | BOOL | in | S/MIME 機能属性を要求に含めるかどうかを指定する BOOL 値を渡す。 |
ICEnroll4::EnableSMIMECapabilities プロパティは、PKCS を有効にするかどうかを制御します。(Get)
| fEnableSMIMECapabilities | BOOL* | out | S/MIME 機能属性を要求に含めるかどうかを受け取る BOOL へのポインタである。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ICEnroll3 "{C28C2D95-B7DE-11D2-A421-00C04F79FE8E}" #usecom global ICEnroll3 IID_ICEnroll3 "{43F8F289-7A20-11D0-8F06-00C04FC295E1}" #comfunc global ICEnroll3_InstallPKCS7 69 wstr #comfunc global ICEnroll3_Reset 70 #comfunc global ICEnroll3_GetSupportedKeySpec 71 var #comfunc global ICEnroll3_GetKeyLen 72 int,int,var #comfunc global ICEnroll3_EnumAlgs 73 int,int,var #comfunc global ICEnroll3_GetAlgName 74 int,var #comfunc global ICEnroll3_put_ReuseHardwareKeyIfUnableToGenNew 75 int #comfunc global ICEnroll3_get_ReuseHardwareKeyIfUnableToGenNew 76 var #comfunc global ICEnroll3_put_HashAlgID 77 int #comfunc global ICEnroll3_get_HashAlgID 78 var #comfunc global ICEnroll3_put_LimitExchangeKeyToEncipherment 79 int #comfunc global ICEnroll3_get_LimitExchangeKeyToEncipherment 80 var #comfunc global ICEnroll3_put_EnableSMIMECapabilities 81 int #comfunc global ICEnroll3_get_EnableSMIMECapabilities 82 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_ICEnroll3 "{C28C2D95-B7DE-11D2-A421-00C04F79FE8E}" #usecom global ICEnroll3 IID_ICEnroll3 "{43F8F289-7A20-11D0-8F06-00C04FC295E1}" #comfunc global ICEnroll3_InstallPKCS7 69 wstr #comfunc global ICEnroll3_Reset 70 #comfunc global ICEnroll3_GetSupportedKeySpec 71 sptr #comfunc global ICEnroll3_GetKeyLen 72 int,int,sptr #comfunc global ICEnroll3_EnumAlgs 73 int,int,sptr #comfunc global ICEnroll3_GetAlgName 74 int,sptr #comfunc global ICEnroll3_put_ReuseHardwareKeyIfUnableToGenNew 75 int #comfunc global ICEnroll3_get_ReuseHardwareKeyIfUnableToGenNew 76 sptr #comfunc global ICEnroll3_put_HashAlgID 77 int #comfunc global ICEnroll3_get_HashAlgID 78 sptr #comfunc global ICEnroll3_put_LimitExchangeKeyToEncipherment 79 int #comfunc global ICEnroll3_get_LimitExchangeKeyToEncipherment 80 sptr #comfunc global ICEnroll3_put_EnableSMIMECapabilities 81 int #comfunc global ICEnroll3_get_EnableSMIMECapabilities 82 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。