我该在哪里找到os.urandom()的源代码?

3

我想调查和研究Python 3.7的os.urandom()函数的代码。我看了相关的标准库os.py,但它既没有在那里定义,也没有被导入到那里。我还尝试使用grep查找定义:

/usr/lib/python3.7 $ grep -rFl "def urandom" 2> /dev/null 但是没有找到任何结果。我怀疑os.urandom()函数中有一些神奇的事情发生。我在哪里可以找到这个函数的定义以供研究和加密分析?


1
关于当前实现的一些背景信息:https://www.python.org/dev/peps/pep-0524/ - Klaus D.
1个回答

6

os模块定义的许多名称都由Modules/posixmodule.c处理,无论是在POSIX系统上还是Windows系统上。请注意,源代码是用C而不是Python编写的,因为访问系统函数需要本地代码。

您可以在os.py source code中看到这一点,它根据当前操作系统导入posixnt,其中这两个名称都是从上面的posixmodule.c文件编译而来,但被重命名以更好地反映平台并指示两种变体之间的功能差异(nt变体提供的功能较少)。

查看 os_urandom_impl() 函数 了解 os.urandom() 的实现细节。这将委托给一个内部函数 _PyOS_URandom(),与 Python 启动过程中需要的其他辅助函数一起,在 Python/bootstrap_hash.c 中定义。


谢谢。我追踪了这个线索,它指向 https://github.com/python/cpython/blob/3.7/Python/bootstrap_hash.c#L306 ,这基本上就是我要找的(WIN32目前不关心)。 - Richard Neumann
3
如果你的操作系统支持getrandom()系统调用(例如Linux、Solaris),则首选该函数,其次使用getentropy()(OpenBSD),只有在这些调用不可用时Python才会从/dev/urandom读取。因此,dev_urandom()函数是最后一道选择。 - Martijn Pieters
谢谢你的提示。我一定是跳过了那个。 - Richard Neumann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接