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