package gr.cript.jdirect; import com.ms.dll.DllLib; import gr.cript.*; public class JDirectCript implements JCriptLowLevelInterface { private static int INTSIZE = 4; // SET_DN_SIZE == 65536 + 4, because the max fixedarray dimension is 65536 private static int SET_DN_SIZE = DllLib.sizeOf(SET_DN.class);//65796 = 1028*64+4 private static int EXT_DN_SIZE = 1028; private static int EXT_DN_DIM = 64; private static int DN_SIZE = 1024; private static int DN_1SIZE = 256; private static int DNAMEOFS = 0; private static int RFCNAMEOFS = 256; private static int URINAMEOFS = 512; private static int DIRNAMEOFS = 768; public JDirectCript(){ } public int login(String pwd, JDn out){ int dn_ptr = DllLib.allocCoTaskMem(DN_SIZE); JDnToDN_Ptr(new JDn(),dn_ptr); //init to empty DN_P byte[] pwdB = pwd.getBytes(); int pwd_ptr = BUFFER_new(); BUFFER_set(pwd_ptr,pwdB,pwdB.length); int res = login(dn_ptr,pwd_ptr); if (res == 0) DN_PtrToJDn(dn_ptr,out); BUFFER_free(pwd_ptr); DllLib.freeCoTaskMem(dn_ptr); return res; } public int changePassword(String oldPwd, String newPwd){ int old_pwd_ptr = BUFFER_new(); int new_pwd_ptr = BUFFER_new(); BUFFER_set(old_pwd_ptr,oldPwd.getBytes(),oldPwd.length()); BUFFER_set(new_pwd_ptr,newPwd.getBytes(),newPwd.length()); int res = changePassword(old_pwd_ptr,new_pwd_ptr); BUFFER_free(new_pwd_ptr); BUFFER_free(old_pwd_ptr); return res; } public int decrypt(String pwd, JBuffer in, DecryptResult out){ int alg_ptr = DllLib.allocCoTaskMem(INTSIZE); int in_buf_ptr = BUFFER_new(); BUFFER_set(in_buf_ptr,in.getBytes(),in.length()); int pwd_ptr = BUFFER_new(); BUFFER_set(pwd_ptr,pwd.getBytes(),pwd.length()); int out_buf_ptr = BUFFER_new(); int res = decrypt(pwd_ptr,in_buf_ptr,out_buf_ptr,alg_ptr); if (res == 0) decodeResultToDecryptResult(out_buf_ptr,alg_ptr,out); BUFFER_free(in_buf_ptr); BUFFER_free(pwd_ptr); BUFFER_free(out_buf_ptr); DllLib.freeCoTaskMem(alg_ptr); return res; } public int encrypt(int alg, JDn dn, JBuffer in, JBuffer out){ int dn_ptr = DllLib.allocCoTaskMem(DN_SIZE); JDnToDN_Ptr(dn,dn_ptr); int in_buf_ptr = BUFFER_new(); BUFFER_set(in_buf_ptr,in.getBytes(),in.length()); int out_buf_ptr = BUFFER_new(); int res = encrypt(alg,dn_ptr,in_buf_ptr,out_buf_ptr); if (res == 0) BUFFER_PtrToJBuffer(out_buf_ptr,out); BUFFER_free(in_buf_ptr); BUFFER_free(out_buf_ptr); DllLib.freeCoTaskMem(dn_ptr); return res; } public int sign(int alg, String pwd, JBuffer in, JBuffer out){ int in_buf_ptr = BUFFER_new(); BUFFER_set(in_buf_ptr,in.getBytes(),in.length()); int pwd_ptr = BUFFER_new(); BUFFER_set(pwd_ptr,pwd.getBytes(),pwd.length()); int out_buf_ptr = BUFFER_new(); int res = sign(alg,pwd_ptr,in_buf_ptr,out_buf_ptr); if (res == 0) BUFFER_PtrToJBuffer(out_buf_ptr,out); BUFFER_free(in_buf_ptr); BUFFER_free(pwd_ptr); BUFFER_free(out_buf_ptr); return res; } public int verify(JBuffer in, VerifyResult out){ int alg_ptr = DllLib.allocCoTaskMem(INTSIZE); int signers_ptr = DllLib.allocCoTaskMem(SET_DN_SIZE); DllLib.write4(signers_ptr,0,0); int in_buf_ptr = BUFFER_new(); BUFFER_set(in_buf_ptr,in.getBytes(),in.length()); int out_buf_ptr = BUFFER_new(); int res = verify(in_buf_ptr,out_buf_ptr,alg_ptr,signers_ptr); if (res == 0) decodeResultToVerifyResult(out_buf_ptr,alg_ptr,signers_ptr,out); BUFFER_free(in_buf_ptr); BUFFER_free(out_buf_ptr); DllLib.freeCoTaskMem(alg_ptr); DllLib.freeCoTaskMem(signers_ptr); return res; } //int login(BUFFER* pwd, DN* dn); /**@dll.import("Cript_Api")*/ private static native int login(BUFFER[] pwd,DN[] dn); /**@dll.import("Cript_Api")*/ private static native int login(int pwd_ptr, int dn_ptr); //int changePassword(BUFFER* oldPwd, BUFFER* newPwd); /**@dll.import("Cript_Api")*/ private static native int changePassword(BUFFER[] old_pwd, BUFFER[] new_pwd); /**@dll.import("Cript_Api")*/ private static native int changePassword(int old_pwd_ptr, int new_pwd_ptr); //int sign(int algorithm, BUFFER* pwd, BUFFER* inBuf, BUFFER* outBuf); /**@dll.import("Cript_Api")*/ private static native int sign(int alg, BUFFER[] pwd, BUFFER[] in_buf, BUFFER[] out_buf); /**@dll.import("Cript_Api")*/ private static native int sign(int alg, int pwd_ptr, int in_buf_ptr, int out_buf_ptr); //int encrypt(int algorithm, DN* dn, BUFFER* inBuf, BUFFER* outBuf) /**@dll.import("Cript_Api")*/ private static native int encrypt(int alg, DN[] dn, BUFFER[] in_buf, BUFFER[] out_buf); /**@dll.import("Cript_Api")*/ private static native int encrypt(int alg, int dn_ptr, int in_buf_ptr, int out_buf_ptr); //int decode(BUFFER* pwd, BUFFER* inBuf, BUFFER* outBuf, int* algorithm); /**@dll.import("Cript_Api")*/ private static native int decrypt(BUFFER[] pwd, BUFFER[] in_buf, BUFFER[] out_buf, int[] alg); /**@dll.import("Cript_Api")*/ private static native int decrypt(int pwd_ptr, int in_buf_ptr, int out_buf_ptr, int alg_ptr); //int verify(BUFFER* inBuf, int* algorithm, SET_DN* dn); /**@dll.import("Cript_Api")*/ private static native int verify(BUFFER[] in_buf, BUFFER[] out_buf, int[] alg, SET_DN[] set_dn); /**@dll.import("Cript_Api")*/ private static native int verify(int in_buf_ptr, int out_buf_ptr, int alg_ptr, int set_DN_ptr); /**@dll.import("Cript_Api")*/ private static native int BUFFER_new(); /**@dll.import("Cript_Api")*/ private static native void BUFFER_free(BUFFER[] buf); /**@dll.import("Cript_Api")*/ private static native void BUFFER_free(int ptr_buf); /**@dll.import("Cript_Api")*/ private static native void BUFFER_set(BUFFER[] buf, byte[] data, int len); /**@dll.import("Cript_Api")*/ private static native void BUFFER_set(int buf_ptr, byte[] data, int len); /********************************************* * * CONVERSIONE DEI TIPI JAVA IN C * **********************************************/ private void JDnToDN_Ptr(JDn dn,int dn_ptr) { StringToDNPtr(dn.getDNameBytes(),dn_ptr+DNAMEOFS); StringToDNPtr(dn.getRfc822NameBytes(),dn_ptr+RFCNAMEOFS); StringToDNPtr(dn.getUriNameBytes(),dn_ptr+URINAMEOFS); StringToDNPtr(dn.getDirNameBytes(),dn_ptr+DIRNAMEOFS); } private void JDnToEXT__DN_Ptr(JDn dn, int ext_dn_ptr) { DllLib.write4(ext_dn_ptr,0,dn.getRCode()); int dn_ptr = ext_dn_ptr + INTSIZE; JDnToDN_Ptr(dn,dn_ptr); } private void StringToDNPtr(byte[] b,int dn_ptr){ int len; if (b.length