当时在做安全访问功能时,配置机会都是抄着老项目以及被工具的错误提示推着走,以至于功能开发完成了,但是对于加密栈子元素的依赖关系仍然是一头雾水,那么趁此机会,整理下加密栈的依存关系以及个人对这个栈的理解。
在这三个模块中(Csm、CryIf、Crypto),贯穿始终的有一个Key。举个例子,CryptoKeyType相当于一种食物,有可能是肉包有可能是煎蛋,那么对于肉包而言,肉馅和面粉是其元素,而对于煎蛋而言,鸡蛋和食用油就是其元素,那么对于RSA而言元素就是模数和公/私钥指数。而在下图的依赖关系中,将在KeyElement中对元素的属性进行配置。
而在定好了肉馅的种类、质量和面粉的种类、质量(key的初始值、长度、访问权限)后,那我们就要选择做肉包的方法对其原材料进行加工,那么对于加密而言,这个“加工方法”实际上可以类比为加密原语。
DriverObject类比为蒸笼,CryptoPrimitive类比为食物的做法。
Family(算法族)类比为肉包做法,和面、包包子、上锅蒸(RSA算法)。
Mode(算法模式)类比为肉馅里要不要加韭菜(OAEP填充)。
SecondaryFamily(算法次族)类比为包子上要不要撒一些芝麻,要不要点一些红曲(哈希算法)。
这些组合在一起我们可以做出香喷喷的大肉包(加密后的密文)。而后面的算法模式和算法次族对于算法族而言并非必需,就像肉包未必要加韭菜,满足客户需求即可。
对于Key和DriverObj有了一点了解后,根据AUTOSAR定义的依存关系,有如下图的总览图。
基于此总览图, 我们对加密栈的三个层级的配置流程就能够有十分清晰的认知。比如客户现在要求他需要一个RSA-OAEP算法,摘要算法为Hash-256。
那么我们就需要在Csm中新建一个Key,一路索引至CryptoKetTypes,选择RSA,而后选择RSA的公私钥元素设置,比如客户要求是加密,那自然需要我们配置客户的公钥,而RSA的公钥由模数和公钥指数组成,那么我们需要在KeyElement中选择模数和公钥指数进行配置(初始值、长度之类)。
在配置完Key后,我们需要在Crypto中选择相应的原语,即算法族是RSA,算法模式为填充算法OAEP,算法次族为摘要算法HASH256,并在Csm中进行同步。
在我们完成密码学部分的定义后,需要将这些加密任务放在队列中,并由Csm管理调度,那么我们需要把配置完的加密原语放入CryptoDriverObj中,再将CryptoDriverObj放入CryIf的channel里,最后放入Csm的队列当中。
如此便完成了一个加密算法的配置,在代码中可以直接调用Csm相关的加密函数,输入明文获得密文。