RISC-Vデバイス上でwolfSSLを実行するにあたり、特別な要件はありません。wolfSSLは外部のプロジェクトに依存しておらず、非常に小さなメモリ使用量でTLSスタックを実行できます。
RISC-Vデバイスではありませんが、IoT環境でよく利用されるArduino Nano 33(合計32KB RAM + 256KBフラッシュ)で24KB未満のTLSスタックを動作させることができました。ほとんどの環境では、より大きなメモリリソースを使用できることと思います。
私たちは、よりスムーズにお使いいただけるようサンプルプログラムを多数提供しています。お探しのプログラムがwolfsslリポジトリ内に見つからないようでしたら、wolfssl-examplesリポジトリが役立つかもしれません。特定のデバイスやIDE向けのサンプルプロジェクトも公開しています。
組み込み環境で暗号ライブラリを使用する際には、継続的に正確な時刻同期を行うことが重要です。例えば証明書を扱う際、デバイスの時刻が証明書の有効期間内でなければ検証処理に失敗します。
これより、Espressif向けのwolfssl_clientサンプルプログラムを例にとって一連の流れを解説します。
Espressifのみならず、多くの環境に適用できます。
まず、wolfSSLを(必要に応じて)特定のディレクトリにコピーまたはインストールします。
コマンドラインシステムの場合
$ ./configure LDFLAGS="-L/path/to/wolfssl" CPPFLAGS="-I/path/to/includes"
カスタムuser_settings.hファイルを使用する場合
(例えばCMakeで)WOLFSSL_USER_SETTINGSを定義します
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWOLFSSL_USER_SETTINGS")
いくつかのwolfSSLファイルをインクルードします。
/* wolfSSL */
#include
#include
settings.hファイルは、wolfSSLを使用するすべてのソースファイルで、他のwolfSSLファイルの前にインクルードする必要があることにご注意ください。
また、user_settings.hファイルはプログラム内で明示的にインクルードしないでください。これはsettings.hファイルによってプリプロセスされ、インクルードされます。
wolfSSL ctx(コンテキストオブジェクト)を作成し、初期化します。
ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); /* SSL 3.0 - TLS 1.3. */
/* 代わりに 以下を使用することもできます。 */
/* ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method()); TLS 1.2のみ */
/* ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method()); TLS 1.3のみ */
ソケットを開きます。
sockfd = socket(AF_INET, SOCK_STREAM, 0)
必要に応じて、暗号スイートを設定します。
ret = wolfSSL_CTX_set_cipher_list(ctx, WOLFSSL_ESP32_CIPHER_SUITE);
クライアント証明書を設定します。
ret = wolfSSL_CTX_use_certificate_chain_buffer_format(ctx,
CTX_CLIENT_CERT,
CTX_CLIENT_CERT_SIZE,
CTX_CLIENT_CERT_TYPE);
CA証明書をロードします。
ret = wolfSSL_CTX_load_verify_buffer(ctx,
CTX_CA_CERT,
CTX_CA_CERT_SIZE,
CTX_CA_CERT_TYPE);
秘密鍵をロードします。
ret_i = wolfSSL_CTX_use_PrivateKey_buffer(ctx,
CTX_CLIENT_KEY,
CTX_CLIENT_KEY_SIZE,
CTX_CLIENT_KEY_TYPE);
wolfSSLセキュアソケットレイヤー接続を作成します。
ssl = wolfSSL_new(ctx)
wolfSSLにピアを検証するよう指示します。
以下はコールバック関数を必要としない場合の例です。
wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, 0);
接続します。
ret = connect(sockfd,
(struct sockaddr *)&servAddr,
sizeof(servAddr))
接続できたら、wolfSSL_write()でメッセージを送信します。
/* サーバーにメッセージを送信 */
do {
err = 0; /* エラーをリセット */
ret_i = wolfSSL_write(ssl, buff, len);
if (ret_i <= 0) {
err = wolfSSL_get_error(ssl, 0);
}
} while (err == WOLFSSL_ERROR_WANT_WRITE ||
err == WOLFSSL_ERROR_WANT_READ);
そして、wolfSSL_read()でメッセージを受信します。
do {
err = 0; /* エラーをリセット */
ret_i = wolfSSL_read(ssl, buff, sizeof(buff));
if (ret_i <= 0) {
err = wolfSSL_get_error(ssl, 0);
}
} while ((err == WOLFSSL_ERROR_WANT_READ) ||
(err == WOLFSSL_ERROR_WANT_WRITE) );
ビルドコマンドは次のようになります。
$ gcc -o simple_tls_client simple_tls_client.c \
-I/usr/local/include -L/usr/local/lib -lwolfssl
ご質問がございましたら、info@wolfssl.jp までお問い合わせください。
「RISC-VとwolfSSL Part 4: カスタマイズと応用」に続きます。
その他のパートはこちらからどうぞ。
原文:https://www.wolfssl.com/part-3-sample-application-integrating-wolfssl-with-a-risc-v