- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在 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_encrypt
、crypto_aead_chacha20poly1305_decrypt
和 crypto_stream_chacha20_xor
的绑定(bind)可在 pysodium 的分支上获得,地址为 https://github.com/iachievedit/pysodium直到提交并接受拉取请求。
关于带有 RaspberryPi 的 Python Ctypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25278208/
Closed. This question needs details or clarity。它当前不接受答案。 想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。 4
我想通过蓝牙接收从手机到树莓的消息 我写了以下代码, import bluetooth hostMACAddress = '18:9E:FC:A1:81:93' # The MAC address o
Stackoverflow 用户您好, 对于我的学生项目,我需要使用 python 和 mysql,但是当我尝试使用时出现这种错误 Traceback (most recent call last):
我一直在学习剑桥大学的“BakePI”类(class),但在确定设备的正确内存地址时发现了一些问题。 例如:在他们的类(class)中,他们声称系统计时器位于位置 0x20003000 但在 BCM2
我正在开发一个使用树莓派构建机器人的项目,该机器人将视频发送到 android 设备,并由它控制。 我决定使用 RaspberryPi 摄像头(也许 USB 网络摄像头更好?)。 我希望视频采用 H2
我正在使用 raspivid 和 netcat 将视频从 RaspberryPi Zero 流式传输到我的 PC: raspivid -t 0 -n -w 320 -h 240 -hf -fps 30
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我生日时收到了一个覆盆子圆周率,我决定用它做一个闹钟。我在我的 PC 上编写了所有代码,工作完全正常并且符合预期,但我在 raspberry pi 上安装软件包时遇到了一些小问题。 当我打开终端时,我
我最近第一次体验了 Raspberry Pi。过了一会儿,我不小心删除了一个重要文件,所以我被告知从另一个 Pi 安装图像。所以我从工作卡中取出 SD 卡并使用“Disc-Imager”创建了一个图像
我正在关注这个website将树莓派与网络服务器连接。所有步骤均正确完成,包括最后一步。然后我尝试去http://127.0.0.1:8000/但从 chrome 收到这条消息:“无法访问该网站 12
我正在寻求澄清 Raspbian 上 LLVM 3.2 的最佳构建选项是什么 我已经获取了 3.2 的 LLVM 源代码,我的配置是: cd llvm-3.2.src ./configure --bu
我想使用Raspberry Pi 2和OSMC从外部HDD播放某些视频文件时出现声音问题。除了听到视频声音外,我听到的声音非常刺耳,沙沙作响。有点像老式电子游戏中的机枪声音。该错误仅在某些视频文件中发
我想在 PIR 传感器处于 Activity 状态时调用网络服务。我使用 wsimport 创建了 Web 服务调用:wsimport -keep -s src http://webservicex.
我在我的 RPI 上安装了 sphinx 和 Jasper。当我尝试启动 Jasper 时 - 我得到了这个: Traceback (most recent call last): F
目前正在尝试使用 GUI 编写代码,以允许打开/关闭图像处理。理想情况下,代码将允许打开/关闭窗口 View 、实时图像处理(非常基本)和控制外部板。 我遇到的问题与 cv2.imshow() 函数有
我已经在Raspberry-Pi模块上实现了这段代码,从文件夹中读取png图像并将其转换为灰色,代码如下: x = glob.glob("/home/pi/pngimages/ss*png") for
我们正在尝试使用 Antlr4(Python2 目标)在 RaspberryPi B 上解析自定义语言。然而,做任何严肃的事情都太慢了:解析几行大约需要十秒钟。这是我的代码: Transposeur.
我正在 PySodium 中为 libsodium 例程 crypto_aead_chacha20poly1305_encrypt 编写一个 ctypes 包装器,该例程定义为: def crypto
我正在按照本指南使用主机桌面在 RaspberryPi 上构建 Qt https://wiki.qt.io/Raspberry_Pi_Beginners_Guide . 当涉及到使用 make 命令构
我已使用 USB 适配器将 adafruit ultimate gps v3 连接到树莓派。 gps 单元似乎有一个修复,因为 led(在 gps 单元上)以缓慢的速度闪烁(可能每 10 秒)。如果我
我是一名优秀的程序员,十分优秀!