1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     ssl_Connection.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 31299 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_SSL_SSL_CONNECTION_H_
17 #define NN_SSL_SSL_CONNECTION_H_
18 
19 #include <nn/Result.h>
20 #include <nn/Handle.h>
21 #include <nn/os.h>
22 #include <nn/util/util_NonCopyable.h>
23 #include <nn/ssl/ssl_Const.h>
24 #include <nn/ssl/ssl_Types.h>
25 #include <nn/ssl/ssl_CertStore.h>
26 #include <nn/ssl/ssl_CrlStore.h>
27 #include <nn/ssl/ssl_ClientCert.h>
28 #include <nn/ssl/ssl_ConnectionIpc.h>
29 
30 
31 #ifdef __cplusplus
32 
33 
34 namespace nn {
35 namespace ssl {
36 
37 
38 /*!
39   @brief SSLの通信を表すクラスです。本クラスの1つのインスタンスは、「1socketに対するSSL通信」を担います。
40 */
41 class Connection : private nn::util::NonCopyable<Connection>
42 {
43 public:
44 
45     //----------------------------------------
46     //! @name 初期化/終了
47     //@{
48 
49     /*!
50       @brief コンストラクタです。SSL通信に利用するSocketを設定します。
51       @param[in] socketDesc Socketディスクリプタ
52     */
53     explicit Connection(s32 socketDesc);
54 
55     /*!
56       @brief コンストラクタです。Socketの設定を行わないタイプのコンストラクタですので、SSL通信前に別途  @ref AssignSocket で通信に利用するSocketを設定する必要があります。
57     */
58     explicit Connection();
59 
60     /*!
61       @brief デストラクタです。
62     */
63     virtual ~Connection(void);
64 
65     /*!
66       @brief  SSL通信に利用するSocketを設定します。すでにSocketを設定済みのConnectionには、設定できません。
67       @param[in]  socketDesc   Socketディスクリプタ
68       @return Socketが設定されたか否か(trueなら設定された)
69       @note   本関数では通信設定のみが実施され、ネットワークレベルの接続は行われません。ネットワーク通信が開始されるのは、 @ref DoHandshake 関数呼び出し時となります。
70     */
71     bool AssignSocket(s32 socketDesc);
72 
73     /*!
74       @brief  サーバ証明書取得用のバッファを設定します。@ref Initialize()実施後に使用してください。
75               本関数はバッファの設定までを行うものです。実際にサーバ証明書がバッファに書き込まれるのは、DoHandshake()実行時になります。
76       @param[in]  bufferAddress   バッファの先頭を指すポインタ。バッファ用メモリは4096 バイト整合である必要があります。
77       @param[in]  bufferSize      バッファのサイズ。
78       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
79       @retval ResultSuccess       処理に成功しました。
80       @retval ResultServerCertBufAlreadySetErr すでにサーバ証明書取得用バッファが設定されています。バッファを切り替える場合は、@ref Finalize を実行後、@ref Initialize からやり直してください。
81       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
82       @retval 上記以外            想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。
83     */
84     nn::Result SetServerCertBuffer(uptr bufferAddress, size_t bufferSize);
85 
86     /*!
87       @brief  Connectionを初期化します。
88                                      ※本関数では通信設定のみが実施され、ネットワークレベルの接続は行われません。ネットワーク通信が開始されるのは、 @ref DoHandshake 関数呼び出し時となります。
89       @param[in]  pServerName   通信先サーバのホスト名。SSL通信時には、このホスト名と「サーバ証明書の CommonName もしくは<BR/>
90                                 subjectAltName 拡張領域の dnsName/iPAddress」 を比較し、一致していなかった場合は接続エラーとなります。<BR/>
91                                                                                      指定できる文字列長は、ヌル文字を含めてNN_SOCKET_MAXDNAMEバイトまでです。
92       @param[in]  verifyOpt     SSLのサーバ検証に関するオプション設定。デフォルトのサーバ検証では実施しない設定となっている検証オプションを、実施する場合に利用します。<BR/>
93                                 (デフォルトのサーバ検証を用いる場合は、この引数は省略できます。)<BR/>
94                                                                                      引数には、実施する検証オプションを表す  @ref nn::ssl::VerifyOption 列挙体の値を設定します。(複数の値を設定したい場合は、複数値の論理和を設定します。)<BR/>
95                                                                                      現在この引数に設定可能な値は、以下となります。<BR/>
96                                     @ref nn::ssl::VERIFY_DATE         : サーバ証明書の期限切れ検証を実施します。<BR/>
97                                     @ref nn::ssl::USE_SESSION_CACHE   : resumptionを利用します。(つまり同じホストに連続で接続する際、セッションの再利用を試みます。)<BR/>
98                                     @ref nn::ssl::VERIFY_EV           : EV証明書検証を実施します(この検証では、サーバ証明書がEV証明書に紐づいたもので無い限り、検証失敗となります。)<BR/>
99                                     @ref nn::ssl::VERIFY_IGNORE       : サーバ証明書検証を行いますが、検証結果は無視して接続します。(証明書検証の結果は、@ref GetCertVerifyErrors で取得できます。)<BR/>
100                                     @ref nn::ssl::GET_ALL_SERVER_CERT_CHAIN : @ref SetServerCertBuffer で指定したバッファにサーバ証明書を保存する際、証明書チェーン内の全証明書データを保存します(本オプションが指定されない場合は、サーバ証明書のみが保存されます)<BR/>
101                                                                                      ※@ref VerifyOption 列挙体に定義が存在するCommonName検証(@ref VERIFY_COMMON_NAME)、RootCA検証(@ref VERIFY_ROOT_CA)、SubjectAlternativeName検証(@ref VERIFY_SUBJECT_ALT_NAME)は、デフォルトで実施されます。<BR/>
102                                                                                      ※@ref nn::ssl::GET_ALL_SERVER_CERT_CHAIN で証明書チェーン内の全証明書データを保存する場合は、データは[証明書データ長(4BYTE)]+[証明書データ]が並ぶ形となります。<BR/>
103                                                                                        データの並び順は、チェーン先頭の証明書(=サーバ証明書)から、チェーン末尾(CA証明書)の順になります。ただしCA検証がNGの場合は、CA証明書データは含まれません(CA証明書が特定できなためです)。<BR/>
104       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
105       @retval ResultSuccess       処理に成功しました。
106       @retval ResultProcessConnectionMaxErr 1プロセスの使用できるコネクションの最大数を越えていることを表すエラー。他のSSL通信が終了すれば利用可能になりますので、自身がインスタンス化している他の @ref Connection を終了(@ref Finalize )させてから、再実行してください。
107       @retval ResultIpcSessionMaxErr    同時に接続可能なIPCセッション数のセッションがすでに接続中を表すエラー。ある程度の時間を待機することで(その間に他のIPCセッションが成功すれば)、再実行が成功する場合があります。
108       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
109       @retval 上記以外            想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。
110     */
111     nn::Result Initialize(const char* pServerName, u32 verifyOpt = VERIFY_NONE);
112 
113     /*!
114       @brief  @ref Initialize の別名関数です。互換性のために残されています。今後は @ref Initialize を使用してください。
115     */
116     nn::Result AssignServer(const char* pServerName, u32 verifyOpt = VERIFY_NONE){return Initialize(pServerName, verifyOpt);}
117 
118     /*!
119       @brief  通信の終了処理を実施します。Connectionの終了処理と共に、Connectionに設定したソケットの解放処理も共に実施されます。
120       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
121       @retval ResultSuccess       処理に成功しました。
122       @retval ResultProtocolFailedErr       通信中(データ受信、あるいは送信中)にシャットダウンしたことを示します。このエラーが返った場合も、Connectionの終了処理とソケットの解放処理は実施されています。
123       @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。
124       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
125       @retval 上記以外            想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。
126       @attention 機器が同時に管理できるSSL通信の数は有限です。使わなくなった通信に対しては必ずこの関数を実行して、他通信に管理リソースを回してください。
127     */
128     nn::Result Shutdown(void);
129 
130     //@}
131 
132 
133     //----------------------------------------
134     //! @name SSLハンドシェイク
135     //@{
136 
137     /*!
138       @brief  SSL Handshakeを実施します。
139       @return 処理の結果が返ります。<BR>
140       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
141       @retval ResultSuccess       処理に成功しました。
142       @retval ResultProtocolFailedErr SSLプロトコルの失敗によりエラーが起こったことを表します(サーバー側でクライアント証明書の検証が失敗した場合等)。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。
143       @retval ResultWantRead 非同期ソケット使用時に 受信関数(nn::socket::Read()等)が操作の完了を待たずに返ってきたことを表します。再試行してください。
144       @retval ResultWantWrite 非同期ソケット使用時に 受信関数(nn::socket::Write()等)が操作の完了を待たずに返ってきたことを表します。再試行してください。
145       @retval ResultSystemCallErr    内部で使用しているライブラリ関数(主にSocket関数)が予期せぬエラーを返したことを表します(サーバーから異常な応答があった場合等)。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。
146       @retval ResultSocketZeroReturn ソケットの読み込み/書き込み関数が0を返した(通信が切断された)ことを表します。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。
147       @retval ResultWantConnect 非同期ソケット使用時にまだ接続が完了していないことを表します。再試行してください。
148       @retval ResultVerifyCertErr 証明書検証に失敗したことを表します(これが返った場合、失敗の理由を @ref nn::ssl::Connection::GetCertVerifyErrors で取得することが可能です)。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。
149       @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。
150       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
151       @retval 上記以外            想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。
152     */
153     nn::Result DoHandshake(void);
154 
155     /*!
156       @brief  SSL Handshakeを実施すると共に、SetServerCertBuffer()で設定したサーバ証明書保存用バッファに保存された証明書データの情報を、引数で受け取ることができます。
157               SetServerCertBuffer()が実行されていない(=サーバ証明書保存用バッファが設定されていない)場合は、@ref DoHandshake()と同様の動作となります。
158       @param[out]  pServerCertSize 保存されたサーバ証明書データのサイズを格納するバッファ。
159       @param[out]  pServerCertNum  保存されたサーバ証明書の個数を格納するバッファ。(GET_ALL_SERVER_CERT_CHAINオプションを有効にしてサーバ証明書チェーン内の全証明書データを保存した場合に、証明書チェーン内の証明書数を取得するために用います。サーバ証明書のみ取得する場合など、個数を必要としない場合は省略できます)
160       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
161       @retval ResultSuccess       処理に成功しました。
162       @retval ResultFailToGetServerCert 証明書データのサイズがSetServerCertBuffer()で設定したバッファよりも大きいため、全データを保存できませんでした。(サーバーとの接続は正常終了していますので、以降の通信を続ける事はできます。)
163       @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。
164       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
165       @retval 上記以外            上記以外の理由で失敗しました(エラー内容は、@ref nn::ssl::Connection::DoHandshake と同様です。
166     */
167     nn::Result DoHandshake( size_t* pServerCertSize, u32* pServerCertNum = NULL);
168 
169     //@}
170 
171     //----------------------------------------
172     //! @name データの送受信
173     //@{
174 
175     /*!
176       @brief  SSL接続経由でデータの読み込みを行います。
177 
178               読み込みに成功した場合は@ref ResultSuccess が返ります。すでに全データを読み込みが完了している場合に本関数を実行すると、@ref ResultSocketZeroReturn が返ります。
179 
180       @param[out]  pDataBuf データを格納するバッファ。
181       @param[in]   dataBufSize pDataBufのサイズ
182       @param[out]  pReadSizeCourier 読み取ったデータサイズを格納するバッファ。(読み取ったデータサイズを必要としない場合は、省略可)
183       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
184       @retval ResultSuccess       処理に成功しました。
185       @retval ResultSocketZeroReturn 受信関数( @ref nn::socket::Read 等)が0を返したことを表します。全データの読み込みが完了したなどで、サーバ側がSSL接続を閉じた場合に返されます。
186       @retval ResultProtocolFailedErr  SSLプロトコルの失敗によりエラーが起こったことを表します。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。
187       @retval ResultWantRead  非同期ソケット使用時に受信関数( @ref nn::socket::Read 等)が操作の完了を待たずに返ってきたことを表します。再試行してください。
188       @retval ResultSystemCallErr    内部で使用しているライブラリ関数(主にSocket関数)が予期せぬエラーを返したことを表します(サーバーから異常な応答があった場合等)。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。
189       @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。
190       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
191       @retval 上記以外            想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。
192 
193     */
194     nn::Result Read(u8* pDataBuf, size_t dataBufSize, size_t* pReadSizeCourier = NULL);
195 
196 
197     /*!
198       @brief  SSL接続経由で受信済みのデータを、状態を変更せずに先読みします。
199 
200               読み込みに成功した場合は@ref ResultSuccess が返ります。すでに全データを読み込みが完了している場合に本関数を実行すると、@ref ResultSocketZeroReturn が返ります。
201 
202       @param[out]  pDataBuf データを格納するバッファ。
203       @param[in]   dataBufSize pDataBufのサイズ
204       @param[out]  pReadSizeCourier 読み取ったデータサイズを格納するバッファ。(読み取ったデータサイズを必要としない場合は、省略可)
205       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
206       @retval ResultSuccess       処理に成功しました。
207       @retval ResultSocketZeroReturn 受信関数( @ref nn::socket::Read 等)が0を返したことを表します。全データの読み込みが完了したなどで、サーバ側がSSL接続を閉じた場合に返されます。
208       @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。
209       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
210       @retval 上記以外            上記以外の理由で失敗しました(エラー内容については、引数無しの @ref nn::ssl::Connection::Read と同様です)。
211     */
212     nn::Result Peek(u8* pDataBuf, size_t dataBufSize, size_t* pReadSizeCourier = NULL);
213 
214     /*!
215       @brief  SSL接続経由でデータの書き込みを行います。
216       @param[out]  pDataBuf 書き込むデータを格納したバッファ。
217       @param[in]   dataBufSize pDataBufのサイズ
218       @param[out]  pWrittenDataSizeCourier 書き込んだデータサイズを格納するバッファ。(書き込んだデータサイズを必要としない場合は、省略可)
219       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
220       @retval ResultSuccess       処理に成功しました。
221       @retval ResultProtocolFailedErr  SSLプロトコルの失敗によりエラーが起こったことを表します。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。
222       @retval ResultWantWrite  非同期ソケット使用時に送信関数( @ref nn::socket::Write )が操作の完了を待たずに返ってきたことを表します。再試行してください。
223       @retval ResultSystemCallErr    内部で使用しているライブラリ関数(主にSocket関数)が予期せぬエラーを返したことを表します(サーバーから異常な応答があった場合等)。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。
224       @retval ResultSocketZeroReturn 送信関数( @ref nn::socket::Write 等)が0を返したことを表します。サーバ側がSSL接続を閉じました。再度通信を行うには、@ref Connection の @ref Finalize を実行後、@ref Initialize からやり直してください。
225       @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。
226       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
227       @retval 上記以外            想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。
228     */
229     nn::Result Write(const u8* pDataBuf, size_t dataBufSize, size_t* pWrittenDataSizeCourier = NULL);
230 
231     //@}
232 
233     //----------------------------------------
234     //! @name 証明書&CRL設定
235     //@{
236 
237     /*!
238       @brief  SSL接続で使用する証明書ストアを設定します。API利用者が独自の証明書ストアを設定するためのAPIです。
239 
240               このAPIで設定された証明書は、信頼する証明書と認識されます。<BR/>
241               CA証明書を設定した場合、サーバから送られた証明書チェーンのルートCA検証における検証成功候補として、設定した証明書のCAが登録されます。<BR/>
242               (つまりルートCAが設定したCAであれば、ルートCA検証成功となります。)<BR/>
243               サーバ証明書を設定した場合、サーバから送られた証明書がその証明書と合致すれば、証明書検証が成功します。<BR/>
244               ※サーバ証明書を設定した場合、証明書通しがデータとして合致すれば検証成功となりますので、<BR/>
245               サーバ証明書内容の検証は行われません。(例えば @ref nn::ssl::VERIFY_DATE オプションを指定しても、データが合致さえすれば期限確認は行われませんので、注意してください。)<BR/>
246               CA証明書を設定した場合は、サーバから送られた証明チェーン内のCA証明書以外の証明書については、証明書内容の検証も行われます。<BR/>
247               (例えば @ref nn::ssl::VERIFY_DATE オプションを指定されていれば、各証明書の有効期限について、機器の時計時刻を基に検証が行われます。)<BR/>
248 
249       @param[in]  certStore 設定する証明書ストア
250       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
251       @retval ResultSuccess       処理に成功しました。
252       @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。
253       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
254       @retval 上記以外            想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。
255     */
256     nn::Result SetServerCertStore(CertStore& certStore);
257 
258     /*!
259       @brief  SSL接続で使用するクライアント証明書を設定します。
260       @param[in]  clientCert   設定するクライアント証明書。
261       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
262       @retval ResultSuccess       処理に成功しました。
263       @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。
264       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
265       @retval 上記以外            想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。
266     */
267     nn::Result SetClientCert(ClientCert& clientCert);
268 
269     /*!
270       @brief  SSL接続で使用するCRLストアを設定します。API利用者が独自のCRLストアを設定するためのAPIです。
271       @param[in]  crlStore 設定するCRLストア
272       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
273       @retval ResultSuccess       処理に成功しました。
274       @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。
275       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
276       @retval 上記以外            想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。
277     */
278     nn::Result SetCRLStore(CrlStore& crlStore);
279 
280     /*!
281       @brief 信頼するEV証明書ポリシーIDを設定します。
282       @param[in] pPolicyId 信頼するEV証明書のOID文字列("1.3.6.1.4.1.4146.1.1"など)。
283       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
284       @retval ResultSuccess       処理に成功しました。
285       @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。
286       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
287       @retval 上記以外            想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。
288      */
289     nn::Result AddEVPolicyId( const char* pPolicyId );
290 
291     //@}
292 
293     /**
294       @brief  指定したビットのSSL通信の検証内容を削除します。
295                                       デフォルトで検証する項目は安全を守るためのものです。デバッグ目的以外で検証項目を減らさないでください。
296       @param[in]  excludeVerifyOptions SSLの検証方法に関して、除外対象を表すオプション。除外したい検証方法を表す@ref nn::ssl::VerifyOption列挙体の値を設定します。(複数の値を設定したい場合は、複数値の論理を設定します。)<BR/>
297                                        現在この引数に設定可能な値は、以下となります。<BR/>
298                                        @ref nn::ssl::VERIFY_COMMON_NAME            : 証明書の CommonName が  @ref AssignServer 関数で指定したホスト名と一致するか検証します。<BR/>
299                                        @ref nn::ssl::VERIFY_SUBJECT_ALT_NAME       : CommonNameの検証を行う際に、証明書にSubjectAltNameの記述がある場合はそちらを優先して使用します。<BR/>
300                                        @ref nn::ssl::VERIFY_ROOT_CA                : 証明書の Root CA を検証します。<BR/>
301       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
302       @retval ResultSuccess       処理に成功しました。
303       @retval ResultProtocolFailedErr      処理が失敗したことを示します。(不正な引数など)
304       @retval ResultInternalSslIdErr       対象のSSLコネクションは不正なものです。(ライブラリ内部エラーです)
305       @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。
306       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
307       @retval 上記以外            想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。
308     */
309     nn::Result DisableVerifyOptionForDebug( u32 excludeVerifyOptions );
310 
311     /**
312       @brief  対象SSL通信の暗号化の情報を得ます。本関数は特殊なユースケース用の関数であり、通常ユーザーの利用は想定していません。
313       @param[out] pVersionBuf  バージョンの文字列を格納するバッファ
314       @param[in]  versionBufSize pVersionBufのサイズ
315       @param[out] pCipherKindStrBuf 暗号の種類の文字列を格納するバッファ
316       @param[in]  cipherKindStrBufSize pCipherKindStrBufSizeのサイズ
317       @param[out] pAlgBits          暗号のアルゴリズム上のキーのビット数を格納するバッファ
318       @param[out] pEffectiveBits    暗号の実効強度のビット数を格納するバッファ
319       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
320       @retval ResultSuccess       処理に成功しました。
321       @retval ResultProtocolFailedErr      処理が失敗したことを示します。(不正な引数など)
322       @retval ResultInternalSslIdErr       対象のSSLコネクションは不正なものです。(ライブラリ内部エラーです)
323       @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。
324       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
325       @retval 上記以外            想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。
326     */
327     nn::Result GetCipherInfo( char* pVersionBuf, size_t versionBufSize, char* pCipherKindStrBuf, size_t cipherKindStrBufSize, s32* pAlgBits, s32* pEffectiveBits );
328 
329 
330     /***
331       @brief 証明書検証の結果を取得します。
332       @param[out] pCertVerifyErrors 証明書検証結果。証明書検証結果フラグ(nn::ssl::CertVerifyError)の論理和です。
333       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
334       @retval ResultSuccess       処理に成功しました。
335       @retval ResultIpcSessionErr 初期化が行われていないConnectionを表すエラー。@ref Initialize が成功していないConnectionに対する実行であり、何も処理は行われていません。
336       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::ssl::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
337       @retval 上記以外            想定外のエラー(エラー内容については、@ref ssl_Result.h を参照)。
338      */
339     nn::Result GetCertVerifyErrors( u32* pCertVerifyErrors );
340 
341 #ifdef NDEBUG_ENABLE
342     /***
343       @brief This is for testing purposes only and is used for obtaining the connection handle of this object.
344       @return The connection handle of this object. <BR>
345      */
GetConnectionHandle()346     ConnectionHandle GetConnectionHandle(){return m_connectHandle;}
347 #endif
348 
349 
350 private:
351     /**
352      @brief 接続先サーバとsocketがAssign済みか否かを表すフラグ。
353      */
354     bool m_isAssigned;
355     NN_PADDING3;
356 
357     /**
358      @brief 利用するSocketのディスクリプション。
359      */
360     s32 m_socket;
361     /**
362      @brief 対象コネクションのID。
363     */
364     ConnectionHandle m_connectHandle;
365 
366     /**
367      @brief SSLプロセスとのIPCセッション
368      */
369     nn::Handle m_privateIpcSession;
370 
371     /**
372      @brief  SSLプロセスとのIPCクライアント
373      */
374     ConnectionIpc m_privateIpcClient;
375 
376     /**
377      @brief  サーバ証明書取得用共有メモリバッファ。
378      */
379     nn::os::TransferMemoryBlock m_serverCertBuffer;
380 
381     /**
382      * @brief  接続先サーバとsocketがAssign済みか否かを返す。
383      * @return 接続先サーバとsocketがAssign済みか否か(trueが設定済み)
384     */
IsAssigned()385     bool IsAssigned(){return m_isAssigned;}
386 
387 
388     /**
389      * @brief  コネクション専用IPCクライアントを割り当てます。
390      * @return 処理の結果。
391     */
392     Result AssignPrivateIpcClient( void );
393 
394     /**
395      * @brief  対象コネクションのShutdown処理を行います。
396      * @return 処理の結果。(すでにコネクションがShutdownされていた場合や、まだAssignServer()されていなかった場合は、ResultSuccess()が返ります。)
397     */
398     Result ShutdownConnection( void );
399 };
400 
401 
402 } // end of namespace ssl
403 } // end of namespace nn
404 
405 
406 #endif // __cplusplus
407 
408 
409 
410 #include <nn/util/detail/util_CLibImpl.h>
411 
412 
413 /*!
414   @addtogroup   nn_ssl               ssl
415   @{
416 
417   @defgroup     nn_ssl_Connection_c    Connection (C)
418 
419   @brief        @ref nn::ssl::Connection の C インタフェースモジュールです。
420 
421   @{
422 */
423 
424 /*!
425   @struct       nnsslConnection
426   @brief        SSLのConnectionを表す C の構造体です。
427 
428   @brief 対応するクラス @ref nn::ssl::Connection を参照してください。
429 */
430 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnsslConnection, nn::ssl::Connection, 56, u32);
431 
432 /*!
433   @brief 対応する C++ 関数 @ref nn::ssl::Connection::AssignSocket を参照してください。
434 */
435 NN_EXTERN_C bool nnsslConnectionAssignSocket(nnsslConnection* this_, s32 socket);
436 
437 /*!
438   @brief 対応する C++ 関数 @ref nn::ssl::Connection::AssignServer を参照してください。
439 */
440 NN_EXTERN_C nnResult nnsslConnectionAssignServer(nnsslConnection* this_, const char* pServerName, u32 verifyOpt);
441 
442 /*!
443   @brief 対応する C++ 関数 @ref nn::ssl::Connection::SetServerCertBuffer を参照してください。
444 */
445 NN_EXTERN_C nnResult nnsslConnectionSetServerCertBuffer(nnsslConnection* this_, uptr bufferAddress, size_t bufferSize);
446 
447 /*!
448   @brief 対応する C++ 関数 @ref nn::ssl::Connection::Shutdown を参照してください。
449 */
450 NN_EXTERN_C nnResult nnsslConnectionShutdown(nnsslConnection* this_);
451 
452 /*!
453   @brief 対応する C++ 関数 @ref nn::ssl::Connection::DoHandshake(void) を参照してください。
454 */
455 NN_EXTERN_C nnResult nnsslConnectionDoHandshake(nnsslConnection* this_);
456 
457 /*!
458   @brief 対応する C++ 関数 @ref nn::ssl::Connection::DoHandshake(u8* pServerCertBuf, size_t* pServerCertSize, u32* pServerCertNum) を参照してください。
459 */
460 NN_EXTERN_C nnResult nnsslConnectionDoHandshakeEx(nnsslConnection* this_, size_t* pServerCertSize, u32* pServerCertNum);
461 
462 /*!
463   @brief 対応する C++ 関数 @ref nn::ssl::Connection::Read() を参照してください。
464 */
465 NN_EXTERN_C nnResult nnsslConnectionRead(nnsslConnection* this_, u8* pDataBuf, size_t dataBufSize, size_t* pReadSizeCourier);
466 
467 /*!
468   @brief 対応する C++ 関数 @ref nn::ssl::Connection::Peek() を参照してください。
469 */
470 NN_EXTERN_C nnResult nnsslConnectionPeek(nnsslConnection* this_, u8* pDataBuf, size_t dataBufSize, size_t* pReadSizeCourier);
471 
472 /*!
473   @brief 対応する C++ 関数 @ref nn::ssl::Connection::Peek() を参照してください。
474 */
475 NN_EXTERN_C nnResult nnsslConnectionWrite(nnsslConnection* this_, const u8* pDataBuf, size_t dataBufSize, size_t* pWrittenDataSizeCourier);
476 
477 /*!
478   @brief 対応する C++ 関数 @ref nn::ssl::Connection::SetServerCertStore() を参照してください。
479 */
480 NN_EXTERN_C nnResult nnsslConnectionSetServerCertStore(nnsslConnection* this_, nnsslCertStore* certStore);
481 
482 /*!
483   @brief 対応する C++ 関数 @ref nn::ssl::Connection::SetClientCert() を参照してください。
484 */
485 NN_EXTERN_C nnResult nnsslConnectionSetClientCert(nnsslConnection* this_, nnsslClientCert* pClientCert);
486 
487 /*!
488   @brief 対応する C++ 関数 @ref nn::ssl::Connection::SetCRLStore() を参照してください。
489 */
490 NN_EXTERN_C nnResult nnsslConnectionSetCRLStore(nnsslConnection* this_, nnsslCrlStore* crlStore);
491 
492 /*!
493   @brief 対応する C++ 関数 @ref nn::ssl::Connection::DisableVerifyOptionForDebug() を参照してください。
494 */
495 NN_EXTERN_C nnResult nnsslConnectionDisableVerifyOptionForDebug(nnsslConnection* this_, u32 excludeVerifyOptions);
496 
497 /*!
498   @brief 対応する C++ 関数 @ref nn::ssl::Connection::GetCipherInfo() を参照してください。
499 */
500 NN_EXTERN_C nnResult nnsslConnectionGetCipherInfo(nnsslConnection* this_, char* pVersionBuf, size_t versionBufSize, char* pCipherKindStrBuf, size_t cipherKindStrBufSize, s32* pAlgBits, s32* pEffectiveBits );
501 
502 /*!
503   @brief 対応する C++ 関数 @ref nn::ssl::Connection::GetCertVerifyErrors( ) を参照してください。
504 */
505 NN_EXTERN_C nnResult nnsslConnectionGetCertVerifyErrors(nnsslConnection* this_, u32* pCertVerifyErrors );
506 
507 /*!
508   @}
509 
510   @}
511 */
512 
513 #endif /* NN_SSL_SSL_CONNECTION_H_ */
514