蟹さんにSSLを話させようと思いついて、調べていたところaxTLSというスタックが見つかったのだが、ビルドを試したところいろいろ手をいれないと使えなさそうだった。たまたまこれについて調べていたところBearSSLという実装がある事を知った。この実装は比較的新しい物のようです。
組み込み用のオープンソースのTLSのコードは他にはmbedTLS(旧PolarSSL),wolfTLS,matrixSSLなどがある。
BearSSLはカナダの人がおそらく一人で作られたMITライセンスのコードで、ざっくりみたところ非常に奇麗に書かれています。
現在のところTLS 1.0, 1.1, 1,2に対応しています。
コードは全て公開されていて、ライブラリのビルドに必要なコードはCなのですが、一部C#で書かれたプリプロセッサーでCコードを生成しているようです。
FreeBSD 11/amd64でmakeしたところすんなりビルドが通りました。
Mac OS X/Intel(雪豹)でビルドするとso作ろうとしてこけますが.aはできます。
Mac OS X/PPC(10.5)でもビルドできました。
ビルドするとbuildディレクトリにlibbearsslができます。sampleディレクトリにhttpsなサーバとクラインとのサンプルのコードがあります。
all: client_basic server_basic
client_basic: client_basic.c
cc -I../inc -L../build -lbearssl -o client_basic client_basic.c
server_basic: server_basic.c
cc -I../inc -L../build -lbearssl -o server_basic server_basic.c
このサンプルプログラムを実行してみます。FreeBSDの場合はLD_LIBRARY_PATHをbuildディレクトリに通してsoを読めるようにしておきます。
サーバ側
bash-3.2$ ./server_basic 8080
binding to: 0.0.0.0
bound.
accepting connection from: 127.0.0.1
SSL closed (correctly).
クライアント側
bash-3.2$ ./client_basic localhost 8080
connecting to: 127.0.0.1
connected.
HTTP/1.0 200 OK
Content-Length: 46
Connection: close
Content-Type: text/html; charset=iso-8859-1
<html>
<body>
<p>Test!</p>
</body>
</html>
closed.
サーバ側にはlocalhostの証明書が貼ってあるので、クライアント側からIPアドレスでのアクセスはエラーになります。
違うホストからのアクセスを確認したい場合はclient_basic.cを以下ようにします。
br_ssl_client_reset(&sc, "localhost", 0);
client_basicで一般のサイトをアクセスするには乱暴かもしれませんが、以下のようにするとできます。
bash-3.2$ curl https://curl.se/ca/cacert.pem > cacert.pem
bash-3.2$ ../build/brssl ta cacert.pem > cacert.h
出来上がったcacert.hをclient_basic.cにハードコードされたTAと入れ替えてコンパイルします。
bash-3.2$ ./client_basic www.yahoo.co.jp 443
connecting to: 182.22.25.252
connected.
HTTP/1.0 200 OK
Date: Sun, 25 Mar 2018 01:26:17 GMT
まだ蟹さんでは動いていませんが、ちょっといじってみるつもりです。