/*******************************************************************************
*                              Openwave Systems.                               *
*                            Device Products Group                             *
*                               Shinjuku, Tokyo                                *
****************************************************************************//**
   @file
   このヘッダーファイルはユーザ操作によってクライアント証明書を選択し必要に応じて
   PINを入力するUIを統一的に管理するためにOEMが提供するインターフェースを
   定義しています。OEMはこのヘッダーファイルを変更することはできません。

*//*
   REVISION HISTORY:
   Date:       Who:               Email:
      - Details:
--------------------------------------------------------------------------------
   23 Aug 2005 kawa               yoshihiro.kawaguchi@openwave.com
      - Initial version

*******************************************************************************/
/*******************************************************************************
*                  Copyright (c) Openwave Systems 1995-2005                    *
*                            All rights reserved.                              *
*                                                                              *
*     THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF Openwave Systems Inc.     *
*               The copyright notice above does not evidence any               *
*              actual or intended publication of such source code.             *
*******************************************************************************/

#ifndef _IOMBSEC_H
#define _IOMBSEC_H


/*==============================================================================

	INCLUDES

==============================================================================*/
#ifndef PREPROCESSING_ONLY //don't include these if we're only preprocessing & not compiling
#include "aee.h"	// for size_t, etc
#include "aeestdlib.h"	// for size_t, etc
#include "aeeinterface.h"
#include "aeersa.h"
#endif //ndef PREPROCESSING_ONLY


/*==============================================================================

	DEFINES

==============================================================================*/


/*==============================================================================

	TYPES

==============================================================================*/
#ifndef PREPROCESSING_ONLY //don't include these if we're only preprocessing & not compiling

/** @ingroup grp_client_certification
 IOMBSEC_GetClientCertAndKeyUI()で登録されるコールバック関数に返すコールバック結果の定義
*/
typedef enum {
	keIOMBSEC_CB_OK,			///< OK, 正常終了
	keIOMBSEC_CB_REJECT,		///< 証明書送出拒否
	keIOMBSEC_CB_NOTEXIST,		///< 証明書なし
	keIOMBSEC_CB_EXPIRE,		///< 証明書有効期限切れ
	keIOMBSEC_CB_PINFAIL,		///< PIN入力エラー
	keIOMBSEC_CB_INTERNAL		///< その他、インターナルエラー
} teIOMBSEC_CB_Result;

/** @ingroup grp_client_certification
 IOMBSEC_GetClientCertAndKeyUI() で登録されるコールバック関数の定義
 このコールバック関数はクライアント証明UIの完了通知としてWIMに格納されている
 クライアント証明書、中間証明書および秘密鍵（オプション）をブラウザに引き渡します。
@PARAMETERS
 @param[in] pvUser IOMBSEC_GetClientCertAndKeyUI() で渡された任意のUser dataのポインタ
 @param[in] psIRSA IRSAオブジェクトへのポインタ。IOMBSECで署名用にIRSAインスタンス生成し
 初期化（IRSA_init）をしてください。このIRSAオブジェクトはOEMがIRSAインターフェース
 を継承して実装したOEMRSAであり、ブラウザはこのIRSAインスタンスを通してWIMのEncrypt機能
 使用します。ブラウザは引き渡された psIRSA をAddRefします。
 @param[in] pbClientCert DERエンコードされたクライアント証明書へのポインタ
 @param[in] lClientCertLen  クライアント証明書のバイトサイズ
 @param[in] pbIntermediateCert DERエンコードされたクライアント証明書にチェーンする
 中間証明書 へのポインタ。中間証明書が存在しない場合はNULLをセットしてください。
 @param[in] lIntermediateCertLen  中間証明書のバイトサイズ
 @param[in] pbPrivateKey  DERエンコードされた秘密鍵へのポインタ(オプション）。実機上では
 WIMから秘密鍵を取り出すことは許可されていないためNULLを設定してください。NULLが設定された
 場合ブラウザは署名時に psIRSA を通してOEMRSAで提供されるWIMのEncrypt機能を利用します。
 秘密鍵が設定された場合はOpenSSLのRSA_sign機能により署名を行います（検証用）。秘密鍵は
 クライアント証明書の公開鍵とペアであることが必要です。
 @param[in] lPrivateKeyLen  秘密鍵のバイトサイズ（オプション）
 @param[in] eResult コールバック結果。 正常時は０、異常（キャンセル）時は０以外がセットする。
@RETURNS
 @retval TRUE 正常終了 
 @retval FALSE エラー終了（特別なエラー処理は不要）  
*/
typedef void (*PFNCLIENTCERTANDKEY)(void *pvUser, IRSA *psIRSA, 
								byte *pbClientCert, int lClientCertLen,  
								byte *pbIntermediateCert, int lIntermediateCertLen, 
								byte *pbPrivateKey, int lPrivateKeyLen, 
								teIOMBSEC_CB_Result eResult);

#endif //ndef PREPROCESSING_ONLY

/*==============================================================================

	INTERFACE

==============================================================================*/
#ifndef PREPROCESSING_ONLY //don't define if we're only pre-processing to expand the macros

/** @ingroup grp_lifecycle
 IOMBSECクラスのインスタンス構造定義。 クラスID @ref AEECLSID_IOMBSEC で
 ISHELL_CreateInstanceによりインスタンス生成した場合に返される。
 @code
 #include iombsec.bid
 #include iombsec.h

 tsIOMBSEC *psIOMBSEC = NULL;
 if((SUCCESS == ISHELL_CreateInstance(psShell, AEECLSID_IOMBSEC, (void**)&psIOMBSEC)) && psIOMBSEC)
 {


   // release the interface when finished
   IOMBV6_Release(psIOMBSEC);
   psIOMBSEC = NULL;
 }
@endcode

*/
typedef struct stIOMBSEC tsIOMBSEC;

#ifndef DOXYGEN_SHOULD_SKIP_THIS //make doxygen ignore this block of code
///仮想関数テーブルの定義
AEEINTERFACE( IOMBSEC )
{
   //declare our virtual functions using macro expansion
   #define FUNCTION( RETURNS, NAME )   RETURNS (*NAME)(
   #define NO_PARAM                    void
   #define FIRST_PARAM( TYPE, NAME )   TYPE NAME
   #define NEXT_PARAM( TYPE, NAME )    , TYPE NAME
   #define END_FUNCTION                );
   #include "iombsec.m"
};
#endif //ndef DOXYGEN_SHOULD_SKIP_THIS

#endif //ndef PREPROCESSING_ONLY

/*==============================================================================

	VIRTUAL FUNCTION ACCESSORS

==============================================================================*/
#ifndef PREPROCESSING_ONLY //don't define if we're only pre-processing to expand the macros

/** @ingroup grp_lifecycle
 @ref AddRef 関数のラッパー定義。 このマクロはこの関数のアプレットからの呼出しを
 容易にする。
*/
#define IOMBSEC_AddRef( psIOMBSEC ) \
	AEEGETPVTBL( (psIOMBSEC), IOMBSEC )->lwIOMBSEC_AddRef( psIOMBSEC )

/** @ingroup grp_lifecycle
 @ref Release 関数のラッパー定義。 このマクロはこの関数のアプレットからの呼出しを
 容易にする。
*/
#define IOMBSEC_Release( psIOMBSEC ) \
	AEEGETPVTBL( (psIOMBSEC), IOMBSEC )->lwIOMBSEC_Release( psIOMBSEC )

/** @ingroup grp_client_certification
 @ref HandleEvent 関数のラッパー定義。 このマクロはこの関数のアプレットからの
 呼出しを容易にする。
*/
#define IOMBSEC_HandleEvent( psIOMBSEC, eCode, wp, dwp ) \
	AEEGETPVTBL( (psIOMBSEC), IOMBSEC )->HandleEvent( psIOMBSEC, eCode, wp, dwp )

/** @ingroup grp_client_certification
 @ref GetClientCertAndKeyUI 関数のラッパー定義。 このマクロはこの関数のアプレットからの
 呼出しを容易にする。
*/
#define IOMBSEC_GetClientCertAndKeyUI( psIOMBSEC, pbDNList, lwDNListLen, pfvCallBack, pvUser ) \
	AEEGETPVTBL( (psIOMBSEC), IOMBSEC )->GetClientCertAndKeyUI( psIOMBSEC, pbDNList, lwDNListLen, pfvCallBack, pvUser )


#endif //ndef PREPROCESSING_ONLY

/*==============================================================================

	GLOBAL VARIABLE DECLARATIONS

==============================================================================*/


/*==============================================================================

	FUNCTION DECLARATIONS

==============================================================================*/


#endif /* _IOMBSEC_H */



