CSM,CryIf,CrptoDriver每层都做了什么
CryptoDriver(CryDrv)配置:
1)CryptoPrimitives配置用到的算法
2)配置CryptoDriverObjects
3)配置CryptoGeneral
4)配置CryptoKeyElements
5)配置CryptoKeyTypes
6)配置CryptoKeys
CryptoInterface(CryIf)配置
1)配置CryIfChannels:
2)配置CryIfCryptoModules
3)CryIfKeys配置
4)CryIfGeneral配置
CryptoServiceManager(CSM)配置
1)CsmJobs配置
2)CsmPrimitives配置
3)CsmKeys配置
4)CsmQueues配置
5)CsmGeneral配置
6)CsmCallbacks配置
CSMAPI的调用:
1)同步作业模式
2)异步作业模式
CSMJob的调用
随着汽车网联化和智能化,汽车不再孤立,越来越多地融入到互联网中。同时,汽车也慢慢成为潜在的网络攻击目标。这边不做过多赘述,只是强调一下网络安全和功能安全的区别,经常会有人疑惑这两者之间的关系,这边引用一张vector的图,非常清晰的展示了两者之间的区别:
1)功能安全是保护人为目的的,车如果发生故障的话,目的是让车能尽可能的可控,不会失控去对人做出伤害。
2)网络安全是反过来保护车辆系统的,防止黑客的入侵,控制或者窃取车辆信息,使车辆不可控,或者干一些违法的事情。
这边我们做出如下总结:
1)像T-BOX,TCU,网关等节点或功能,必须考虑网络安全,因为它们有直接的对外连接
2)具有高功能安全等级,比如ASILC/D的节点,也要实施网络安全
4)有无线连接的节点,比如蓝牙,NFC,WIFI等有关的组件也要涉及网络安全,因为他们是最容易被攻击的组件
5)对外连接的节点,比如对外连接的总线,OBD
那么在AUTOSAR架构中是怎么实现网络安全功能的呢?
这个话题涉及的内容就比较多,今天我们只讲CryptoStack的实现。
如下图,是AUTOSARCP信息安全架构图:
可以看到CryptoStack分为三部分:
为什么会存在CSM,CryIf,CrptoDriver?
是为了将硬件HSM的接口做一个封装,以便上层服务可以标准化调用,而不受HSM的不同的影响。
而且HSM通常还拥有单独的存储区,包括RAM和NVM,HSM的存储区在正常运行状态下应只允许HSM核读写,主核不能读写。这样就可以把算法秘钥等重要数据存储在HSM存储区,与主核进行隔离,进一步加强安全性。此外HSM模块还会带有真随机数生成器等加密算法常用外设。
HSM两个主要功能:
第一个是存储管理密钥。第二个是加速加解密算法
以TC397为例,HSM作为外设之一,挂载在单片机的SPB系统外设总线上。
HSM展开后的架构图,HSM有一个基于ARMCortex-M3的CPU,有随机数生成器TRNG,AES算法等硬件加速器,以及中断、Timer等组成部分。
其中存储软件程序和数据的PFlash和DFlash实际上与芯片的其他部件共用一块Flash,但是能通过TriCore的访问控制设置,来保护HSM所对应的Flash区域不被非法访问或篡改。安全密钥的存储就是在其中的DFlash里。
举个栗子,HSM有两个加密驱动对象CryptoDriverObject:HW-AES和HW-RSA
它们每个都有自己的通道。每个通道连接到一个CSM队列和一个CryptoDriverObject队列。
两个CryptoDriverObject都在分别处理一个加密作业:AES-high和RSA
其中一个CryptoDriverObject的队列包含另一个作业(AES-low)。如果HSM的HW-AES已经完成了AES-high的任务,则将AES-low的任务作为下一个任务处理。
假设应用程序的新作业调用RSA:
1)如果RSA的CryptoDriverObject不繁忙,则立即处理该任务。
2)如果RSA的CryptoDriverObject很忙,但是CryptoDriverObject的队列未满,则该作业将按优先级顺序列在该队列中。一旦CryptoDriverObject空闲,将执行CryptoDriverObject队列中具有最高优先级的作业。
3)如果RSA的CryptoDriverObject很忙,并且CryptoDriverObject的队列已满,则该作业将按照优先级顺序存储在CSM队列中。·
4)如果RSA的CryptoDriverObject忙,且CryptoDriverObject队列和CSM队列都已满,CSM会拒绝请求。
5)如果RSA的CryptoDriverObject是活动的,则作业已经在加密驱动程序中启动,正在等待更多的数据来处理或完成命令。
CryptoDriver(CryDrv)配置
主核的Crypto层主要负责与HSM的交互,将任务转发给HSM,并获取响应Crypto模块需要如下container,如果不存在就需要右键Crypto添加这些Container.
这边举一个CAMCVerify的例子.
添加一个Object:HSM_Crypto
CryIf将CSM层的请求转发到对应的CryptoDriver。它涉及到的主要配置就是CryIfChannel。它将Csm层的job和实际处理cryptoDriverObject对应起来。CryIf模块需要如下container:CryIfChannels,CryIfCryptoModules,CryIfKeys,CryIfGeneral.
DriverObjectsRef就是Crypto模块配置中配置好的
SWC或者BSW调用接口时除了data之外只传了jobid,而没有类似使用什么key,什么算法之类的东西,CSMjob封装了所有这些信息,可以被视为在CryptoDriverObject中实现的加密算法的实例。所以通过CSMJob为入口分析CSM的配置
CSMjob会引用到Csm层的CsmPrimitive
异步执行作业时需要有callback函数。根据需要配置,这边只是举个例子
CSMAPI的调用
CSM的API大致可以分为两类:直接API(主要用于密钥管理)和基于作业的API(主要用于加解密操作)
直接API(DirectAPI):
直接对应于CryIf和加密驱动程序中的函数。这些函数只能同步调用。CSM会将参数从应用程序直接传递给函数调用。
基于作业的API(Job-basedAPI):
使用作业结构Crypto_JobType,它包含静态和动态参数以及对结构的引用。此数据为加密驱动程序提供执行该作业所需的所有信息。每个使用作业的服务都将使用此结构。服务的所有必要参数将由CSM打包到结构的元素中,然后将调用CryIf,而这又将调用配置的加密驱动程序。
直接API是直接调用,只能同步调用,比较简单,这里不做过多描述
我这边想要讲一下基于job的API的调用的同步模式,和异步模式
SynchronousModeSynchronousmode:CSM服务Job在调用方的上下文中立即执行,函数返回结果直接可用因为对于同步作业处理来说,队列排队可能用途不大。所以如果选择了同步作业处理,则建议把队列大小设定为0。但是,如果通道同时支持同步和异步作业,则队列排队机制还是有使用的必要。在Csm_MainFunction()中,可以将排队的作业传递给给CRYIF模块。
AsynchronousModeAsynchronousmode:异步作业稍后由专用CRYPTO在预先安排的主函数上下文中或硬件中处理。如果特定的CRYPTO驱动程序对象因为繁忙而拒绝该作业,CSM将服务请求放在相应的CSM作业队列中。CRYPTO使用CRYIF的回调函数通知CRYIF异步作业的完成。CRYIF通过CSM的回调函数转发结果。
最后来总结一下CSMjob调用的流程:
CSMJob可能有多个队列,每个队列映射到一个单独的加密驱动对象CryptoDriverObject(CDO),从而可以访问CDO的加密原语cryptoprimitives,CRYPTO因为繁忙拒绝了CSM的服务请求后,特定的Job会根据其优先级放入相应的CSM队列中,在Csm_MainFunction()循环调用期间,排队的Job被传递给CRYIF。CRYIF将把Job转发给特定的CRYPTO。为了优化CDO的硬件使用CDO也可以有选择的有JobQueuing。每个Job的优先级根据其配置决定其优先级,优先级值越高,优先级越高,Job将根据其优先级执行。