X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=fips%2Ffips_utl.h;h=98cb5915a23cc98735b940d39252d335487f9ab0;hb=beb895083c4794c6134e05dc0fbf0a1a6b919b8e;hp=76ae4f8e38d25ce8de5b5fcab14786bdfe07bda4;hpb=7cc684f4f7fbcdc5cf4683eaf025d4f915acbf3c;p=oweals%2Fopenssl.git diff --git a/fips/fips_utl.h b/fips/fips_utl.h index 76ae4f8e38..98cb5915a2 100644 --- a/fips/fips_utl.h +++ b/fips/fips_utl.h @@ -48,13 +48,12 @@ */ #define OPENSSL_FIPSAPI -#include int hex2bin(const char *in, unsigned char *out); unsigned char *hex2bin_m(const char *in, long *plen); int do_hex2bn(BIGNUM **pr, const char *in); -int do_bn_print(FILE *out, BIGNUM *bn); -int do_bn_print_name(FILE *out, const char *name, BIGNUM *bn); +int do_bn_print(FILE *out, const BIGNUM *bn); +int do_bn_print_name(FILE *out, const char *name, const BIGNUM *bn); int parse_line(char **pkw, char **pval, char *linebuf, char *olinebuf); BIGNUM *hex2bn(const char *in); int bin2hex(const unsigned char *in,int len,char *out); @@ -99,9 +98,16 @@ static void fips_set_error_print(void) int hex2bin(const char *in, unsigned char *out) { - int n1, n2; + int n1, n2, isodd = 0; unsigned char ch; + n1 = strlen(in); + if (in[n1 - 1] == '\n') + n1--; + + if (n1 & 1) + isodd = 1; + for (n1=0,n2=0 ; in[n1] && in[n1] != '\n' ; ) { /* first byte */ if ((in[n1] >= '0') && (in[n1] <= '9')) @@ -117,6 +123,15 @@ int hex2bin(const char *in, unsigned char *out) out[n2++]=ch; break; } + /* If input is odd length first digit is least significant: assumes + * all digits valid hex and null terminated which is true for the + * strings we pass. + */ + if (n1 == 1 && isodd) + { + out[n2++] = ch; + continue; + } out[n2] = ch << 4; /* second byte */ if ((in[n1] >= '0') && (in[n1] <= '9')) @@ -135,6 +150,11 @@ int hex2bin(const char *in, unsigned char *out) unsigned char *hex2bin_m(const char *in, long *plen) { unsigned char *p; + if (strlen(in) == 0) + { + *plen = 0; + return OPENSSL_malloc(1); + } p = OPENSSL_malloc((strlen(in) + 1)/2); *plen = hex2bin(in, p); return p; @@ -158,7 +178,7 @@ int do_hex2bn(BIGNUM **pr, const char *in) return r; } -int do_bn_print(FILE *out, BIGNUM *bn) +int do_bn_print(FILE *out, const BIGNUM *bn) { int len, i; unsigned char *tmp; @@ -182,7 +202,7 @@ int do_bn_print(FILE *out, BIGNUM *bn) return 1; } -int do_bn_print_name(FILE *out, const char *name, BIGNUM *bn) +int do_bn_print_name(FILE *out, const char *name, const BIGNUM *bn) { int r; fprintf(out, "%s = ", name);