2010-02-06 117 views
2

在內核級別的項目,我想使用DES算法,需要使用功能內核項目DES加密

static int des_setkey(void *ctx,const u8 *key, 
         unsigned int keylen, 
         u32 *flags) 

我想知道的關鍵在於如何傳遞給函數,該函數值來加密數據包要被用作對密鑰,它的一個指針類型,以便將一個地址值

+1

這是一個有點困難沒有進一步的背景說。這是一些公開可用的庫的一部分嗎?你有關於這個功能的任何文檔嗎?通常,DES採用56 + 8 = 64位密鑰。 flags參數可能會設置操作模式(可能需要或可能不需要您定義初始化向量)。 – dirkgently 2010-02-06 11:08:08

+0

我可以看到爲什麼你無法找到答案,linux內核已經改變。在內核中根本沒有實際的使用。 – IanNorton 2010-03-03 20:59:37

回答

1

http://lxr.kelp.or.kr/ident?v=2.6.28;i=des_setkey

* Cryptographic API. 
* 
* s390 implementation of the DES Cipher Algorithm. 
* 
* Copyright IBM Corp. 2003,2007 
* Author(s): Thomas Spatzier 
*   Jan Glauber ([email protected]) 

的typeA A = XY;
functionname(typeA * a,typeA b)
- > functionname(& A,A);



crypto_des_check_key(const u8 *key, unsigned int keylen, u32 *flags) 
{ 
     u32 n, w; 

     n = parity[key[0]]; n <<= 4; 
     n |= parity[key[1]]; n <<= 4; 
     n |= parity[key[2]]; n <<= 4; 
     n |= parity[key[3]]; n <<= 4; 
     n |= parity[key[4]]; n <<= 4; 
     n |= parity[key[5]]; n <<= 4; 
     n |= parity[key[6]]; n <<= 4; 
     n |= parity[key[7]]; 
     w = 0x88888888L; 

     if ((*flags & CRYPTO_TFM_REQ_WEAK_KEY) 
      && !((n - (w >> 3)) & w)) { /* 1 in 



- > CRYPTO_TFM_REQ_WEAK_KEY是一個標誌 - >源極/包括/ LINUX/crypto.h

/* 
* Transform masks and values (for crt_flags). 
*/ 
#define CRYPTO_TFM_REQ_MASK    0x000fff00 
#define CRYPTO_TFM_RES_MASK    0xfff00000 

#define CRYPTO_TFM_REQ_WEAK_KEY   0x00000100 
#define CRYPTO_TFM_REQ_MAY_SLEEP  0x00000200 
#define CRYPTO_TFM_REQ_MAY_BACKLOG  0x00000400 
#define CRYPTO_TFM_RES_WEAK_KEY   0x00100000 
#define CRYPTO_TFM_RES_BAD_KEY_LEN  0x00200000 
#define CRYPTO_TFM_RES_BAD_KEY_SCHED 0x00400000 
#define CRYPTO_TFM_RES_BAD_BLOCK_LEN 0x00800000 
#define CRYPTO_TFM_RES_BAD_FLAGS  0x01000000 



源/拱/ S390 /加密/ des_s390.c

#define DES_EXPKEY_WORDS  32 
typedef unsigned char   u8; 
typedef unsigned char   u8; 
typedef unsigned short   u16; 
typedef unsigned int   u32; 
typedef unsigned long long  u64; 
typedef signed char    s8; 
typedef short     s16; 
typedef int      s32; 
typedef long long    s64; 



static int des_setkey(void *ctx, const u8 *key, unsigned int keylen, u32 *flags) 
{ 
     return setkey(((struct des_ctx *)ctx)->expkey, key, keylen, flags); 
} 



struct des_ctx { 
     u32 expkey[DES_EXPKEY_WORDS]; 
}; 
+1

答案需要更具建設性的文字或至少是代碼的評論。 – IanNorton 2010-03-03 20:30:35

1

看起來是從2.6.16(ISH)Linux內核。後來的內核已經看到加密系統api稍微改寫了。

這個內核這可能幫助: -

  • *鍵是一個指向一個16字節數組,(無符號字符[16])。
  • * ctx是指向struct des_ctx結構的指針;
  • *標誌是一個指向32位無符號整數,將有如果你提供的弱密鑰(一個失敗FIPS 74 - 看到智能鑰匙()函數)CRYPTO_TFM_RES_WEAK_KEY設置