2015-09-16 20 views
7

PKCS#11 v2.40の作成者は、APIがアイテムの可変長リストを返すときに共通のパターンを利用します。 C_GetSlotListおよびC_GetMechanismListなどのAPIでは、アプリケーションはAPIを2回呼び出すことが予想されます。最初の呼び出しでは、CK_ULONGへのポインターは、次の呼び出しで返される項目の数に設定されます。これにより、アプリケーションは十分なメモリーを割り振り、結果を取り出すためにAPIを再度呼び出すことができます。PKCS#11 C_FindObjectsのメモリ所有権ulMaxObjectCount!= 1

また、C_FindObjectsコールは可変数の項目を返しますが、異なるパラダイムを使用します。パラメーターCK_OBJECT_HANDLE_PTR phObjectは、結果リストの先頭に設定されます。パラメータCK_ULONG_PTR pulObjectCountは返された項目の数に設定され、CK_ULONG ulMaxObjectCount未満であることが保証されています。

標準では、phObjectは、ulMaxObjectCountCK_OBJECT_HANDLEを保持するのに十分な大きさのメモリブロックへの有効なポインタである必要があると明示的には言及していません。

標準は、アプリケーションがulMaxObjectCountオブジェクトに十分なメモリを悲観的に割り当てる必要があると解釈できます。 PKCS#11の実装でpulObjectCountCK_OBJECT_HANDLEが割り当てられ、そのメモリを解放するのはアプリケーションの責任です。しかし、この後の解釈は、PKCS#11の実装がこれまでにメモリ内のどこに標準を実装していないとしても、疑わしいと思われる。

通路がある:それは、しかし、その1つのエントリのためのメモリを割り当てないulMaxObjectCount 1に設定するように

C_FindObjects continues a search for token and session objects that 
match a template, obtaining additional object handles. hSession is 
the session’s handle; phObject points to the location that receives 
the list (array) of additional object handles; ulMaxObjectCount is 
the maximum number of object handles to be returned; pulObjectCount 
points to the location that receives the actual number of object 
handles returned. 

If there are no more objects matching the template, then the location 
that pulObjectCount points to receives the value 0. 

The search MUST have been initialized with C_FindObjectsInit. 

非規範的な例は、非常に有用ではありません。これは、アプリケーションが悲観的にメモリを事前に割り当てる必要があることを示しているようです。

CK_SESSION_HANDLE hSession; 
CK_OBJECT_HANDLE hObject; 
CK_ULONG ulObjectCount; 
CK_RV rv; 
. 
. 
rv = C_FindObjectsInit(hSession, NULL_PTR, 0); 
assert(rv == CKR_OK); 
while (1) { 
rv = C_FindObjects(hSession, &hObject, 1, &ulObjectCount); 
if (rv != CKR_OK || ulObjectCount == 0) 
break; 
. 
. 
} 
rv = C_FindObjectsFinal(hSession); 
assert(rv == CKR_OK); 

仕様のリンク:http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/pkcs11-base-v2.40.pdf

+0

私は同意します、それは境界線です。 S.O.にある人がいるかもしれませんが。メモリが一般的にどのように管理されているかについての洞察がありますが、ここで誰かがPKCS#11 Cライブラリを特に使用していることはほぼ確実です。 – Huckle

答えて

6

はい、アプリケーションがC_FindObjects()によって返されたオブジェクトハンドルのためのスペースを割り当てるための責任があるように思われます。このコード例では、一度に1つのオブジェクトハンドルしか要求しません。

例のコードを書き換えて、複数のオブジェクトハンドルを要求することもできます。このように:

おそらく
#define MAX_OBJECT_COUNT 100 /* arbitrary value */ 

K_SESSION_HANDLE hSession; 
CK_OBJECT_HANDLE hObjects[MAX_OBJECT_COUNT]; 
CK_ULONG ulObjectCount, i; 
CK_RV rv; 

rv = C_FindObjectsInit(hSession, NULL_PTR, 0); 
assert(rv == CKR_OK); 
while (1) { 
    rv = C_FindObjects(hSession, hObjects, MAX_OBJECT_COUNT, &ulObjectCount); 
    if (rv != CKR_OK || ulObjectCount == 0) break; 
    for (i = 0; i < ulObjectCount; i++) { 
    /* do something with hObjects[i] here */ 
    } 
} 
rv = C_FindObjectsFinal(hSession); 
assert(rv == CKR_OK); 

、単一C_FindObjects()コールで複数のオブジェクトハンドルを要求する能力は、パフォーマンスの最適化を目的としています。

FWIWでは、これはfread()のような多くのC標準ライブラリ関数が同様に機能します。 fgetc()で一度に1バイトずつファイルからデータを読み取るのは非常に効率が悪いので、fread()関数を使用すると、任意の大きさのバッファを割り当てて、それに合わせて多くのデータを読み取ることができます。

+0

ありがとう、ちょうど確認したかった。私は、C_GetSlotListとC_FindObjectsの違いは、ライブラリはおそらく正確に何個のスロットが存在するのかを事前に知っているが、一致するオブジェクトの数を知りませんでしたか? – Huckle

+1

これは実際に異なるAPIスタイルの1つの理由になります。また、C_FindObjectsがC_GetSlotListよりも多くの結果を返すことが予想されるため、単一のバッファを割り当てることで実現できない可能性があります。あるいは、部分的なC_GetSlotListクエリを再開することが不可能な内部実装の問題があるかもしれません。あるいは、APIのさまざまな部分が、異なるAPI設計の好みを持つ異なる人によって設計されただけかもしれません。 –

+0

(個人的には、C_GetSlotList APIのスタイルは、やや面白くなく、しばしば非効率的で、むしろ迷惑をかけることがあります.73ページに記載されているように、最初の呼び出しで返されたサイズ*私は、別のセッションオブジェクトをセットアップして解放する必要があるとしても、C_FindObjectsスタイルのAPIを好むでしょう。 ) –

関連する問題