Как использовать последовательность SHAKE128 в openssl - PullRequest
0 голосов
/ 10 июля 2020

Мой английский 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

...