- changed \\e back to \e in sc_log.c

- changed function prototypes in sc-asn1.c (int --> size_t)


git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@126 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
jey 2002-01-01 18:25:11 +00:00
parent 5cdd262385
commit 68928ae520
5 changed files with 79 additions and 67 deletions

View File

@ -29,7 +29,7 @@
static int asn1_parse(struct sc_context *ctx, struct sc_asn1_struct *asn1, static int asn1_parse(struct sc_context *ctx, struct sc_asn1_struct *asn1,
const u8 *in, int len, const u8 **newp, int *len_left, const u8 *in, size_t len, const u8 **newp, size_t *len_left,
int choice, int depth); int choice, int depth);
const char *tag2str(int tag) const char *tag2str(int tag)
@ -50,12 +50,12 @@ const char *tag2str(int tag)
return tags[tag]; return tags[tag];
} }
static int read_tag(const u8 ** buf, static int read_tag(const u8 ** buf, size_t buflen, unsigned int *cla_out,
int buflen, int *cla_out, int *tag_out, int *taglen) unsigned int *tag_out, size_t *taglen)
{ {
const u8 *p = *buf; const u8 *p = *buf;
int left = buflen; size_t left = buflen, len;
int cla, tag, len, i; unsigned int cla, tag, i;
if (left < 2) if (left < 2)
goto error; goto error;
@ -73,7 +73,7 @@ static int read_tag(const u8 ** buf,
goto error; goto error;
len = *p & 0x7f; len = *p & 0x7f;
if (*p++ & 0x80) { if (*p++ & 0x80) {
int a = 0; unsigned int a = 0;
if (len > 4) { if (len > 4) {
fprintf(stderr, "ASN.1 tag too long!\n"); fprintf(stderr, "ASN.1 tag too long!\n");
goto error; goto error;
@ -94,7 +94,7 @@ static int read_tag(const u8 ** buf,
return -1; return -1;
} }
static void sc_asn1_print_octet_string(const u8 * buf, int buflen) static void sc_asn1_print_octet_string(const u8 * buf, size_t buflen)
{ {
int i; int i;
@ -102,7 +102,7 @@ static void sc_asn1_print_octet_string(const u8 * buf, int buflen)
printf("%02X", buf[i]); printf("%02X", buf[i]);
} }
static void sc_asn1_print_utf8string(const u8 * buf, int buflen) static void sc_asn1_print_utf8string(const u8 * buf, size_t buflen)
{ {
int i; int i;
@ -110,7 +110,7 @@ static void sc_asn1_print_utf8string(const u8 * buf, int buflen)
printf("%c", buf[i]); printf("%c", buf[i]);
} }
static void sc_asn1_print_integer(const u8 * buf, int buflen) static void sc_asn1_print_integer(const u8 * buf, size_t buflen)
{ {
long long a = 0; long long a = 0;
int i; int i;
@ -126,7 +126,7 @@ static void sc_asn1_print_integer(const u8 * buf, int buflen)
printf("%lld", a); printf("%lld", a);
} }
static void sc_asn1_print_bit_string(const u8 * buf, int buflen) static void sc_asn1_print_bit_string(const u8 * buf, size_t buflen)
{ {
unsigned long long a = 0; unsigned long long a = 0;
int i, r; int i, r;
@ -145,7 +145,7 @@ static void sc_asn1_print_bit_string(const u8 * buf, int buflen)
} }
} }
static void sc_asn1_print_object_id(const u8 * buf, int buflen) static void sc_asn1_print_object_id(const u8 * buf, size_t buflen)
{ {
int i = 0; int i = 0;
struct sc_object_id oid; struct sc_object_id oid;
@ -168,10 +168,11 @@ static void sc_asn1_print_object_id(const u8 * buf, int buflen)
printf("%s", sbuf); printf("%s", sbuf);
} }
static void print_tags_recursive(const u8 * buf0, static void print_tags_recursive(const u8 * buf0, const u8 * buf,
const u8 * buf, int buflen, int depth) size_t buflen, int depth)
{ {
int i, r, bytesleft = buflen; int i, r;
size_t bytesleft = buflen;
const char *classes[4] = { const char *classes[4] = {
"Univ", "Appl", "Cntx", "Priv" "Univ", "Appl", "Cntx", "Priv"
}; };
@ -242,7 +243,7 @@ static void print_tags_recursive(const u8 * buf0,
return; return;
} }
void sc_asn1_print_tags(const u8 * buf, int buflen) void sc_asn1_print_tags(const u8 * buf, size_t buflen)
{ {
printf("Printing tags for buffer of length %d\n", buflen); printf("Printing tags for buffer of length %d\n", buflen);
print_tags_recursive(buf, buf, buflen, 0); print_tags_recursive(buf, buf, buflen, 0);
@ -251,7 +252,8 @@ void sc_asn1_print_tags(const u8 * buf, int buflen)
const u8 *sc_asn1_find_tag(struct sc_context *ctx, const u8 * buf, const u8 *sc_asn1_find_tag(struct sc_context *ctx, const u8 * buf,
size_t buflen, unsigned int tag_in, size_t *taglen_in) size_t buflen, unsigned int tag_in, size_t *taglen_in)
{ {
int left = buflen, taglen, cla, tag; size_t left = buflen, taglen;
unsigned int cla, tag;
const u8 *p = buf; const u8 *p = buf;
*taglen_in = 0; *taglen_in = 0;
@ -276,7 +278,8 @@ const u8 *sc_asn1_skip_tag(struct sc_context *ctx, const u8 ** buf, size_t *bufl
unsigned int tag_in, size_t *taglen_out) unsigned int tag_in, size_t *taglen_out)
{ {
const u8 *p = *buf; const u8 *p = *buf;
int len = *buflen, taglen, cla, tag; size_t len = *buflen, taglen;
unsigned int cla, tag;
if (read_tag((const u8 **) &p, len, &cla, &tag, &taglen) != 1) if (read_tag((const u8 **) &p, len, &cla, &tag, &taglen) != 1)
return NULL; return NULL;
@ -324,19 +327,21 @@ const u8 *sc_asn1_verify_tag(struct sc_context *ctx, const u8 * buf, size_t bufl
return sc_asn1_skip_tag(ctx, &buf, &buflen, tag_in, taglen_out); return sc_asn1_skip_tag(ctx, &buf, &buflen, tag_in, taglen_out);
} }
static int decode_bit_string(const u8 * inbuf, int inlen, void *outbuf, static int decode_bit_string(const u8 * inbuf, size_t inlen, void *outbuf,
int outlen, int invert) size_t outlen, int invert)
{ {
const u8 *in = inbuf; const u8 *in = inbuf;
u8 *out = (u8 *) outbuf; u8 *out = (u8 *) outbuf;
int zero_bits = *in & 0x07; int zero_bits = *in & 0x07;
int octets_left = inlen - 1; size_t octets_left = inlen - 1;
int i, count = 0; int i, count = 0;
memset(outbuf, 0, outlen); memset(outbuf, 0, outlen);
in++; in++;
if (outlen < octets_left) if (outlen < octets_left)
return SC_ERROR_BUFFER_TOO_SMALL; return SC_ERROR_BUFFER_TOO_SMALL;
if (inlen < 1)
return SC_ERROR_INVALID_ASN1_OBJECT;
while (octets_left) { while (octets_left) {
/* 1st octet of input: ABCDEFGH, where A is the MSB */ /* 1st octet of input: ABCDEFGH, where A is the MSB */
/* 1st octet of output: HGFEDCBA, where A is the LSB */ /* 1st octet of output: HGFEDCBA, where A is the LSB */
@ -363,19 +368,19 @@ static int decode_bit_string(const u8 * inbuf, int inlen, void *outbuf,
return (count * 8) - zero_bits; return (count * 8) - zero_bits;
} }
int sc_asn1_decode_bit_string(const u8 * inbuf, int sc_asn1_decode_bit_string(const u8 * inbuf, size_t inlen,
int inlen, void *outbuf, int outlen) void *outbuf, size_t outlen)
{ {
return decode_bit_string(inbuf, inlen, outbuf, outlen, 1); return decode_bit_string(inbuf, inlen, outbuf, outlen, 1);
} }
int sc_asn1_decode_bit_string_ni(const u8 * inbuf, int sc_asn1_decode_bit_string_ni(const u8 * inbuf, size_t inlen,
int inlen, void *outbuf, int outlen) void *outbuf, size_t outlen)
{ {
return decode_bit_string(inbuf, inlen, outbuf, outlen, 0); return decode_bit_string(inbuf, inlen, outbuf, outlen, 0);
} }
int sc_asn1_decode_integer(const u8 * inbuf, int inlen, int *out) int sc_asn1_decode_integer(const u8 * inbuf, size_t inlen, int *out)
{ {
int i, a = 0; int i, a = 0;
@ -389,7 +394,7 @@ int sc_asn1_decode_integer(const u8 * inbuf, int inlen, int *out)
return 0; return 0;
} }
int sc_asn1_decode_object_id(const u8 * inbuf, int inlen, int sc_asn1_decode_object_id(const u8 * inbuf, size_t inlen,
struct sc_object_id *id) struct sc_object_id *id)
{ {
int i, a; int i, a;
@ -424,8 +429,8 @@ int sc_asn1_decode_object_id(const u8 * inbuf, int inlen,
return 0; return 0;
} }
int sc_asn1_decode_utf8string(const u8 * inbuf, int inlen, int sc_asn1_decode_utf8string(const u8 * inbuf, size_t inlen,
u8 *out, int *outlen) u8 *out, size_t *outlen)
{ {
if (inlen+1 > *outlen) if (inlen+1 > *outlen)
return SC_ERROR_BUFFER_TOO_SMALL; return SC_ERROR_BUFFER_TOO_SMALL;
@ -457,12 +462,12 @@ int sc_asn1_put_tag(int tag, const u8 * data, int datalen, u8 * out, int outlen,
return 0; return 0;
} }
static int asn1_parse_path(struct sc_context *ctx, const u8 *in, int len, static int asn1_parse_path(struct sc_context *ctx, const u8 *in, size_t len,
struct sc_path *path, int depth) struct sc_path *path, int depth)
{ {
int idx, r; int idx, r;
struct sc_asn1_struct asn1_path[] = { struct sc_asn1_struct asn1_path[] = {
{ "path", SC_ASN1_OCTET_STRING, ASN1_OCTET_STRING, 0, &path->value, (int *) &path->len }, { "path", SC_ASN1_OCTET_STRING, ASN1_OCTET_STRING, 0, &path->value, &path->len },
{ "index", SC_ASN1_INTEGER, ASN1_INTEGER, SC_ASN1_OPTIONAL, &idx }, { "index", SC_ASN1_INTEGER, ASN1_INTEGER, SC_ASN1_OPTIONAL, &idx },
{ NULL } { NULL }
}; };
@ -475,13 +480,14 @@ static int asn1_parse_path(struct sc_context *ctx, const u8 *in, int len,
return 0; return 0;
} }
static int asn1_parse_p15_object(struct sc_context *ctx, const u8 *in, int len, static int asn1_parse_p15_object(struct sc_context *ctx, const u8 *in,
struct sc_pkcs15_object *obj, int depth) size_t len, struct sc_pkcs15_object *obj,
int depth)
{ {
int r; int r;
struct sc_pkcs15_common_obj_attr *com_attr = obj->com_attr; struct sc_pkcs15_common_obj_attr *com_attr = obj->com_attr;
int flags_len = sizeof(com_attr->flags); size_t flags_len = sizeof(com_attr->flags);
int label_len = sizeof(com_attr->label); size_t label_len = sizeof(com_attr->label);
struct sc_asn1_struct asn1_com_obj_attr[] = { struct sc_asn1_struct asn1_com_obj_attr[] = {
{ "label", SC_ASN1_UTF8STRING, ASN1_UTF8STRING, SC_ASN1_OPTIONAL, com_attr->label, &label_len }, { "label", SC_ASN1_UTF8STRING, ASN1_UTF8STRING, SC_ASN1_OPTIONAL, com_attr->label, &label_len },
{ "flags", SC_ASN1_BIT_STRING, ASN1_BIT_STRING, SC_ASN1_OPTIONAL, &com_attr->flags, &flags_len }, { "flags", SC_ASN1_BIT_STRING, ASN1_BIT_STRING, SC_ASN1_OPTIONAL, &com_attr->flags, &flags_len },
@ -502,13 +508,13 @@ static int asn1_parse_p15_object(struct sc_context *ctx, const u8 *in, int len,
} }
static int asn1_decode_entry(struct sc_context *ctx, struct sc_asn1_struct *entry, static int asn1_decode_entry(struct sc_context *ctx, struct sc_asn1_struct *entry,
const u8 *obj, int objlen, int depth) const u8 *obj, size_t objlen, int depth)
{ {
void *parm = entry->parm; void *parm = entry->parm;
int (*callback_func)(struct sc_context *ctx, void *arg, const u8 *obj, int (*callback_func)(struct sc_context *ctx, void *arg, const u8 *obj,
int objlen, int depth) = int objlen, int depth) =
(int (*)(struct sc_context *, void *, const u8 *, int, int)) parm; (int (*)(struct sc_context *, void *, const u8 *, int, int)) parm;
int *len = (int *) entry->arg; size_t *len = (size_t *) entry->arg;
int r = 0; int r = 0;
if (ctx->debug >= 3) { if (ctx->debug >= 3) {
@ -549,6 +555,10 @@ static int asn1_decode_entry(struct sc_context *ctx, struct sc_asn1_struct *entr
if (parm != NULL) { if (parm != NULL) {
int invert = entry->type == SC_ASN1_BIT_STRING ? 1 : 0; int invert = entry->type == SC_ASN1_BIT_STRING ? 1 : 0;
assert(len != NULL); assert(len != NULL);
if (objlen < 1) {
r = SC_ERROR_INVALID_ASN1_OBJECT;
break;
}
if (entry->flags & SC_ASN1_ALLOC) { if (entry->flags & SC_ASN1_ALLOC) {
u8 **buf = (u8 **) parm; u8 **buf = (u8 **) parm;
*buf = malloc(objlen-1); *buf = malloc(objlen-1);
@ -641,7 +651,7 @@ static int asn1_decode_entry(struct sc_context *ctx, struct sc_asn1_struct *entr
} }
static int asn1_parse(struct sc_context *ctx, struct sc_asn1_struct *asn1, static int asn1_parse(struct sc_context *ctx, struct sc_asn1_struct *asn1,
const u8 *in, int len, const u8 **newp, int *len_left, const u8 *in, size_t len, const u8 **newp, size_t *len_left,
int choice, int depth) int choice, int depth)
{ {
int r, idx = 0; int r, idx = 0;
@ -700,13 +710,13 @@ static int asn1_parse(struct sc_context *ctx, struct sc_asn1_struct *asn1,
} }
int sc_asn1_parse(struct sc_context *ctx, struct sc_asn1_struct *asn1, int sc_asn1_parse(struct sc_context *ctx, struct sc_asn1_struct *asn1,
const u8 *in, int len, const u8 **newp, int *len_left) const u8 *in, size_t len, const u8 **newp, size_t *len_left)
{ {
return asn1_parse(ctx, asn1, in, len, newp, len_left, 0, 0); return asn1_parse(ctx, asn1, in, len, newp, len_left, 0, 0);
} }
int sc_asn1_parse_choice(struct sc_context *ctx, struct sc_asn1_struct *asn1, int sc_asn1_parse_choice(struct sc_context *ctx, struct sc_asn1_struct *asn1,
const u8 *in, int len, const u8 **newp, int *len_left) const u8 *in, size_t len, const u8 **newp, size_t *len_left)
{ {
return asn1_parse(ctx, asn1, in, len, newp, len_left, 1, 0); return asn1_parse(ctx, asn1, in, len, newp, len_left, 1, 0);
} }

View File

@ -43,9 +43,9 @@ struct sc_pkcs15_object {
/* DER tag and length parsing */ /* DER tag and length parsing */
int sc_asn1_parse(struct sc_context *ctx, struct sc_asn1_struct *asn1, int sc_asn1_parse(struct sc_context *ctx, struct sc_asn1_struct *asn1,
const u8 *in, int len, const u8 **newp, int *left); const u8 *in, size_t len, const u8 **newp, size_t *left);
int sc_asn1_parse_choice(struct sc_context *ctx, struct sc_asn1_struct *asn1, int sc_asn1_parse_choice(struct sc_context *ctx, struct sc_asn1_struct *asn1,
const u8 *in, int len, const u8 **newp, int *left); const u8 *in, size_t len, const u8 **newp, size_t *left);
const u8 *sc_asn1_find_tag(struct sc_context *ctx, const u8 * buf, const u8 *sc_asn1_find_tag(struct sc_context *ctx, const u8 * buf,
size_t buflen, unsigned int tag, size_t *taglen); size_t buflen, unsigned int tag, size_t *taglen);
@ -61,19 +61,20 @@ const u8 *sc_asn1_skip_tag(struct sc_context *ctx, const u8 ** buf,
int sc_asn1_put_tag(int tag, const u8 * data, int datalen, u8 * out, int outlen, u8 ** ptr); int sc_asn1_put_tag(int tag, const u8 * data, int datalen, u8 * out, int outlen, u8 ** ptr);
/* ASN.1 printing functions */ /* ASN.1 printing functions */
void sc_asn1_print_tags(const u8 * buf, int buflen); void sc_asn1_print_tags(const u8 * buf, size_t buflen);
/* ASN.1 object decoding functions */ /* ASN.1 object decoding functions */
int sc_asn1_utf8string_to_ascii(const u8 * buf, int buflen, int sc_asn1_utf8string_to_ascii(const u8 * buf, size_t buflen,
u8 * outbuf, int outlen); u8 * outbuf, size_t outlen);
int sc_asn1_decode_bit_string(const u8 * inbuf, int inlen, int sc_asn1_decode_bit_string(const u8 * inbuf, size_t inlen,
void *outbuf, int outlen); void *outbuf, size_t outlen);
/* non-inverting version */ /* non-inverting version */
int sc_asn1_decode_bit_string_ni(const u8 * inbuf, int inlen, int sc_asn1_decode_bit_string_ni(const u8 * inbuf, size_t inlen,
void *outbuf, int outlen); void *outbuf, size_t outlen);
int sc_asn1_decode_integer(const u8 * inbuf, int inlen, int *out); int sc_asn1_decode_integer(const u8 * inbuf, size_t inlen, int *out);
int sc_asn1_decode_object_id(const u8 * inbuf, int inlen, int sc_asn1_decode_object_id(const u8 * inbuf, size_t inlen,
struct sc_object_id *id); struct sc_object_id *id);
#define SC_ASN1_CLASS_MASK 0x30000000 #define SC_ASN1_CLASS_MASK 0x30000000
#define SC_ASN1_UNI 0x00000000 /* Universal */ #define SC_ASN1_UNI 0x00000000 /* Universal */
#define SC_ASN1_APP 0x10000000 /* Application */ #define SC_ASN1_APP 0x10000000 /* Application */

View File

@ -82,7 +82,7 @@ static int parse_flex_sf_reply(struct sc_context *ctx, const u8 *buf, int buflen
file->size = (b1 << 8) + b2; file->size = (b1 << 8) + b2;
b1 = *p++; b1 = *p++;
b2 = *p++; b2 = *p++;
file->id = (b1) + b2; file->id = (b1 << 8) + b2;
switch (*p) { switch (*p) {
case 0x01: case 0x01:
file->type = SC_FILE_TYPE_WORKING_EF; file->type = SC_FILE_TYPE_WORKING_EF;

View File

@ -110,18 +110,18 @@ void do_log2(struct sc_context *ctx, int type, const char *file,
if (do_color && !isatty(fileno(outf))) if (do_color && !isatty(fileno(outf)))
do_color = 0; do_color = 0;
if (do_color) { if (do_color) {
color_sfx = "\\e[0m"; color_sfx = "\e[0m";
switch (type) { switch (type) {
case SC_LOG_TYPE_ERROR: case SC_LOG_TYPE_ERROR:
color_pfx = "\\e[01;31m"; color_pfx = "\e[01;31m";
break; break;
#if 0 #if 0
case SC_LOG_TYPE_NORMAL: case SC_LOG_TYPE_NORMAL:
color_pfx = "\\e[01;33m"; color_pfx = "\e[01;33m";
break; break;
#endif #endif
case SC_LOG_TYPE_DEBUG: case SC_LOG_TYPE_DEBUG:
color_pfx = "\\e[00;32m"; color_pfx = "\e[00;32m";
break; break;
} }
} }

View File

@ -43,9 +43,9 @@ struct sc_pkcs15_object {
/* DER tag and length parsing */ /* DER tag and length parsing */
int sc_asn1_parse(struct sc_context *ctx, struct sc_asn1_struct *asn1, int sc_asn1_parse(struct sc_context *ctx, struct sc_asn1_struct *asn1,
const u8 *in, int len, const u8 **newp, int *left); const u8 *in, size_t len, const u8 **newp, size_t *left);
int sc_asn1_parse_choice(struct sc_context *ctx, struct sc_asn1_struct *asn1, int sc_asn1_parse_choice(struct sc_context *ctx, struct sc_asn1_struct *asn1,
const u8 *in, int len, const u8 **newp, int *left); const u8 *in, size_t len, const u8 **newp, size_t *left);
const u8 *sc_asn1_find_tag(struct sc_context *ctx, const u8 * buf, const u8 *sc_asn1_find_tag(struct sc_context *ctx, const u8 * buf,
size_t buflen, unsigned int tag, size_t *taglen); size_t buflen, unsigned int tag, size_t *taglen);
@ -61,19 +61,20 @@ const u8 *sc_asn1_skip_tag(struct sc_context *ctx, const u8 ** buf,
int sc_asn1_put_tag(int tag, const u8 * data, int datalen, u8 * out, int outlen, u8 ** ptr); int sc_asn1_put_tag(int tag, const u8 * data, int datalen, u8 * out, int outlen, u8 ** ptr);
/* ASN.1 printing functions */ /* ASN.1 printing functions */
void sc_asn1_print_tags(const u8 * buf, int buflen); void sc_asn1_print_tags(const u8 * buf, size_t buflen);
/* ASN.1 object decoding functions */ /* ASN.1 object decoding functions */
int sc_asn1_utf8string_to_ascii(const u8 * buf, int buflen, int sc_asn1_utf8string_to_ascii(const u8 * buf, size_t buflen,
u8 * outbuf, int outlen); u8 * outbuf, size_t outlen);
int sc_asn1_decode_bit_string(const u8 * inbuf, int inlen, int sc_asn1_decode_bit_string(const u8 * inbuf, size_t inlen,
void *outbuf, int outlen); void *outbuf, size_t outlen);
/* non-inverting version */ /* non-inverting version */
int sc_asn1_decode_bit_string_ni(const u8 * inbuf, int inlen, int sc_asn1_decode_bit_string_ni(const u8 * inbuf, size_t inlen,
void *outbuf, int outlen); void *outbuf, size_t outlen);
int sc_asn1_decode_integer(const u8 * inbuf, int inlen, int *out); int sc_asn1_decode_integer(const u8 * inbuf, size_t inlen, int *out);
int sc_asn1_decode_object_id(const u8 * inbuf, int inlen, int sc_asn1_decode_object_id(const u8 * inbuf, size_t inlen,
struct sc_object_id *id); struct sc_object_id *id);
#define SC_ASN1_CLASS_MASK 0x30000000 #define SC_ASN1_CLASS_MASK 0x30000000
#define SC_ASN1_UNI 0x00000000 /* Universal */ #define SC_ASN1_UNI 0x00000000 /* Universal */
#define SC_ASN1_APP 0x10000000 /* Application */ #define SC_ASN1_APP 0x10000000 /* Application */