Cython中的AES-NI内在函数?

时间:2016-07-10 19:43:52

标签: python aes cython simd cythonize

有没有办法在Cython代码中使用AES-NI指令?

我最近找到的是有人如何访问SIMD说明: https://groups.google.com/forum/#!msg/cython-users/nTnyI7A6sMc/a6_GnOOsLuQJ

Python线程中的AES-NI没有得到回答: Python support for AES-NI

1 个答案:

答案 0 :(得分:2)

您应该能够将内在函数定义为在Cython中正常的C函数。像

这样的东西
cdef extern from "emmintrin.h": # I'm going off the microsoft documentation for where the headers are
    # define the datatype as an opaque type
    ctypedef struct __m128i x:
        pass

    __m128i _mm_set_epi32 (int i3, int i2, int i1, int i0)

cdef extern from "wmmintrin.h":
    __m128i _mm_aesdec_si128(__m128i v,__m128i rkey)

# then in some Cython function
def f():
   cdef __m128i v = _mm_set_epi32(1,2,3,4)
   cdef __m128i key = _mm_set_epi32(5,6,7,8)
   cdef __m128i result = _mm_aesdec_si128(v,key)

问题"如何在bytes阵列上应用此问题"?首先,你得到一个char*字节数组。然后用range迭代它(注意不要跑到最后)。

# assuming you already have an __m128i key
cdef __m128i v
cdef char* array = python_bytes_array # auto conversion
cdef int i, j

# you NEED to ensure that the byte array has a length divisible by
# 16, otherwise you'll probably get a segmentation fault.
for i in range(0,len(python_bytes_array),16):
    # go over in chunks of 16
    v = _mm_set_epi8(array[i+15],array[i+14],array[i+13],
            # etc... fill in the rest 
            array[i+1], array[i])

    cdef __m128 result = _mm_aesdec_si128(v,key)

    # write back to the same place?
    for j in range(16):
        array[i+j] = _mm_extract_epi8(result,j)