我似乎无法理解crypto api是如何工作的。我查看了有关消化密码的示例和文档,但我仍然非常困惑。
内核空间中的
...
unsigned char key[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; //# used as key
struct crypto_tfm *tfm;
struct scatterlist sg;
...
static ssize_t go_encrypt_write(struct file *filp, char *buffer,
size_t length, loff_t *offset)
{
osprd_info_t *d = file2osprd(filp);
uint8_t *tmp = kmalloc(sizeof(uint8_t), GFP_ATOMIC);
struct scatterlist sg;
copy_from_user(tmp, buffer, length);
tfm = crypto_alloc_tfm("aes", 0);
crypto_cipher_setkey(tfm, key, 16);
sg_set_buf(&sg, tmp, length);
crypto_cipher_encrypt(tfm, &sg, &sg, length);
memcpy(d->data, tmp, length);
return length;
}
基本思想是我想将缓冲区从用户空间(字符串)复制到加密的内核空间。
由于我不能直接访问内核空间中的用户空间,我必须使用copy_from_user。从这里开始我将我的变换设置为使用aes算法。然后我设置一个长度为16的硬编码密钥。然后我从用户空间的缓冲区中设置一个分散列表。那么当我加密sg时,此时不应该'tmp'加密?
当我稍后阅读时,我仍然得到没有加密的原始字符串。我究竟做错了什么?谢谢。