1. 基础
SE(Securty Engine) 提供encryption/decryption。
SE 常见使用如下形式加解密:
- cipher engine(密码引擎)
- short messages(short message 指front message 的长度小于block cipher length)
- residue(残余) technology (residue 指当我们最后的数据是小于cipher input block length 剩下的data)
术语 | 解释 |
---|---|
明文 | 原始信息 |
加密算法 | 以密钥为参数,对明文进行多种置换和转换的规则和步骤,变换结果为密文。 |
密钥 | 加密与解密算法的参数,直接影响对明文进行变换的结果 |
密文 | 对明文进行变换的结果 |
解密算法 | 加密算法的逆变换,以密文为输入、密钥为参数,变换结果为明文 |
1.1. 常见cipher engine
- AES 128/192/256
- DES
- TDES(EEE/DDD/EDE/DED)
当然cipher 还有如下full chain(加密模式) 可以搭配, 例如AES_ECB, DES_CBC等。
- ECB
- CBC
- CTR
- OFB
- CFB
例如ECB 模式:
residue ecb_clr:
shortmessage ecb_clr:
cipher chain | CLR (short message) | XOR(IV1)(short message) | XOR(IV2)(short message) | CLR(residue) | RBT(residue) | CTS(residue) |
---|---|---|---|---|---|---|
AES_ECB | O | X | X | O | X | X |
AES_CBC | O | X | X | O | O | O |
AES_CTR | X | O | X | X | O | O |
AES_OFB | O | X | X | O | X | X |
AES_CFB | O | X | X | O | X | X |
DES_ECB | O | X | X | O | X | X |
DES_CBC | O | X | X | O | X | X |
DES_CBC | X | O | O | X | O | X |
DES_CTR | O | X | X | O | X | X |
DES_OFB | O | X | X | O | X | X |
DES_CFB | O | X | X | O | X | X |
TES_ECB | O | X | X | O | X | X |
TES_CBC | O | X | X | O | X | X |
TES_CBC | X | O | O | X | O | X |
TES_CTR | O | X | X | O | X | X |
TES_OFB | O | X | X | O | X | X |
TES_CFB | O | X | X | O | X | X |
注:
O: legal
X: illegal
1.2. key(密钥)
硬件模块支持set key。有些还提供了CPU cannot access 的internal key 进一步保证安全性。因此,我们在加密时需要选择何种key。
当然,internal key 是可以重新生成的,重新产生流程如下:
1.3. R/W 方式
cryptographic 一般支持三种方式的encryption or decrytion:
- pio
- dma
- List + dma
List Mode
每一entry 内容常见为:
- attribute (algorithm)
- dma size
- dma r/w addr
PIO Mode
2. Kernel Crypto
crypto 在kernel 中可以分为如下几类():
- cipher (AES, DES, TDES等)
1.1. Symmetric cipher(ablkcipher, blkcipher, cipher)
1.2. aead cipher(Authenticated Encryption with Associated Data ) - compress(zlib, lzo 等)
- digest (摘要算法例如crc32, sha1, md5等)
- random (软件层随机数)
- hash (CAC, HMAC, XCBC, VMAC 等)
2.1. kernel menuconfig
kernel 的crypto 子系统采用了分层的思想。作者使用crypto_alg 代表算法例如(AES_CBC, DES_CBC等), crypto_tfm 代表用户实例化的对象,它包含了算法与处理逻辑。
crt_u里面的回调函数和cra_u中的回调函数名称几乎一模一样,但是它们的层次不同,crt中的函数实现了一大类算法的运行逻辑,比如cipher中的des中的块应该怎么分割等等,虽然对于摘要算法,sha1或者别的什么的算法逻辑没有什么区别,但是对于cipher来讲就不是这样了,同一种算法可能拥有ecb,cbc,fcb等不同的模式,于是就来了个中间层,这个中间层就是上面的联合体crt_u。
2.2. data structure
1 | struct crypto_alg { |
2.3. usage
kernel中crypto 相关源码在两个位置:
- ${kernel_src}/crypto (向Kernel或userspace提供的api)
- ${kernel_src}/drivers/crypto (支持硬件加密的驱动)
tfm 的管理通过如下函数:1
2crypto_alloc_tfm()
crypto_free_tfm()
在SE 驱动中,我们使用crypto_register_alg() 将他们添加到list中1
2
3
4int crypto_register_algs(struct crypto_alg *algs, int count;
list_add(&alg->cra_list, &crypto_alg_list);
int crypto_unregister_algs(struct crypto_alg *algs, int count);
他们的使用关系大致如下:
crypto API <—> crypto core <—> crypto_register_alg