まずB.G-STATIONとは何ぞや

B.G-STATION Advent Calendar 2017 1日目です。 adventar.org まずは何ぞやって話です まあ、B.G-STATIONは、僕が以前から運営していたというか運営しているサイトであり、同人個人サークル名でもあります。 B.G-STATION 車輪のx発明 ~B.G's Blog~代表は僕で…

VizCommand #36 viewコマンドで画像(ビットマップファイル)の表示

画像を表示するviewコマンドを実装する。まず、WindowListItem.cppで、 OnCreateで、赤のペン、ブラシを、黒のペン、ブラシに変更。Console.cppで、 "view"と入力されたら、SendMessageでUM_STREAMCOMMAND。StreamConsole.hは、 OnViewを追加。StreamConsole…

VizCommand #35 walkコマンドでフォルダの移動

linuxコマンドのcdに相当するフォルダ移動コマンドwalkを実装する。Console.hで、 Consoleオブジェクトが生成された時のデフォルトカレントパスとしてm_tstrDefaultCurrentPathを用意。 コンストラクタもtstrDefaultCurrentPathを引数に取るものを追加。 そ…

VizCommand #34 アイテムズパネルが大きくなるたびに自動的に下にスクロール

これまで、アイテムズパネルが大きくなってスクロールバーが出てきて、どんどんウィンドウリストアイテムが追加されていっても、下に自動でスクロールされることはなく、自分で下までスクロールしないといけなかったが、今回は自動スクロールに対応する。res…

VizCommand #33 listコマンドの相対パス対応

これまではlistコマンドに渡すパスは絶対パスであったが、そろそろ相対パスにも対応したい。ConsoleCore.hで、 SetCurrentPath、GetCurrentPath、そしてGetFullPathを用意。ConsoleCore.cppで、 SetCurrentPathでは、Win32APIのSetCurrentDirectoryでカレン…

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コンテキスト…

VizCommand #32 listコマンドでパラメータ無しの場合にカレントパスを補完&デフォルトのカレントパスをマイドキュメントに変更

そろそろ、パラメータ無しでlistコマンドを使えるようにしたい。ConsoleCore.hで、 m_tstrMyDocumentPathとGetMyDocumentPathを追加。ConsoleCore.cppは、 このようにマイドキュメント(現在のユーザのドキュメント)のパスを取得。 GetMyDocumentPathで取得し…

VizCommand #31 listコマンドのCCommandクラス対応

コメントアウトしていたlistコマンドもCCommandに対応させる。Command.hに、 GetParamを追加。 また、tstring&ではなく、通常のtstringに変更。 (GetCommandNameも)Command.cppで、 GetParamは、m_vectstrCommandTokenの範囲内なら、index番目を返す。 そう…

VizCommand #30 コマンドの定義

コマンド文字列をハンドラにそのまま渡して、各所で(しかも何度も)パースさせるのもちょっと酷い。 そこで、コマンド文字列じゃなく、パース済みのコマンドオブジェクトを渡すようにコマンドクラスを定義する。Command.hを追加して、 CCommandのメンバ変数は…

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