⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssx31b_cipher_digest.c

📁 海思KEY驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
/*ssx31b ciphers and digests module2006-7-6*/#include <linux/string.h>#include <linux/module.h>#include <linux/errno.h>#include <linux/init.h>#include <asm/byteorder.h>#include <linux/crypto.h>#include "./ssx31bdrv_glue.h"#if 0#ifdef SPINLOCK	# ifdef SPINLOCK_23		#  include <linux/spinlock.h> /* *lock* */	# else /* SPINLOCK_23 */		#  include <asm/spinlock.h> /* *lock* */	# endif /* SPINLOCK_23 */#endif /* SPINLOCK */#endif#ifdef MODULE_LICENSEMODULE_LICENSE ("GPL");#endif#ifdef MODULE_DESCRIPTIONMODULE_DESCRIPTION ("SSX31B Crypto / CryptoAPI");#endif#ifdef MODULE_AUTHORMODULE_AUTHOR ("Gisle Sensminde <gisle@ii.uib.no>");#endif/*========== ssx31bdrv sa   <--->  cryptoapi context ======================*/#define SSX31B_CTX_MAPPING_LEN	1024void* ssx31b_ctx_mapping[SSX31B_CTX_MAPPING_LEN];static void ssx31b_ctx_mapping_init();static struct cipher_context *ssx31b_ctx_mapping_getctx(unsigned short saNum);static int ssx31b_ctx_mapping_getsanum(struct cipher_context* pctx);static int ssx31b_ctx_mapping_set(struct cipher_context* pctx);static int ssx31b_ctx_mapping_clear(struct cipher_context* pctx);/*==========================================================*//* ciphers */static struct cipher_context *ssx31b_default_realloc_cipher_context(struct cipher_context *old_cx,                           struct cipher_implementation *ci,                           int max_key_len);static void ssx31b_default_wipe_context(struct cipher_context *cx);static void ssx31b_default_free_cipher_context(struct cipher_context *cx);/* digests */static struct digest_context *ssx31b_default_realloc_digest_context(struct digest_context *old_cx,			       struct digest_implementation *ci);static void ssx31b_default_free_digest_context(struct digest_context *cx);#ifndef NOT_ONLY_HMACstatic int ssx31b_default_open (struct digest_context *cx, int atomic);static int ssx31b_default_update(struct digest_context *cx, const u8 *in, int size, int atomic);static int ssx31b_default_digest(struct digest_context *cx, u8 *out, int atomic);static int ssx31b_default_close(struct digest_context *cx, u8 *out, int atomic);#endifstatic void ssx31b_ctx_mapping_init(){	int i;	for(i=0;i<SSX31B_CTX_MAPPING_LEN;i++)		ssx31b_ctx_mapping[i]=NULL;}static struct cipher_context *ssx31b_ctx_mapping_getctx(unsigned short saNum){	return ssx31b_ctx_mapping[saNum];}static intssx31b_ctx_mapping_getsanum(struct cipher_context* pctx){	int i;	if(pctx==NULL) return -1;	for(i=0;i<SSX31B_CTX_MAPPING_LEN;i++){		if(ssx31b_ctx_mapping[i]==(void *)pctx)			return i;	}	return -1;}static int ssx31b_ctx_mapping_set(struct cipher_context* pctx){	int i;	i=ssx31b_GetSANum();	if(i<0) return i;	ssx31b_ctx_mapping[i]=(void*)pctx;	return 0;}static int ssx31b_ctx_mapping_clear(struct cipher_context* pctx){	int i;	if(pctx==NULL) return -1;	i=ssx31b_ctx_mapping_getsanum(pctx);	if(i<0) return i;	ssx31b_ctx_mapping[i]=NULL;		ssx31b_ReleaseSANum(i);	return 0;}/*----des-------------------*/static int des_ecb_set_key(struct cipher_context *cx, 	  		const unsigned char *key, int keybytes, int atomic){    //u32 *method;    int status;   // unsigned char lkey[24];    //unsigned char n1, n2;    //method=(u32 *)cx->keyinfo;unsigned short usOpt;unsigned char* lkey=(unsigned char*)(cx->keyinfo);	int saNum;    /* asign keybits based on keylength */    switch(keybytes) {	    case 8:		    memcpy(lkey,key,8);		    break;	    default:		    return -EINVAL;    }    cx->key_length = keybytes;#if 0    /* set the correct parity bit for each byte in the key*/    for(i=0; i<24; i++){	    n1 = lkey[i] & 0xfe;	    n2 = n1 ^ (n1 >> 4);	    n2 ^= (n2 >> 2);	    n2 ^= (n2 >> 1);	    lkey[i] = n1 | (~n2 & 0x01);	        }        /* check for degenerate keys */    if(keybytes > 8 &&       (memcmp(lkey,lkey+8,8)==0 || memcmp(lkey+8,lkey+16,8)==0))	    return -2;    if((status = des_part_set_key(method, lkey)) != 0) 	    return status;    if((status = des_part_set_key(method+32, lkey+8)) != 0) 	    return status;    if((status = des_part_set_key(method+64, lkey+16)) != 0) 	    return status;#endif   saNum=ssx31b_ctx_mapping_getsanum(cx);   if(saNum<0) return -1;   usOpt=0;	/*000 0000 00: ?? des ECB*/   status=ssx31b_sa_register( usOpt, lkey, NULL, saNum);   if(status<0) return -1;   return 0;}static int des_cbc_set_key(struct cipher_context *cx, 	  		const unsigned char *key, int keybytes, int atomic){    //u32 *method;    int status;   // unsigned char lkey[24];    //unsigned char n1, n2;    //method=(u32 *)cx->keyinfo;unsigned short usOpt;unsigned char* lkey=(unsigned char*)(cx->keyinfo);	int saNum;    /* asign keybits based on keylength */    switch(keybytes) {	    case 8:		    memcpy(lkey,key,8);		    break;	    default:		    return -EINVAL;    }    cx->key_length = keybytes;#if 0    /* set the correct parity bit for each byte in the key*/    for(i=0; i<24; i++){	    n1 = lkey[i] & 0xfe;	    n2 = n1 ^ (n1 >> 4);	    n2 ^= (n2 >> 2);	    n2 ^= (n2 >> 1);	    lkey[i] = n1 | (~n2 & 0x01);	        }        /* check for degenerate keys */    if(keybytes > 8 &&       (memcmp(lkey,lkey+8,8)==0 || memcmp(lkey+8,lkey+16,8)==0))	    return -2;    if((status = des_part_set_key(method, lkey)) != 0) 	    return status;    if((status = des_part_set_key(method+32, lkey+8)) != 0) 	    return status;    if((status = des_part_set_key(method+64, lkey+16)) != 0) 	    return status;#endif   saNum=ssx31b_ctx_mapping_getsanum(cx);   if(saNum<0) return -1;   usOpt=1;	/*000 0000 01: ?? des CBC*/   status=ssx31b_sa_register( usOpt, (unsigned long *)lkey, NULL, saNum);   if(status<0) return -1;   return 0;}static int des_ecb_encrypt(struct cipher_context *cx,                         const u8 *in, u8 *out, int size, int atomic, 			 const u8 *iv){	int err;	unsigned char ucOpt=0x0;	/*0x000:crypto operation only and en-do*/	int saNum;	unsigned long OutDatLen;	saNum=ssx31b_ctx_mapping_getsanum(cx);	if(saNum<0) return -1;	err=ssx31b_crypto_perform(ucOpt, iv, cx->ci->blocksize, saNum, in, size, out, &OutDatLen);	if(err!=0) return -1;	return 0;}static int des_ecb_decrypt(struct cipher_context *cx,                        const u8 *in, u8 *out, int size, int atomic, 			const u8 *iv){	int err;	unsigned char ucOpt=0x01;	/*0x001:crypto operation only and de-do*/	int saNum;	unsigned long OutDatLen;	saNum=ssx31b_ctx_mapping_getsanum(cx);	if(saNum<0) return -1;	err=ssx31b_crypto_perform(ucOpt, iv, cx->ci->blocksize, saNum, in, size, out, &OutDatLen);	if(err!=0) return -1;	return 0;}/*===CBC====*/static int des_cbc_encrypt(struct cipher_context *cx,                         const u8 *in, u8 *out, int size, int atomic, 			 const u8 *iv){	return des_ecb_encrypt(cx,  in, out,  size,  atomic,  iv);	}static int des_cbc_decrypt(struct cipher_context *cx,                        const u8 *in, u8 *out, int size, int atomic, 			const u8 *iv){		return des_ecb_decrypt( cx,  in,  out,  size,  atomic,  iv);}#define SSX31B_CIPHER_DES_ID                des#define SSX31B_CIPHER_DES_STR               "des"#define SSX31B_CIPHER_DES_BLOCKSIZE         64#define SSX31B_CIPHER_DES_KEY_SIZE_MASK   CIPHER_KEYSIZE_64#define SSX31B_CIPHER_DES_KEY_SCHEDULE_SIZE (32*sizeof(u32))/*----3des-------------------*/static int des_ede3_ecb_set_key(struct cipher_context *cx, 	  		const unsigned char *key, int keybytes, int atomic){    int status;/*    u32 *method;   unsigned char lkey[24];   method=(u32 *)cx->keyinfo;*/   //unsigned char n1, n2;  // int i;unsigned short usOpt;unsigned char* lkey=(unsigned char*)(cx->keyinfo);	int saNum;    /* asign keybits based on keylength */    switch(keybytes) {	    case 24:		    memcpy(lkey,key,24);		    break;	    case 16:		    memcpy(lkey,key,16);		    memcpy(lkey+16,key,8);		    break;	    case 8:		    memcpy(lkey,key,8);		    memcpy(lkey+8,key,8);		    memcpy(lkey+16,key,8);		    break;	    default:		    return -EINVAL;    }    cx->key_length = keybytes;#if 0    /* set the correct parity bit for each byte in the key*/    for( i=0; i<24; i++){	    n1 = lkey[i] & 0xfe;	    n2 = n1 ^ (n1 >> 4);	    n2 ^= (n2 >> 2);	    n2 ^= (n2 >> 1);	    lkey[i] = n1 | (~n2 & 0x01);	        }        /* check for degenerate keys *//*    if(keybytes > 8 &&       (memcmp(lkey,lkey+8,8)==0 || memcmp(lkey+8,lkey+16,8)==0))	    return -2;    if((status = des_part_set_key(method, lkey)) != 0) 	    return status;    if((status = des_part_set_key(method+32, lkey+8)) != 0) 	    return status;    if((status = des_part_set_key(method+64, lkey+16)) != 0) 	    return status;*/#endif   saNum=ssx31b_ctx_mapping_getsanum(cx);   if(saNum<0) return -1;   usOpt=4;	/*000 0001 00: ?? 3des ECB*/   status=ssx31b_sa_register( usOpt, lkey, NULL, saNum);   if(status<0) return -1;   return 0;}static int des_ede3_cbc_set_key(struct cipher_context *cx, 	  		const unsigned char *key, int keybytes, int atomic){    int status;/*    u32 *method;   unsigned char lkey[24];   method=(u32 *)cx->keyinfo;*/   //unsigned char n1, n2;  // int i;unsigned short usOpt;unsigned char* lkey=(unsigned char*)(cx->keyinfo);	int saNum;    /* asign keybits based on keylength */    switch(keybytes) {	    case 24:		    memcpy(lkey,key,24);		    break;	    case 16:		    memcpy(lkey,key,16);		    memcpy(lkey+16,key,8);		    break;	    case 8:		    memcpy(lkey,key,8);		    memcpy(lkey+8,key,8);		    memcpy(lkey+16,key,8);		    break;	    default:		    return -EINVAL;    }    cx->key_length = keybytes;#if 0    /* set the correct parity bit for each byte in the key*/    for(i=0; i<24; i++){	    n1 = lkey[i] & 0xfe;	    n2 = n1 ^ (n1 >> 4);	    n2 ^= (n2 >> 2);	    n2 ^= (n2 >> 1);	    lkey[i] = n1 | (~n2 & 0x01);	        }        /* check for degenerate keys *//*    if(keybytes > 8 &&       (memcmp(lkey,lkey+8,8)==0 || memcmp(lkey+8,lkey+16,8)==0))	    return -2;    if((status = des_part_set_key(method, lkey)) != 0) 	    return status;    if((status = des_part_set_key(method+32, lkey+8)) != 0) 	    return status;    if((status = des_part_set_key(method+64, lkey+16)) != 0) 	    return status;*/	    #endif   saNum=ssx31b_ctx_mapping_getsanum(cx);   if(saNum<0) return -1;   usOpt=5;	/*000 0001 01: ?? 3des CBC*/   status=ssx31b_sa_register( usOpt, (unsigned long *)lkey, NULL, saNum);   if(status<0) return -1;   return 0;}static int des_ede3_ecb_encrypt(struct cipher_context *cx,                         const u8 *in, u8 *out, int size, int atomic, 			 const u8 *iv){	int err;	unsigned char ucOpt=0x0;	/*0x000:crypto operation only and en-do*/	int saNum;	unsigned long OutDatLen;	saNum=ssx31b_ctx_mapping_getsanum(cx);	if(saNum<0) return -1;	err=ssx31b_crypto_perform(ucOpt, iv, cx->ci->blocksize, saNum, in, size, out, &OutDatLen);	if(err!=0) return -1;	return 0;}static int des_ede3_ecb_decrypt(struct cipher_context *cx,                        const u8 *in, u8 *out, int size, int atomic, 			const u8 *iv){	int err;	unsigned char ucOpt=0x01;	/*0x001:crypto operation only and de-do*/	int saNum;	unsigned long OutDatLen;	saNum=ssx31b_ctx_mapping_getsanum(cx);	if(saNum<0) return -1;	err=ssx31b_crypto_perform(ucOpt, iv, cx->ci->blocksize, saNum, in, size, out, &OutDatLen);	if(err!=0) return -1;	return 0;}/*===CBC====*/static int des_ede3_cbc_encrypt(struct cipher_context *cx,                         const u8 *in, u8 *out, int size, int atomic, 			 const u8 *iv){	return des_ede3_ecb_encrypt(cx,  in, out,  size,  atomic,  iv);	}static int des_ede3_cbc_decrypt(struct cipher_context *cx,                        const u8 *in, u8 *out, int size, int atomic, 			const u8 *iv){		return des_ede3_ecb_decrypt( cx,  in,  out,  size,  atomic,  iv);}#define SSX31B_CIPHER_3DES_ID                des_ede3#define SSX31B_CIPHER_3DES_STR               "3des"#define SSX31B_CIPHER_3DES_BLOCKSIZE         64#define SSX31B_CIPHER_3DES_KEY_SIZE_MASK     CIPHER_KEYSIZE_64 | CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192#define SSX31B_CIPHER_3DES_KEY_SCHEDULE_SIZE (3*32*sizeof(u32))/*----aes-------------------*/static int aes_ecb_set_key(struct cipher_context *cx, 	  		const unsigned char *key, int keybytes, int atomic){    //u32 *method;    int status;   // unsigned char lkey[24];    //unsigned char n1, n2;    //method=(u32 *)cx->keyinfo;unsigned short usOpt;unsigned char* lkey=(unsigned char*)(cx->keyinfo);	int saNum; /* asign keybits based on keylength */	if ((keybytes == 16)||(keybytes == 24)||(keybytes == 32)) {		memcpy(lkey,key,keybytes);	} else		return -EINVAL;	cx->key_length = keybytes;   saNum=ssx31b_ctx_mapping_getsanum(cx);   if(saNum<0) return -1;/*		       1~0 bit:	Crypto Mode 		       		00:ECB		       		01: CBC		       		other: reserved		       5~2 bit:	Ctypto Algrithm		       		0000:des		       		0001:3des		       		0010:aes128		       		0011:aes192		       		0100:aes256		       		0101:scb2		       		other:reserved		       8~6 bit:	Hmac Algrithm		       		000:md5		       		001:sha1		       		other:reserved*/    switch (keybytes){		case 16:			usOpt = 8; 	/*000 0010 00: aes128 ECB*/			break;		case 24:			usOpt = 12; 	/*000 0011 00: aes192 ECB*/			break;		case 32:			usOpt = 16; 	/*000 0100 00: aes256 ECB*/			break;		default:			return -EINVAL;    }  // usOpt=8;	/*000 0010 00: ?? aes128 ECB*/   status=ssx31b_sa_register( usOpt, lkey, NULL, saNum);   if(status<0) return -1;   return 0;}static int aes_cbc_set_key(struct cipher_context *cx, 	  		const unsigned char *key, int keybytes, int atomic){    //u32 *method;    int status;   // unsigned char lkey[24];    //unsigned char n1, n2;    //method=(u32 *)cx->keyinfo;unsigned short usOpt;unsigned char* lkey=(unsigned char*)(cx->keyinfo);	int saNum; /* asign keybits based on keylength */	if ((keybytes == 16)||(keybytes == 24)||(keybytes == 32)) {		memcpy(lkey,key,keybytes);	} else		return -EINVAL;	cx->key_length = keybytes;   saNum=ssx31b_ctx_mapping_getsanum(cx);   if(saNum<0) return -1;    switch (keybytes){		case 16:			usOpt = 9; 	/*000 0010 01: aes128 CBC*/			break;		case 24:			usOpt = 13; 	/*000 0011 01: aes192 CBC*/			break;		case 32:			usOpt = 17; 	/*000 0100 01: aes256 CBC*/			break;		default:			return -EINVAL;    }  // usOpt=9;	/*000 0010 01: ?? aes128 CBC*/   status=ssx31b_sa_register( usOpt, lkey, NULL, saNum);   if(status<0) return -1;   return 0;}static int aes_ecb_encrypt(struct cipher_context *cx,                         const u8 *in, u8 *out, int size, int atomic, 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -