Linux 使用内核加密时,很长消息的SHA摘要不正确

Linux 使用内核加密时,很长消息的SHA摘要不正确,linux,cryptography,kernel,sha,Linux,Cryptography,Kernel,Sha,我正在尝试使用SHA-1和内核加密来计算哈希摘要。对于4096字节以下的消息,我得到了正确的结果。除此之外的任何东西都是不正确的。测试本身没有失败,但给出了错误的响应 左侧显示OpenSSL的输出,右侧显示内核加密。我知道左侧(OpenSSL)给出右侧结果的原因是,结果经过实验室验证。在图像中,消息长度为32984,即4123字节 我的代码如下所示: int numpages = (msgLength / PAGE_SIZE); if ( msgLength % PAGE_SIZE )

我正在尝试使用SHA-1和内核加密来计算哈希摘要。对于4096字节以下的消息,我得到了正确的结果。除此之外的任何东西都是不正确的。测试本身没有失败,但给出了错误的响应

左侧显示OpenSSL的输出,右侧显示内核加密。我知道左侧(OpenSSL)给出右侧结果的原因是,结果经过实验室验证。在图像中,消息长度为32984,即4123字节

我的代码如下所示:

int numpages = (msgLength / PAGE_SIZE);
if ( msgLength % PAGE_SIZE )
    numpages++; // Overflow

struct crypto_shash *tfm = NULL;
struct shash_desc *desc = NULL;
unsigned char *page_msg[numpages];
unsigned char *page_hash;
int i, msg_remaining;

tfm = crypto_alloc_shash("sha1", 0, 0);

desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(tfm), GFP_KERNEL);
    if (!desc) {
        LOG_ERROR("Unable to allocate struct shash_desc\n");
        goto free_return;
    }

desc->tfm = tfm;
desc->flags = 0;

// temporary storage for hash in block-memory
page_hash = (unsigned char*)get_zeroed_page(GFP_KERNEL);

// setup message in block-memory
i=0;
msg_remaining = msgLength;
while ( msg_remaining > 0 ) {
    page_msg[i] = (unsigned char*)get_zeroed_page(GFP_KERNEL);
    memcpy(page_msg[i], msg + (i * PAGE_SIZE), (msg_remaining > PAGE_SIZE) ? PAGE_SIZE : msg_remaining);
    i++;
    msg_remaining -= PAGE_SIZE;
}

// do the operation
crypto_shash_init(desc);
if ( 0 != crypto_shash_digest(desc, page_msg[0], msgLength, page_hash) ) {
    LOG_ERROR("Bad Digest Returned\n");
    goto free_return;
}

free_return:
    crypto_free_shash(tfm);
    free_page((unsigned long)page_hash);
    for ( i = 0; i < numpages; i++ ) {
        free_page((unsigned long)page_msg[i]);
    }
int numpages=(msgLength/页面大小);
如果(msgLength%页面大小)
numpages++;//溢流
结构crypto_shash*tfm=NULL;
结构shash_desc*desc=NULL;
未签名字符*第页消息[numpages];
无符号字符*页面散列;
int i,剩余的msg_;
tfm=crypto_alloc_shash(“sha1”,0,0);
desc=kmalloc(sizeof(*desc)+crypto_shash_descsize(tfm),GFP_内核);
如果(!desc){
日志错误(“无法分配结构shash_desc\n”);
转到自由返回;
}
desc->tfm=tfm;
desc->flags=0;
//块内存中哈希的临时存储
页面散列=(无符号字符*)获取零页面(GFP内核);
//块内存中的设置消息
i=0;
msg_剩余=msgLength;
而(剩余消息>0){
page_msg[i]=(unsigned char*)get_zero_page(GFP_内核);
memcpy(页面信息[i],信息+(i*页面信息大小),(剩余信息>页面信息大小)?页面信息大小:剩余信息);
i++;
msg_剩余-=页面大小;
}
//做手术
crypto_shash_init(desc);
如果(0!=加密摘要(描述,第页消息[0],第页消息,第页散列)){
日志错误(“返回的摘要错误”);
转到自由返回;
}
免费返回:
无密码密码(tfm);
自由页面((无符号长)页面散列);
对于(i=0;i
我从来没有做过linux内核开发,所以完全没有资格回答这个问题,但是您不是在分配内存中不连续的页面,将输入数据复制到这些页面上,然后期望
crypto_shash_digest()
是否将页面视为连续页面?@trojanfoe:我不确定这些页面是否分配在非连续页面中。我也是内核测试的新手。我也是,但我不知道如何将页面“链接”成一个连续的缓冲区。你需要研究内存是如何分配的;您已经在使用
kmalloc()
,所以这可能是正确的方法?