OpenSSL

SHA1_Final

SHA1_Finalで結果を得る。/docs/man1.0.2/crypto/SHA1_Final.htmlSHA1_Final.cで、SHA1_Finalに渡したsha1にSHA1ハッシュ値が格納される。 $ vi SHA1_Final.c $ gcc -o SHA1_Final SHA1_Final.c -lcrypto $ ./SHA1_Final SHA1_Init success! SHA1_Update suc…

SHA1_Update

SHA1_Updateでデータソースを追加する。/docs/man1.0.2/crypto/SHA1_Update.htmlSHA1_Update.cで、SHA1_Updateにstrを渡す。 $ vi SHA1_Update.c $ gcc -o SHA1_Update SHA1_Update.c -lcrypto $ ./SHA1_Update SHA1_Init success! SHA1_Update success! $こ…

SHA1_Init

SHA1ハッシュの計算もできる。 SHA1_Initで初期化。/docs/man1.1.0/crypto/SHA1_Init.htmlSHA1_Init.cで、SHA1_InitにSHA_CTX型sha_ctxのアドレスを渡す。 $ vi SHA1_Init.c $ gcc -o SHA1_Init SHA1_Init.c -lcrypto $ ./SHA1_Init SHA1_Init success! $こ…

MD5_Final

MD5_Finalで、結果のハッシュ値を受け取れる。/docs/man1.0.2/crypto/MD5_Final.htmlMD5_Final.cで、MD5_Finalに長さMD5_DIGEST_LENGTHのunsigned char型配列md5を渡して、ハッシュ値を格納。 md5の要素を1つずつfor文で出力。 $ vi MD5_Final.c $ gcc -o MD…

MD5_Update

MD5_Updateでデータソース(変換元の文字列)を渡す。/docs/man1.0.2/crypto/MD5_Update.htmlMD5_Update.cで、MD5_Updateに文字列"ABCDE"を格納したchar型配列strを渡す. $ vi MD5_Update.c $ gcc -o MD5_Update MD5_Update.c -lcrypto $ ./MD5_Update MD5_Ini…

MD5_Init

OpenSSLには、MD5ハッシュ値の計算機能もある。 まずは、MD5_Initで初期化。md5_init(3): MD2, MD4, and MD5 hash functions - Linux man pageMD5_Init.cで、MD5_InitにMD5_CTX型md5_ctxのアドレスを渡す。 戻り値が1なら初期化成功。 $ vi MD5_Init.c $ gcc…

SSL_read

SSL_readでレスポンスを読み込む。/docs/man1.1.0/ssl/SSL_read.htmlSSL_read.cで、SSL_readで1023バイトずつ読み込んで、読み込んだバイトを出力していくのを繰り返す。 $ vi SSL_read.c $ gcc -o SSL_read SSL_read.c -lssl -lcrypto $ ./SSL_read connect…

SSL_write

SSL_writeでリクエストの書き込みを行う。/docs/man1.1.0/ssl/SSL_write.htmlSSL_write.cで、用意したGETリクエスト文字列をSSL_writeで書き込み、戻り値のwrittenには書き込めたバイト数が返る。 $ vi SSL_write.c $ gcc -o SSL_write SSL_write.c -lssl -l…

SSL_connect

SSL_connectでサーバとのSSLハンドシェイクを行う。/docs/man1.0.2/ssl/SSL_connect.htmlSSL_connect.cで、SSL_connectにsslを渡して、戻り値が1なら成功。 SSLの切断にはSSL_shutdownを呼ぶ。 $ vi SSL_connect.c $ gcc -o SSL_connect SSL_connect.c -lssl…

SSL_set_fd

SSL_set_fdで、SSL接続情報とソケットファイルディスクリプタを紐づけることで、そのソケット通信をSSL通信とすることができる。Manual:SSL set fd(3) - OpenSSLWikiSSL_set_fd.cで、"www.google.co.jp"にポート443で接続するソケットsocを作成し、SSL_set_f…

SSL_new

SSL_newで、SSL接続情報を作成することもできる。 BIOを使わないでSSL接続をする場合はこれを使う。/docs/man1.0.2/ssl/SSL_new.htmlSSL_new.cで、SSL_newにctxを渡すことで、sslを作成。 sslの指すアドレスを出力。 SSL_newで作成した場合は、SSL_freeでssl…

SSL_load_error_strings

SSL_load_error_stringsもエラー文字列を読み込む関数だが、ERR_load_BIO_stringsとはちょっと違う模様。/docs/man1.0.2/crypto/SSL_load_error_strings.htmlSSL_load_error_strings.cで、ERR_load_BIO_stringsに加えて、SSL_load_error_stringsも呼ぶ。 $ v…

ERR_load_BIO_strings

ERR_load_BIO_stringsで、エラー文字列をロードすることで、意味の分からないエラーコードをある程度エラー文字列に変換して出力させる。OpenSSL API によるセキュア・プログラミング: 第 1 回 API の概要ERR_load_BIO_strings.cで、最初にERR_load_BIO_stri…

ERR_print_errors_fp

ERR_print_errors_fpにファイルポインタを指定すると、そのストリームにOpenSSLのエラーメッセージを書き込む。/docs/man1.1.0/crypto/ERR_print_errors_fp.htmlERR_print_errors_fp.cで、SSL_CTX_load_verify_locationsで"dummyurl"という存在しないパスを…

SSL_get_verify_result

SSL_get_verify_resultで、接続先のSSL証明書の検証結果を取得する。 これで問題ないならば、リクエストの書き込みをするという流れとなる。/docs/man1.0.2/ssl/SSL_get_verify_result.htmlSSL_get_verify_result.cで、BIO_do_connectで接続後、SSL_get_veri…

BIO_set_conn_hostname

非セキュアな場合は、BIO_new_connectで接続先ホスト名とポートを指定していたが、セキュアな場合に、BIO_new_ssl_connectにはSSL_CTX型ポインタしか渡せないため、BIO_set_conn_hostnameを使う。bio_set_conn_hostname(3): connect BIO - Linux man pageBIO…

SSL_set_mode

SSL_set_modeでSSLモードを設定する。/docs/man1.1.0/ssl/SSL_get_mode.htmlSSL_set_mode.cで、SSL_get_modeでなにもセットされていないことを確認してから、SSL_set_modeでSSL_MODE_AUTO_RETRYをセットする。 SSL_get_modeを再び呼んで、ssl_modeにSSL_MODE…

SSL_get_mode

SSL_get_modeで、現在のSSLモードを取得できる。/docs/man1.0.2/ssl/SSL_get_mode.htmlSSL_get_mode.cで、SSL_get_modeにsslを渡すと、long型変数ssl_modeにSSLモードの値が返ってくる。 $ vi SSL_get_mode.c $ gcc -o SSL_get_mode SSL_get_mode.c -lssl -l…

BIO_get_ssl

BIO構造体ポインタのbioから、今度はSSL接続情報を持つSSL構造体ポインタのsslを取得する。 それにはBIO_get_sslを使う。bio_get_ssl(3): SSL BIO - Linux man pageBIO_get_ssl.cで、BIO_get_sslの第1引数にbioを渡し、第2引数にsslのアドレスを渡すと、ssl…

BIO_new_ssl_connect

SSLの場合は、BIO_new_ssl_connectでコネクション作成をする。bio_new_ssl_connect(3): SSL BIO - Linux man pageBIO_new_ssl_connect.cで、BIO_new_ssl_connectにctxを渡してbioを受け取って、bioを出力。 終わったらBIO_free_allで解放。 $ vi BIO_new_ssl…

SSL_CTX_load_verify_locations

セキュアな接続をするには、SSL_CTX_load_verify_locationsで、信頼できる証明書ストアをロードする必要がある。/docs/man1.0.2/ssl/SSL_CTX_load_verify_locations.htmlSSL_CTX_load_verify_locations.cで、SSL_CTX_load_verify_locationsにSSLコンテキスト…

SSL_CTX_new

今度はセキュアな接続をしていこうとおもう。 まずは、SSL情報を持つSSLコンテキストを作成する。 SSLコンテキストはSSL_CTX_newで作成する。/docs/man1.0.2/ssl/SSL_CTX_new.htmlSSL_CTX_new.cで、SSL_CTX型ポインタctxを用意。SSL_library_initで初期化を…

BIO_write

今度は、BIO_writeでPUTリクエストを書き込み、ファイルをアップロードする。bio_write(3): BIO I/O functions - Linux man pageBIO_write.cで、bgstation0.comの下にshareフォルダを作って、そこにtest.txtをPUTする。 test.txtは、 ABCDE XYZ という文字列…

BIO_read

コネクションの接続ができたら、BIO_writeで接続先にリクエストを書き込み、BIO_readで接続先からレスポンスを読み込む。bio_read(3): BIO I/O functions - Linux man pageBIO_read.cで、bgstation0.comのindex.htmlをGETするリクエスト文字列request_strを…

BIO_do_connect

接続できたかどうかは、BIO_do_connectで確認する。Manual:BIO s connect(3) - OpenSSLWikiBIO_do_connect.cで、BIO_new_connectでコネクション作成したら、BIO_do_connectを呼んで、真なら成功。 (今回はポートを80に戻してる。443でもできたけど。) $ vi B…

BIO_new_connect

libjpeg以来のオープンソース編・・・。OpenSSLは、SSL通信を実現するためのオープンソースライブラリ・・・。/index.htmlまずは非セキュアな接続から始めてみる・・・。今回は、OpenSSL API によるセキュア・プログラミング: 第 1 回 API の概要を参考に、B…