EternalWindows
ファイル署名 / 署名と属性

SignedData型のデータには、オプションとして属性と呼ばれる情報を追加することができます。 属性には、データのコンテンツの形式を示すものや、メールアドレスなどがあり、 後から署名を確認する際に有用となる情報ばかりです。 属性を確認するには、署名されたファイルのプロパティから「デジタル署名」を選択します。

図から分かるように、属性には「認証済み属性」と「認証されていない属性」の2種類があります。 どのような情報がどちらの属性として扱われるかは、 現段階では「副署名」という情報以外は「認証済み属性」に入ると考えて問題ありません。 まず、「内容の種類」という属性ですが、これは SignedData型のデータに含まれるコンテンツの形式を表します。 前節や前々節で説明したように、コンテンツの形式はspcIndirectDataContextでなければならいため、 それを示すOIDであるSPC_INDIRECT_DATA_OBJIDが格納されています。 「メッセージ ダイジェスト」は、データから生成されたハッシュ値を格納しています。 基本的に属性というのは明示的に追加するものですが、 コンテンツの形式がspcIndirectDataContextである場合は、 自動的に先に述べた2つの属性は追加されることになります。

属性を明示的に追加する場合は、CRYPT_ATTRIBUTE構造体を初期化し、 それを属性を要求する構造体に指定することになります。 次に、CRYPT_ATTRIBUTE構造体の定義を示します。

typedef struct _CRYPT_ATTRIBUTE {
  LPSTR            pszObjId;
  DWORD            cValue;
  PCRYPT_ATTR_BLOB rgValue;
} CRYPT_ATTRIBUTE,  *PCRYPT_ATTRIBUTE;

pszObjIdは、属性を表すOIDを指定します。 先に述べた属性を例にすれば、内容の種類はszOID_RSA_contentTypeであり、 メッセージ ダイジェストはszOID_RSA_messageDigestとなります。 cValueは、rgValueの要素数を指定します。 特別なことがない限り、この値は1になるでしょう。 rgValueは、属性とする値を指定します。 基本的には、ここに指定する値はpszObjIdで指定したOIDを基にエンコードしている必要があると思われますが、 一部の属性に関しては、OIDを指定するだけで関数が属性を追加してくれる場合もあります。 ちなみに、属性を表すOIDは、CryptEnumOIDInfoにCRYPT_EXT_OR_ATTR_OID_GROUP_IDを指定することで列挙できますが、 そこには拡張情報を表すOIDも含まれることに注意してください。


戻る