2017/05/21

[c/c++]noise-c ?

仕様書で「プロトコルはnoise-cで」みたいなことが書かれていた。

noise-c ???

どうやら、Noiseプロトコル、というものがあるらしく、そのC言語実装がnoise-cだそうな。
rweather/noise-c: Noise-C, a plain C implementation of the Noise protocol

プロトコルに興味は無いのだが、githubに上がってるくらいだから、ブログのネタにしても悪くはなかろう。


プロトコル仕様は、これらしい。

The Noise Protocol Framework

いやー、見る気にならんわー。
最初の方に"crypto"と出てくるので、何か暗号化するようなプロトコルなのだろう。

こういうのって、作っている人は改良しながらやっていくから中身が分かるのだろうけど、外側から見ている人、特に私みたいに成果だけ使おうとしている人にとっては、なかなかつらい。

私もgithubにときどき上げているが、使いやすくがんばっているわけではないし、そもそも「誰にでも使えるように」などと考えているわけではないから、同類だ。
それに、ドキュメントを整備しているわけではないから、同類とすることすらためらわれるレベルである。。。

 

まあ、いいのだ。
使おうと思う人が増えると、自然とドキュメントも整備したくなってくるものだから、それだけの違いなのである。


話を戻そう。

noise-cの使い方はまだわからないが、examplesはある。
Noise-C: Using Noise-C: Client/Server Echo Example

ただ、これを読んだまま実行してもなんだかわからなかったので、手順を残しておこう。
動かしたのは、bash on ubuntu on windows(16.04)だ。

 

 

githubから落とす

cloneでも何でもよいので、持ってこよう。

 

makeする

autogen.shがあるから、まずはそれを実行するとよかろう。
Build手順が載っているので、その順番でよいのではなかろうか。
Noise-C: Main Page

 

exam:key生成

いま、noise-cのディレクトリにいるとしよう。

$ cd examples/echo
$ mkdir keys
$ cd keys
$ ../echo-keygen/echo-keygen 25519 client_key_25519 client_key_25519.pub
$ ../echo-keygen/echo-keygen 25519 server_key_25519 server_key_25519.pub
$ ../echo-keygen/echo-keygen 448 client_key_448 client_key_448.pub
$ ../echo-keygen/echo-keygen 448 server_key_448 server_key_448.pub

パスをちゃんと書けよ!と思った。

実際は、*.pubの方を公開するのだけど、今回は同じPC内で実行するから、面倒を省くために keys/に全部置いているだけだ。
psk(pre-shared key)もいるらしいが、読んでもよくわからんので、こういうスクリプトを作った。

#!/bin/bash
rm -rf keys
mkdir keys
./echo-keygen/echo-keygen 25519 keys/client_key_25519 keys/client_key_25519.pub
./echo-keygen/echo-keygen 25519 keys/server_key_25519 keys/server_key_25519.pub
./echo-keygen/echo-keygen 448 keys/client_key_448 keys/client_key_448.pub
./echo-keygen/echo-keygen 448 keys/server_key_448 keys/server_key_448.pub

echo -en '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f' > keys/psk.bin
base64 keys/psk.bin > keys/psk

 

exam:server起動

待ち受ける方。

$ cd examples/echo/echo-server
$ ./echo-server --key-dir=../keys 7000

これで、待ち状態になった。

 

exam:client起動

serverに接続をお願いする方。

$ cd examples/echo/echo-client
$ ./echo-client Noise_NN_25519_AESGCM_SHA256 localhost 7000
Noise_NN_25519_AESGCM_SHA256 handshake complete.  Enter text to be echoed ...

これで待ち状態になった。
なにかテキストを打ち込むと、そのまま返ってきた。

hiro99ma
Received: hiro99ma

うーん。。。動いているような気はするが、そもそもなんだかわかっていないので、そこから先に進めないな。
こうやって、詳細を調べていく間に世の中が進んでいくのだけど、まあ仕方ないわね。。。


examplesには続きがあった。
上記の動かし方は、static keyが不要な動かし方らしい。
確かに、作ったkeyを指定してない。

$ ./echo-client --client-private-key=../keys/client_key_448 \
            --server-public-key=../keys/server_key_448.pub \
            Noise_KK_448_ChaChaPoly_BLAKE2b hostname 7000

これを実行すると、echo-server側にエラーが表示される。

set client public key: Unknown identifier

ソースでいえば、ここのはず。
コメントからすると、client用のpubkeyを設定しているのだろう。

 

・・・ここのif文って、どっちもNOISE_DH_CURVE25519しかチェックしてないじゃないか。。。
NOISE_DH_CURVE448に変更すると動いた。

修正されたので、もう大丈夫だ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。