1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     nssl.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: 32618 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef __NSSL_H__
17 #define __NSSL_H__
18 
19 /*---------------------------------------------------------------------------*
20  * Includes
21  *---------------------------------------------------------------------------*/
22 
23 #include <nn/net/compatible/nos.h>
24 
25 #ifdef  __cplusplus
26 extern "C" {
27 #endif  // __cplusplus
28 
29 /*---------------------------------------------------------------------------*
30  * Definitions
31  *---------------------------------------------------------------------------*/
32 #define NSSL_VERIFY_NONE                         0x00
33 #define NSSL_VERIFY_COMMON_NAME                  0x01
34 #define NSSL_VERIFY_ROOT_CA                      0x02
35 #define NSSL_VERIFY_DATE                         0x04
36 //#define NSSL_VERIFY_CHAIN                        0x08 /* BSAFEの検証の仕組みでは、chainの検証"のみ"をOFFにできないので、廃止 */
37 #define NSSL_VERIFY_SUBJECT_ALT_NAME             0x10
38 #define NSSL_VERIFY_EV                           0x20
39 #define NSSL_OPTION_SESSION_CACHE                0x100
40 #define NSSL_VERIFY_IGNORE                       0x200 /*証明書検証を行うが、検証結果は無視して接続するためのオプション*/
41 #define NSSL_GET_ALL_SERVER_CERT_CHAIN           0x400 /*証明書チェーンの全データを取得するためのオプション*/
42 
43 #define NSSL_ERROR_BASE                          0xfffff000
44 #define NSSL_ERROR_CODE(code)                    ((s32)(NSSL_ERROR_BASE|(code)))
45 
46 /* エラーコードを数字でprintした時も何のエラーかわかるように、値を全て指定しておく */
47 enum {
48     NSSL_EFAILED                                 = NSSL_ERROR_CODE(1),
49     NSSL_EWANT_READ                              = NSSL_ERROR_CODE(2),
50     NSSL_EWANT_WRITE                             = NSSL_ERROR_CODE(3),
51     NSSL_ESYSCALL                                = NSSL_ERROR_CODE(5),
52     NSSL_EZERO_RETURN                            = NSSL_ERROR_CODE(6),
53     NSSL_EWANT_CONNECT                           = NSSL_ERROR_CODE(7),
54     NSSL_ESSLID                                  = NSSL_ERROR_CODE(8),
55     NSSL_EVERIFY_COMMON_NAME                     = NSSL_ERROR_CODE(9),
56     NSSL_EVERIFY_ROOT_CA                         = NSSL_ERROR_CODE(10),
57     NSSL_EVERIFY_CHAIN                           = NSSL_ERROR_CODE(11),
58     NSSL_EVERIFY_DATE                            = NSSL_ERROR_CODE(12),
59     NSSL_EGET_SERVER_CERT                        = NSSL_ERROR_CODE(13),
60     NSSL_EROOTCAID                               = NSSL_ERROR_CODE(14), // not used
61     NSSL_ECLIENTCERTID                           = NSSL_ERROR_CODE(15), // not used
62     NSSL_EVERIFY_REVOKED_CERT                    = NSSL_ERROR_CODE(16),
63     NSSL_ESTATE                                  = NSSL_ERROR_CODE(17),
64     NSSL_EVERIFY_USER                            = NSSL_ERROR_CODE(18),
65     NSSL_ERANDOM                                 = NSSL_ERROR_CODE(19),
66     NSSL_EVERIFY_SERVER_CERT                     = NSSL_ERROR_CODE(20),
67     NSSL_ECERT_BUF_ALREADY_SET                   = NSSL_ERROR_CODE(21),
68     NSSL_ENONE                                   = 0
69 };
70 
71 /**
72  * 作成できるNSSL記述子の最大数。
73  * NSSL記述子の整数値の最大ではありません。
74  */
75 #define NSSL_ID_MAX                              6
76 
77 /**
78  * Moved over Cert/CRL/EV related definitions from nssl_cfg.h.
79  */
80 #define CERT_SIZE               1024*2  /**< NSSLCtx->serverCertに保存しておく証明書の最大サイズ 2K */
81 
82 #define NSSL_CERTS_MAX          50      /**< NSSL_RegisterCert()で登録できる証明書の最大数。ビルトイン証明書の数も含めた数です。 */
83 #define NSSL_CERTSTORE_MAX      14      /**< 作成できる証明書ストアの最大数 */
84 #define NSSL_CERTS_PER_STORE    40      /**< 一つの証明書ストアにセットできる証明書の最大数 */
85 
86 #define NSSL_CRLS_MAX           10      /**< NSSL_RegisterCRL()で登録できるCRLの最大数 */
87 #define NSSL_CRLSTORE_MAX       3       /**< 作成できるCRLストアの最大数 */
88 #define NSSL_CRLS_PER_STORE     3       /**< で一つのCRLストアにセットできるCRLの最大数 */
89 
90 #define NSSL_EV_MAX             30       /**< NSSL_AddEVPolicyId()で登録できるEV証明書ポリシーIDの数 */
91 /**/
92 
93 /*---------------------------------------------------------------------------*
94  * Types/Declarations
95  *---------------------------------------------------------------------------*/
96 
97 /**
98  * NSSL ライブラリ内部動作設定を定義する構造体です。
99  * NSSL ライブラリで使用するメモリアロケータなどを設定します。
100  *
101  * XXX 仕様変更
102  * u32 maxIdは無くなりました。
103  */
104 typedef struct NSSLConfig
105 {
106     /**
107      * NSSL ライブラリが内部的に使用するメモリを確保するためのアロケータ関数へのポインタを指定します。
108      * 初期化時に一定のヒープを確保し、その後、新しいハンドルを作成するごとに追加のメモリ確保が行われます。
109      * 関数は、スレッドセーフな関数としてください。
110      */
111     void* (*alloc)(u32 name, u32 size, u32 align);
112     /**
113      * allocと対になるメモリ解放関数へのポインタを指定します。
114      * 関数は、スレッドセーフな関数としてください。
115      */
116     void  (*free)(u32 name, void *ptr);
117     /**
118      * allocから得たメモリ領域のサイズを変更するための関数へのポインタを指定します。
119      * C標準関数の realloc の仕様を満たす関数を与えてください。
120      * NULL を指定すると、alloc と free を組み合わせた代替関数が使用されます。
121      * 関数は、スレッドセーフな関数としてください。
122      */
123     void* (*realloc)(void *ptr, u32 size);
124     /**
125      * 0 を指定した場合は、ライブラリ内部でメモリ確保が発生するたびに alloc, realloc を呼び出します。
126      * 0 以外を指定した場合は、指定したサイズの固定サイズのヒープを初期化時に確保し、
127      * その後のメモリ確保はライブラリ内部のアロケータが固定ヒープから確保します。
128      */
129     u32   fixedHeapSize;
130 } NSSLConfig;
131 
132 typedef s32 NSSLId; /**< NSSL記述子 */
133 typedef s32 NSSLCertId; /**< 証明書 ID */
134 typedef s32 NSSLCertStoreId; /**< 証明書ストア ID */
135 typedef s32 NSSLCRLId; /**< CRL ID */
136 typedef s32 NSSLCRLStoreId; /**< CRL ストア ID */
137 
138 /* デバッグ用 */
139 typedef struct NSSLResource
140 {
141     int numDescSsl;
142     u32 freeHeapSize;
143     u32 usedHeapSize;
144     u32 maxHeapSize;
145 } NSSLResource;
146 
147 /*---------------------------------------------------------------------------*
148  * Cert Data
149  *---------------------------------------------------------------------------*/
150 #define NSSL_ROOTCA_NINTENDO_0                   1
151 #define NSSL_ROOTCA_NINTENDO_1                   2
152 #define NSSL_ROOTCA_NINTENDO_2                   3
153 
154 /*---------------------------------------------------------------------------*
155  * Function Prototypes
156  *---------------------------------------------------------------------------*/
157 s32             NSSL_Init            ( const NSSLConfig* config );
158 s32             NSSL_Finish          ( void );
159 NSSLId          NSSL_NewClient       ( int socket, u32 option, const char* serverName );
160 s32             NSSL_DoHandshake     ( NSSLId sslId );
161 s32             NSSL_DoHandshakeEx   ( NSSLId sslId, char* serverCertData, size_t serverCertSize, u32* serverCertNum );
162 s32             NSSL_DoHandshakeWithGetCertInfo(NSSLId sslId, size_t* serverCertSize, u32* serverCertNum );
163 s32             NSSL_Read            ( NSSLId sslId, char* buf, size_t bufSize );
164 s32             NSSL_Peek            ( NSSLId sslId, char* buf, size_t bufSize );
165 s32             NSSL_Write           ( NSSLId sslId, const char* buf, size_t bufSize );
166 s32             NSSL_Shutdown        ( NSSLId sslId );
167 s32             NSSL_SetServerCertStore(NSSLId sslId, NSSLCertStoreId storeId);
168 s32             NSSL_SetClientCert        ( NSSLId sslId, NSSLCertId certId);
169 s32             NSSL_SetCRLStore          ( NSSLId sslId, NSSLCRLStoreId storeId);
170 s32             NSSL_DisableVerifyOptionForDebug( NSSLId i_sslId, u32 i_verifyOption );
171 
172 s32             NSSL_SetUTCTime           ( s64 utcTime );
173 
174 s32             NSSL_GetCipherInfo( NSSLId sslId, char** version, char** name, int* algBits, int* effectiveBits );
175 s32             NSSL_GetCertVerifyErrors( NSSLId sslId, u32* pCertVerifyErrors);
176 s32             NSSL_SetServerCertBuffer( NSSLId sslId, u8* pBuf, size_t bufSize);
177 
178 void            NSSL_GetResource(NSSLResource* resource);
179 
180 /* functions for certificates */
181 NSSLCertId      NSSL_RegisterCert(u8 *cert, int certSize);
182 NSSLCertId      NSSL_RegisterCertWithKey(u8 *cert, int certSize, u8 *key, int keySize);
183 s32             NSSL_UnregisterCert(NSSLCertId certId);
184 BOOL            NSSL_IsValidCertId(NSSLCertId id);
185 
186 /* functions for certificate store */
187 NSSLCertStoreId NSSL_CertStore_Create(void);
188 s32             NSSL_CertStore_Destroy(NSSLCertStoreId storeId);
189 void            NSSL_CertStore_DestroyAll(NSSLCertStoreId storeId);
190 s32             NSSL_CertStore_AddCert(NSSLCertStoreId storeId, NSSLCertId certId);
191 s32             NSSL_CertStore_RemoveCert(NSSLCertStoreId storeId, NSSLCertId certId);
192 BOOL            NSSL_CertStore_IsValidId(NSSLCertStoreId storeId);
193 
194 /* functions for CRL */
195 NSSLCRLId       NSSL_RegisterCRL(u8 *crl, int len);
196 s32             NSSL_UnregisterCRL(NSSLCRLId crlId);
197 BOOL            NSSL_IsValidCRLId(NSSLCRLId id);
198 
199 /* functions for CRL store */
200 NSSLCRLStoreId  NSSL_CRLStore_Create(void);
201 s32             NSSL_CRLStore_Destroy(NSSLCRLStoreId storeId);
202 void            NSSL_CRLStore_DestroyAll(NSSLCRLStoreId storeId);
203 s32             NSSL_CRLStore_AddCRL(NSSLCRLStoreId storeId, NSSLCRLId crlId);
204 s32             NSSL_CRLStore_RemoveCRL(NSSLCRLStoreId storeId, NSSLCRLId crlId);
205 BOOL            NSSL_CRLStore_IsValidId(NSSLCRLStoreId storeId);
206 
207 BOOL            NSSL_IsAvailable     ( void );
208 void            NSSL_GatherEntropy   ( void );
209 
210 #ifdef  __cplusplus
211 }
212 #endif  // __cplusplus
213 #endif  // __NSSL_H__
214