Jimmy Chen

A Programmer

(原创)Android FBE加密源码分析(一)

  书接上一回,上一回我们讲到分区的mount过程,这一回我们将剩下的加密内容也一同分析下。

接上一篇 fs_mgr_mount_all 开始

上一篇只讲到mount_with_alternatives函数就没有继续讲下去了,这里我们从这里开始讲。同样的,这里我们还是用userdata这一个分区作为例子。userdata在fstab.sailfish的内容也先贴出来。

下面开始看代码

fs_mgr_mount_all –> handle_encryptable

这里查看userdata在fstabl.sailfish中的标志位带有”fileencryption=”,对比上一篇中的fs_mgr_flags[]数组可以知道,”fileencryption=”对应于MF_FILEENCRYPTION。这接下来的代码就是比较对应分区信息中是都带有对应的标志的。

handle_encryptable –> needs_block_encryption

handle_encryptable –> should_use_metadata_encryption

到这里,加密部分对应的参数就分析OK了,接下来就是从fs_mgr_mount_all函数向上弹出调用栈,首先是回到mount_fstab函数中。

mount_fstab

上一篇说到mount_fstab会创建一个线程执行mount操作,而父进程则等待子线程返回,并获取返回值。

这一步OK,再往上出栈就到do_mount_all了。

do_mount_all

do_mount_all –> queue_fs_event

只看相关的内容,其余部分省略掉。首先看key的安装。

queue_fs_event –> e4crypt_install_keyring

这里,在do_mount_all的最后触发了”nonencrypted” event。看这个event的内容只是简单启动late_start和main类的应用。看来这个加密过程还要在稍后的地方进行啊。

on_post_fs阶段

这里,我们从installkey开始,对照function map,installkey这个action对应的函数是do_intallkey

do_installkey –> vdc::main()

vdc::main() –> do_cmd

vdc通过socket通信的方式,和cryptd建立连接,并通过write见cmd数据写到cryptd中。最后通过do_monitor等待处理的结果并对结果进行分析。在分析cryptd是如何处理数据前,需要先弄清楚cryptd这个socket server端是什么时候启动起来的。

Vold启动分析

  看回前面init.rc中的op-post-fs阶段,在installkey前,有先执行start vold,所以呢,在执行installkey前,vold是会先启动的。vold的代码在system/vold/main.cpp中

main.cpp::main()

既然前面doInstallkey是通过socket来传输指令的,那当然要分析下socket的服务端是怎么启动的。

new CryptCommandListener()

ccl->startListener()

cryptd的启动流程知道了,下面继续看看是怎么处理client到达的数据的吧。首先根据纯虚函数和继承可以知道,最后调用的onDataAvailable是FrameworkListener::onDataAvailable,然后FrameworkListener::onDataAvailable会调用到FrameworkListener::dispatchCommand

FrameworkListener::onDataAvailable

FrameworkListener::dispatchCommand() –> FrameworkListener::dispatchCommand

好了好了,这一篇感觉长了,就想到这里,剩下的会在另一篇里在做分析。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注