X-Git-Url: https://git.cryptolib.org/?p=arm-crypto-lib.git;a=blobdiff_plain;f=bcal%2Fkeysize_descriptor.c;h=20f5caf23d6be4093a0a35e7c01a719fa6a92432;hp=8ffb06f7eb55928d763b92725605d83b8b504036;hb=4702ee6467ec406ab58d3a5cb4e3144133ba4909;hpb=d70d1d77bab1a5f5278227d674bc59da0378fe15 diff --git a/bcal/keysize_descriptor.c b/bcal/keysize_descriptor.c index 8ffb06f..20f5caf 100644 --- a/bcal/keysize_descriptor.c +++ b/bcal/keysize_descriptor.c @@ -1,7 +1,7 @@ /* keysize_descriptor.c */ /* This file is part of the ARM-Crypto-Lib. - Copyright (C) 2006-2010 Daniel Otte (daniel.otte@rub.de) + Copyright (C) 2009 Daniel Otte (daniel.otte@rub.de) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,63 +25,136 @@ */ #include +#include #include "keysize_descriptor.h" +#define KS8 ((uint8_t*)ks_desc) uint8_t is_valid_keysize_P(const void* ks_desc, uint16_t keysize){ uint8_t type; - type = *((uint8_t*)ks_desc); - ks_desc = (uint8_t*)ks_desc + 1; + type = KS8[0]; + ks_desc = KS8 + 1; if(type==KS_TYPE_TERMINATOR) return 0; if(type==KS_TYPE_LIST){ uint8_t items; uint16_t item; - items = *((uint8_t*)ks_desc); - ks_desc = (uint8_t*)ks_desc + 1; + items = KS8[0]; + ks_desc = KS8 + 1; while(items--){ - item = *((uint16_t*)ks_desc); - ks_desc = (uint8_t*)ks_desc + 2; + item = KS8[1] * 256 + KS8[0]; + ks_desc = KS8 + 2; if(item==keysize) return 1; } - ks_desc = (uint8_t*)ks_desc - 2; + ks_desc = KS8 - 2; } if(type==KS_TYPE_RANGE){ uint16_t max, min; - min = *((uint16_t*)ks_desc); + min = KS8[1] * 256 + KS8[0]; ks_desc = (uint8_t*)ks_desc + 2; - max = *((uint16_t*)ks_desc); - if(min<=keysize && keysize<=max) + max = KS8[1] * 256 + KS8[0]; + if(min <= keysize && keysize <= max) return 1; } if(type==KS_TYPE_ARG_RANGE){ uint16_t max, min, dist, offset; - min = *((uint16_t*)ks_desc); - ks_desc = (uint8_t*)ks_desc + 2; - max = *((uint16_t*)ks_desc); - ks_desc = (uint8_t*)ks_desc + 2; - dist = *((uint16_t*)ks_desc); - ks_desc = (uint8_t*)ks_desc + 2; - offset = *((uint16_t*)ks_desc); - if(min<=keysize && keysize<=max && (keysize%dist==offset)) + min = KS8[1] * 256 + KS8[0]; + max = KS8[3] * 256 + KS8[2]; + dist = KS8[5] * 256 + KS8[4]; + offset = KS8[7] * 256 + KS8[6]; + ks_desc = KS8 + 6; + if(min <= keysize && keysize <= max && (keysize % dist == offset)) return 1; } if(type>KS_TYPE_ARG_RANGE){ /* bad error, you may insert a big warning message here */ return 0; } - return is_valid_keysize_P((uint8_t*)ks_desc+1, keysize); /* search the next record */ + return is_valid_keysize_P(KS8+1, keysize); /* search the next record */ } uint16_t get_keysize(const void* ks_desc){ uint8_t type; uint16_t keysize; type = *((uint8_t*)ks_desc); - if(type==KS_TYPE_LIST) + if(type==KS_TYPE_LIST){ ks_desc = (uint8_t*)ks_desc + 1; + } ks_desc = (uint8_t*)ks_desc + 1; - keysize = *((uint16_t*)ks_desc); + keysize = *((uint8_t*)ks_desc); return keysize; } - +uint16_t get_keysizes(const void* ks_desc, uint16_t** list){ + uint8_t type; + uint16_t items; + uint8_t i; + type = *((uint8_t*)ks_desc); + ks_desc = (uint8_t*)ks_desc + 1; + if(type==KS_TYPE_LIST){ + items = *((uint8_t*)ks_desc); + ks_desc = (uint8_t*)ks_desc + 1; + if(!*list){ + *list = malloc(items*2); + if(!*list){ + return 0; + } + } + for(i=0; i