首页   注册   登录

linusyang

  •   V2EX 第 19606 号会员,加入于 2012-04-18 18:09:56 +08:00,今日活跃度排名 3142
    linusyang 最近回复了
    @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
    26 天前
    回复了 linusyang 创建的主题 Android MIUI 9 欧洲版移植小米公交、支付等服务
    @danbao 这就是我发的。。
    74 天前
    回复了 linusyang 创建的主题 Android MIUI 9 欧洲版移植小米公交、支付等服务
    @royalsys 你就先用旧版 8.1.25 提取的吧,这个貌似是小米自己的问题了,国际版和国内版某些 miui 框架不匹配。eu 版 rom=国内版底包+gapps+精简系统 apk+build.prop 修改国际版+系统 app 魔改加回部分国内版功能,所以可以直接提取国内版的用。
    74 天前
    回复了 linusyang 创建的主题 Android MIUI 9 欧洲版移植小米公交、支付等服务
    @asipirin1120 @Jormin 现在 eu 又搞幺蛾子,会自动给你刷 xda 上网友 raupe 自己做的 recovery,而且还是人家不支持解密的旧版。raupe 的最新版是支持解密的,我正在用。
    78 天前
    回复了 linusyang 创建的主题 Android MIUI 9 欧洲版移植小米公交、支付等服务
    @asipirin1120 可能要等一会,加密要时间的。只推荐第一次刷机时候用,速度会快点。这个脚本主要是为了提取 mipay,eufix 是我自用的,没仔细测试过,可能有风险。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1810 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 6ms · UTC 06:32 · PVG 14:32 · LAX 23:32 · JFK 02:32
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1