Changeset 2722 for trunk/oscam-simples.c
- Timestamp:
- 07/12/10 19:58:29 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/oscam-simples.c
r2704 r2722 22 22 for(i=0; i<n; i+=16) 23 23 AES_encrypt(buf+i, buf+i, &client[idx].aeskey); 24 } 25 26 #define OK 0 27 #define ERROR 1 28 void add_aes_entry(struct s_reader *rdr, ushort caid, uint32 ident, int keyid, uchar *aesKey) 29 { 30 AES_ENTRY *new_entry; 31 AES_ENTRY *next,*current; 32 33 // create de AES key entry for the linked list 34 new_entry=malloc(sizeof(AES_ENTRY)); 35 new_entry->caid=caid; 36 new_entry->ident=ident; 37 new_entry->keyid=keyid; 38 AES_set_decrypt_key((const unsigned char *)aesKey, 128, &(new_entry->key)); 39 new_entry->next=NULL; 40 41 //if list is empty, new_entry is the new head 42 if(!rdr->aes_list) { 43 rdr->aes_list=new_entry; 44 return; 45 } 46 47 //happend it to the list 48 current=rdr->aes_list; 49 next=current->next; 50 while(next) { 51 current=next; 52 next=current->next; 53 } 54 current->next=new_entry; 55 56 } 57 58 void parse_aes_entry(struct s_reader *rdr,char *value) { 59 ushort caid; 60 uint32 ident; 61 int len; 62 char *tmp; 63 int nb_keys,key_id; 64 uchar aes_key[16]; 65 char *save; 66 67 tmp=strtok_r(value,"@",&save); 68 caid=a2i(tmp,2); 69 tmp=strtok_r(NULL,":",&save); 70 ident=a2i(tmp,3); 71 72 // now we need to split the key ane add the entry to the reader. 73 nb_keys=0; 74 key_id=0; 75 while((tmp=strtok_r(NULL,",",&save))) { 76 len=strlen(tmp); 77 if(len!=32) { 78 if(len!=1) 79 cs_log("AES key length error .. not adding"); 80 key_id++; 81 continue; 82 } 83 if(len==1 && tmp[0]=='0') 84 cs_debug("key is empty"); 85 nb_keys++; 86 key_atob(tmp,aes_key); 87 // now add the key to the reader... TBD 88 add_aes_entry(rdr,caid,ident,key_id,aes_key); 89 key_id++; 90 } 91 92 cs_log("%d key(s) added on %s for %04x:%06x", nb_keys,rdr->label,caid,ident); 93 94 } 95 96 void parse_aes_keys(struct s_reader *rdr,char *value) 97 { 98 // value format is caid1@ident1:key0,key1;caid2@indent2:key0,key1 99 char *entry; 100 char *save; 101 102 rdr->aes_list=NULL; 103 for (entry=strtok_r(value, ";",&save); entry; entry=strtok_r(NULL, ";",&save)) { 104 cs_debug("AES key entry=%s",entry); 105 parse_aes_entry(rdr,entry); 106 } 107 /* 108 AES_ENTRY *current; 109 current=rdr->aes_list; 110 while(current) { 111 cs_log("CAID = %04x",current->caid); 112 cs_log("IDENT = %06x",current->ident); 113 cs_log("keyID = %d",current->keyid); 114 cs_log("key = %s",cs_hexdump(3,(uchar *)&(current->key),sizeof(AES_KEY))); 115 cs_log("next = %p",current->next); 116 current=current->next; 117 } 118 */ 119 } 120 121 int aes_decrypt_from_list(AES_ENTRY *list, ushort caid, uint32 provid,int keyid, uchar *buf, int n) 122 { 123 AES_ENTRY *current; 124 int i; 125 current=list; 126 while(current) { 127 if(current->caid==caid && current->ident==provid && current->keyid==keyid) 128 break; 129 current=current->next; 130 } 131 132 if(!current) 133 return ERROR; // we don't have the key to decode this buffer. 134 else { 135 // decode the key 136 for(i=0; i<n; i+=16) 137 AES_decrypt(buf+i, buf+i, &(current->key)); 138 } 139 return OK; // all ok, key decoded. 24 140 } 25 141
Note:
See TracChangeset
for help on using the changeset viewer.