System.Data.SQLite の暗号化機能

System.Data.SQLite .NET frameworkからSQLiteのデータベースファイルを扱うためのモジュールなんだけど、これに含まれる System.Data.SQLite.DLL は普通のネイティブなWindowsアプリケーションからでも利用できて、しかもMicrosoft Cryptography APIの暗号化機能が使えるんだ。

これを今回はMinGWから使ってみるよ。

インポートライブラリの生成

インストール先のフォルダからSystem.Data.SQLite.DLLを持ってくる。
MinGWのdlltoolは . が多い名前を扱えないから sqlite3dnet.dll にリネームする。
MinGWのpexportsでdefファイルを作る。
pexports sqlite3dnet.dll >sqlite3dnet.def
defファイルの先頭行のDLLファイル名をsqlite3dnet.dll に変更する。蛇足だけど、defファイルの中を見ると sqlite3_key ってシンボルが含まれてるよ。
dlltoolでMinGW用のインポートライブラリを作る。
dlltool --dllname sqlite3dnet.dll --input-def sqlite3dnet.def --output-lib libsqlite3dnet.a

暗号キーの設定

sqlite3.h には書かれていないけど
extern int sqlite3_key(sqlite3 *db, const void *pKey, int nKey);
をオープン直後に使うと暗号化が有効になるよ。

問題点

現在の System.Data.SQLite は sqlite3_enable_load_extension() をエクスポートしてなくて、拡張DLLを使えないんだ。