2015-09-29

暗号ライブラリ (別題:実用Scheme)

Schemeは黒板言語だと言われたりするのだが(概ね認める部分もあるが)、プログラミング言語は実用されないことにはコミュニティも広がらないだろうということで、完全R7RSのみで暗号ライブラリを作っていたりする。ちなみにR6RS処理系用はindustriaがあるので、そっちを使った方がよいと思われる。

ライブラリの名前はAeolus(アイオロス)。まぁ、そういうことです。基本的にはSagittariusで実装されてる(crypto)ライブラリに似せた感じのAPIにしてある。使い方は大体こんな感じ。
(import (scheme base)
        (aeolus cipher)
        (aeolus cipher aes)
        (aeolus modes ecb))

;; 128bit key
(define key (string->utf8 "1234567890123456"))
(define cipher (make-cipher AES key mode-ecb))

;; 16 octet block
(cipher-encrypt cipher (string->utf8 "It's top secret!"))
;; -> #vu8(230 1 210 64 10 131 72 18 222 112 210 129 170 236 243 42)
パディングとかはまだ実装してないので、自前でデータをブロック長にする必要があったりする。

以下はここにあるR7RS準拠の処理系での動作チェック。部分準拠のものは試してない。

完動(全テストパス)
  • Sagittarius 0.6.8
  • Gauche 0.9.5 (HEAD)
  • Larceny 0.98 (ただしパラメタのテストはtest-errorの実装がおかしいので動かない)
  • Chibi Scheme (23ac772e3a)
テスト失敗
  • Chibi Scheme 0.7.3 (AESのテストがこける。SRFI-33っぽい、使わないようにしたらテスト通った)
動かん
  • Foment (複数のバグを踏んだ)
  • Picrin (パスの通し方が分からん)
  • Kawa (同上)
未検証
  • Husk (Haskellいれるのだるい)
PicrinとKawaはなんとか試してみたいのだが、いかんせんライブラリパスの通し方が分からんので手が出せない。誰かテストしてくれないかな(チラ その他リストには載ってないけど動いたとかの報告があると嬉しいなぁ(チラ

とりあえずDES、Triple DESとAESをサポート(というか、当面はこれだけの予定。Blowfishとか欲しい人いる?) 以下は当面のTODO
  • パディング(パラメタにするか明示的にユーザにやらせるか悩み中)
  • ハッシュ(MD5、SHA-1、SHA-256、SHA-512等)
  • MAC(HMAC、CMAC辺り)
  • RSA
  • PKI(X.509証明書とか。ここまでやるとほぼSagittariusの焼き増しに・・・)
 これくらいあるとTLSとかSSHとか実装できそう。

なんでこんなの作ったのか?


上の方に書いたのと被るけど、○○がないからSchemeは使わない(使えない)と言われるのが嫌だったから。仕様内だとソケットやスレッドがないのでいろいろ厳しいんだけど、そこに依存しないピュアSchemeなライブラリを書いていけばそのうち人が増えるのではないかと。黒板言語と呼ばれる理由の一つに実用的なライブラリが圧倒的に足りないというのがあると思うので、そこを何とかしていけばいつかきっととか。以前書いたPostgreSQLバインディングもそんな気持ちからというのはある。(Scheme使ってPostgreSQL使ってるっていう人の方は少ない気がするので、ちとニッチ過ぎたというのはあるが・・・)

まぁ、後は仕事で暗号関係を使わなくなってきたので、忘れないようにというのもある。誰にも聞かれないと思うけど、一応動機。

2015年9月30日追記
Chibiのバグが直されたので完動に追加。仕事が速い。

5 comments:

Anonymous said...

最近Sagittariusをビルドできないのですが。
こんなことになってしまします(プラットフォームはUbuntu-15.04_x86_64)。
cmake .
make
->
----------
...
[ 99%] Building C object build/ext/odbc/CMakeFiles/sagittarius--odbc.dir/odbc.c.o
[100%] Building C object build/ext/odbc/CMakeFiles/sagittarius--odbc.dir/odbc_stub.c.o
Linking C shared module ../../sagittarius--odbc.so
[100%] Built target sagittarius--odbc
Scanning dependencies of target doc
Unhandled exception
Condition components:
1. &error
2. &message can't find a rule for tz
3. &who timezone-offset
4. &irritants (#)
5. &stack-trace

stack trace:
[1] error
[2] timezone-zone&rule
src: (find-rule tz date month year rules)
"/usr/local/sagittarius-0.6.8/ext/time/sagittarius/timezone.scm":199
[3] timezone-offset
src: (timezone-zone&rule tz when)
"/usr/local/sagittarius-0.6.8/ext/time/sagittarius/timezone.scm":154
[4] current-date
src: (timezone-offset (local-timezone))
"/usr/local/sagittarius-0.6.8/ext/time/sagittarius/time.scm":139
[5] scribble-sxml->shtml
src: (current-date)
"/usr/local/sagittarius-0.6.8/sitelib/sagittarius/document/html.scm":547
[6] scribble-sxml->shtml
src: (date->string (current-date) "~4")
"/usr/local/sagittarius-0.6.8/sitelib/sagittarius/document/html.scm":546
[7] scribble-sxml->html
src: (scribble-sxml->shtml sexp :style style :javascrip
"/usr/local/sagittarius-0.6.8/sitelib/sagittarius/document/html.scm":735
[8] call-with-port
[9] dynamic-wind
doc/CMakeFiles/doc.dir/build.make:49: recipe for target 'doc/CMakeFiles/doc' failed
make[2]: *** [doc/CMakeFiles/doc] Error 70
CMakeFiles/Makefile2:1684: recipe for target 'doc/CMakeFiles/doc.dir/all' failed
make[1]: *** [doc/CMakeFiles/doc.dir/all] Error 2
Makefile:117: recipe for target 'all' failed
make: *** [all] Error 2
root@i5:/usr/local/sagittarius-0.6.8#
----------

ちなみに、Sagittarius-0.6.6までは問題なくビルドできたいました。

kei said...

0.6.7からのタイムゾーン周りの扱いの変更でドキュメントの作成が失敗してるみたいですね。以下のコマンドで何が表示されるか教えてもらってもいいですか?(ソースディレクトリでビルドしてると仮定してます)

$ ./build/sagittarius -Llib -Lsitelib -L'ext/*' -e '(import (sagittarius timezone)) (print (local-timezone)) (exit)'

kei said...

手元のUbuntuでタイムゾーンとAsia/Tokyoにしたら再現されるのを確認しました(エラーのirritantsにタイムゾーンが表示されてるので、多少現象は違うみたいですが、発生箇所は一緒なので問題ないかと)。

kei said...

直しました。

https://bitbucket.org/ktakashi/sagittarius-scheme/commits/5d4c944d6b15

0.6.8でビルドするには ext/time/sagittarius/timezone.scm の302行目にある (error ...) を #f に変更するか、ビルド時だけタイムゾーンをAsia/Tokyoではないもの(例:Europe/Amsterdam)に変更してください。

Anonymous said...

レスポンス早いですね!
ビルドできることを確認しました。
ありがとう御座います。

Post a Comment