gpt4 book ai didi

带有 RaspberryPi 的 Python Ctypes

转载 作者:太空宇宙 更新时间:2023-11-03 11:03:57 25 4
gpt4 key购买 nike

我正在 PySodium 中为 libsodium 例程 crypto_aead_chacha20poly1305_encrypt 编写一个 ctypes 包装器,该例程定义为:

def crypto_aead_chacha20poly1305_encrypt(message,
ad,
nonce,
key):

mlen = ctypes.c_ulonglong(len(message))
adlen = ctypes.c_ulonglong(len(ad))

c = ctypes.create_string_buffer(mlen.value+16L)
clen = ctypes.c_ulonglong(0)

sodium.crypto_aead_chacha20poly1305_encrypt(c,
clen,
message,
mlen,
ad,
adlen,
None,
nonce,
key)
return c.raw

我的测试驱动程序是:

from pysodium import  crypto_aead_chacha20poly1305_encrypt
from bitstring import BitStream

key = BitStream(hex="4290bcb154173531f314af57f3be3b5006da371ece272afa1b5dbdd1100a1007")
nonce = BitStream(hex="cd7cf67be39c794a")
ad = BitStream(hex="87e229d4500845a079c0")
msg = BitStream(hex="86d09974840bded2a5ca")

print(key)
print(nonce)
print(ad)
print(msg)

m = crypto_aead_chacha20poly1305_encrypt(message=msg.bytes,
ad=ad.bytes,
nonce=nonce.bytes,
key=key.bytes)

edata = BitStream(bytes=m)
print(edata)

令我惊讶的是(这是我第一次使用 libsodium 或 PySodium 或 ctypes)它在 AMD x86_64 系统上运行顺利。不幸的是,当我将所有内容移植到 RaspberryPi (ARMv6) 时,事情就失败了。我针对它运行了 gdb python-gdb 并且可以看到堆栈跟踪:

#0  chacha_keysetup (x=0xbeffefc4, k=0x0) at crypto_stream/chacha20/ref/stream_chacha20_ref.c:69#1  0x4059dcbc in crypto_stream_chacha20_ref (c=0xbefff0e4 "\264\335\024", clen=, n=0x0, k=0x0)    at crypto_stream/chacha20/ref/stream_chacha20_ref.c:241#2  0x40556f60 in crypto_aead_chacha20poly1305_encrypt (c=0x405385f4 "\206Йt\204\v\336", , clen=0x437f44,     m=0x0, mlen=4634464344201201140, ad=0xa , adlen=1079196860, nsec=0xa , npub=    0x0, k=0x0) at crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c:49#3  0x40501368 in ffi_call_VFP () from /usr/lib/python2.7/lib-dynload/_ctypes_d.so#4  0x40500930 in ffi_call () from /usr/lib/python2.7/lib-dynload/_ctypes_d.so#5  0x404ecf10 in _call_function_pointer (flags=4353, pProc=0x40556ea8 , avalues=0xbefff2d8,     atypes=0xbefff2a8, restype=0x402a6ed8, resmem=0xbefff308, argcount=9)    at /build/python2.7-xJctIx/python2.7-2.7.3/Modules/_ctypes/callproc.c:827#6  0x404edb84 in _ctypes_callproc (pProc=0x40556ea8 , argtuple=    (, , '\x86\xd0\x99t\x84\x0b\xde\xd2\xa5\xca', , '\x87\xe2)\xd4P\x08E\xa0y\xc0', , None, '\xcd|\xf6{\xe3\x9cyJ', "B\x90\xbc\xb1T\x1751\xf3\x14\xafW\xf3\xbe;P\x06\xda7\x1e\xce'*\xfa\x1b]\xbd\xd1\x10\n\x10\x07"), flags=4353, argtypes=0x0, restype=    , checker=0x0)    at /build/python2.7-xJctIx/python2.7-2.7.3/Modules/_ctypes/callproc.c:1174#7  0x404e5154 in PyCFuncPtr_call (self=0x40518e90, inargs=    (, , '\x86\xd0\x99t\x84\x0b\xde\xd2\xa5\xca', , '\x87\xe2)\xd4P\x08E\xa0y\xc0', , None, '\xcd|\xf6{\xe3\x9cyJ', "B\x90\xbc\xb1T\x1751\xf3\x14\xafW\xf3\xbe;P\x06\xda7\x1e\xce'*\xfa\x1b]\xbd\xd1\x10\n\x10\x07"), kwds=0x0)    at /build/python2.7-xJctIx/python2.7-2.7.3/Modules/_ctypes/_ctypes.c:3913#8  0x0002fa08 in PyObject_Call (func=, arg=    (, , '\x86\xd0\x99t\x84\x0b\xde\xd2\xa5\xca', , '\x87\xe2)\xd4P\x08E\xa0y\xc0', , None, '\xcd|\xf6{\xe3\x9cyJ', "B\x90\xbc\xb1T\x1751\xf3\x14\xafW\xf3\xbe;P\x06\xda7\x1e\xce'*\xfa\x1b]\xbd\xd1\x10\n\x10\x07"), kw=0x0) at ../Objects/abstract.c:2529

阅读 FFI 的实际作用后,我不得不认为,出于某种原因,当 ctypes 将数据传递给 FFI 时,它会在途中被破坏。我进行了搜索,试图找出 Pi/ARM 平台上的 ctypes/FFI 等是否存在一些已知问题,但一无所获。如果这是我的实际绑定(bind)代码,我很想知道为什么它在 x86_64 和 ARM 上表现正确。

最后,我对使用 ctypes 替代品的建议持开放态度(尽管我对 SWIG 并不疯狂,如果需要的话)。

最佳答案

下面的

clen 需要使用 ctypes.byref() 方法通过引用传递。来自 Ctypes documentation : 有时 C api 函数需要一个指向数据类型的指针作为参数,可能写入相应的位置,或者如果数据太大而无法按值传递。这也称为通过引用传递参数。 ctypes 导出用于通过引用传递参数的 byref() 函数。无论出于何种原因使用ctypes.byref() 在 x86 上都没有问题平台,但在 ARM 处理器上。更新代码以使用它清除了 ARM 上的段错误,并且在 x86 上也按预期工作。

def crypto_aead_chacha20poly1305_encrypt(message,
ad,
nonce,
key):

mlen = ctypes.c_ulonglong(len(message))
adlen = ctypes.c_ulonglong(len(ad))

c = ctypes.create_string_buffer(mlen.value+16L)
clen = ctypes.c_ulonglong(0)

sodium.crypto_aead_chacha20poly1305_encrypt(c,
ctypes.byref(clen),
message,
mlen,
ad,
adlen,
None,
nonce,
key)
return c.raw

crypto_aead_chacha20poly1305_encryptcrypto_aead_chacha20poly1305_decryptcrypto_stream_chacha20_xor 的绑定(bind)可在 pysodium 的分支上获得,地址为 https://github.com/iachievedit/pysodium直到提交并接受拉取请求。

关于带有 RaspberryPi 的 Python Ctypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25278208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com