Syntax highlighter

2018-02-09

TLS実装2(完)

Sagittarius上にビルトインなTLSを実装し終えた。POSIXな環境(Linux、OSX)ではOpenSSLをWindowsな環境ではSchennal、CygwinとMSYS2上ではあればOpenSSL、なければSchannelを使うという感じになっている。

今までPure SchemeだったのがCでの実装になったのだから性能にもなにかしら影響があるだろうと思ってベンチマークを取ってみた。
#!read-macro=sagittarius/bv-string
(import (rnrs)
(time)
(sagittarius control)
(sagittarius socket)
(rfc tls))
(define *poor-victim* "www.google.com")
(define iteration 100)
(let ((sock (make-client-tls-socket *poor-victim* "443"))
(buf (make-bytevector 1024)))
(time (dotimes (i iteration)
(tls-socket-send sock #*"GET / HTTP/1.1\r\n\r\n")
(tls-socket-recv! sock buf 0 1024)))
(tls-socket-shutdown sock SHUT_RDWR)
(tls-socket-close sock))
view raw bench.scm hosted with ❤ by GitHub
$ SAGITTARIUS_CACHE_DIR=/tmp sash bench.scm
;; (dotimes (i iteration) (tls-socket-send sock #vu8(71 69 84 32 47 32 72 84 84 80 47 49 46 49 13 10 13 10)) (tls-socket-recv! sock buf 0 1024))
;; 1.847038 real 0.008000 user 0.008000 sys
$ SAGITTARIUS_CACHE_DIR=/tmp SCHEME_ENV_REPOSITORY=~/projects/scheme-env scheme-env run bench.scm
;; (dotimes (i iteration) (tls-socket-send sock #vu8(71 69 84 32 47 32 72 84 84 80 47 49 46 49 13 10 13 10)) (tls-socket-recv! sock buf 0 1024))
;; 1.989803 real 0.064000 user 0.000000 sys
view raw result.log hosted with ❤ by GitHub

意外にも有意な差がない。Schemeの性能が高いんだと喜びたいところだが、以下のような理由だろう:
  • 暗号、復号及びMACは元々Cでやられている
  • TLSパケットの送受信は上記がメイン
  • (おそらく)OpenSSLはスタックの破棄みたいなセキュリティ上のオーバーヘッドがある
元々ビルトインにしようと思ったのは別の理由からなので、あまりおまけを期待しすぎてはいけない。よりセキュアになったということにしておく。

一応2月のリリースには間に合ったということで。

No comments:

Post a Comment