diff --git a/aes.cpp b/aes.cpp index 526ddc76..c4b1df17 100644 --- a/aes.cpp +++ b/aes.cpp @@ -325,9 +325,37 @@ namespace crypto void TunnelDecryption::Decrypt (uint8_t * payload) { +#ifdef __x86_64__ + __asm__ + ( + // decrypt IV + "movups (%[payload]), %%xmm0 \n" + DecryptAES256(sched_iv) + "movaps %%xmm0, %%xmm1 \n" + // double IV encryption + DecryptAES256(sched_iv) + "movups %%xmm0, (%[payload]) \n" + // decrypt data, IV is xmm1 + "block_dt: \n" + "add $16, %[payload] \n" + "movups (%[payload]), %%xmm0 \n" + "movaps %%xmm0, %%xmm2 \n" + DecryptAES256(sched_l) + "pxor %%xmm1, %%xmm0 \n" + "movups %%xmm0, (%[payload]) \n" + "movaps %%xmm2, %%xmm1 \n" + "dec %[num] \n" + "jnz block_dt; \n" + : + : [sched_iv]"r"(m_IVDecryption.GetKeySchedule ()), [sched_l]"r"(m_LayerDecryption.GetKeySchedule ()), + [payload]"r"(payload), [num]"r"(63) // 63 blocks = 1008 bytes + : "%xmm0", "%xmm1", "%xmm2", "cc", "memory" + ); +#else m_IVDecryption.Decrypt ((ChipherBlock *)payload, (ChipherBlock *)payload); // iv m_LayerDecryption.Decrypt (payload + 16, i2p::tunnel::TUNNEL_DATA_ENCRYPTED_SIZE, payload + 16); // data m_IVDecryption.Decrypt ((ChipherBlock *)payload, (ChipherBlock *)payload); // double iv +#endif } } } diff --git a/aes.h b/aes.h index 10189f33..541baf4e 100644 --- a/aes.h +++ b/aes.h @@ -176,7 +176,11 @@ namespace crypto private: ECBDecryption m_IVDecryption; +#ifdef __x86_64__ + ECBDecryption m_LayerDecryption; +#else CBCDecryption m_LayerDecryption; +#endif }; } }