首页   注册   登录

linusyang

V2EX 第 19606 号会员,加入于 2012-04-18 18:09:56 +08:00
今日活跃度排名 6408
linusyang 最近回复了
5 天前
回复了 linusyang 创建的主题 Android MIUI 9 欧洲版移植小米公交、支付等服务
@ly19870111 appvault 是负一屏,就是最左边的快捷方式。eu 和国际版的把支付相关的快捷方式去掉了,我把国内版的提取回来了,放在这个包里面,有需要的可以单独刷。
10 天前
回复了 linusyang 创建的主题 Android MIUI 9 欧洲版移植小米公交、支付等服务
@wuyuxing 我改了下最新的脚本,默认 eufix 不改加密了,可以直接刷。强制加密的脚本单独放在了 eufix-force-fbe-oreo.zip 。
连 usb,adb shell 然后运行 top,看占用 cpu 的进程。如果是 com.miui.securitycenter(.remote)和 com.android.settings(:remote)耗电,把安全和设置 app 的数据清空可以临时解决,耗电具体原因未知。
62 天前
回复了 linusyang 创建的主题 Android MIUI 9 欧洲版移植小米公交、支付等服务
@wangyilin1226 @Jormin @liangch @chestermax
诸位,好久没升级系统,所以没办法测试。刚升到 xiaomi.eu 发布的 MIUI 10,版本号 8.6.14 ,提取同版本国内 ROM 的小米支付,可以顺利使用各项功能,无 FC。

最新提取脚本和 Mix 2 提取文件已更新到 Repo。遇到奇怪问题请备份好,清掉 Dalvik Cache 再试。
@bluefalconjun 很奇怪的就是 xiaomi.eu 的固件都能 pass cts,android pay 我都用了很久了…
@bincat 我只是觉得你们用这个简单测试就说 ring 比 openssl 还快,听起来有点想搞大新闻的感觉,有点误导成分,因为测得就不是一个东西。直觉上想想也不对劲,底层代码都是一样的,怎么会快这么多呢…
@bincat evp 是要调用的没错啊,问题是你测就要测对等的啊。一个不包含 init 和 free,一个有,不就不对等了嘛。而且所谓 api 原语,ring 里面的 seal 函数不写了么,对应的 api 应该是这个,C analog: `EVP_AEAD_CTX_seal`,这个是没有包含 init 和 free context 的。
@bincat 我看了一下你们的 benchmark,测试 OpenSSL 的时候并不公平,在测试的每次 iteration 内部有很多 OpenSSL EVP context 初始化和释放的额外开销,导致测试时间多了将近一倍。这个可以用 Instruments.app 或者 valgrind/callgrind 作 profile,很容易就可以查到。

具体来说,OpenSSL 测试的部分用的是 rust-openssl 库,调用的是 symm.rs 里面高层 api,具体的函数是 encrypt_aead [1]。注意到 encrypt_aead 在每次做加密的时候都会新建一个 Crypter 对象,加密完离开作用域会自动调用 drop trait 里定义的 drop()释放。而 Crypter 封装的也是 OpenSSL 的高层 EVP api,初始化的时候会调用一次 EVP_CIPHER_CTX_new 和两次 EVP_CipherInit_ex,释放的时候会调用一次 EVP_CIPHER_CTX_free。这些函数在 test::Bencher 测试的时候,每次循环都会调用,产生的开销还是挺大的。

事实上在加密的时候并不是每次都要新的 Crypter/EVP 对象,因为加密的 IV、Key 和算法都是固定的,理论上只要一个就行了,所以说这部分开销是额外的。但是注意这里不能简单地只建一个 symm::Crypter 复用,因为 EVP api 的限制,每次都要重建,所以用 openssl speed -evp 命令跑出来的也不够快。这里如果不考虑测试函数的正确性,只测 AES-GCM 加密的时间,我们可以只把 Crypter::update 放在 b.iter 的循环里,这样测出来的时间就跟 Ring 的差不多了 [2]。可以参见

Ring 的测试里面用的是 aead::seal_in_place 函数 [3],实际封装的是 C 语言写的 AES-GCM 加密函数 [4],不需要新建和释放 EVP 对象,也就没有了这部分的开销。所以最后测出来 Ring 看起来跑得更快,虽然具体加密算法用的就是 OpenSSL 的代码 [5]。

如果要写一个更公平的测试,最好直接调用更底层的 OpenSSL 函数,可以用 rust-openssl 里的 openssl-sys 库封装的 FFI 来写,就可以去掉 EVP 对象这部分的开销。

[1] https://github.com/sfackler/rust-openssl/blob/c1e5a5c/openssl/src/symm.rs#L664
[2] /revisions
[3] https://github.com/briansmith/ring/blob/1caad72/src/aead/mod.rs#L200
[4] https://github.com/briansmith/ring/blob/1caad72/crypto/cipher/e_aes.c#L301
[5] https://github.com/briansmith/ring/blob/1caad72/crypto/fipsmodule/aes/asm/aesni-x86_64.pl#L566
@waruqi 我也感觉是这样,本质是一个兼容封装库。找了半天实际的加密算法代码,mesalink -> rustls -> ring,最后发现实际加密算法还是用 C 写的,而且是 BoringSSL(OpenSSL)复制过来的 [1]。有点又绕回来的感觉,这么一层一层封装至少性能上不会比 OpenSSL 更好,也会依赖 OpenSSL 具体实现的安全。

想起来 Hacker News/Reddit 上的老笑话,万事万物都可以用 Rust 重写。用 Rust 写是很好,但不是万金油,我认为只能解决一部分问题,比如内存上的问题。最终还是得做形式化分析,证明完导出代码,比如用 F* 写的一个 TLS 库 [2],用的加密算法也是验证过的 [3],虽然形式化分析是条不归路。

[1] https://github.com/briansmith/ring/tree/master/crypto
[2] https://github.com/mitls/mitls-fstar
[3] https://github.com/mitls/hacl-star
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3400 人在线   最高记录 3762   ·  
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.1 · 7ms · UTC 06:20 · PVG 14:20 · LAX 23:20 · JFK 02:20
♥ Do have faith in what you're doing.
沪ICP备16043287号-1