mbedTLS implementation to Particle

Now I contribute/maintenance 2 TLS client library to the Particle, TlsTcpClient, MQTT-TLS. Many developer request is “Please update to the light-weight library”, then I update to the light version!!
Initital TLS version(0.0.1) size is 111Kbyte flash image, too big:-< here is TlsTcpClient sample sapplication build.

Now latest version MQTT-TLS(0.1.3), TlsTcpClient(0.1.15) 40Kbyte over size down 70Kbyte:) I think only TLS library real size maybe 60-70kbyte.

8 Cipher Suites are included in this library, TLS_RSA_WTIH_AES_256_[GCM|CBC]_SHA384、TLS_RSA_WTIH_AES_128_[GCM|CBC]_SHA256、TLS_RSA_PSK_WTIH_AES_256_[GCM|CBC]_SHA384、TLS_RSA_PSK_WTIH_AES_128_[GCM|CBC]_SHA256
here is MQTT-TLS tls 1.2 negotiation flow(my MQTT server port is 1883).

It’s hard to lightweight TLS library for think about the selection of the TLS protocol/cipher suites and algorithm, application have to include 2048bit root certificate as a result it waste 2048bit flash area. I think maybe more lightweight TLS library(about 50kbyte) could be. If more issue/request coming, I will try to update the library:)

—–

mbedTLSの組込で分かったこと に続いて…TLSをメンテしたり、色んなリクエストに対応しつつTLSの組込という事をしている。この2つTlsTcpClient, MQTT-TLS

めっちゃ軽量化した。111kbyteから70kbyteに、40kbyteの軽量化。これだけ空けばアプリも十分書けるでしょう。ちょっとヤベーなーと思って軽量化した理由のひとつに、”USING TWILIO SYNC WITH MQTT ON A PARTICLE PHOTON“で使っちゃってるやん…完全にネタで作ったのにDocに入れられると、危機感を覚えてマジメになるというか何というか。twilio以外にもmathworksとかsamsung, losant, 本家のIBMに…etc だったりMQTT使って便利だぜ!!みたいなのが使われていたし、マジメに対応しなきゃなーと思っていたりはしていた。

ただ、「軽量化して!!」というリクエストは受けていて、完全スルーしていたから良い機会だし、セキュリティを考えつつ軽量化をした。Cipher Suiteは固いものが8つ。まぁ大丈夫でしょう。

■ サイズとの戦い、軽量化!!軽量化!!軽量化!!
TLSは基本(サイズ的に)大きい。普通のPCでもメモリに16Gbyteとか余裕で搭載する時代に、たった数百〜数kbyteを巡って軽量化を考えるのは地味な修行になる。

例えば、2048bitのRoot CAをアプリに内包する必要があるけど、それだけで2kbyteもの領域とメモリが強制的に消費されてしまう。さらにサーバー証明書を使うとなると、さらに2048bitのメモリの領域が消えて行く。現時点の70Kbyteのサンプルアプリだと、約3%もの領域が何もしなくてもflash領域で使われて消えてしまう…これはぶっちゃけ辛い。

例えば、無理やり方法でやってみたのが、
1.端末のEEPROMにデータを退避させておく。
2.librayrで必要なメモリの一部でEEPROM/SRAMを利用。
といった、使える領域は何でも使ってみる戦術をやってみたりした。ただ、EEPROMは回数制限があるし、あまりにも変態的な使い方になるから、正攻法で普通に実装した。

またリクエストがあれば軽量化をすると思う。もう少し頑張れば50kbyte台も行けると思うし、特定のCipher Suiteに限定すれば更に軽くすることも出来るから。