2016-07-10 2 views
2

Cython 코드 내에서 AES-NI 명령어를 사용할 수 있습니까?Cython의 AES-NI 내장 함수는 무엇입니까?

내가 찾을 수있는 가장 가까운 사람이 SIMD 명령에 액세스하는 방법입니다 https://groups.google.com/forum/#!msg/cython-users/nTnyI7A6sMc/a6_GnOOsLuQJ

파이썬 스레드에서

AES-NI는 대답하지 않은 : Python support for AES-NI

+2

있는 정보 (https://github.com/dlitz/pycrypto/blob/master/src/AESNI.c)? –

+0

@ J.J.Hakala 그런 다음 샘플 코드를 제공하고 대답으로 지정하십시오. – ArekBulski

답변

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 배열을 통해 신청합니까?" 먼저 bytes 배열의 char*을 얻습니다. 그런 다음 range (끝에서 벗어나지 않도록주의)으로 반복하십시오. [pycrypto AESNI.c] 등

# 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) 
+0

반복 할 때마다 함수 호출 오버 헤드없이 어레이를 디코딩하는 루프를 생성 할 수 있습니까? 그렇지 않다면 아마도 C 코드를 인 코드/디코드해야 할 것입니다. –

+0

예 - 그렇게 생각합니다. Cython은 배열에 대해 반복 수행 할 수있는 C 코드를 생성 할 수 있으며 C와 비슷한 속도로 C 함수를 호출 할 수 있습니다. C 컴파일러가 이러한 "함수 호출"을 보았을 때 실제로는 단일 프로세서 명령어 (바라건대!)로 변환해야합니다. 함수 호출하기). – DavidW

+0

환상적입니다. 이제 이것을 바이트 (파이썬 3) 객체에 어떻게 적용합니까? – ArekBulski

관련 문제