/*---------------------------------------------------------------------------* Project: Horizon File: ssl_Connection.h Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 31299 $ *---------------------------------------------------------------------------*/ #ifndef NN_SSL_SSL_CONNECTION_H_ #define NN_SSL_SSL_CONNECTION_H_ #include #include #include #include #include #include #include #include #include #include #ifdef __cplusplus namespace nn { namespace ssl { /*! @brief SSLの通信を表すクラスです。本クラスの1つのインスタンスは、「1socketに対するSSL通信」を担います。 */ class Connection : private nn::util::NonCopyable { public: //---------------------------------------- //! @name 初期化/終了 //@{ /*! @brief コンストラクタです。SSL通信に利用するSocketを設定します。 @param[in] socketDesc Socketディスクリプタ */ explicit Connection(s32 socketDesc); /*! @brief コンストラクタです。Socketの設定を行わないタイプのコンストラクタですので、SSL通信前に別途 @ref AssignSocket で通信に利用するSocketを設定する必要があります。 */ explicit Connection(); /*! @brief デストラクタです。 */ virtual ~Connection(void); /*! @brief SSL通信に利用するSocketを設定します。すでにSocketを設定済みのConnectionには、設定できません。 @param[in] socketDesc Socketディスクリプタ @return Socketが設定されたか否か(trueなら設定された) @note 本関数では通信設定のみが実施され、ネットワークレベルの接続は行われません。ネットワーク通信が開始されるのは、 @ref DoHandshake 関数呼び出し時となります。 */ bool AssignSocket(s32 socketDesc); /*! @brief サーバ証明書取得用のバッファを設定します。@ref Initialize()実施後に使用してください。 本関数はバッファの設定までを行うものです。実際にサーバ証明書がバッファに書き込まれるのは、DoHandshake()実行時になります。 @param[in] bufferAddress バッファの先頭を指すポインタ。バッファ用メモリは4096 バイト整合である必要があります。 @param[in] bufferSize バッファのサイズ。 @return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultServerCertBufAlreadySetErr すでにサーバ証明書取得用バッファが設定されています。バッファを切り替える場合は、@ref Finalize を実行後、@ref Initialize からやり直してください。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。 */ nn::Result SetServerCertBuffer(uptr bufferAddress, size_t bufferSize); /*! @brief Connectionを初期化します。 ※本関数では通信設定のみが実施され、ネットワークレベルの接続は行われません。ネットワーク通信が開始されるのは、 @ref DoHandshake 関数呼び出し時となります。 @param[in] pServerName 通信先サーバのホスト名。SSL通信時には、このホスト名と「サーバ証明書の CommonName もしくは
subjectAltName 拡張領域の dnsName/iPAddress」 を比較し、一致していなかった場合は接続エラーとなります。
指定できる文字列長は、ヌル文字を含めてNN_SOCKET_MAXDNAMEバイトまでです。 @param[in] verifyOpt SSLのサーバ検証に関するオプション設定。デフォルトのサーバ検証では実施しない設定となっている検証オプションを、実施する場合に利用します。
(デフォルトのサーバ検証を用いる場合は、この引数は省略できます。)
引数には、実施する検証オプションを表す @ref nn::ssl::VerifyOption 列挙体の値を設定します。(複数の値を設定したい場合は、複数値の論理和を設定します。)
現在この引数に設定可能な値は、以下となります。
@ref nn::ssl::VERIFY_DATE : サーバ証明書の期限切れ検証を実施します。
@ref nn::ssl::USE_SESSION_CACHE : resumptionを利用します。(つまり同じホストに連続で接続する際、セッションの再利用を試みます。)
@ref nn::ssl::VERIFY_EV : EV証明書検証を実施します(この検証では、サーバ証明書がEV証明書に紐づいたもので無い限り、検証失敗となります。)
@ref nn::ssl::VERIFY_IGNORE : サーバ証明書検証を行いますが、検証結果は無視して接続します。(証明書検証の結果は、@ref GetCertVerifyErrors で取得できます。)
@ref nn::ssl::GET_ALL_SERVER_CERT_CHAIN : @ref SetServerCertBuffer で指定したバッファにサーバ証明書を保存する際、証明書チェーン内の全証明書データを保存します(本オプションが指定されない場合は、サーバ証明書のみが保存されます)
※@ref VerifyOption 列挙体に定義が存在するCommonName検証(@ref VERIFY_COMMON_NAME)、RootCA検証(@ref VERIFY_ROOT_CA)、SubjectAlternativeName検証(@ref VERIFY_SUBJECT_ALT_NAME)は、デフォルトで実施されます。
※@ref nn::ssl::GET_ALL_SERVER_CERT_CHAIN で証明書チェーン内の全証明書データを保存する場合は、データは[証明書データ長(4BYTE)]+[証明書データ]が並ぶ形となります。
  データの並び順は、チェーン先頭の証明書(=サーバ証明書)から、チェーン末尾(CA証明書)の順になります。ただしCA検証がNGの場合は、CA証明書データは含まれません(CA証明書が特定できなためです)。
@return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultProcessConnectionMaxErr 1プロセスの使用できるコネクションの最大数を越えていることを表すエラー。他のSSL通信が終了すれば利用可能になりますので、自身がインスタンス化している他の @ref Connection を終了(@ref Finalize )させてから、再実行してください。 @retval ResultIpcSessionMaxErr 同時に接続可能なIPCセッション数のセッションがすでに接続中を表すエラー。ある程度の時間を待機することで(その間に他のIPCセッションが成功すれば)、再実行が成功する場合があります。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。 */ nn::Result Initialize(const char* pServerName, u32 verifyOpt = VERIFY_NONE); /*! @brief @ref Initialize の別名関数です。互換性のために残されています。今後は @ref Initialize を使用してください。 */ nn::Result AssignServer(const char* pServerName, u32 verifyOpt = VERIFY_NONE){return Initialize(pServerName, verifyOpt);} /*! @brief 通信の終了処理を実施します。Connectionの終了処理と共に、Connectionに設定したソケットの解放処理も共に実施されます。 @return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultProtocolFailedErr 通信中(データ受信、あるいは送信中)にシャットダウンしたことを示します。このエラーが返った場合も、Connectionの終了処理とソケットの解放処理は実施されています。 @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。 @attention 機器が同時に管理できるSSL通信の数は有限です。使わなくなった通信に対しては必ずこの関数を実行して、他通信に管理リソースを回してください。 */ nn::Result Shutdown(void); //@} //---------------------------------------- //! @name SSLハンドシェイク //@{ /*! @brief SSL Handshakeを実施します。 @return 処理の結果が返ります。
@return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultProtocolFailedErr SSLプロトコルの失敗によりエラーが起こったことを表します(サーバー側でクライアント証明書の検証が失敗した場合等)。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。 @retval ResultWantRead 非同期ソケット使用時に 受信関数(nn::socket::Read()等)が操作の完了を待たずに返ってきたことを表します。再試行してください。 @retval ResultWantWrite 非同期ソケット使用時に 受信関数(nn::socket::Write()等)が操作の完了を待たずに返ってきたことを表します。再試行してください。 @retval ResultSystemCallErr 内部で使用しているライブラリ関数(主にSocket関数)が予期せぬエラーを返したことを表します(サーバーから異常な応答があった場合等)。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。 @retval ResultSocketZeroReturn ソケットの読み込み/書き込み関数が0を返した(通信が切断された)ことを表します。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。 @retval ResultWantConnect 非同期ソケット使用時にまだ接続が完了していないことを表します。再試行してください。 @retval ResultVerifyCertErr 証明書検証に失敗したことを表します(これが返った場合、失敗の理由を @ref nn::ssl::Connection::GetCertVerifyErrors で取得することが可能です)。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。 @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。 */ nn::Result DoHandshake(void); /*! @brief SSL Handshakeを実施すると共に、SetServerCertBuffer()で設定したサーバ証明書保存用バッファに保存された証明書データの情報を、引数で受け取ることができます。 SetServerCertBuffer()が実行されていない(=サーバ証明書保存用バッファが設定されていない)場合は、@ref DoHandshake()と同様の動作となります。 @param[out] pServerCertSize 保存されたサーバ証明書データのサイズを格納するバッファ。 @param[out] pServerCertNum 保存されたサーバ証明書の個数を格納するバッファ。(GET_ALL_SERVER_CERT_CHAINオプションを有効にしてサーバ証明書チェーン内の全証明書データを保存した場合に、証明書チェーン内の証明書数を取得するために用います。サーバ証明書のみ取得する場合など、個数を必要としない場合は省略できます) @return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultFailToGetServerCert 証明書データのサイズがSetServerCertBuffer()で設定したバッファよりも大きいため、全データを保存できませんでした。(サーバーとの接続は正常終了していますので、以降の通信を続ける事はできます。) @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 上記以外の理由で失敗しました(エラー内容は、@ref nn::ssl::Connection::DoHandshake と同様です。 */ nn::Result DoHandshake( size_t* pServerCertSize, u32* pServerCertNum = NULL); //@} //---------------------------------------- //! @name データの送受信 //@{ /*! @brief SSL接続経由でデータの読み込みを行います。 読み込みに成功した場合は@ref ResultSuccess が返ります。すでに全データを読み込みが完了している場合に本関数を実行すると、@ref ResultSocketZeroReturn が返ります。 @param[out] pDataBuf データを格納するバッファ。 @param[in] dataBufSize pDataBufのサイズ @param[out] pReadSizeCourier 読み取ったデータサイズを格納するバッファ。(読み取ったデータサイズを必要としない場合は、省略可) @return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultSocketZeroReturn 受信関数( @ref nn::socket::Read 等)が0を返したことを表します。全データの読み込みが完了したなどで、サーバ側がSSL接続を閉じた場合に返されます。 @retval ResultProtocolFailedErr SSLプロトコルの失敗によりエラーが起こったことを表します。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。 @retval ResultWantRead 非同期ソケット使用時に受信関数( @ref nn::socket::Read 等)が操作の完了を待たずに返ってきたことを表します。再試行してください。 @retval ResultSystemCallErr 内部で使用しているライブラリ関数(主にSocket関数)が予期せぬエラーを返したことを表します(サーバーから異常な応答があった場合等)。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。 @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。 */ nn::Result Read(u8* pDataBuf, size_t dataBufSize, size_t* pReadSizeCourier = NULL); /*! @brief SSL接続経由で受信済みのデータを、状態を変更せずに先読みします。 読み込みに成功した場合は@ref ResultSuccess が返ります。すでに全データを読み込みが完了している場合に本関数を実行すると、@ref ResultSocketZeroReturn が返ります。 @param[out] pDataBuf データを格納するバッファ。 @param[in] dataBufSize pDataBufのサイズ @param[out] pReadSizeCourier 読み取ったデータサイズを格納するバッファ。(読み取ったデータサイズを必要としない場合は、省略可) @return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultSocketZeroReturn 受信関数( @ref nn::socket::Read 等)が0を返したことを表します。全データの読み込みが完了したなどで、サーバ側がSSL接続を閉じた場合に返されます。 @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 上記以外の理由で失敗しました(エラー内容については、引数無しの @ref nn::ssl::Connection::Read と同様です)。 */ nn::Result Peek(u8* pDataBuf, size_t dataBufSize, size_t* pReadSizeCourier = NULL); /*! @brief SSL接続経由でデータの書き込みを行います。 @param[out] pDataBuf 書き込むデータを格納したバッファ。 @param[in] dataBufSize pDataBufのサイズ @param[out] pWrittenDataSizeCourier 書き込んだデータサイズを格納するバッファ。(書き込んだデータサイズを必要としない場合は、省略可) @return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultProtocolFailedErr SSLプロトコルの失敗によりエラーが起こったことを表します。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。 @retval ResultWantWrite 非同期ソケット使用時に送信関数( @ref nn::socket::Write )が操作の完了を待たずに返ってきたことを表します。再試行してください。 @retval ResultSystemCallErr 内部で使用しているライブラリ関数(主にSocket関数)が予期せぬエラーを返したことを表します(サーバーから異常な応答があった場合等)。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。 @retval ResultSocketZeroReturn 送信関数( @ref nn::socket::Write 等)が0を返したことを表します。サーバ側がSSL接続を閉じました。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。 @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。 */ nn::Result Write(const u8* pDataBuf, size_t dataBufSize, size_t* pWrittenDataSizeCourier = NULL); //@} //---------------------------------------- //! @name 証明書&CRL設定 //@{ /*! @brief SSL接続で使用する証明書ストアを設定します。API利用者が独自の証明書ストアを設定するためのAPIです。 このAPIで設定された証明書は、信頼する証明書と認識されます。
CA証明書を設定した場合、サーバから送られた証明書チェーンのルートCA検証における検証成功候補として、設定した証明書のCAが登録されます。
(つまりルートCAが設定したCAであれば、ルートCA検証成功となります。)
サーバ証明書を設定した場合、サーバから送られた証明書がその証明書と合致すれば、証明書検証が成功します。
※サーバ証明書を設定した場合、証明書通しがデータとして合致すれば検証成功となりますので、
サーバ証明書内容の検証は行われません。(例えば @ref nn::ssl::VERIFY_DATE オプションを指定しても、データが合致さえすれば期限確認は行われませんので、注意してください。)
CA証明書を設定した場合は、サーバから送られた証明チェーン内のCA証明書以外の証明書については、証明書内容の検証も行われます。
(例えば @ref nn::ssl::VERIFY_DATE オプションを指定されていれば、各証明書の有効期限について、機器の時計時刻を基に検証が行われます。)
@param[in] certStore 設定する証明書ストア @return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。 */ nn::Result SetServerCertStore(CertStore& certStore); /*! @brief SSL接続で使用するクライアント証明書を設定します。 @param[in] clientCert 設定するクライアント証明書。 @return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。 */ nn::Result SetClientCert(ClientCert& clientCert); /*! @brief SSL接続で使用するCRLストアを設定します。API利用者が独自のCRLストアを設定するためのAPIです。 @param[in] crlStore 設定するCRLストア @return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。 */ nn::Result SetCRLStore(CrlStore& crlStore); /*! @brief 信頼するEV証明書ポリシーIDを設定します。 @param[in] pPolicyId 信頼するEV証明書のOID文字列("1.3.6.1.4.1.4146.1.1"など)。 @return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。 */ nn::Result AddEVPolicyId( const char* pPolicyId ); //@} /** @brief 指定したビットのSSL通信の検証内容を削除します。 デフォルトで検証する項目は安全を守るためのものです。デバッグ目的以外で検証項目を減らさないでください。 @param[in] excludeVerifyOptions SSLの検証方法に関して、除外対象を表すオプション。除外したい検証方法を表す@ref nn::ssl::VerifyOption列挙体の値を設定します。(複数の値を設定したい場合は、複数値の論理を設定します。)
現在この引数に設定可能な値は、以下となります。
@ref nn::ssl::VERIFY_COMMON_NAME : 証明書の CommonName が @ref AssignServer 関数で指定したホスト名と一致するか検証します。
@ref nn::ssl::VERIFY_SUBJECT_ALT_NAME : CommonNameの検証を行う際に、証明書にSubjectAltNameの記述がある場合はそちらを優先して使用します。
@ref nn::ssl::VERIFY_ROOT_CA : 証明書の Root CA を検証します。
@return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultProtocolFailedErr 処理が失敗したことを示します。(不正な引数など) @retval ResultInternalSslIdErr 対象のSSLコネクションは不正なものです。(ライブラリ内部エラーです) @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。 */ nn::Result DisableVerifyOptionForDebug( u32 excludeVerifyOptions ); /** @brief 対象SSL通信の暗号化の情報を得ます。本関数は特殊なユースケース用の関数であり、通常ユーザーの利用は想定していません。 @param[out] pVersionBuf バージョンの文字列を格納するバッファ @param[in] versionBufSize pVersionBufのサイズ @param[out] pCipherKindStrBuf 暗号の種類の文字列を格納するバッファ @param[in] cipherKindStrBufSize pCipherKindStrBufSizeのサイズ @param[out] pAlgBits 暗号のアルゴリズム上のキーのビット数を格納するバッファ @param[out] pEffectiveBits 暗号の実効強度のビット数を格納するバッファ @return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultProtocolFailedErr 処理が失敗したことを示します。(不正な引数など) @retval ResultInternalSslIdErr 対象のSSLコネクションは不正なものです。(ライブラリ内部エラーです) @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。 */ nn::Result GetCipherInfo( char* pVersionBuf, size_t versionBufSize, char* pCipherKindStrBuf, size_t cipherKindStrBufSize, s32* pAlgBits, s32* pEffectiveBits ); /*** @brief 証明書検証の結果を取得します。 @param[out] pCertVerifyErrors 証明書検証結果。証明書検証結果フラグ(nn::ssl::CertVerifyError)の論理和です。 @return 関数の実行結果を返します。以下に挙げる Result を返します。
@retval ResultSuccess 処理に成功しました。 @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。 @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。 @retval 上記以外 想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。 */ nn::Result GetCertVerifyErrors( u32* pCertVerifyErrors ); #ifdef NDEBUG_ENABLE /*** @brief This is for testing purposes only and is used for obtaining the connection handle of this object. @return The connection handle of this object.
*/ ConnectionHandle GetConnectionHandle(){return m_connectHandle;} #endif private: /** @brief 接続先サーバとsocketがAssign済みか否かを表すフラグ。 */ bool m_isAssigned; NN_PADDING3; /** @brief 利用するSocketのディスクリプション。 */ s32 m_socket; /** @brief 対象コネクションのID。 */ ConnectionHandle m_connectHandle; /** @brief SSLプロセスとのIPCセッション */ nn::Handle m_privateIpcSession; /** @brief SSLプロセスとのIPCクライアント */ ConnectionIpc m_privateIpcClient; /** @brief サーバ証明書取得用共有メモリバッファ。 */ nn::os::TransferMemoryBlock m_serverCertBuffer; /** * @brief 接続先サーバとsocketがAssign済みか否かを返す。 * @return 接続先サーバとsocketがAssign済みか否か(trueが設定済み) */ bool IsAssigned(){return m_isAssigned;} /** * @brief コネクション専用IPCクライアントを割り当てます。 * @return 処理の結果。 */ Result AssignPrivateIpcClient( void ); /** * @brief 対象コネクションのShutdown処理を行います。 * @return 処理の結果。(すでにコネクションがShutdownされていた場合や、まだAssignServer()されていなかった場合は、ResultSuccess()が返ります。) */ Result ShutdownConnection( void ); }; } // end of namespace ssl } // end of namespace nn #endif // __cplusplus #include /*! @addtogroup nn_ssl ssl @{ @defgroup nn_ssl_Connection_c Connection (C) @brief @ref nn::ssl::Connection の C インタフェースモジュールです。 @{ */ /*! @struct nnsslConnection @brief SSLのConnectionを表す C の構造体です。 @brief 対応するクラス @ref nn::ssl::Connection を参照してください。 */ NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnsslConnection, nn::ssl::Connection, 56, u32); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::AssignSocket を参照してください。 */ NN_EXTERN_C bool nnsslConnectionAssignSocket(nnsslConnection* this_, s32 socket); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::AssignServer を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionAssignServer(nnsslConnection* this_, const char* pServerName, u32 verifyOpt); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::SetServerCertBuffer を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionSetServerCertBuffer(nnsslConnection* this_, uptr bufferAddress, size_t bufferSize); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::Shutdown を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionShutdown(nnsslConnection* this_); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::DoHandshake(void) を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionDoHandshake(nnsslConnection* this_); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::DoHandshake(u8* pServerCertBuf, size_t* pServerCertSize, u32* pServerCertNum) を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionDoHandshakeEx(nnsslConnection* this_, size_t* pServerCertSize, u32* pServerCertNum); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::Read() を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionRead(nnsslConnection* this_, u8* pDataBuf, size_t dataBufSize, size_t* pReadSizeCourier); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::Peek() を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionPeek(nnsslConnection* this_, u8* pDataBuf, size_t dataBufSize, size_t* pReadSizeCourier); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::Peek() を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionWrite(nnsslConnection* this_, const u8* pDataBuf, size_t dataBufSize, size_t* pWrittenDataSizeCourier); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::SetServerCertStore() を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionSetServerCertStore(nnsslConnection* this_, nnsslCertStore* certStore); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::SetClientCert() を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionSetClientCert(nnsslConnection* this_, nnsslClientCert* pClientCert); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::SetCRLStore() を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionSetCRLStore(nnsslConnection* this_, nnsslCrlStore* crlStore); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::DisableVerifyOptionForDebug() を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionDisableVerifyOptionForDebug(nnsslConnection* this_, u32 excludeVerifyOptions); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::GetCipherInfo() を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionGetCipherInfo(nnsslConnection* this_, char* pVersionBuf, size_t versionBufSize, char* pCipherKindStrBuf, size_t cipherKindStrBufSize, s32* pAlgBits, s32* pEffectiveBits ); /*! @brief 対応する C++ 関数 @ref nn::ssl::Connection::GetCertVerifyErrors( ) を参照してください。 */ NN_EXTERN_C nnResult nnsslConnectionGetCertVerifyErrors(nnsslConnection* this_, u32* pCertVerifyErrors ); /*! @} @} */ #endif /* NN_SSL_SSL_CONNECTION_H_ */