00001 #ifndef _PV_RSA_MECHANISM 00002 #define _PV_RSA_MECHANISM 00003 00004 #include "PivMechanism.h" 00005 #include "KeyContainer.h" 00006 00007 class Token; 00008 class Session; 00009 00015 class PivRsaPkcsMechanism : public PivMechanism 00016 { 00017 public: 00024 PivRsaPkcsMechanism(Token* thisToken); 00028 ~PivRsaPkcsMechanism(void); 00034 PIV_RV sign(Session* sess,CK_BYTE* in,CK_ULONG inLen,CK_BYTE* out,CK_ULONG* outLen); 00040 PIV_RV decrypt(Session* sess,CK_BYTE* in,CK_ULONG inLen,CK_BYTE* out,CK_ULONG* outLen); 00041 00042 00043 private: 00044 static const CK_MECHANISM_TYPE MY_TYPE; 00048 static const char MY_DESC[]; 00052 static const int ALGO_CODE; 00053 00057 PIV_RSA_1024_CMD cmd; 00058 00065 void pkcs1Dot5Encode(int ffPadding,unsigned char* inData,int inDataLen); 00066 00073 class Stripper { 00074 public: 00082 virtual int strip(unsigned char* in,unsigned char* out,int len) = 0; 00083 }; 00087 class SignStripper : public Stripper { 00088 public: 00093 int strip(unsigned char* in,unsigned char* out,int len); 00094 }; 00098 class DecryptStripper : public Stripper { 00099 public: 00104 int strip(unsigned char* in,unsigned char* out,int len); 00105 }; 00115 PIV_RV execute(Session* sess,CK_BYTE* in,CK_ULONG inLen,CK_BYTE* out,CK_ULONG* outLen,Stripper* stripper); 00119 DecryptStripper decryptStripper; 00123 SignStripper signStripper; 00124 }; 00125 #endif 00126 00127 00128 00129 00130 00131 00132 00133 00134 00135 00136 00137 00138