OpenSSL

BIO_get_mem_ptr

以前、OpenSSLでBase64変換しようとした時に、ファイル経由でしか変換できないとおもっていたが、プログラム内のメモリ上でも変換できる事がわかった。/docs/man1.0.2/man3/BIO_get_mem_ptr.html c++ - Base64 encoding and decoding with OpenSSL - Stack O…

HMAC

HMACを使って、HMAC-SHA1を計算する。/docs/man1.0.2/crypto/hmac.htmlHMAC.cで、keyは"ABC&XYZ" dataは"ABCDE" として、それぞれの文字列と長さをHMACに渡す。hmac_sha1を出力した後、Base64に変換して使うことが多いため、Base64変換した文字列も出力して…

BIO_s_mem

ファイルに文字列を書き込む場合は、BIO_new_file()でファイル用データシンクBIOを作成した。 メモリに文字列を書き込んでいく場合は、BIO_new()にBIO_s_mem()を渡すことで、メモリ用データシンクBIOを作成する。/docs/man1.0.2/crypto/BIO_s_mem.htmlBIO_s_…

BIO_f_base64

BIO_f_base64はBase64フィルタで、これを使うことでBase64に変換できる。/docs/man1.0.2/crypto/BIO_f_base64.htmlBIO_f_base64.cで、bufferとbase64、base64とfile、という形で連結。 $ vi test.txt $ gcc -o BIO_f_base64 BIO_f_base64.c -lcrypto $ ./BIO…

BIO_f_buffer

BIO_f_bufferはバッファ用フィルタBIOの作成に使うことは紹介した。/docs/man1.0.2/crypto/BIO_f_buffer.html今回は、BIO_pushで連結し、バッファBIOのbufferとファイルBIOのfileにそれぞれ文字列を書き込んでから、BIO_flushでフラッシュを試す。BIO_f_buff…

BIO_push

BIO_pushでBIOチェインを連結する。/docs/man1.1.0/crypto/BIO_push.html BIOとBase64BIO_push.cを作成し、BIO_pushでbufferとfileを連結する。 その後、BIO_writeでbufferに"ABCDE"を書き込み、BIO_flushでフラッシュすると、test.txtに書き込まれる。 $ vi…

BIO_new_file

BIO_new_fileでファイル用データシンクBIOを作成する。/docs/man1.0.2/crypto/BIO_new_file.htmlBIO_new_file.cに、test.txtを作成しておいて、BIO_new_file()で開く。 戻り値のポインタfileをprintfで出力。 $ vi BIO_new_file.c $ gcc -o BIO_new_file BIO…

BIO_new

BIO_newでBIO構造体のオブジェクトを作成できる。 今回は、バッファ用フィルタBIOを作成する。/docs/man1.1.0/crypto/BIO_new.htmlBIO_new.cに、と書く。 BIO_new()にBIO_f_buffer()の戻り値を渡すことで、バッファ用フィルタBIOが作成され、bufferにポイン…

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で初期化を…