ホーム 主筆 その他ソフト その他情報 Syuhitu.org English

Windows関連

スクリーンセーバー作成法

半透明ウインドウの性能

bootfont.bin

キャビネット形式

ウインドウスタイルをいじる

Java製ソフトをServiceに登録する

イベントログにメッセージを出力する

コントロールパネルにアイコンを追加する

スクリプトによる拡張1

スクリプトによる拡張2

ガジェットの作成

大容量メモリ

メモリ搭載量の下限に挑む

スパースファイルにする

表示されるアイコンの種類を調べてみた

メモリマップIOとエラー処理

ファイルを作る順番と速度の関係

Cryptography API: Next Generationを使う

Windows 10のアクセントカラー

iSCSIディスクにバックアップを取る

サーバプロセスを分離して実装する

サーバプロセスを分離して実装する - F#

レジストリに大量に書き込む

Solaris関連

OpenGL

Solaris設定

ディレクトリの読み込み

主筆プラグイン開発

マルチスレッドでの開発

door

音を出す

Blade100の正しい虐め方

パッケージの作成

画像入出力

BMPファイル

ICOファイル

ANIファイル

JPEGファイル

減色アルゴリズム

減色アルゴリズムの並列化

その他アルゴリズムなど

自由軸回転

Base64

文字列操作

CPU利用率の取得

正規表現ライブラリ

メタボールを作る

メタボールを作る2

正規表現とNFA・DFA

C言語の構文解析

液晶ディスプレイを解体してみた

iSCSIの理論と実装

単一フォルダにファイルを沢山作る

USB-HUBのカスケード接続

SafeIntの性能

VHDファイルのフォーマット

USBメモリに書き込み続けてみた

CNG:アルゴリズムプロバイダの追加・削除

2016年2月27日公開

実装したアルゴリズムプロバイダをインストールする。

インストールには特別なツールなどは提供されない。DLLを然るべきフォルダに格納して、いくつかのAPI関数を呼び出してやる必要がる。

DLLの格納

作成したDLLは下記に格納する必要がある。

32bit版のWindowsの場合

%systemroot%\system32の中に格納する。

普通にインストールしているのならたぶん「C:\Windows\System32」になるはず。

64bit版のWindowsの場合

64bit版のバイナリであれば%systemroot%\system32の中に格納する。

32bit版のバイナリであれば%systemroot%\sysWOW64の中に格納する。

インストール

インストールというか、登録するためには下記の関数を順番に呼び出す。

  • BCryptRegisterProvider関数
  • BCryptAddContextFunctionProvider関数

BCryptRegisterProvider関数を呼び出すと、レジストリにアルゴリズムプロバイダが登録されるらしい。

// 同一のアルゴリズムクラスに属する、アルゴリズム名の配列
TCHAR* AlgorithmNames[1] = {
  L"TestCAP-NULL"             // アルゴリズム名
};
 
// アルゴリズムプロバイダにより定義される、
// 単一のアルゴリズムクラスの定義
CRYPT_INTERFACE_REG AlgorithmClass = {
  BCRYPT_CIPHER_INTERFACE,// アルゴリズムのクラスとして対称暗号を指定する
  CRYPT_LOCAL,            // スコープとしてローカルを指定する
  1,                      // このアルゴリズムのクラスに属する
                          // アルゴリズムの個数
  AlgorithmNames          // このアルゴリズムのクラスに属する
                          // アルゴリズムの名前
};
 
// 当該のアルゴリズムプロバイダによりサポートされる
// アルゴリズムクラスの定義
PCRYPT_INTERFACE_REG AllUserModeAlgorithmClasses[1] = {
    &AlgorithmClass
};
 
// DLLの定義
CRYPT_IMAGE_REG UserModeProviderImage = {
  L"TestCAP.dll",             // ファイル名
  1,                          // ファイル数
  AllUserModeAlgorithmClasses // 定義
};
 
// 登録するすべてのDLLの定義
CRYPT_PROVIDER_REG SymmetricCipherProvider = {
  0,                           // エイリアスは使用しない
  NULL,                        // エイリアスは使用しない
  &UserModeProviderImage,      // ユーザモード用のDLL
  NULL                         // カーネルモード用のDLL
                               // (NULLでなければならないらしい)
};

// レジストリに登録する
NTSTATUS r = BCryptRegisterProvider(
  L"TestCAP",               // プロバイダ名
  0,                        // 上書きでの登録は行わない
  &SymmetricCipherProvider  // 登録するプロバイダの情報
);

長いけれども、BCryptRegisterProvider関数を呼び出しているのは最後だけである。上記の大部分はCRYPT_PROVIDER_REG 構造体への値の設定である。

BCryptRegisterProvider関数を実行すると、レジストリにアルゴリズムプロバイダの情報が登録されるようだ。

「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Providers」の下を見ると、確かに身に覚えのある値が登録されている。

次に、BCryptAddContextFunctionProvider関数の呼び出しである。

// CNGコンテキストに登録する
r = BCryptAddContextFunctionProvider(
  CRYPT_LOCAL,             // CRYPT_LOCAL以外はサポートされない
  NULL,                    // コンテキストって何を指定するのか?
  BCRYPT_CIPHER_INTERFACE, // 対称暗号であることを指定する
  L"TestCAP-NULL",         // アルゴリズム名
  L"TestCAP",              // プロバイダ名
  CRYPT_PRIORITY_BOTTOM    // 追加する位置とはなんだ?
);

これがいまいちわからない。

Cryptographic Provider Development Kitにあるサンプルを見ると、BCryptRegisterProvider関数の次にBCryptAddContextFunction関数を呼び出し、その次にBCryptAddContextFunctionProvider関数を呼んでいる。

しかし、実行するとBCryptAddContextFunction関数は処理が失敗する。この関数はWindows Vistaでは使えるが後続のバージョンでは使えなくなっているかもしれないなどと注意書きあることをみても、なんとなくいらないんじゃないかという気がしてならない。現に、BCryptAddContextFunction関数の方は呼ばなくてもその後の処理に影響がないように見受けられる。

アンインストール

インストールの逆である。下記の関数を順番に呼び出す。

  • BCryptRemoveContextFunctionProvider
  • BCryptUnregisterProvider

BCryptRemoveContextFunctionProvider関数については、インストール時に実行したBCryptAddContextFunctionProvider関数とほどんと差異はない。

// CNGコンテキストから削除する
NTSTATUS r = BCryptRemoveContextFunctionProvider(
  CRYPT_LOCAL,             // CRYPT_LOCAL以外はサポートされない
  NULL,                    // コンテキストって何を指定するのか?
  BCRYPT_CIPHER_INTERFACE, // 対称暗号であることを指定する
  L"TestCAP-NULL",         // アルゴリズム名
  L"TestCAP"               // プロバイダ名
);

BCryptUnregisterProvider関数は単純だ。

  // レジストリからプロバイダを削除する
  r = BCryptUnregisterProvider( L"TestCAP" );

ここでも同様に、サンプルの実装がやや疑わしいように思われる。BCryptRemoveContextFunctionProvider関数とBCryptUnregisterProvider関数の間でBCryptRemoveContextFunction関数を呼び出しているのだが、これの存在意義がわからない。

CNGへの登録をすべて削除したら、後はDLLを消してしまえばよろしい。

 

 

<< 「Cryptography API: Next Generationを使う」に戻る


連絡先 - サイトマップ - 更新履歴
Copyright (C)  2000 - 2016 nabiki_t All Rights Reserved.