/// <summary> /// Fast encrypt data on unmanaged pointer /// </summary> /// <param name="SourceBuffer"></param> /// <param name="Length"></param> /// <param name="Challenge"></param> /// <param name="Password"></param> /// <returns></returns> public static unsafe uint Encrypt(byte* SourceBuffer, int Length, uint Challenge, byte[] Password) { uint expectedResponse = 0; // init crush32 if (Crush32.CX_SUCCESS == Crush32.cxInit()) { if (Crush32.CX_SUCCESS == Crush32.cxBuf2BufInit()) { // pin the managed sourcebuffer in memory so crush32 can access // and we can directly use without marshaling. fixed (byte* ptrPassword = Password) { // set password && encrypt if (Crush32.CX_SUCCESS == Crush32.cxSetPassword(ptrPassword)) expectedResponse = Crush32.cxBufEncrypt(SourceBuffer, Length, Challenge); } Crush32.cxBuf2BufClose(); } Crush32.cxCleanup(); } return expectedResponse; }
/// <summary> /// /// </summary> /// <param name="SourceBuffer"></param> /// <param name="Length"></param> /// <param name="Challenge"></param> /// <param name="ExpectedResponse"></param> /// <param name="Password"></param> /// <returns></returns> public static unsafe bool Decrypt(byte* SourceBuffer, int Length, uint Challenge, uint ExpectedResponse, byte[] Password) { bool isSuccessful = false; // init crush32 if (Crush32.CX_SUCCESS == Crush32.cxInit()) { if (Crush32.CX_SUCCESS == Crush32.cxBuf2BufInit()) { // pin the managed sourcebuffer in memory so crush32 can access // and we can directly use without marshaling. fixed (byte* ptrPassword = Password) { // set password && decrypt if (Crush32.CX_SUCCESS == Crush32.cxSetPassword(ptrPassword)) if (Crush32.CX_SUCCESS == Crush32.cxBufDecrypt(SourceBuffer, Length, Challenge, ExpectedResponse)) isSuccessful = true; } Crush32.cxBuf2BufClose(); } Crush32.cxCleanup(); } return isSuccessful; }