Add 64-bit integer support to ASN.1 compiler
ASN.1 INTEGERs will now compile to C int64_t or uint64_t, depending on whether the constraint ranges include numbers that cannot be represented in 32-bit ints and whether they include negative numbers. Template backend support included. check-template is now built with --template, so we know we're testing it. Tests included.
This commit is contained in:

committed by
Nicolas Williams

parent
0e7437ba2e
commit
19d378f44d
@@ -37,6 +37,7 @@ gen_files_pkinit = asn1_pkinit_asn1.x
|
|||||||
gen_files_pkcs12 = asn1_pkcs12_asn1.x
|
gen_files_pkcs12 = asn1_pkcs12_asn1.x
|
||||||
gen_files_pkcs8 = asn1_pkcs8_asn1.x
|
gen_files_pkcs8 = asn1_pkcs8_asn1.x
|
||||||
gen_files_pkcs9 = asn1_pkcs9_asn1.x
|
gen_files_pkcs9 = asn1_pkcs9_asn1.x
|
||||||
|
gen_files_test_template = test_template_asn1-template.c
|
||||||
gen_files_test = asn1_test_asn1.x
|
gen_files_test = asn1_test_asn1.x
|
||||||
gen_files_digest = asn1_digest_asn1.x
|
gen_files_digest = asn1_digest_asn1.x
|
||||||
gen_files_kx509 = asn1_kx509_asn1.x
|
gen_files_kx509 = asn1_kx509_asn1.x
|
||||||
@@ -53,7 +54,7 @@ asn1_print_SOURCES = asn1_print.c
|
|||||||
check_der_SOURCES = check-der.c check-common.c check-common.h
|
check_der_SOURCES = check-der.c check-common.c check-common.h
|
||||||
|
|
||||||
check_template_SOURCES = check-template.c check-common.c check-common.h
|
check_template_SOURCES = check-template.c check-common.c check-common.h
|
||||||
nodist_check_template_SOURCES = $(gen_files_test:.x=.c)
|
nodist_check_template_SOURCES = $(gen_files_test_template:.x=.c)
|
||||||
|
|
||||||
dist_check_gen_SOURCES = check-gen.c check-common.c check-common.h
|
dist_check_gen_SOURCES = check-gen.c check-common.c check-common.h
|
||||||
nodist_check_gen_SOURCES = $(gen_files_test:.x=.c)
|
nodist_check_gen_SOURCES = $(gen_files_test:.x=.c)
|
||||||
@@ -134,6 +135,7 @@ CLEANFILES = \
|
|||||||
$(gen_files_pkcs12) \
|
$(gen_files_pkcs12) \
|
||||||
$(gen_files_digest) \
|
$(gen_files_digest) \
|
||||||
$(gen_files_kx509) \
|
$(gen_files_kx509) \
|
||||||
|
$(gen_files_test_template) \
|
||||||
$(gen_files_test) $(nodist_check_gen_SOURCES) \
|
$(gen_files_test) $(nodist_check_gen_SOURCES) \
|
||||||
asn1_err.c asn1_err.h \
|
asn1_err.c asn1_err.h \
|
||||||
rfc2459_asn1_files rfc2459_asn1*.h* \
|
rfc2459_asn1_files rfc2459_asn1*.h* \
|
||||||
@@ -145,6 +147,7 @@ CLEANFILES = \
|
|||||||
pkcs12_asn1_files pkcs12_asn1*.h* \
|
pkcs12_asn1_files pkcs12_asn1*.h* \
|
||||||
digest_asn1_files digest_asn1*.h* \
|
digest_asn1_files digest_asn1*.h* \
|
||||||
kx509_asn1_files kx509_asn1*.h* \
|
kx509_asn1_files kx509_asn1*.h* \
|
||||||
|
test_template_asn1_files test_template_asn1*.h* \
|
||||||
test_asn1_files test_asn1*.h*
|
test_asn1_files test_asn1*.h*
|
||||||
|
|
||||||
dist_include_HEADERS = der.h heim_asn1.h der-protos.h der-private.h
|
dist_include_HEADERS = der.h heim_asn1.h der-protos.h der-private.h
|
||||||
@@ -170,6 +173,7 @@ priv_headers += pkcs9_asn1-priv.h
|
|||||||
priv_headers += pkcs12_asn1-priv.h
|
priv_headers += pkcs12_asn1-priv.h
|
||||||
priv_headers += digest_asn1-priv.h
|
priv_headers += digest_asn1-priv.h
|
||||||
priv_headers += kx509_asn1-priv.h
|
priv_headers += kx509_asn1-priv.h
|
||||||
|
priv_headers += test_template_asn1.h test_template_asn1-priv.h
|
||||||
priv_headers += test_asn1.h test_asn1-priv.h
|
priv_headers += test_asn1.h test_asn1-priv.h
|
||||||
|
|
||||||
|
|
||||||
@@ -178,7 +182,7 @@ $(asn1_compile_OBJECTS): asn1parse.h asn1parse.c $(srcdir)/der-protos.h $(srcdir
|
|||||||
$(libasn1_la_OBJECTS): $(nodist_include_HEADERS) $(priv_headers) asn1_err.h $(srcdir)/der-protos.h $(srcdir)/der-private.h
|
$(libasn1_la_OBJECTS): $(nodist_include_HEADERS) $(priv_headers) asn1_err.h $(srcdir)/der-protos.h $(srcdir)/der-private.h
|
||||||
$(libasn1base_la_OBJECTS): asn1_err.h $(srcdir)/der-protos.h $(srcdir)/der-private.h
|
$(libasn1base_la_OBJECTS): asn1_err.h $(srcdir)/der-protos.h $(srcdir)/der-private.h
|
||||||
$(check_gen_OBJECTS): test_asn1.h
|
$(check_gen_OBJECTS): test_asn1.h
|
||||||
$(check_template_OBJECTS): test_asn1_files
|
$(check_template_OBJECTS): test_template_asn1.h test_template_asn1_files
|
||||||
$(asn1_print_OBJECTS): krb5_asn1.h
|
$(asn1_print_OBJECTS): krb5_asn1.h
|
||||||
|
|
||||||
asn1parse.h: asn1parse.c
|
asn1parse.h: asn1parse.c
|
||||||
@@ -192,6 +196,7 @@ $(gen_files_digest) digest_asn1.hx digest_asn1-priv.hx: digest_asn1_files
|
|||||||
$(gen_files_kx509) kx509_asn1.hx kx509_asn1-priv.hx: kx509_asn1_files
|
$(gen_files_kx509) kx509_asn1.hx kx509_asn1-priv.hx: kx509_asn1_files
|
||||||
$(gen_files_rfc2459) rfc2459_asn1.hx rfc2459_asn1-priv.hx: rfc2459_asn1_files
|
$(gen_files_rfc2459) rfc2459_asn1.hx rfc2459_asn1-priv.hx: rfc2459_asn1_files
|
||||||
$(gen_files_cms) cms_asn1.hx cms_asn1-priv.hx: cms_asn1_files
|
$(gen_files_cms) cms_asn1.hx cms_asn1-priv.hx: cms_asn1_files
|
||||||
|
$(gen_files_test_template) test_template_asn1.hx test_template_asn1-priv.hx: test_template_asn1_files
|
||||||
$(gen_files_test) test_asn1.hx test_asn1-priv.hx: test_asn1_files
|
$(gen_files_test) test_asn1.hx test_asn1-priv.hx: test_asn1_files
|
||||||
|
|
||||||
rfc2459_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/rfc2459.asn1
|
rfc2459_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/rfc2459.asn1
|
||||||
@@ -221,6 +226,9 @@ digest_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/digest.asn1
|
|||||||
kx509_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/kx509.asn1
|
kx509_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/kx509.asn1
|
||||||
$(ASN1_COMPILE) --one-code-file $(srcdir)/kx509.asn1 kx509_asn1 || (rm -f kx509_asn1_files ; exit 1)
|
$(ASN1_COMPILE) --one-code-file $(srcdir)/kx509.asn1 kx509_asn1 || (rm -f kx509_asn1_files ; exit 1)
|
||||||
|
|
||||||
|
test_template_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/test.asn1
|
||||||
|
$(ASN1_COMPILE) --template --sequence=TESTSeqOf $(srcdir)/test.asn1 test_template_asn1 || (rm -f test_template_asn1_files ; exit 1)
|
||||||
|
|
||||||
test_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/test.asn1
|
test_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/test.asn1
|
||||||
$(ASN1_COMPILE) --one-code-file --sequence=TESTSeqOf $(srcdir)/test.asn1 test_asn1 || (rm -f test_asn1_files ; exit 1)
|
$(ASN1_COMPILE) --one-code-file --sequence=TESTSeqOf $(srcdir)/test.asn1 test_asn1 || (rm -f test_asn1_files ; exit 1)
|
||||||
|
|
||||||
|
@@ -118,7 +118,9 @@ enum template_types {
|
|||||||
A1T_IMEMBER = 0,
|
A1T_IMEMBER = 0,
|
||||||
A1T_HEIM_INTEGER,
|
A1T_HEIM_INTEGER,
|
||||||
A1T_INTEGER,
|
A1T_INTEGER,
|
||||||
|
A1T_INTEGER64,
|
||||||
A1T_UNSIGNED,
|
A1T_UNSIGNED,
|
||||||
|
A1T_UNSIGNED64,
|
||||||
A1T_GENERAL_STRING,
|
A1T_GENERAL_STRING,
|
||||||
A1T_OCTET_STRING,
|
A1T_OCTET_STRING,
|
||||||
A1T_OCTET_STRING_BER,
|
A1T_OCTET_STRING_BER,
|
||||||
|
@@ -69,7 +69,7 @@ struct string_list {
|
|||||||
%}
|
%}
|
||||||
|
|
||||||
%union {
|
%union {
|
||||||
int constant;
|
int64_t constant;
|
||||||
struct value *value;
|
struct value *value;
|
||||||
struct range *range;
|
struct range *range;
|
||||||
char *name;
|
char *name;
|
||||||
@@ -370,14 +370,14 @@ range : '(' Value RANGE Value ')'
|
|||||||
lex_error_message("Non-integer in first part of range");
|
lex_error_message("Non-integer in first part of range");
|
||||||
$$ = ecalloc(1, sizeof(*$$));
|
$$ = ecalloc(1, sizeof(*$$));
|
||||||
$$->min = $2->u.integervalue;
|
$$->min = $2->u.integervalue;
|
||||||
$$->max = $2->u.integervalue - 1;
|
$$->max = INT_MAX;
|
||||||
}
|
}
|
||||||
| '(' kw_MIN RANGE Value ')'
|
| '(' kw_MIN RANGE Value ')'
|
||||||
{
|
{
|
||||||
if($4->type != integervalue)
|
if($4->type != integervalue)
|
||||||
lex_error_message("Non-integer in second part of range");
|
lex_error_message("Non-integer in second part of range");
|
||||||
$$ = ecalloc(1, sizeof(*$$));
|
$$ = ecalloc(1, sizeof(*$$));
|
||||||
$$->min = $4->u.integervalue + 2;
|
$$->min = INT_MIN;
|
||||||
$$->max = $4->u.integervalue;
|
$$->max = $4->u.integervalue;
|
||||||
}
|
}
|
||||||
| '(' Value ')'
|
| '(' Value ')'
|
||||||
|
@@ -764,6 +764,124 @@ check_tag_length(void)
|
|||||||
return failed;
|
return failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
check_tag_length64(void)
|
||||||
|
{
|
||||||
|
struct test_data td[] = {
|
||||||
|
{ 1, 3, 3, "\x02\x01\x00"},
|
||||||
|
{ 1, 7, 7, "\x02\x05\x01\xff\xff\xff\xff"},
|
||||||
|
{ 1, 7, 7, "\x02\x05\x02\x00\x00\x00\x00"},
|
||||||
|
{ 1, 9, 9, "\x02\x07\x7f\xff\xff\xff\xff\xff\xff"},
|
||||||
|
{ 1, 10, 10, "\x02\x08\x00\x80\x00\x00\x00\x00\x00\x00"},
|
||||||
|
{ 1, 10, 10, "\x02\x08\x7f\xff\xff\xff\xff\xff\xff\xff"},
|
||||||
|
{ 1, 11, 11, "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff"},
|
||||||
|
{ 0, 3, 0, "\x02\x02\x00"},
|
||||||
|
{ 0, 3, 0, "\x02\x7f\x7f"},
|
||||||
|
{ 0, 4, 0, "\x02\x03\x00\x80"},
|
||||||
|
{ 0, 4, 0, "\x02\x7f\x01\x00"},
|
||||||
|
{ 0, 5, 0, "\x02\xff\x7f\x02\x00"}
|
||||||
|
};
|
||||||
|
size_t sz;
|
||||||
|
TESTuint64 values[] = {0, 8589934591LL, 8589934592LL,
|
||||||
|
36028797018963967LL, 36028797018963968LL,
|
||||||
|
9223372036854775807LL, 18446744073709551615ULL,
|
||||||
|
0, 127, 128, 256, 512 };
|
||||||
|
TESTuint64 u;
|
||||||
|
int i, ret, failed = 0;
|
||||||
|
void *buf;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) {
|
||||||
|
struct map_page *page;
|
||||||
|
|
||||||
|
buf = map_alloc(OVERRUN, td[i].data, td[i].len, &page);
|
||||||
|
|
||||||
|
ret = decode_TESTuint64(buf, td[i].len, &u, &sz);
|
||||||
|
if (ret) {
|
||||||
|
if (td[i].ok) {
|
||||||
|
printf("failed with tag len test %d\n", i);
|
||||||
|
printf("ret = %d\n", ret);
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (td[i].ok == 0) {
|
||||||
|
printf("failed with success for tag len test %d\n", i);
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
if (td[i].expected_len != sz) {
|
||||||
|
printf("wrong expected size for tag test %d\n", i);
|
||||||
|
printf("sz = %d\n", sz);
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
if (values[i] != u) {
|
||||||
|
printf("wrong value for tag test %d\n", i);
|
||||||
|
printf("Expected value: %lld\nActual value: %lld\n", values[i], u);
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
map_free(page, "test", "decode");
|
||||||
|
}
|
||||||
|
return failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
check_tag_length64s(void)
|
||||||
|
{
|
||||||
|
struct test_data td[] = {
|
||||||
|
{ 1, 3, 3, "\x02\x01\x00"},
|
||||||
|
{ 1, 7, 7, "\x02\x05\xfe\x00\x00\x00\x01"},
|
||||||
|
{ 1, 7, 7, "\x02\x05\xfe\x00\x00\x00\x00"},
|
||||||
|
{ 1, 9, 9, "\x02\x07\x80\x00\x00\x00\x00\x00\x01"},
|
||||||
|
{ 1, 9, 9, "\x02\x07\x80\x00\x00\x00\x00\x00\x00"},
|
||||||
|
{ 1, 10, 10, "\x02\x08\x80\x00\x00\x00\x00\x00\x00\x01"},
|
||||||
|
{ 1, 9, 9, "\x02\x07\x80\x00\x00\x00\x00\x00\x01"},
|
||||||
|
{ 0, 3, 0, "\x02\x02\x00"},
|
||||||
|
{ 0, 3, 0, "\x02\x7f\x7f"},
|
||||||
|
{ 0, 4, 0, "\x02\x03\x00\x80"},
|
||||||
|
{ 0, 4, 0, "\x02\x7f\x01\x00"},
|
||||||
|
{ 0, 5, 0, "\x02\xff\x7f\x02\x00"}
|
||||||
|
};
|
||||||
|
size_t sz;
|
||||||
|
TESTint64 values[] = {0, -8589934591LL, -8589934592LL,
|
||||||
|
-36028797018963967LL, -36028797018963968LL,
|
||||||
|
-9223372036854775807LL, -36028797018963967LL,
|
||||||
|
0, 127, 128, 256, 512 };
|
||||||
|
TESTint64 u;
|
||||||
|
int i, ret, failed = 0;
|
||||||
|
void *buf;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) {
|
||||||
|
struct map_page *page;
|
||||||
|
|
||||||
|
buf = map_alloc(OVERRUN, td[i].data, td[i].len, &page);
|
||||||
|
|
||||||
|
ret = decode_TESTint64(buf, td[i].len, &u, &sz);
|
||||||
|
if (ret) {
|
||||||
|
if (td[i].ok) {
|
||||||
|
printf("failed with tag len test %d\n", i);
|
||||||
|
printf("ret = %d\n", ret);
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (td[i].ok == 0) {
|
||||||
|
printf("failed with success for tag len test %d\n", i);
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
if (td[i].expected_len != sz) {
|
||||||
|
printf("wrong expected size for tag test %d\n", i);
|
||||||
|
printf("sz = %d\n", sz);
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
if (values[i] != u) {
|
||||||
|
printf("wrong value for tag test %d\n", i);
|
||||||
|
printf("Expected value: %lld\nActual value: %lld\n", values[i], u);
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
map_free(page, "test", "decode");
|
||||||
|
}
|
||||||
|
return failed;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
cmp_TESTChoice (void *a, void *b)
|
cmp_TESTChoice (void *a, void *b)
|
||||||
{
|
{
|
||||||
@@ -1291,6 +1409,8 @@ main(int argc, char **argv)
|
|||||||
ret += test_cert();
|
ret += test_cert();
|
||||||
|
|
||||||
ret += check_tag_length();
|
ret += check_tag_length();
|
||||||
|
ret += check_tag_length64();
|
||||||
|
ret += check_tag_length64s();
|
||||||
ret += test_large_tag();
|
ret += test_large_tag();
|
||||||
ret += test_choice();
|
ret += test_choice();
|
||||||
|
|
||||||
|
@@ -53,6 +53,38 @@ cmp_dummy (void *a, void *b)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
test_uint64(void)
|
||||||
|
{
|
||||||
|
struct test_case tests[] = {
|
||||||
|
{ NULL, 3, "\x02\x01\x00", "uint64 0" },
|
||||||
|
{ NULL, 7, "\x02\x05\x01\xff\xff\xff\xff", "uint64 0" },
|
||||||
|
{ NULL, 7, "\x02\x05\x02\x00\x00\x00\x00", "uint64 0" },
|
||||||
|
{ NULL, 9, "\x02\x07\x7f\xff\xff\xff\xff\xff\xff", "uint64 0" },
|
||||||
|
{ NULL, 10, "\x02\x08\x00\x80\x00\x00\x00\x00\x00\x00", "uint64 0" },
|
||||||
|
{ NULL, 10, "\x02\x08\x7f\xff\xff\xff\xff\xff\xff\xff", "uint64 0" },
|
||||||
|
{ NULL, 11, "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff", "uint64 0" }
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t i;
|
||||||
|
int ret = 0, ntests = sizeof(tests) / sizeof(*tests);
|
||||||
|
TESTuint64 values[] = { 0, 8589934591LL, 8589934592LL,
|
||||||
|
36028797018963967LL, 36028797018963968LL,
|
||||||
|
9223372036854775807LL, 18446744073709551615ULL };
|
||||||
|
|
||||||
|
for (i = 0; i < ntests; i++)
|
||||||
|
tests[i].val = &values[i];
|
||||||
|
|
||||||
|
ret += generic_test (tests, ntests, sizeof(TESTuint64),
|
||||||
|
(generic_encode)encode_TESTuint64,
|
||||||
|
(generic_length)length_TESTuint64,
|
||||||
|
(generic_decode)decode_TESTuint64,
|
||||||
|
(generic_free)free_TESTuint64,
|
||||||
|
cmp_dummy,
|
||||||
|
NULL);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
test_seqofseq(void)
|
test_seqofseq(void)
|
||||||
{
|
{
|
||||||
@@ -246,6 +278,7 @@ main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
ret += test_uint64();
|
||||||
ret += test_seqofseq();
|
ret += test_seqofseq();
|
||||||
ret += test_seqofseq2();
|
ret += test_seqofseq2();
|
||||||
ret += test_seqof2();
|
ret += test_seqof2();
|
||||||
|
@@ -54,6 +54,13 @@ der_copy_integer (const int *from, int *to)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
der_copy_integer64 (const int64_t *from, int64_t *to)
|
||||||
|
{
|
||||||
|
*to = *from;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
der_copy_unsigned (const unsigned *from, unsigned *to)
|
der_copy_unsigned (const unsigned *from, unsigned *to)
|
||||||
{
|
{
|
||||||
@@ -61,6 +68,13 @@ der_copy_unsigned (const unsigned *from, unsigned *to)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
der_copy_unsigned64 (const uint64_t *from, uint64_t *to)
|
||||||
|
{
|
||||||
|
*to = *from;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
der_copy_generalized_time (const time_t *from, time_t *to)
|
der_copy_generalized_time (const time_t *from, time_t *to)
|
||||||
{
|
{
|
||||||
|
@@ -50,12 +50,24 @@ der_free_integer (int *i)
|
|||||||
*i = 0;
|
*i = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
der_free_integer64 (int64_t *i)
|
||||||
|
{
|
||||||
|
*i = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
der_free_unsigned (unsigned *u)
|
der_free_unsigned (unsigned *u)
|
||||||
{
|
{
|
||||||
*u = 0;
|
*u = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
der_free_unsigned64 (uint64_t *u)
|
||||||
|
{
|
||||||
|
*u = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
der_free_generalized_time(time_t *t)
|
der_free_generalized_time(time_t *t)
|
||||||
{
|
{
|
||||||
|
@@ -48,9 +48,28 @@ der_get_unsigned (const unsigned char *p, size_t len,
|
|||||||
unsigned val = 0;
|
unsigned val = 0;
|
||||||
size_t oldlen = len;
|
size_t oldlen = len;
|
||||||
|
|
||||||
if (len == sizeof(unsigned) + 1 && p[0] == 0)
|
if (len == sizeof(val) + 1 && p[0] == 0)
|
||||||
;
|
;
|
||||||
else if (len > sizeof(unsigned))
|
else if (len > sizeof(val))
|
||||||
|
return ASN1_OVERRUN;
|
||||||
|
|
||||||
|
while (len--)
|
||||||
|
val = val * 256 + *p++;
|
||||||
|
*ret = val;
|
||||||
|
if(size) *size = oldlen;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
der_get_unsigned64 (const unsigned char *p, size_t len,
|
||||||
|
uint64_t *ret, size_t *size)
|
||||||
|
{
|
||||||
|
uint64_t val = 0;
|
||||||
|
size_t oldlen = len;
|
||||||
|
|
||||||
|
if (len == sizeof(val) + 1 && p[0] == 0)
|
||||||
|
;
|
||||||
|
else if (len > sizeof(val))
|
||||||
return ASN1_OVERRUN;
|
return ASN1_OVERRUN;
|
||||||
|
|
||||||
while (len--)
|
while (len--)
|
||||||
@@ -67,7 +86,27 @@ der_get_integer (const unsigned char *p, size_t len,
|
|||||||
int val = 0;
|
int val = 0;
|
||||||
size_t oldlen = len;
|
size_t oldlen = len;
|
||||||
|
|
||||||
if (len > sizeof(int))
|
if (len > sizeof(val))
|
||||||
|
return ASN1_OVERRUN;
|
||||||
|
|
||||||
|
if (len > 0) {
|
||||||
|
val = (signed char)*p++;
|
||||||
|
while (--len)
|
||||||
|
val = val * 256 + *p++;
|
||||||
|
}
|
||||||
|
*ret = val;
|
||||||
|
if(size) *size = oldlen;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
der_get_integer64 (const unsigned char *p, size_t len,
|
||||||
|
int64_t *ret, size_t *size)
|
||||||
|
{
|
||||||
|
int64_t val = 0;
|
||||||
|
size_t oldlen = len;
|
||||||
|
|
||||||
|
if (len > sizeof(val))
|
||||||
return ASN1_OVERRUN;
|
return ASN1_OVERRUN;
|
||||||
|
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
|
@@ -55,6 +55,24 @@ _heim_len_unsigned (unsigned val)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
_heim_len_unsigned64 (uint64_t val)
|
||||||
|
{
|
||||||
|
size_t ret = 0;
|
||||||
|
int last_val_gt_128;
|
||||||
|
|
||||||
|
do {
|
||||||
|
++ret;
|
||||||
|
last_val_gt_128 = (val >= 128);
|
||||||
|
val /= 256;
|
||||||
|
} while (val);
|
||||||
|
|
||||||
|
if(last_val_gt_128)
|
||||||
|
ret++;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
_heim_len_int (int val)
|
_heim_len_int (int val)
|
||||||
{
|
{
|
||||||
@@ -82,6 +100,33 @@ _heim_len_int (int val)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
_heim_len_int64 (int64_t val)
|
||||||
|
{
|
||||||
|
unsigned char q;
|
||||||
|
size_t ret = 0;
|
||||||
|
|
||||||
|
if (val >= 0) {
|
||||||
|
do {
|
||||||
|
q = val % 256;
|
||||||
|
ret++;
|
||||||
|
val /= 256;
|
||||||
|
} while(val);
|
||||||
|
if(q >= 128)
|
||||||
|
ret++;
|
||||||
|
} else {
|
||||||
|
val = ~val;
|
||||||
|
do {
|
||||||
|
q = ~(val % 256);
|
||||||
|
ret++;
|
||||||
|
val /= 256;
|
||||||
|
} while(val);
|
||||||
|
if(q < 128)
|
||||||
|
ret++;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
len_oid (const heim_oid *oid)
|
len_oid (const heim_oid *oid)
|
||||||
{
|
{
|
||||||
@@ -134,12 +179,24 @@ der_length_integer (const int *data)
|
|||||||
return _heim_len_int (*data);
|
return _heim_len_int (*data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
der_length_integer64 (const int64_t *data)
|
||||||
|
{
|
||||||
|
return _heim_len_int64 (*data);
|
||||||
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
der_length_unsigned (const unsigned *data)
|
der_length_unsigned (const unsigned *data)
|
||||||
{
|
{
|
||||||
return _heim_len_unsigned(*data);
|
return _heim_len_unsigned(*data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
der_length_unsigned64 (const uint64_t *data)
|
||||||
|
{
|
||||||
|
return _heim_len_unsigned64(*data);
|
||||||
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
der_length_enumerated (const unsigned *data)
|
der_length_enumerated (const unsigned *data)
|
||||||
{
|
{
|
||||||
|
@@ -75,6 +75,38 @@ der_put_unsigned (unsigned char *p, size_t len, const unsigned *v, size_t *size)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
der_put_unsigned64 (unsigned char *p, size_t len, const uint64_t *v, size_t *size)
|
||||||
|
{
|
||||||
|
unsigned char *base = p;
|
||||||
|
uint64_t val = *v;
|
||||||
|
|
||||||
|
if (val) {
|
||||||
|
while (len > 0 && val) {
|
||||||
|
*p-- = val % 256;
|
||||||
|
val /= 256;
|
||||||
|
--len;
|
||||||
|
}
|
||||||
|
if (val != 0)
|
||||||
|
return ASN1_OVERFLOW;
|
||||||
|
else {
|
||||||
|
if(p[1] >= 128) {
|
||||||
|
if(len < 1)
|
||||||
|
return ASN1_OVERFLOW;
|
||||||
|
*p-- = 0;
|
||||||
|
}
|
||||||
|
*size = base - p;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else if (len < 1)
|
||||||
|
return ASN1_OVERFLOW;
|
||||||
|
else {
|
||||||
|
*p = 0;
|
||||||
|
*size = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
der_put_integer (unsigned char *p, size_t len, const int *v, size_t *size)
|
der_put_integer (unsigned char *p, size_t len, const int *v, size_t *size)
|
||||||
{
|
{
|
||||||
@@ -115,6 +147,46 @@ der_put_integer (unsigned char *p, size_t len, const int *v, size_t *size)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
der_put_integer64 (unsigned char *p, size_t len, const int64_t *v, size_t *size)
|
||||||
|
{
|
||||||
|
unsigned char *base = p;
|
||||||
|
int64_t val = *v;
|
||||||
|
|
||||||
|
if(val >= 0) {
|
||||||
|
do {
|
||||||
|
if(len < 1)
|
||||||
|
return ASN1_OVERFLOW;
|
||||||
|
*p-- = val % 256;
|
||||||
|
len--;
|
||||||
|
val /= 256;
|
||||||
|
} while(val);
|
||||||
|
if(p[1] >= 128) {
|
||||||
|
if(len < 1)
|
||||||
|
return ASN1_OVERFLOW;
|
||||||
|
*p-- = 0;
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
val = ~val;
|
||||||
|
do {
|
||||||
|
if(len < 1)
|
||||||
|
return ASN1_OVERFLOW;
|
||||||
|
*p-- = ~(val % 256);
|
||||||
|
len--;
|
||||||
|
val /= 256;
|
||||||
|
} while(val);
|
||||||
|
if(p[1] < 128) {
|
||||||
|
if(len < 1)
|
||||||
|
return ASN1_OVERFLOW;
|
||||||
|
*p-- = 0xff;
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*size = base - p;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
der_put_length (unsigned char *p, size_t len, size_t val, size_t *size)
|
der_put_length (unsigned char *p, size_t len, size_t val, size_t *size)
|
||||||
|
@@ -306,7 +306,7 @@ gen_assign_defval(const char *var, struct value *val)
|
|||||||
fprintf(codefile, "if((%s = strdup(\"%s\")) == NULL)\nreturn ENOMEM;\n", var, val->u.stringvalue);
|
fprintf(codefile, "if((%s = strdup(\"%s\")) == NULL)\nreturn ENOMEM;\n", var, val->u.stringvalue);
|
||||||
break;
|
break;
|
||||||
case integervalue:
|
case integervalue:
|
||||||
fprintf(codefile, "%s = %d;\n", var, val->u.integervalue);
|
fprintf(codefile, "%s = %lld;\n", var, val->u.integervalue);
|
||||||
break;
|
break;
|
||||||
case booleanvalue:
|
case booleanvalue:
|
||||||
if(val->u.booleanvalue)
|
if(val->u.booleanvalue)
|
||||||
@@ -327,7 +327,7 @@ gen_compare_defval(const char *var, struct value *val)
|
|||||||
fprintf(codefile, "if(strcmp(%s, \"%s\") != 0)\n", var, val->u.stringvalue);
|
fprintf(codefile, "if(strcmp(%s, \"%s\") != 0)\n", var, val->u.stringvalue);
|
||||||
break;
|
break;
|
||||||
case integervalue:
|
case integervalue:
|
||||||
fprintf(codefile, "if(%s != %d)\n", var, val->u.integervalue);
|
fprintf(codefile, "if(%s != %lld)\n", var, val->u.integervalue);
|
||||||
break;
|
break;
|
||||||
case booleanvalue:
|
case booleanvalue:
|
||||||
if(val->u.booleanvalue)
|
if(val->u.booleanvalue)
|
||||||
@@ -400,7 +400,7 @@ generate_constant (const Symbol *s)
|
|||||||
case booleanvalue:
|
case booleanvalue:
|
||||||
break;
|
break;
|
||||||
case integervalue:
|
case integervalue:
|
||||||
fprintf (headerfile, "enum { %s = %d };\n\n",
|
fprintf (headerfile, "enum { %s = %lld };\n\n",
|
||||||
s->gen_name, s->value->u.integervalue);
|
s->gen_name, s->value->u.integervalue);
|
||||||
break;
|
break;
|
||||||
case nullvalue:
|
case nullvalue:
|
||||||
@@ -543,7 +543,7 @@ define_asn1 (int level, Type *t)
|
|||||||
if(t->members == NULL) {
|
if(t->members == NULL) {
|
||||||
fprintf (headerfile, "INTEGER");
|
fprintf (headerfile, "INTEGER");
|
||||||
if (t->range)
|
if (t->range)
|
||||||
fprintf (headerfile, " (%d..%d)",
|
fprintf (headerfile, " (%lld..%lld)",
|
||||||
t->range->min, t->range->max);
|
t->range->min, t->range->max);
|
||||||
} else {
|
} else {
|
||||||
Member *m;
|
Member *m;
|
||||||
@@ -726,14 +726,16 @@ define_type (int level, const char *name, const char *basename, Type *t, int typ
|
|||||||
fprintf (headerfile, "} %s;\n", name);
|
fprintf (headerfile, "} %s;\n", name);
|
||||||
} else if (t->range == NULL) {
|
} else if (t->range == NULL) {
|
||||||
fprintf (headerfile, "heim_integer %s;\n", name);
|
fprintf (headerfile, "heim_integer %s;\n", name);
|
||||||
} else if (t->range->min == INT_MIN && t->range->max == INT_MAX) {
|
} else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) {
|
||||||
|
fprintf (headerfile, "int64_t %s;\n", name);
|
||||||
|
} else if (t->range->min >= 0 && t->range->max > UINT_MAX) {
|
||||||
|
fprintf (headerfile, "uint64_t %s;\n", name);
|
||||||
|
} else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) {
|
||||||
fprintf (headerfile, "int %s;\n", name);
|
fprintf (headerfile, "int %s;\n", name);
|
||||||
} else if (t->range->min == 0 && t->range->max == UINT_MAX) {
|
} else if (t->range->min >= 0 && t->range->max <= UINT_MAX) {
|
||||||
fprintf (headerfile, "unsigned int %s;\n", name);
|
|
||||||
} else if (t->range->min == 0 && t->range->max == INT_MAX) {
|
|
||||||
fprintf (headerfile, "unsigned int %s;\n", name);
|
fprintf (headerfile, "unsigned int %s;\n", name);
|
||||||
} else
|
} else
|
||||||
errx(1, "%s: unsupported range %d -> %d",
|
errx(1, "%s: unsupported range %lld -> %lld",
|
||||||
name, t->range->min, t->range->max);
|
name, t->range->min, t->range->max);
|
||||||
break;
|
break;
|
||||||
case TBoolean:
|
case TBoolean:
|
||||||
|
@@ -189,19 +189,19 @@ range_check(const char *name,
|
|||||||
{
|
{
|
||||||
if (r->min == r->max + 2 || r->min < r->max)
|
if (r->min == r->max + 2 || r->min < r->max)
|
||||||
fprintf (codefile,
|
fprintf (codefile,
|
||||||
"if ((%s)->%s > %d) {\n"
|
"if ((%s)->%s > %lld) {\n"
|
||||||
"e = ASN1_MAX_CONSTRAINT; %s;\n"
|
"e = ASN1_MAX_CONSTRAINT; %s;\n"
|
||||||
"}\n",
|
"}\n",
|
||||||
name, length, r->max, forwstr);
|
name, length, r->max, forwstr);
|
||||||
if (r->min - 1 == r->max || r->min < r->max)
|
if (r->min - 1 == r->max || r->min < r->max)
|
||||||
fprintf (codefile,
|
fprintf (codefile,
|
||||||
"if ((%s)->%s < %d) {\n"
|
"if ((%s)->%s < %lld) {\n"
|
||||||
"e = ASN1_MIN_CONSTRAINT; %s;\n"
|
"e = ASN1_MIN_CONSTRAINT; %s;\n"
|
||||||
"}\n",
|
"}\n",
|
||||||
name, length, r->min, forwstr);
|
name, length, r->min, forwstr);
|
||||||
if (r->max == r->min)
|
if (r->max == r->min)
|
||||||
fprintf (codefile,
|
fprintf (codefile,
|
||||||
"if ((%s)->%s != %d) {\n"
|
"if ((%s)->%s != %lld) {\n"
|
||||||
"e = ASN1_EXACT_CONSTRAINT; %s;\n"
|
"e = ASN1_EXACT_CONSTRAINT; %s;\n"
|
||||||
"}\n",
|
"}\n",
|
||||||
name, length, r->min, forwstr);
|
name, length, r->min, forwstr);
|
||||||
@@ -252,14 +252,16 @@ decode_type (const char *name, const Type *t, int optional,
|
|||||||
name);
|
name);
|
||||||
} else if (t->range == NULL) {
|
} else if (t->range == NULL) {
|
||||||
decode_primitive ("heim_integer", name, forwstr);
|
decode_primitive ("heim_integer", name, forwstr);
|
||||||
} else if (t->range->min == INT_MIN && t->range->max == INT_MAX) {
|
} else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) {
|
||||||
|
decode_primitive ("integer64", name, forwstr);
|
||||||
|
} else if (t->range->min >= 0 && t->range->max > UINT_MAX) {
|
||||||
|
decode_primitive ("unsigned64", name, forwstr);
|
||||||
|
} else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) {
|
||||||
decode_primitive ("integer", name, forwstr);
|
decode_primitive ("integer", name, forwstr);
|
||||||
} else if (t->range->min == 0 && t->range->max == UINT_MAX) {
|
} else if (t->range->min >= 0 && t->range->max <= UINT_MAX) {
|
||||||
decode_primitive ("unsigned", name, forwstr);
|
|
||||||
} else if (t->range->min == 0 && t->range->max == INT_MAX) {
|
|
||||||
decode_primitive ("unsigned", name, forwstr);
|
decode_primitive ("unsigned", name, forwstr);
|
||||||
} else
|
} else
|
||||||
errx(1, "%s: unsupported range %d -> %d",
|
errx(1, "%s: unsupported range %lld -> %lld",
|
||||||
name, t->range->min, t->range->max);
|
name, t->range->min, t->range->max);
|
||||||
break;
|
break;
|
||||||
case TBoolean:
|
case TBoolean:
|
||||||
|
@@ -129,14 +129,16 @@ encode_type (const char *name, const Type *t, const char *tmpstr)
|
|||||||
fprintf(codefile, "}\n;");
|
fprintf(codefile, "}\n;");
|
||||||
} else if (t->range == NULL) {
|
} else if (t->range == NULL) {
|
||||||
encode_primitive ("heim_integer", name);
|
encode_primitive ("heim_integer", name);
|
||||||
} else if (t->range->min == INT_MIN && t->range->max == INT_MAX) {
|
} else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) {
|
||||||
|
encode_primitive ("integer64", name);
|
||||||
|
} else if (t->range->min >= 0 && t->range->max > UINT_MAX) {
|
||||||
|
encode_primitive ("unsigned64", name);
|
||||||
|
} else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) {
|
||||||
encode_primitive ("integer", name);
|
encode_primitive ("integer", name);
|
||||||
} else if (t->range->min == 0 && t->range->max == UINT_MAX) {
|
} else if (t->range->min >= 0 && t->range->max <= UINT_MAX) {
|
||||||
encode_primitive ("unsigned", name);
|
|
||||||
} else if (t->range->min == 0 && t->range->max == INT_MAX) {
|
|
||||||
encode_primitive ("unsigned", name);
|
encode_primitive ("unsigned", name);
|
||||||
} else
|
} else
|
||||||
errx(1, "%s: unsupported range %d -> %d",
|
errx(1, "%s: unsupported range %lld -> %lld",
|
||||||
name, t->range->min, t->range->max);
|
name, t->range->min, t->range->max);
|
||||||
constructed = 0;
|
constructed = 0;
|
||||||
break;
|
break;
|
||||||
|
@@ -80,14 +80,16 @@ length_type (const char *name, const Type *t,
|
|||||||
fprintf(codefile, "}\n");
|
fprintf(codefile, "}\n");
|
||||||
} else if (t->range == NULL) {
|
} else if (t->range == NULL) {
|
||||||
length_primitive ("heim_integer", name, variable);
|
length_primitive ("heim_integer", name, variable);
|
||||||
} else if (t->range->min == INT_MIN && t->range->max == INT_MAX) {
|
} else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) {
|
||||||
|
length_primitive ("integer64", name, variable);
|
||||||
|
} else if (t->range->min >= 0 && t->range->max > UINT_MAX) {
|
||||||
|
length_primitive ("unsigned64", name, variable);
|
||||||
|
} else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) {
|
||||||
length_primitive ("integer", name, variable);
|
length_primitive ("integer", name, variable);
|
||||||
} else if (t->range->min == 0 && t->range->max == UINT_MAX) {
|
} else if (t->range->min >= 0 && t->range->max <= UINT_MAX) {
|
||||||
length_primitive ("unsigned", name, variable);
|
|
||||||
} else if (t->range->min == 0 && t->range->max == INT_MAX) {
|
|
||||||
length_primitive ("unsigned", name, variable);
|
length_primitive ("unsigned", name, variable);
|
||||||
} else
|
} else
|
||||||
errx(1, "%s: unsupported range %d -> %d",
|
errx(1, "%s: unsupported range %lld -> %lld",
|
||||||
name, t->range->min, t->range->max);
|
name, t->range->min, t->range->max);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@@ -52,11 +52,13 @@ integer_symbol(const char *basename, const Type *t)
|
|||||||
return "int"; /* XXX enum foo */
|
return "int"; /* XXX enum foo */
|
||||||
else if (t->range == NULL)
|
else if (t->range == NULL)
|
||||||
return "heim_integer";
|
return "heim_integer";
|
||||||
else if (t->range->min == INT_MIN && t->range->max == INT_MAX)
|
else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX)
|
||||||
|
return "int64_t";
|
||||||
|
else if (t->range->min >= 0 && t->range->max > UINT_MAX)
|
||||||
|
return "uint64_t";
|
||||||
|
else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX)
|
||||||
return "int";
|
return "int";
|
||||||
else if (t->range->min == 0 && t->range->max == UINT_MAX)
|
else if (t->range->min >= 0 && t->range->max <= UINT_MAX)
|
||||||
return "unsigned";
|
|
||||||
else if (t->range->min == 0 && t->range->max == INT_MAX)
|
|
||||||
return "unsigned";
|
return "unsigned";
|
||||||
else {
|
else {
|
||||||
abort();
|
abort();
|
||||||
@@ -490,14 +492,16 @@ template_members(struct templatehead *temp, const char *basetype, const char *na
|
|||||||
itype = "IMEMBER";
|
itype = "IMEMBER";
|
||||||
else if (t->range == NULL)
|
else if (t->range == NULL)
|
||||||
itype = "HEIM_INTEGER";
|
itype = "HEIM_INTEGER";
|
||||||
else if (t->range->min == INT_MIN && t->range->max == INT_MAX)
|
else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX)
|
||||||
|
itype = "INTEGER64";
|
||||||
|
else if (t->range->min >= 0 && t->range->max > UINT_MAX)
|
||||||
|
itype = "UNSIGNED64";
|
||||||
|
else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX)
|
||||||
itype = "INTEGER";
|
itype = "INTEGER";
|
||||||
else if (t->range->min == 0 && t->range->max == UINT_MAX)
|
else if (t->range->min >= 0 && t->range->max <= UINT_MAX)
|
||||||
itype = "UNSIGNED";
|
|
||||||
else if (t->range->min == 0 && t->range->max == INT_MAX)
|
|
||||||
itype = "UNSIGNED";
|
itype = "UNSIGNED";
|
||||||
else
|
else
|
||||||
errx(1, "%s: unsupported range %d -> %d",
|
errx(1, "%s: unsupported range %lld -> %lld",
|
||||||
name, t->range->min, t->range->max);
|
name, t->range->min, t->range->max);
|
||||||
|
|
||||||
add_line(temp, "{ A1_PARSE_T(A1T_%s), %s, NULL }", itype, poffset);
|
add_line(temp, "{ A1_PARSE_T(A1T_%s), %s, NULL }", itype, poffset);
|
||||||
|
@@ -255,7 +255,7 @@ WITH { return kw_WITH; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
-?0x[0-9A-Fa-f]+|-?[0-9]+ { char *e, *y = yytext;
|
-?0x[0-9A-Fa-f]+|-?[0-9]+ { char *e, *y = yytext;
|
||||||
yylval.constant = strtol((const char *)yytext,
|
yylval.constant = strtoll((const char *)yytext,
|
||||||
&e, 0);
|
&e, 0);
|
||||||
if(e == y)
|
if(e == y)
|
||||||
lex_error_message("malformed constant (%s)", yytext);
|
lex_error_message("malformed constant (%s)", yytext);
|
||||||
|
@@ -78,7 +78,7 @@ struct value {
|
|||||||
} type;
|
} type;
|
||||||
union {
|
union {
|
||||||
int booleanvalue;
|
int booleanvalue;
|
||||||
int integervalue;
|
int64_t integervalue;
|
||||||
char *stringvalue;
|
char *stringvalue;
|
||||||
struct objid *objectidentifiervalue;
|
struct objid *objectidentifiervalue;
|
||||||
} u;
|
} u;
|
||||||
@@ -109,8 +109,12 @@ struct tagtype {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct range {
|
struct range {
|
||||||
int min;
|
/*
|
||||||
int max;
|
* We can't represent unsigned 64-bit ranges because max might be
|
||||||
|
* negative...
|
||||||
|
*/
|
||||||
|
int64_t min;
|
||||||
|
int64_t max;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ctype { CT_CONTENTS, CT_USER } ;
|
enum ctype { CT_CONTENTS, CT_USER } ;
|
||||||
|
@@ -66,7 +66,9 @@ static struct asn1_type_func prim[] = {
|
|||||||
el(integer, int),
|
el(integer, int),
|
||||||
el(heim_integer, heim_integer),
|
el(heim_integer, heim_integer),
|
||||||
el(integer, int),
|
el(integer, int),
|
||||||
|
el(integer64, int64_t),
|
||||||
el(unsigned, unsigned),
|
el(unsigned, unsigned),
|
||||||
|
el(unsigned64, uint64_t),
|
||||||
el(general_string, heim_general_string),
|
el(general_string, heim_general_string),
|
||||||
el(octet_string, heim_octet_string),
|
el(octet_string, heim_octet_string),
|
||||||
elber(octet_string, heim_octet_string),
|
elber(octet_string, heim_octet_string),
|
||||||
|
@@ -7,6 +7,8 @@ BEGIN
|
|||||||
IMPORTS heim_any FROM heim;
|
IMPORTS heim_any FROM heim;
|
||||||
|
|
||||||
TESTuint32 ::= INTEGER (0..4294967295)
|
TESTuint32 ::= INTEGER (0..4294967295)
|
||||||
|
TESTuint64 ::= INTEGER(0..18446744073709551615)
|
||||||
|
TESTint64 ::= INTEGER(-9223372036854775808..9223372036854775807)
|
||||||
|
|
||||||
TESTLargeTag ::= SEQUENCE {
|
TESTLargeTag ::= SEQUENCE {
|
||||||
foo[127] INTEGER (-2147483648..2147483647),
|
foo[127] INTEGER (-2147483648..2147483647),
|
||||||
|
@@ -118,6 +118,7 @@ HDB-extension ::= SEQUENCE {
|
|||||||
hist-kvno-diff-clnt[10] INTEGER (0..4294967295),
|
hist-kvno-diff-clnt[10] INTEGER (0..4294967295),
|
||||||
hist-kvno-diff-svc[11] INTEGER (0..4294967295),
|
hist-kvno-diff-svc[11] INTEGER (0..4294967295),
|
||||||
policy[12] UTF8String,
|
policy[12] UTF8String,
|
||||||
|
principal-id[13] INTEGER(-9223372036854775808..9223372036854775807),
|
||||||
...
|
...
|
||||||
},
|
},
|
||||||
...
|
...
|
||||||
|
Reference in New Issue
Block a user