/*---------------------------------------------------------------------------* Project: Horizon File: nssl.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: 24857 $ *---------------------------------------------------------------------------*/ #ifndef __NSSL_H__ #define __NSSL_H__ /*---------------------------------------------------------------------------* * Includes *---------------------------------------------------------------------------*/ #include #ifdef __cplusplus extern "C" { #endif // __cplusplus /*---------------------------------------------------------------------------* * Definitions *---------------------------------------------------------------------------*/ #define NSSL_VERIFY_NONE 0x00 #define NSSL_VERIFY_COMMON_NAME 0x01 #define NSSL_VERIFY_ROOT_CA 0x02 #define NSSL_VERIFY_DATE 0x04 //#define NSSL_VERIFY_CHAIN 0x08 /* BSAFEの検証の仕組みでは、chainの検証"のみ"をOFFにできないので、廃止 */ #define NSSL_VERIFY_SUBJECT_ALT_NAME 0x10 #define NSSL_VERIFY_EV 0x20 #define NSSL_OPTION_SESSION_CACHE 0x100 #define NSSL_VERIFY_IGNORE 0x200 /*証明書検証を行うが、検証結果は無視して接続するためのオプション*/ #define NSSL_GET_ALL_SERVER_CERT_CHAIN 0x400 /*証明書チェーンの全データを取得するためのオプション*/ #define NSSL_ERROR_BASE 0xfffff000 #define NSSL_ERROR_CODE(code) ((s32)(NSSL_ERROR_BASE|(code))) /* エラーコードを数字でprintした時も何のエラーかわかるように、値を全て指定しておく */ enum { NSSL_EFAILED = NSSL_ERROR_CODE(1), NSSL_EWANT_READ = NSSL_ERROR_CODE(2), NSSL_EWANT_WRITE = NSSL_ERROR_CODE(3), NSSL_ESYSCALL = NSSL_ERROR_CODE(5), NSSL_EZERO_RETURN = NSSL_ERROR_CODE(6), NSSL_EWANT_CONNECT = NSSL_ERROR_CODE(7), NSSL_ESSLID = NSSL_ERROR_CODE(8), NSSL_EVERIFY_COMMON_NAME = NSSL_ERROR_CODE(9), NSSL_EVERIFY_ROOT_CA = NSSL_ERROR_CODE(10), NSSL_EVERIFY_CHAIN = NSSL_ERROR_CODE(11), NSSL_EVERIFY_DATE = NSSL_ERROR_CODE(12), NSSL_EGET_SERVER_CERT = NSSL_ERROR_CODE(13), NSSL_EROOTCAID = NSSL_ERROR_CODE(14), // not used NSSL_ECLIENTCERTID = NSSL_ERROR_CODE(15), // not used NSSL_EVERIFY_REVOKED_CERT = NSSL_ERROR_CODE(16), NSSL_ESTATE = NSSL_ERROR_CODE(17), NSSL_EVERIFY_USER = NSSL_ERROR_CODE(18), NSSL_ERANDOM = NSSL_ERROR_CODE(19), NSSL_EVERIFY_SERVER_CERT = NSSL_ERROR_CODE(20), NSSL_ECERT_BUF_ALREADY_SET = NSSL_ERROR_CODE(21), NSSL_ENONE = 0 }; /** * 作成できるNSSL記述子の最大数。 * NSSL記述子の整数値の最大ではありません。 */ #define NSSL_ID_MAX 6 /** * Moved over Cert/CRL/EV related definitions from nssl_cfg.h. */ #define CERT_SIZE 1024*2 /**< NSSLCtx->serverCertに保存しておく証明書の最大サイズ 2K */ #define NSSL_CERTS_MAX 50 /**< NSSL_RegisterCert()で登録できる証明書の最大数。ビルトイン証明書の数も含めた数です。 */ #define NSSL_CERTSTORE_MAX 8 /**< 作成できる証明書ストアの最大数 */ #define NSSL_CERTS_PER_STORE 40 /**< 一つの証明書ストアにセットできる証明書の最大数 */ #define NSSL_CRLS_MAX 10 /**< NSSL_RegisterCRL()で登録できるCRLの最大数 */ #define NSSL_CRLSTORE_MAX 3 /**< 作成できるCRLストアの最大数 */ #define NSSL_CRLS_PER_STORE 3 /**< で一つのCRLストアにセットできるCRLの最大数 */ #define NSSL_EV_MAX 30 /**< NSSL_AddEVPolicyId()で登録できるEV証明書ポリシーIDの数 */ /**/ /*---------------------------------------------------------------------------* * Types/Declarations *---------------------------------------------------------------------------*/ /** * NSSL ライブラリ内部動作設定を定義する構造体です。 * NSSL ライブラリで使用するメモリアロケータなどを設定します。 * * XXX 仕様変更 * u32 maxIdは無くなりました。 */ typedef struct NSSLConfig { /** * NSSL ライブラリが内部的に使用するメモリを確保するためのアロケータ関数へのポインタを指定します。 * 初期化時に一定のヒープを確保し、その後、新しいハンドルを作成するごとに追加のメモリ確保が行われます。 * 関数は、スレッドセーフな関数としてください。 */ void* (*alloc)(u32 name, u32 size, u32 align); /** * allocと対になるメモリ解放関数へのポインタを指定します。 * 関数は、スレッドセーフな関数としてください。 */ void (*free)(u32 name, void *ptr); /** * allocから得たメモリ領域のサイズを変更するための関数へのポインタを指定します。 * C標準関数の realloc の仕様を満たす関数を与えてください。 * NULL を指定すると、alloc と free を組み合わせた代替関数が使用されます。 * 関数は、スレッドセーフな関数としてください。 */ void* (*realloc)(void *ptr, u32 size); /** * 0 を指定した場合は、ライブラリ内部でメモリ確保が発生するたびに alloc, realloc を呼び出します。 * 0 以外を指定した場合は、指定したサイズの固定サイズのヒープを初期化時に確保し、 * その後のメモリ確保はライブラリ内部のアロケータが固定ヒープから確保します。 */ u32 fixedHeapSize; } NSSLConfig; typedef s32 NSSLId; /**< NSSL記述子 */ typedef s32 NSSLCertId; /**< 証明書 ID */ typedef s32 NSSLCertStoreId; /**< 証明書ストア ID */ typedef s32 NSSLCRLId; /**< CRL ID */ typedef s32 NSSLCRLStoreId; /**< CRL ストア ID */ /* デバッグ用 */ typedef struct NSSLResource { int numDescSsl; u32 freeHeapSize; u32 usedHeapSize; u32 maxHeapSize; } NSSLResource; /*---------------------------------------------------------------------------* * Cert Data *---------------------------------------------------------------------------*/ #define NSSL_ROOTCA_NINTENDO_0 1 #define NSSL_ROOTCA_NINTENDO_1 2 #define NSSL_ROOTCA_NINTENDO_2 3 /*---------------------------------------------------------------------------* * Function Prototypes *---------------------------------------------------------------------------*/ s32 NSSL_Init ( const NSSLConfig* config ); s32 NSSL_Finish ( void ); NSSLId NSSL_NewClient ( int socket, u32 option, const char* serverName ); s32 NSSL_DoHandshake ( NSSLId sslId ); s32 NSSL_DoHandshakeEx ( NSSLId sslId, char* serverCertData, size_t serverCertSize, u32* serverCertNum ); s32 NSSL_DoHandshakeWithGetCertInfo(NSSLId sslId, size_t* serverCertSize, u32* serverCertNum ); s32 NSSL_Read ( NSSLId sslId, char* buf, size_t bufSize ); s32 NSSL_Peek ( NSSLId sslId, char* buf, size_t bufSize ); s32 NSSL_Write ( NSSLId sslId, const char* buf, size_t bufSize ); s32 NSSL_Shutdown ( NSSLId sslId ); s32 NSSL_SetServerCertStore(NSSLId sslId, NSSLCertStoreId storeId); s32 NSSL_SetClientCert ( NSSLId sslId, NSSLCertId certId); s32 NSSL_SetCRLStore ( NSSLId sslId, NSSLCRLStoreId storeId); s32 NSSL_DisableVerifyOptionForDebug( NSSLId i_sslId, u32 i_verifyOption ); s32 NSSL_SetUTCTime ( s64 utcTime ); s32 NSSL_GetCipherInfo( NSSLId sslId, char** version, char** name, int* algBits, int* effectiveBits ); s32 NSSL_GetCertVerifyErrors( NSSLId sslId, u32* pCertVerifyErrors); s32 NSSL_SetServerCertBuffer( NSSLId sslId, u8* pBuf, size_t bufSize); void NSSL_GetResource(NSSLResource* resource); /* functions for certificates */ NSSLCertId NSSL_RegisterCert(u8 *cert, int certSize); NSSLCertId NSSL_RegisterCertWithKey(u8 *cert, int certSize, u8 *key, int keySize); s32 NSSL_UnregisterCert(NSSLCertId certId); BOOL NSSL_IsValidCertId(NSSLCertId id); /* functions for certificate store */ NSSLCertStoreId NSSL_CertStore_Create(void); s32 NSSL_CertStore_Destroy(NSSLCertStoreId storeId); void NSSL_CertStore_DestroyAll(NSSLCertStoreId storeId); s32 NSSL_CertStore_AddCert(NSSLCertStoreId storeId, NSSLCertId certId); s32 NSSL_CertStore_RemoveCert(NSSLCertStoreId storeId, NSSLCertId certId); BOOL NSSL_CertStore_IsValidId(NSSLCertStoreId storeId); /* functions for CRL */ NSSLCRLId NSSL_RegisterCRL(u8 *crl, int len); s32 NSSL_UnregisterCRL(NSSLCRLId crlId); BOOL NSSL_IsValidCRLId(NSSLCRLId id); /* functions for CRL store */ NSSLCRLStoreId NSSL_CRLStore_Create(void); s32 NSSL_CRLStore_Destroy(NSSLCRLStoreId storeId); void NSSL_CRLStore_DestroyAll(NSSLCRLStoreId storeId); s32 NSSL_CRLStore_AddCRL(NSSLCRLStoreId storeId, NSSLCRLId crlId); s32 NSSL_CRLStore_RemoveCRL(NSSLCRLStoreId storeId, NSSLCRLId crlId); BOOL NSSL_CRLStore_IsValidId(NSSLCRLStoreId storeId); BOOL NSSL_IsAvailable ( void ); void NSSL_GatherEntropy ( void ); #ifdef __cplusplus } #endif // __cplusplus #endif // __NSSL_H__