免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1380 | 回复: 0
打印 上一主题 下一主题

linux内核加密框架 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-15 09:46 |只看该作者 |倒序浏览
Linux内核支持很多加密算法,包括对称加密算法,如AES;摘要算法,如sha1,md5;压缩算法,如deflate。不过内核好像不支持非对称加密算法。这些算法作为加密函数框架的最底层,提供加密和解密的实际操作。这些函数可以在内核crypto文件夹下,相应的文件中找到。不过内核模块不能直接调用这些函数,因为它们并没有export。内核提供一个统一的框架,来管理这些算法。加密算法通过crypto_register_alg()和crypto_unregister_alg()注册。内核将加密算法分为三类,1)cipher,2)compress,3)digest。加密函数框架中有相应的API封装,提供给模块调用。
对于使用这些加密函数,首先通过crypto_alloc_tfm()来分配一个加密函数对象的实例。初始化这些实例,然后就可以通过框架提供的API对数据进行加密和解密。完成以后,必须通过crypto_free_tfm()撤销实例。
下面是几个代码,或许能够够对内核的加密框架有更直观的了解:
1)digest算法(sha1)
[color="#000000"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000ff"]struct crypto_tfm [color="#0000cc"]*tfm[color="#0000cc"];
[color="#0000ff"]struct scatterlist sg[color="#0000cc"][1[color="#0000cc"]][color="#0000cc"];
[color="#0000ff"]char [color="#0000cc"]* code1 [color="#0000cc"]= [color="#ff00ff"]"2ew34123132513451345"[color="#0000cc"];
[color="#0000ff"]char [color="#0000cc"]* code2 [color="#0000cc"]= [color="#ff00ff"]"234123132513451345"[color="#0000cc"];
[color="#0000ff"]char [color="#0000cc"]*do_digest[color="#0000cc"]([color="#0000ff"]char [color="#0000cc"]* code[color="#0000cc"]) [color="#0000cc"]{
    [color="#0000ff"]char [color="#0000cc"]*result[color="#0000cc"];
    [color="#0000ff"]int code_len [color="#0000cc"]= [color="#ff0000"]strlen[color="#0000cc"](code[color="#0000cc"])[color="#0000cc"];
   
        tfm [color="#0000cc"]= crypto_alloc_tfm[color="#0000cc"]([color="#ff00ff"]"sha1"[color="#0000cc"],0[color="#0000cc"])[color="#0000cc"];
        [color="#0000ff"]if[color="#0000cc"](IS_ERR[color="#0000cc"](tfm[color="#0000cc"])[color="#0000cc"])
                [color="#0000ff"]return 0[color="#0000cc"];
        sg_init_one[color="#0000cc"](sg[color="#0000cc"],code[color="#0000cc"],code_len[color="#0000cc"])[color="#0000cc"];
        crypto_digest_init[color="#0000cc"](tfm[color="#0000cc"])[color="#0000cc"];
        crypto_digest_update[color="#0000cc"](tfm[color="#0000cc"],sg[color="#0000cc"],1[color="#0000cc"])[color="#0000cc"];
    result [color="#0000cc"]= [color="#0000cc"]([color="#0000ff"]char [color="#0000cc"]*[color="#0000cc"])kmalloc[color="#0000cc"]([color="#0000ff"]sizeof[color="#0000cc"]([color="#0000ff"]char[color="#0000cc"])[color="#0000cc"]*50[color="#0000cc"],GFP_KERNEL[color="#0000cc"])[color="#0000cc"];
[color="#0000cc"]    if(result == NULL) {
[color="#0000cc"]        crypto_free_tfm(tfm);
[color="#0000cc"]        return 0;
[color="#0000cc"]    }[color="#000000"]
    memset[color="#0000cc"](result[color="#0000cc"],0[color="#0000cc"],[color="#0000ff"]sizeof[color="#0000cc"]([color="#0000ff"]char[color="#0000cc"])[color="#0000cc"]*50[color="#0000cc"])[color="#0000cc"];
    crypto_digest_final[color="#0000cc"](tfm[color="#0000cc"],result[color="#0000cc"])[color="#0000cc"];
        crypto_free_tfm[color="#0000cc"](tfm[color="#0000cc"])[color="#0000cc"];
    [color="#0000ff"]return result[color="#0000cc"];
[color="#0000cc"]}
[color="#0000ff"]static [color="#0000ff"]int __init test_init[color="#0000cc"]([color="#0000ff"]void[color="#0000cc"])
[color="#0000cc"]{
    [color="#0000ff"]char [color="#0000cc"]*result1[color="#0000cc"],[color="#0000cc"]*result2[color="#0000cc"];
    result1 [color="#0000cc"]= do_digest[color="#0000cc"](code1[color="#0000cc"])[color="#0000cc"];
    [color="#0000ff"]if[color="#0000cc"]([color="#0000cc"]!result1[color="#0000cc"])
        [color="#0000ff"]goto failed2[color="#0000cc"];
    result2 [color="#0000cc"]= do_digest[color="#0000cc"](code2[color="#0000cc"])[color="#0000cc"];
    [color="#0000ff"]if[color="#0000cc"]([color="#0000cc"]!result2[color="#0000cc"])
        [color="#0000ff"]goto failed1[color="#0000cc"];
   
    [color="#0000ff"]if[color="#0000cc"]([color="#ff0000"]memcmp[color="#0000cc"](result1[color="#0000cc"],result2[color="#0000cc"],50[color="#0000cc"]) [color="#0000cc"]![color="#0000cc"]= 0[color="#0000cc"])
        printk[color="#0000cc"]([color="#ff00ff"]"code1 != code2\n"[color="#0000cc"])[color="#0000cc"];
    [color="#0000ff"]else
        printk[color="#0000cc"]([color="#ff00ff"]"code1 == code2\n"[color="#0000cc"])[color="#0000cc"];
    kfree[color="#0000cc"](result2[color="#0000cc"])[color="#0000cc"];
[color="#000000"]failed1:
    kfree[color="#0000cc"](result1[color="#0000cc"])[color="#0000cc"];
failed2[color="#0000cc"]:
    [color="#0000ff"]return 0[color="#0000cc"];
[color="#0000cc"]}
[color="#0000ff"]static [color="#0000ff"]void __exit test_exit[color="#0000cc"]([color="#0000ff"]void[color="#0000cc"])
[color="#0000cc"]{
[color="#0000cc"]}
module_init[color="#0000cc"](test_init[color="#0000cc"])[color="#0000cc"];
module_exit[color="#0000cc"](test_exit[color="#0000cc"])[color="#0000cc"];
MODULE_LICENSE[color="#0000cc"]([color="#ff00ff"]"GPL"[color="#0000cc"])[color="#0000cc"];
MODULE_AUTHOR[color="#0000cc"]([color="#ff00ff"]"richardhesidu@chinaunix"[color="#0000cc"])[color="#0000cc"];
2)compress算法(deflate)
[color="#000000"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000ff"]struct crypto_tfm [color="#0000cc"]*tfm[color="#0000cc"];
[color="#0000ff"]char [color="#0000cc"]* code [color="#0000cc"]= [color="#ff00ff"]"Hello everyone, I'm richardhesidu from chinaunix.net !"[color="#0000cc"];
[color="#0000ff"]static [color="#0000ff"]inline  [color="#0000ff"]void hexdump[color="#0000cc"]([color="#0000ff"]unsigned [color="#0000ff"]char [color="#0000cc"]*buf[color="#0000cc"],[color="#0000ff"]unsigned [color="#0000ff"]int len[color="#0000cc"]) [color="#0000cc"]{
    [color="#0000ff"]while[color="#0000cc"](len[color="#0000cc"]-[color="#0000cc"]-[color="#0000cc"])
        printk[color="#0000cc"]([color="#ff00ff"]"0x%02x,"[color="#0000cc"],[color="#0000cc"]*buf[color="#0000cc"]+[color="#0000cc"]+[color="#0000cc"])[color="#0000cc"];
    printk[color="#0000cc"]([color="#ff00ff"]"\n"[color="#0000cc"])[color="#0000cc"];
[color="#0000cc"]}
[color="#0000ff"]static [color="#0000ff"]int __init test_init[color="#0000cc"]([color="#0000ff"]void[color="#0000cc"]) [color="#0000cc"]{
    [color="#0000ff"]int ret[color="#0000cc"],result_len[color="#0000cc"],temp_len[color="#0000cc"];
    [color="#0000ff"]char result[color="#0000cc"][512[color="#0000cc"]][color="#0000cc"];
    [color="#0000ff"]char temp[color="#0000cc"][512[color="#0000cc"]][color="#0000cc"];
    printk[color="#0000cc"]([color="#ff00ff"]"%s\n"[color="#0000cc"],code[color="#0000cc"])[color="#0000cc"];   
   
    [color="#ff9900"]/* Allocate transform for deflate */
            
    tfm [color="#0000cc"]= crypto_alloc_tfm[color="#0000cc"]([color="#ff00ff"]"deflate"[color="#0000cc"],0[color="#0000cc"])[color="#0000cc"];
        [color="#0000ff"]if[color="#0000cc"](IS_ERR[color="#0000cc"](tfm[color="#0000cc"])[color="#0000cc"]) [color="#0000cc"]{
        printk[color="#0000cc"]([color="#ff00ff"]"failed to load transform for deflate !\n"[color="#0000cc"])[color="#0000cc"];
                [color="#0000ff"]return 0[color="#0000cc"];
    [color="#0000cc"]}
    [color="#ff0000"]memset[color="#0000cc"](result[color="#0000cc"],0[color="#0000cc"],[color="#0000ff"]sizeof[color="#0000cc"](result[color="#0000cc"])[color="#0000cc"])[color="#0000cc"];
    temp_len [color="#0000cc"]= 512[color="#0000cc"];
    ret [color="#0000cc"]= crypto_comp_compress[color="#0000cc"](tfm[color="#0000cc"],code[color="#0000cc"],[color="#ff0000"]strlen[color="#0000cc"](code[color="#0000cc"])[color="#0000cc"],temp[color="#0000cc"],[color="#0000cc"]&temp_len[color="#0000cc"])[color="#0000cc"];
    [color="#0000ff"]if[color="#0000cc"](ret[color="#0000cc"]) [color="#0000cc"]{
        printk[color="#0000cc"]([color="#ff00ff"]"failed to compress !\n"[color="#0000cc"])[color="#0000cc"];
        [color="#0000ff"]return 0[color="#0000cc"];
    [color="#0000cc"]}
      
    hexdump[color="#0000cc"](temp[color="#0000cc"],[color="#ff0000"]strlen[color="#0000cc"](temp[color="#0000cc"])[color="#0000cc"])[color="#0000cc"];
   
    [color="#ff0000"]memset[color="#0000cc"](result[color="#0000cc"],0[color="#0000cc"],[color="#0000ff"]sizeof[color="#0000cc"](result[color="#0000cc"])[color="#0000cc"])[color="#0000cc"];
    result_len [color="#0000cc"]= 512[color="#0000cc"];
    ret [color="#0000cc"]= crypto_comp_decompress[color="#0000cc"](tfm[color="#0000cc"],temp[color="#0000cc"],[color="#ff0000"]strlen[color="#0000cc"](temp[color="#0000cc"])[color="#0000cc"],result[color="#0000cc"],[color="#0000cc"]&result_len[color="#0000cc"])[color="#0000cc"];
    [color="#0000ff"]if[color="#0000cc"](ret[color="#0000cc"]) [color="#0000cc"]{
                printk[color="#0000cc"]([color="#ff00ff"]"failed to decompress !\n"[color="#0000cc"])[color="#0000cc"];
                [color="#0000ff"]return 0[color="#0000cc"];
        [color="#0000cc"]}
    printk[color="#0000cc"]([color="#ff00ff"]"%s\n"[color="#0000cc"],result[color="#0000cc"])[color="#0000cc"];
    [color="#0000ff"]if[color="#0000cc"]([color="#ff0000"]memcmp[color="#0000cc"](code[color="#0000cc"],result[color="#0000cc"],[color="#ff0000"]strlen[color="#0000cc"](code[color="#0000cc"])[color="#0000cc"]) [color="#0000cc"]![color="#0000cc"]= 0[color="#0000cc"])
        printk[color="#0000cc"]([color="#ff00ff"]"decompressed was not successful\n"[color="#0000cc"])[color="#0000cc"];
    [color="#0000ff"]else
        printk[color="#0000cc"]([color="#ff00ff"]"decompressed was successful\n"[color="#0000cc"])[color="#0000cc"];
           crypto_free_tfm[color="#0000cc"](tfm[color="#0000cc"])[color="#0000cc"];
    [color="#0000ff"]return 0[color="#0000cc"];
[color="#0000cc"]}
[color="#0000ff"]static [color="#0000ff"]void __exit test_exit[color="#0000cc"]([color="#0000ff"]void[color="#0000cc"])
[color="#0000cc"]{
[color="#0000cc"]}
module_init[color="#0000cc"](test_init[color="#0000cc"])[color="#0000cc"];
module_exit[color="#0000cc"](test_exit[color="#0000cc"])[color="#0000cc"];
MODULE_LICENSE[color="#0000cc"]([color="#ff00ff"]"GPL"[color="#0000cc"])[color="#0000cc"];
MODULE_AUTHOR[color="#0000cc"]([color="#ff00ff"]"richardhesidu@chinaunix"[color="#0000cc"])[color="#0000cc"];
3)cipher算法(aes)
[color="#000000"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000cc"]#[color="#ff0000"]include [color="#0000cc"]
[color="#0000ff"]struct crypto_tfm [color="#0000cc"]*tfm[color="#0000cc"];
[color="#0000cc"]#[color="#0000ff"]if 1
[color="#0000ff"]char [color="#0000cc"]*code [color="#0000cc"]= [color="#ff00ff"]"Hello everyone,I'm Richardhesidu"
        [color="#ff00ff"]"Hello everyone,I'm Richardhesidu"
            [color="#ff00ff"]"Hello everyone,I'm Richardhesidu"[color="#0000cc"];
[color="#0000ff"]char [color="#0000cc"]*key [color="#0000cc"]= [color="#ff00ff"]"00112233445566778899aabbccddeeff"[color="#0000cc"];
[color="#0000cc"]#[color="#ff0000"]endif
[color="#0000cc"]#[color="#0000ff"]if 0
[color="#0000ff"]char code[color="#0000cc"][[color="#0000cc"]] [color="#0000cc"]= [color="#0000cc"]{0x00[color="#0000cc"],0x11[color="#0000cc"],0x22[color="#0000cc"],0x33[color="#0000cc"],0x44[color="#0000cc"],0x55[color="#0000cc"],0x66[color="#0000cc"],0x77[color="#0000cc"],0x88[color="#0000cc"],0x99[color="#0000cc"],0xaa[color="#0000cc"],
        0xbb[color="#0000cc"],0xcc[color="#0000cc"],0xdd[color="#0000cc"],0xee[color="#0000cc"],0xff[color="#0000cc"]}[color="#0000cc"];
[color="#0000ff"]char key[color="#0000cc"][[color="#0000cc"]] [color="#0000cc"]= [color="#0000cc"]{0x00[color="#0000cc"],0x01[color="#0000cc"],0x02[color="#0000cc"],0x03[color="#0000cc"],0x04[color="#0000cc"],0x05[color="#0000cc"],0x06[color="#0000cc"],0x07[color="#0000cc"],0x08[color="#0000cc"],0x09[color="#0000cc"],0x0a[color="#0000cc"],
        0x0b[color="#0000cc"],0x0c[color="#0000cc"],0x0d[color="#0000cc"],0x0e[color="#0000cc"],0x0f[color="#0000cc"]}[color="#0000cc"];
[color="#0000cc"]#[color="#ff0000"]endif
[color="#0000ff"]static [color="#0000ff"]inline  [color="#0000ff"]void hexdump[color="#0000cc"]([color="#0000ff"]unsigned [color="#0000ff"]char [color="#0000cc"]*buf[color="#0000cc"],[color="#0000ff"]unsigned [color="#0000ff"]int len[color="#0000cc"]) [color="#0000cc"]{
    [color="#0000ff"]while[color="#0000cc"](len[color="#0000cc"]-[color="#0000cc"]-[color="#0000cc"])
        printk[color="#0000cc"]([color="#ff00ff"]"%02x"[color="#0000cc"],[color="#0000cc"]*buf[color="#0000cc"]+[color="#0000cc"]+[color="#0000cc"])[color="#0000cc"];
    printk[color="#0000cc"]([color="#ff00ff"]"\n"[color="#0000cc"])[color="#0000cc"];
[color="#0000cc"]}
[color="#0000ff"]static [color="#0000ff"]int __init test_init[color="#0000cc"]([color="#0000ff"]void[color="#0000cc"]) [color="#0000cc"]{
    [color="#0000ff"]int ret[color="#0000cc"],templen[color="#0000cc"],keylen[color="#0000cc"],codelen[color="#0000cc"];
    [color="#0000ff"]struct scatterlist sg[color="#0000cc"][1[color="#0000cc"]][color="#0000cc"];
    [color="#0000ff"]char [color="#0000cc"]*result[color="#0000cc"];
    [color="#0000ff"]char [color="#0000cc"]*temp[color="#0000cc"];
    keylen [color="#0000cc"]= 16[color="#0000cc"];
    codelen [color="#0000cc"]= [color="#ff0000"]strlen[color="#0000cc"](code[color="#0000cc"])[color="#0000cc"]/2[color="#0000cc"];
[color="#0000cc"]#[color="#0000ff"]if 0
    printk[color="#0000cc"]([color="#ff00ff"]"%s, codelen=%d\n"[color="#0000cc"],code[color="#0000cc"],[color="#ff0000"]strlen[color="#0000cc"](code[color="#0000cc"])[color="#0000cc"])[color="#0000cc"];
    printk[color="#0000cc"]([color="#ff00ff"]"%s, keylen=%d\n"[color="#0000cc"],key[color="#0000cc"],[color="#ff0000"]strlen[color="#0000cc"](key[color="#0000cc"])[color="#0000cc"])[color="#0000cc"];   
[color="#0000cc"]#[color="#ff0000"]endif   
    [color="#ff9900"]/* Allocate transform for AES ECB mode */
            
    tfm [color="#0000cc"]= crypto_alloc_tfm[color="#0000cc"]([color="#ff00ff"]"aes"[color="#0000cc"],CRYPTO_TFM_MODE_ECB[color="#0000cc"])[color="#0000cc"];
        [color="#0000ff"]if[color="#0000cc"](IS_ERR[color="#0000cc"](tfm[color="#0000cc"])[color="#0000cc"]) [color="#0000cc"]{
        printk[color="#0000cc"]([color="#ff00ff"]"failed to load transform for aes ECB mode !\n"[color="#0000cc"])[color="#0000cc"];
                [color="#0000ff"]return 0[color="#0000cc"];
    [color="#0000cc"]}
    ret [color="#0000cc"]= crypto_cipher_setkey[color="#0000cc"](tfm[color="#0000cc"],key[color="#0000cc"],keylen[color="#0000cc"])[color="#0000cc"];
    [color="#0000ff"]if[color="#0000cc"](ret[color="#0000cc"]) [color="#0000cc"]{
        printk[color="#0000cc"]([color="#ff00ff"]"failed to setkey \n"[color="#0000cc"])[color="#0000cc"];
        [color="#0000ff"]goto failed1[color="#0000cc"];
    [color="#0000cc"]}
   
    sg_init_one[color="#0000cc"](sg[color="#0000cc"],code[color="#0000cc"],codelen[color="#0000cc"])[color="#0000cc"];
        
    [color="#ff9900"]/* start encrypt */
   
    ret [color="#0000cc"]= crypto_cipher_encrypt[color="#0000cc"](tfm[color="#0000cc"],sg[color="#0000cc"],sg[color="#0000cc"],codelen[color="#0000cc"])[color="#0000cc"];
    [color="#0000ff"]if[color="#0000cc"](ret[color="#0000cc"]) [color="#0000cc"]{
        printk[color="#0000cc"]([color="#ff00ff"]"encrypt failed \n"[color="#0000cc"])[color="#0000cc"];
        [color="#0000ff"]goto failed1[color="#0000cc"];
    [color="#0000cc"]}
   
    temp [color="#0000cc"]= kmap[color="#0000cc"](sg[color="#0000cc"][0[color="#0000cc"]][color="#0000cc"].page[color="#0000cc"]) [color="#0000cc"]+ sg[color="#0000cc"][0[color="#0000cc"]][color="#0000cc"].offset[color="#0000cc"];
    hexdump[color="#0000cc"](temp[color="#0000cc"],sg[color="#0000cc"][0[color="#0000cc"]][color="#0000cc"].length[color="#0000cc"])[color="#0000cc"];
   
          [color="#ff9900"]/* start dencrypt */
    templen [color="#0000cc"]= [color="#ff0000"]strlen[color="#0000cc"](temp[color="#0000cc"])[color="#0000cc"]/2[color="#0000cc"];
    sg_init_one[color="#0000cc"](sg[color="#0000cc"],temp[color="#0000cc"],templen[color="#0000cc"])[color="#0000cc"];
    ret [color="#0000cc"]= crypto_cipher_decrypt[color="#0000cc"](tfm[color="#0000cc"],sg[color="#0000cc"],sg[color="#0000cc"],templen[color="#0000cc"])[color="#0000cc"];
        [color="#0000ff"]if[color="#0000cc"](ret[color="#0000cc"]) [color="#0000cc"]{
                printk[color="#0000cc"]([color="#ff00ff"]"dencrypt failed \n"[color="#0000cc"])[color="#0000cc"];
                [color="#0000ff"]goto failed1[color="#0000cc"];
        [color="#0000cc"]}
        result [color="#0000cc"]= kmap[color="#0000cc"](sg[color="#0000cc"][0[color="#0000cc"]][color="#0000cc"].page[color="#0000cc"]) [color="#0000cc"]+ sg[color="#0000cc"][0[color="#0000cc"]][color="#0000cc"].offset[color="#0000cc"];
    printk[color="#0000cc"]([color="#ff00ff"]"%s\n"[color="#0000cc"],result[color="#0000cc"])[color="#0000cc"];
[color="#ff9900"]//        hexdump(result,sg[0].length);

[color="#0000cc"]#[color="#0000ff"]if 0
    [color="#0000ff"]if[color="#0000cc"]([color="#ff0000"]memcmp[color="#0000cc"](code[color="#0000cc"],result[color="#0000cc"],[color="#ff0000"]strlen[color="#0000cc"](code[color="#0000cc"])[color="#0000cc"]) [color="#0000cc"]![color="#0000cc"]= 0[color="#0000cc"])
        printk[color="#0000cc"]([color="#ff00ff"]"dencrpt was not successful\n"[color="#0000cc"])[color="#0000cc"];
    [color="#0000ff"]else
        printk[color="#0000cc"]([color="#ff00ff"]"dencrypt was successful\n"[color="#0000cc"])[color="#0000cc"];
[color="#0000cc"]#[color="#ff0000"]endif
failed1[color="#0000cc"]:
           crypto_free_tfm[color="#0000cc"](tfm[color="#0000cc"])[color="#0000cc"];
    [color="#0000ff"]return 0[color="#0000cc"];
[color="#0000cc"]}
[color="#0000ff"]static [color="#0000ff"]void __exit test_exit[color="#0000cc"]([color="#0000ff"]void[color="#0000cc"])
[color="#0000cc"]{
[color="#0000cc"]}
module_init[color="#0000cc"](test_init[color="#0000cc"])[color="#0000cc"];
module_exit[color="#0000cc"](test_exit[color="#0000cc"])[color="#0000cc"];
MODULE_LICENSE[color="#0000cc"]([color="#ff00ff"]"GPL"[color="#0000cc"])[color="#0000cc"];
MODULE_AUTHOR[color="#0000cc"]([color="#ff00ff"]"richardhesidu@chinaunix"[color="#0000cc"])[color="#0000cc"];

               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/79955/showart_1964346.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP