Мой английский sh не очень хорош, поэтому я использовал перевод Google.
Я использую cython для вызова openssl через ссылку c, это моя реализация класса оболочки:
cdef class OpensslShake128:
cdef void* ctx
def __cinit__(self):
self.ctx = openssl.EVP_MD_CTX_new()
openssl.EVP_DigestInit(self.ctx, openssl.EVP_shake128())
def __dealloc__(self):
if self.ctx is not NULL:
openssl.EVP_MD_CTX_free(self.ctx)
cpdef void set_data(self, bytes data):
cdef unsigned char* c_data = data
openssl.EVP_DigestUpdate(self.ctx, c_data, len(data))
cpdef bytes read(self, int n):
cdef unsigned char* r = <unsigned char*>PyMem_Malloc(n)
openssl.EVP_DigestFinalXOF(self.ctx, r, n)
openssl.EVP_DigestInit(self.ctx, openssl.EVP_shake128())
cdef bytes result = r[:n]
PyMem_Free(r)
return result
Это тестовый код по сравнению с SHAKE128 библиотеки pycryptodome
from Crypto.Hash import SHAKE128
data = b'0' * 16
shake = OpensslShake128()
shake.set_data(data)
print(shake.read(16)) # output: b'\x0cb\xc9\xd5v%u\xf9\x13\xdc\xbfd\x04\xf23m'
print(shake.read(16)) # output: b'\x7f\x9c+\xa4\xe8\x8f\x82}a`EPv\x05\x85>'
s = SHAKE128.new(data)
print(s.read(16)) # output: b'\x0cb\xc9\xd5v%u\xf9\x13\xdc\xbfd\x04\xf23m'
print(s.read(16)) # output: b'Pc3\xf6\xc6\x1e\xd7\x94Uy\xdc\x8d\xd9~\xb33'
Я обнаружил, что первый вызов OpensslShake128 для read () такой же, как у pycryptodome, но результат вызова read ( ) впоследствии будет другим.
Я думаю, что функция read () класса OpensslShake128 неверна, но я не могу найти способ правильно ее реализовать.
https://www.openssl.org/docs/man1.1.1/man3/EVP_DigestInit.html