1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     http_CertStore.h
4 
5   Copyright (C)2010 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: 30213 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_HTTP_HTTP_CERTSTORE_H_
17 #define NN_HTTP_HTTP_CERTSTORE_H_
18 
19 #include <nn/util/util_NonCopyable.h>
20 #include <nn/http/http_Types.h>
21 
22 #ifdef __cplusplus
23 
24 namespace nn {
25 namespace http {
26 
27 class Connection;
28 
29 /*!
30   @brief HTTPS用の証明書ストアを表すクラスです。複数のHTTPS通信でCA証明書ストアを使いまわしたい場合に利用します。
31 */
32 class CertStore : private nn::util::NonCopyable<CertStore>
33 {
34     friend class Connection;
35 public:
36     /*!
37       @brief コンストラクタです。
38     */
39     explicit CertStore();
40 
41     /*!
42       @brief デストラクタです。
43     */
44     virtual ~CertStore (void);
45 
46     /*!
47       @brief  証明書ストアを初期化します。証明書を登録する前に、一度実施する必要があります。
48       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
49       @retval ResultSuccess       処理に成功しました。
50       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::http::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
51       @retval 上記以外            想定外のエラー(エラー内容については、@ref http_Result.h を参照)。
52     */
53     nn::Result Initialize(void);
54 
55     /*!
56       @brief  証明書ストアの終了処理を行います。証明書ストアの全利用が終了したら、一度実施する必要があります。
57       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
58       @retval ResultSuccess       処理に成功しました。
59       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::http::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
60       @retval 上記以外            想定外のエラー(エラー内容については、@ref http_Result.h を参照)。
61     */
62     nn::Result Finalize(void);
63 
64     /*!
65       @brief  証明書を登録します。複数回実行することで、複数個の証明書を登録することもできます。
66       @param[in]  pCertData   証明書データ。データフォーマットは、X.509 v3の証明書データ(ASN.1定義)をDERエンコードしたバイナリデータ。
67       @param[in]  certDataSize pCertDataのサイズ 。
68       @param[out] pCertIdCourier 登録した証明書のID.個別に証明書の登録解除(@ref UnRegisterCert())を実施する際に使用します。不要な場合(個別登録解除が不要の場合。CertStoreが解放されると、そこに登録されていた証明書は一括で登録解除されますので、その場合は個別登録解除は不要です。)は、未指定とすることができます。
69       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
70       @retval ResultSuccess       処理に成功しました。
71       @retval ResultFailToCreateCertStoreErr 証明書ストアの作成失敗を表すエラー。@ref Initialize が実行されていない場合に返ります。本クラスを利用する場合は、インスタンス化後に@ref Initialize を必ず実行してください。
72       @retval nn::ssl::ResultFailToCreateCertStoreErr 証明書ストアの作成失敗を表すエラー。SSLライブラリに登録されている全証明書数が、システムが許容できる最大数に達している場合などにも返ります。自身が登録している証明書の登録解除を行ったり、ある程度の時間を待機することで(その間に他モジュールが登録している証明書を登録解除すれば)、再実行が成功する場合があります。
73       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::http::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
74       @retval 上記以外            想定外のエラー(エラー内容については、@ref http_Result.h を参照)。
75     */
76     nn::Result RegisterCert(const u8* pCertData, size_t certDataSize, CertId* pCertIdCourier=NULL);
77 
78     /*!
79       @brief  機器内蔵CA証明書を登録します。複数回実行することで、複数個の証明書を登録することもできます。
80       @param[in]  inCaCertName   対象の機器内蔵CA証明書(sslの @ref nn::ssl::InternalCaCertの値。)
81       @param[out] pCertIdCourier 登録した証明書のID.個別に証明書の登録解除(UnRegisterCert())を実施する際に使用します。不要な場合(個別登録解除が不要の場合。CertStoreが解放されると、そこに登録されていた証明書は一括で登録解除されますので、その場合は個別登録解除は不要です。)は、未指定とすることができます。
82       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
83       @retval ResultSuccess       処理に成功しました。
84       @retval ResultFailToCreateCertStoreErr 証明書ストアの作成失敗を表すエラー。@ref Initialize が実行されていない場合に返ります。本クラスを利用する場合は、インスタンス化後に@ref Initialize を必ず実行してください。
85       @retval nn::ssl::ResultFailToCreateCertStoreErr 証明書ストアの作成失敗を表すエラー。SSLライブラリに登録されている全証明書数が、システムが許容できる最大数に達している場合などにも返ります。自身が登録している証明書の登録解除を行ったり、ある程度の時間を待機することで(その間に他モジュールが登録している証明書を登録解除すれば)、再実行が成功する場合があります。
86       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::http::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
87       @retval 上記以外            想定外のエラー(エラー内容については、@ref http_Result.h を参照)。
88     */
89     nn::Result RegisterCert(InternalCaCertId inCaCertName, CertId* pCertIdCourier=NULL);
90 
91     /*!
92       @brief  証明書を登録解除します。
93       @param[in] certId   登録した証明書のID。RegisterCert()の引数で取得されたものです。
94       @return 関数の実行結果を返します。以下に挙げる Result を返します。<BR>
95       @retval ResultSuccess       処理に成功しました。
96       @retval ResultFailToCreateCertStoreErr 証明書ストアの作成失敗を表すエラー。@ref Initialize が実行されていない場合に返ります。本クラスを利用する場合は、インスタンス化後に@ref Initialize を必ず実行してください。
97       @retval ResultNotInitializedErr ライブラリが未初期化を表すエラー。@ref nn::http::Initialize が実行されていないと、本ライブラリの関数はすべて利用することができません。
98       @retval 上記以外            想定外のエラー(エラー内容については、@ref http_Result.h を参照)。
99     */
100     nn::Result UnRegisterCert(CertId certId);
101 
102 
103 
104 private:
105     bool m_isInitialized;
106     NN_PADDING3;
107     CertStoreId m_certStoreId;
108 
109     /*!
110       @brief  証明書ストアが有効なものか否かを取得します。
111       @return 処理の結果が返ります。<BR>
112     */
IsValid()113     bool IsValid(){return m_isInitialized;}
114 };
115 
116 } // end of namespace http
117 } // end of namespace nn
118 
119 #endif // __cplusplus
120 
121 
122 #include <nn/util/detail/util_CLibImpl.h>
123 
124 
125 /*!
126   @addtogroup   nn_http               http
127   @{
128 
129   @defgroup     nn_http_CertStore_c    CertStore (C)
130 
131   @brief        @ref nn::http::CertStore の C インタフェースモジュールです。
132 
133   @{
134 */
135 
136 /*!
137   @struct       nnhttpCertStore
138   @brief        HTTPのCertStoreを表す C の構造体です。
139 
140   @brief 対応するクラス @ref nn::http::CertStore を参照してください。
141 */
142 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnhttpCertStore, nn::http::CertStore, 12, u32);
143 
144 /*!
145   @brief 対応する C++ 関数 @ref nn::http::CertStore::Initialize
146 */
147 NN_EXTERN_C nnResult nnhttpCertStoreInitialize(nnhttpCertStore* this_);
148 
149 /*!
150   @brief 対応する C++ 関数 @ref nn::http::CertStore::Finalize
151 */
152 NN_EXTERN_C nnResult nnhttpCertStoreFinalize(nnhttpCertStore* this_);
153 
154 /*!
155   @brief 対応する C++ 関数 @ref nn::http::CertStore::RegisterCert を参照してください。
156 */
157 NN_EXTERN_C nnResult nnhttpCertStoreRegisterCert(nnhttpCertStore* this_, const u8* pCertData, size_t certDataSize, NnHttpCertId* pCertIdCourier);
158 
159 /*!
160   @brief 対応する C++ 関数 @ref nn::http::CertStore::RegisterCert を参照してください。
161 */
162 NN_EXTERN_C nnResult nnhttpCertStoreRegisterInternalCert(nnhttpCertStore* this_, NnHttpInternalCaCertId inCaCertName, NnHttpCertId* pCertIdCourier);
163 
164 
165 /*!
166   @brief 対応する C++ 関数 @ref nn::http::CertStore::UnRegisterCert を参照してください。
167 */
168 NN_EXTERN_C nnResult nnhttpCertStoreUnRegisterCert(nnhttpCertStore* this_,  NnHttpCertId certId);
169 
170 
171 /*!
172   @}
173 
174   @}
175 */
176 
177 #endif /* NN_HTTP_HTTP_CERTSTORE_H_ */
178