SMLでSHA2アルゴリズムを実装しました
SMLでSHA2(Secure Hash Algorithm)というハッシュアルゴリズムを実装しました。
https://github.com/eldesh/sha2_sml.gitに公開してあります。現在のところSML/NJで動作を確認しています。
#こういう基本的な部品から実装して行くのが重要です。たぶん。
実装内容
RFC6234を実装しました。
SHA224 | SHA256 | SHA384 | SHA512 | SHA512/224 | SHA512/256 | |
---|---|---|---|---|---|---|
実装 | ✔ | ✔ | ✔ | ✔ |
SHA224,SHA256,SHA384,SHA512を実装してあります。他にSHA-512/224とSHA-512/256というのがありますがこちらは未実装です。
また入力として文字列とバイト(Word8.word)列しか受け取れず、(8の倍数で無い)ビットの列は入力できません。
インストール方法
readme.rstに書いてあります。
各コマンドの詳細を知りたい方は先日のエントリ(SMLUnitのインストールを通してSML/NJ向けのライブラリのインストール方法を解説する)を参照して下さい :)
使用例
インストールが出来たとして、使用する様子を紹介します。
sha2_sml$ sml - CM.make "libsha2sml.cm"; (* ... snip ... *) val it = true : bool - Sha256.hashString "abc"; val it = - : ?.Sha256.word Sha256.t - Sha256.toString it; val it = "BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD" : string
念のためsha256sumコマンドで確認します。
$ echo -n "abc" | sha256sum | tr [:lower:] [:upper:] BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD -
やりました。
テスト
NISTのCAVPのshort/longのケース全て。それに加えてNESSIE*1のテストベクタの一部を使っています。*2。
全部パスしてるので、まぁ大体正しく実装出来てるんでしょう。きっと。
あとは処理系的に入力サイズが大きいとき不安。4GB超えた辺りとか。