c - 为什么 OpenSSL 加密函数在成功时返回 1,在失败时返回 0?
问题描述
一直在编写使用 OpenSSL 的代码,我注意到,令人困惑的是,大多数加密库函数返回 1 表示成功,0 表示失败:
- 使用 RSA_set0_key(key, n,e,d) 时 RSA_public_decrypt 失败?
- https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_verify.html
- https://github.com/openssl/openssl/blob/57d7b988b498ed34e98d1957fbbded8342f2a952/include/openssl/ec.h#L464
- https://github.com/openssl/openssl/blob/master/doc/man3/EVP_EncryptInit.pod#examples
所以我的问题是,为什么 OpenSSL 不使用典型的 C/POSIX 标准返回值?
解决方案
传统上,在 C 中,整数值0
代表false
和1
代表true
,OpenSSL 遵循该约定。有关某些上下文,请参阅有关 Boolean 数据类型的 Wikipedia 页面的这一部分:
C 语言(1972 年)的初始实现没有提供布尔类型,直到今天,布尔值通常在 C 程序中由整数(整数)表示。比较运算符(>、== 等)被定义为返回有符号整数 (int) 结果,0(表示假)或 1(表示真)。
随着 C99中类型的引入,这种情况有所改变,但 OpenSSL 的初始实现早于该类型——因此使用了and_Bool
的整数值。此外,在某些情况下,OpenSSL 函数使用不同的整数值来指示不同类型的结果。0
1
您所指出的关于返回值的SO 答案专门关于进程退出值的特殊情况,该值将返回给其父级。实际上,对于那种特定情况,零值表示成功。但这不是一般应用于函数返回值的典型方法。
推荐阅读
- asp.net-core - System.MissingMethodException:找不到方法:'UInt32 Npgsql.NpgsqlStatement.get_Rows()
- javascript - 在 gmap-v3-geofence.js 中的“selectId(infoId)”中获取 null
- css - 第 N 个子列表显示错误
- javascript - 根据是否存在 href 路径显示/隐藏 btns
- python - 为什么 VSCode Code Runner 不支持 f-strings?
- flutter - 如何将导航路线添加到颤振底部导航路线
- ionic-framework - 尝试 Cordova 运行浏览器时出现错误
- javascript - .htaccess RewriteRule 用于在 javascript 中作为非斜杠添加的多个参数
- ios - 在 pushViewController 之后 ViewController 未显示在屏幕上,但它存在于 UI-Debugger 中
- vue.js - 如何在不使用特殊 Vue.js 库的情况下使用 socket.io-client allware?