Path: blob/main/crypto/heimdal/lib/asn1/check-der.c
34879 views
/*1* Copyright (c) 1999 - 2007 Kungliga Tekniska Högskolan2* (Royal Institute of Technology, Stockholm, Sweden).3* All rights reserved.4*5* Portions Copyright (c) 2009 Apple Inc. All rights reserved.6*7* Redistribution and use in source and binary forms, with or without8* modification, are permitted provided that the following conditions9* are met:10*11* 1. Redistributions of source code must retain the above copyright12* notice, this list of conditions and the following disclaimer.13*14* 2. Redistributions in binary form must reproduce the above copyright15* notice, this list of conditions and the following disclaimer in the16* documentation and/or other materials provided with the distribution.17*18* 3. Neither the name of the Institute nor the names of its contributors19* may be used to endorse or promote products derived from this software20* without specific prior written permission.21*22* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND23* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE24* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE25* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE26* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL27* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS28* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)29* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT30* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY31* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF32* SUCH DAMAGE.33*/3435#include "der_locl.h"36#include <err.h>37#include <roken.h>3839#include <asn1-common.h>40#include <asn1_err.h>41#include <der.h>4243#include "check-common.h"4445RCSID("$Id$");4647static int48cmp_integer (void *a, void *b)49{50int *ia = (int *)a;51int *ib = (int *)b;5253return *ib - *ia;54}5556static int57test_integer (void)58{59struct test_case tests[] = {60{NULL, 1, "\x00"},61{NULL, 1, "\x7f"},62{NULL, 2, "\x00\x80"},63{NULL, 2, "\x01\x00"},64{NULL, 1, "\x80"},65{NULL, 2, "\xff\x7f"},66{NULL, 1, "\xff"},67{NULL, 2, "\xff\x01"},68{NULL, 2, "\x00\xff"},69{NULL, 4, "\x7f\xff\xff\xff"}70};7172int values[] = {0, 127, 128, 256, -128, -129, -1, -255, 255,730x7fffffff};74int i, ret;75int ntests = sizeof(tests) / sizeof(*tests);7677for (i = 0; i < ntests; ++i) {78tests[i].val = &values[i];79if (asprintf (&tests[i].name, "integer %d", values[i]) < 0)80errx(1, "malloc");81if (tests[i].name == NULL)82errx(1, "malloc");83}8485ret = generic_test (tests, ntests, sizeof(int),86(generic_encode)der_put_integer,87(generic_length) der_length_integer,88(generic_decode)der_get_integer,89(generic_free)NULL,90cmp_integer,91NULL);9293for (i = 0; i < ntests; ++i)94free (tests[i].name);95return ret;96}9798static int99test_one_int(int val)100{101int ret, dval;102unsigned char *buf;103size_t len_len, len;104105len = _heim_len_int(val);106107buf = emalloc(len + 2);108109buf[0] = '\xff';110buf[len + 1] = '\xff';111memset(buf + 1, 0, len);112113ret = der_put_integer(buf + 1 + len - 1, len, &val, &len_len);114if (ret) {115printf("integer %d encode failed %d\n", val, ret);116return 1;117}118if (len != len_len) {119printf("integer %d encode fail with %d len %lu, result len %lu\n",120val, ret, (unsigned long)len, (unsigned long)len_len);121return 1;122}123124ret = der_get_integer(buf + 1, len, &dval, &len_len);125if (ret) {126printf("integer %d decode failed %d\n", val, ret);127return 1;128}129if (len != len_len) {130printf("integer %d decoded diffrent len %lu != %lu",131val, (unsigned long)len, (unsigned long)len_len);132return 1;133}134if (val != dval) {135printf("decode decoded to diffrent value %d != %d",136val, dval);137return 1;138}139140if (buf[0] != (unsigned char)'\xff') {141printf("precanary dead %d\n", val);142return 1;143}144if (buf[len + 1] != (unsigned char)'\xff') {145printf("postecanary dead %d\n", val);146return 1;147}148free(buf);149return 0;150}151152static int153test_integer_more (void)154{155int i, n1, n2, n3, n4, n5, n6;156157n2 = 0;158for (i = 0; i < (sizeof(int) * 8); i++) {159n1 = 0x01 << i;160n2 = n2 | n1;161n3 = ~n1;162n4 = ~n2;163n5 = (-1) & ~(0x3f << i);164n6 = (-1) & ~(0x7f << i);165166test_one_int(n1);167test_one_int(n2);168test_one_int(n3);169test_one_int(n4);170test_one_int(n5);171test_one_int(n6);172}173return 0;174}175176static int177cmp_unsigned (void *a, void *b)178{179return *(unsigned int*)b - *(unsigned int*)a;180}181182static int183test_unsigned (void)184{185struct test_case tests[] = {186{NULL, 1, "\x00"},187{NULL, 1, "\x7f"},188{NULL, 2, "\x00\x80"},189{NULL, 2, "\x01\x00"},190{NULL, 2, "\x02\x00"},191{NULL, 3, "\x00\x80\x00"},192{NULL, 5, "\x00\x80\x00\x00\x00"},193{NULL, 4, "\x7f\xff\xff\xff"}194};195196unsigned int values[] = {0, 127, 128, 256, 512, 32768,1970x80000000, 0x7fffffff};198int i, ret;199int ntests = sizeof(tests) / sizeof(*tests);200201for (i = 0; i < ntests; ++i) {202tests[i].val = &values[i];203if (asprintf (&tests[i].name, "unsigned %u", values[i]) < 0)204errx(1, "malloc");205if (tests[i].name == NULL)206errx(1, "malloc");207}208209ret = generic_test (tests, ntests, sizeof(int),210(generic_encode)der_put_unsigned,211(generic_length)der_length_unsigned,212(generic_decode)der_get_unsigned,213(generic_free)NULL,214cmp_unsigned,215NULL);216for (i = 0; i < ntests; ++i)217free (tests[i].name);218return ret;219}220221static int222cmp_octet_string (void *a, void *b)223{224heim_octet_string *oa = (heim_octet_string *)a;225heim_octet_string *ob = (heim_octet_string *)b;226227if (oa->length != ob->length)228return ob->length - oa->length;229230return (memcmp (oa->data, ob->data, oa->length));231}232233static int234test_octet_string (void)235{236heim_octet_string s1 = {8, "\x01\x23\x45\x67\x89\xab\xcd\xef"};237238struct test_case tests[] = {239{NULL, 8, "\x01\x23\x45\x67\x89\xab\xcd\xef"}240};241int ntests = sizeof(tests) / sizeof(*tests);242int ret;243244tests[0].val = &s1;245if (asprintf (&tests[0].name, "a octet string") < 0)246errx(1, "malloc");247if (tests[0].name == NULL)248errx(1, "malloc");249250ret = generic_test (tests, ntests, sizeof(heim_octet_string),251(generic_encode)der_put_octet_string,252(generic_length)der_length_octet_string,253(generic_decode)der_get_octet_string,254(generic_free)der_free_octet_string,255cmp_octet_string,256NULL);257free(tests[0].name);258return ret;259}260261static int262cmp_bmp_string (void *a, void *b)263{264heim_bmp_string *oa = (heim_bmp_string *)a;265heim_bmp_string *ob = (heim_bmp_string *)b;266267return der_heim_bmp_string_cmp(oa, ob);268}269270static uint16_t bmp_d1[] = { 32 };271static uint16_t bmp_d2[] = { 32, 32 };272273static int274test_bmp_string (void)275{276heim_bmp_string s1 = { 1, bmp_d1 };277heim_bmp_string s2 = { 2, bmp_d2 };278279struct test_case tests[] = {280{NULL, 2, "\x00\x20"},281{NULL, 4, "\x00\x20\x00\x20"}282};283int ntests = sizeof(tests) / sizeof(*tests);284int ret;285286tests[0].val = &s1;287if (asprintf (&tests[0].name, "a bmp string") < 0)288errx(1, "malloc");289if (tests[0].name == NULL)290errx(1, "malloc");291tests[1].val = &s2;292if (asprintf (&tests[1].name, "second bmp string") < 0)293errx(1, "malloc");294if (tests[1].name == NULL)295errx(1, "malloc");296297ret = generic_test (tests, ntests, sizeof(heim_bmp_string),298(generic_encode)der_put_bmp_string,299(generic_length)der_length_bmp_string,300(generic_decode)der_get_bmp_string,301(generic_free)der_free_bmp_string,302cmp_bmp_string,303NULL);304free(tests[0].name);305free(tests[1].name);306return ret;307}308309static int310cmp_universal_string (void *a, void *b)311{312heim_universal_string *oa = (heim_universal_string *)a;313heim_universal_string *ob = (heim_universal_string *)b;314315return der_heim_universal_string_cmp(oa, ob);316}317318static uint32_t universal_d1[] = { 32 };319static uint32_t universal_d2[] = { 32, 32 };320321static int322test_universal_string (void)323{324heim_universal_string s1 = { 1, universal_d1 };325heim_universal_string s2 = { 2, universal_d2 };326327struct test_case tests[] = {328{NULL, 4, "\x00\x00\x00\x20"},329{NULL, 8, "\x00\x00\x00\x20\x00\x00\x00\x20"}330};331int ntests = sizeof(tests) / sizeof(*tests);332int ret;333334tests[0].val = &s1;335if (asprintf (&tests[0].name, "a universal string") < 0)336errx(1, "malloc");337if (tests[0].name == NULL)338errx(1, "malloc");339tests[1].val = &s2;340if (asprintf (&tests[1].name, "second universal string") < 0)341errx(1, "malloc");342if (tests[1].name == NULL)343errx(1, "malloc");344345ret = generic_test (tests, ntests, sizeof(heim_universal_string),346(generic_encode)der_put_universal_string,347(generic_length)der_length_universal_string,348(generic_decode)der_get_universal_string,349(generic_free)der_free_universal_string,350cmp_universal_string,351NULL);352free(tests[0].name);353free(tests[1].name);354return ret;355}356357static int358cmp_general_string (void *a, void *b)359{360char **sa = (char **)a;361char **sb = (char **)b;362363return strcmp (*sa, *sb);364}365366static int367test_general_string (void)368{369char *s1 = "Test User 1";370371struct test_case tests[] = {372{NULL, 11, "\x54\x65\x73\x74\x20\x55\x73\x65\x72\x20\x31"}373};374int ret, ntests = sizeof(tests) / sizeof(*tests);375376tests[0].val = &s1;377if (asprintf (&tests[0].name, "the string \"%s\"", s1) < 0)378errx(1, "malloc");379if (tests[0].name == NULL)380errx(1, "malloc");381382ret = generic_test (tests, ntests, sizeof(unsigned char *),383(generic_encode)der_put_general_string,384(generic_length)der_length_general_string,385(generic_decode)der_get_general_string,386(generic_free)der_free_general_string,387cmp_general_string,388NULL);389free(tests[0].name);390return ret;391}392393static int394cmp_generalized_time (void *a, void *b)395{396time_t *ta = (time_t *)a;397time_t *tb = (time_t *)b;398399return *tb - *ta;400}401402static int403test_generalized_time (void)404{405struct test_case tests[] = {406{NULL, 15, "19700101000000Z"},407{NULL, 15, "19851106210627Z"}408};409time_t values[] = {0, 500159187};410int i, ret;411int ntests = sizeof(tests) / sizeof(*tests);412413for (i = 0; i < ntests; ++i) {414tests[i].val = &values[i];415if (asprintf (&tests[i].name, "time %d", (int)values[i]) < 0)416errx(1, "malloc");417if (tests[i].name == NULL)418errx(1, "malloc");419}420421ret = generic_test (tests, ntests, sizeof(time_t),422(generic_encode)der_put_generalized_time,423(generic_length)der_length_generalized_time,424(generic_decode)der_get_generalized_time,425(generic_free)NULL,426cmp_generalized_time,427NULL);428for (i = 0; i < ntests; ++i)429free(tests[i].name);430return ret;431}432433static int434test_cmp_oid (void *a, void *b)435{436return der_heim_oid_cmp((heim_oid *)a, (heim_oid *)b);437}438439static unsigned oid_comp1[] = { 1, 1, 1 };440static unsigned oid_comp2[] = { 1, 1 };441static unsigned oid_comp3[] = { 6, 15, 1 };442static unsigned oid_comp4[] = { 6, 15 };443444static int445test_oid (void)446{447struct test_case tests[] = {448{NULL, 2, "\x29\x01"},449{NULL, 1, "\x29"},450{NULL, 2, "\xff\x01"},451{NULL, 1, "\xff"}452};453heim_oid values[] = {454{ 3, oid_comp1 },455{ 2, oid_comp2 },456{ 3, oid_comp3 },457{ 2, oid_comp4 }458};459int i, ret;460int ntests = sizeof(tests) / sizeof(*tests);461462for (i = 0; i < ntests; ++i) {463tests[i].val = &values[i];464if (asprintf (&tests[i].name, "oid %d", i) < 0)465errx(1, "malloc");466if (tests[i].name == NULL)467errx(1, "malloc");468}469470ret = generic_test (tests, ntests, sizeof(heim_oid),471(generic_encode)der_put_oid,472(generic_length)der_length_oid,473(generic_decode)der_get_oid,474(generic_free)der_free_oid,475test_cmp_oid,476NULL);477for (i = 0; i < ntests; ++i)478free(tests[i].name);479return ret;480}481482static int483test_cmp_bit_string (void *a, void *b)484{485return der_heim_bit_string_cmp((heim_bit_string *)a, (heim_bit_string *)b);486}487488static int489test_bit_string (void)490{491struct test_case tests[] = {492{NULL, 1, "\x00"}493};494heim_bit_string values[] = {495{ 0, "" }496};497int i, ret;498int ntests = sizeof(tests) / sizeof(*tests);499500for (i = 0; i < ntests; ++i) {501tests[i].val = &values[i];502if (asprintf (&tests[i].name, "bit_string %d", i) < 0)503errx(1, "malloc");504if (tests[i].name == NULL)505errx(1, "malloc");506}507508ret = generic_test (tests, ntests, sizeof(heim_bit_string),509(generic_encode)der_put_bit_string,510(generic_length)der_length_bit_string,511(generic_decode)der_get_bit_string,512(generic_free)der_free_bit_string,513test_cmp_bit_string,514NULL);515for (i = 0; i < ntests; ++i)516free(tests[i].name);517return ret;518}519520static int521test_cmp_heim_integer (void *a, void *b)522{523return der_heim_integer_cmp((heim_integer *)a, (heim_integer *)b);524}525526static int527test_heim_integer (void)528{529struct test_case tests[] = {530{NULL, 2, "\xfe\x01"},531{NULL, 2, "\xef\x01"},532{NULL, 3, "\xff\x00\xff"},533{NULL, 3, "\xff\x01\x00"},534{NULL, 1, "\x00"},535{NULL, 1, "\x01"},536{NULL, 2, "\x00\x80"}537};538539heim_integer values[] = {540{ 2, "\x01\xff", 1 },541{ 2, "\x10\xff", 1 },542{ 2, "\xff\x01", 1 },543{ 2, "\xff\x00", 1 },544{ 0, "", 0 },545{ 1, "\x01", 0 },546{ 1, "\x80", 0 }547};548int i, ret;549int ntests = sizeof(tests) / sizeof(tests[0]);550size_t size;551heim_integer i2;552553for (i = 0; i < ntests; ++i) {554tests[i].val = &values[i];555if (asprintf (&tests[i].name, "heim_integer %d", i) < 0)556errx(1, "malloc");557if (tests[i].name == NULL)558errx(1, "malloc");559}560561ret = generic_test (tests, ntests, sizeof(heim_integer),562(generic_encode)der_put_heim_integer,563(generic_length)der_length_heim_integer,564(generic_decode)der_get_heim_integer,565(generic_free)der_free_heim_integer,566test_cmp_heim_integer,567NULL);568for (i = 0; i < ntests; ++i)569free (tests[i].name);570if (ret)571return ret;572573/* test zero length integer (BER format) */574ret = der_get_heim_integer(NULL, 0, &i2, &size);575if (ret)576errx(1, "der_get_heim_integer");577if (i2.length != 0)578errx(1, "der_get_heim_integer wrong length");579der_free_heim_integer(&i2);580581return 0;582}583584static int585test_cmp_boolean (void *a, void *b)586{587return !!*(int *)a != !!*(int *)b;588}589590static int591test_boolean (void)592{593struct test_case tests[] = {594{NULL, 1, "\xff"},595{NULL, 1, "\x00"}596};597598int values[] = { 1, 0 };599int i, ret;600int ntests = sizeof(tests) / sizeof(tests[0]);601size_t size;602heim_integer i2;603604for (i = 0; i < ntests; ++i) {605tests[i].val = &values[i];606if (asprintf (&tests[i].name, "heim_boolean %d", i) < 0)607errx(1, "malloc");608if (tests[i].name == NULL)609errx(1, "malloc");610}611612ret = generic_test (tests, ntests, sizeof(int),613(generic_encode)der_put_boolean,614(generic_length)der_length_boolean,615(generic_decode)der_get_boolean,616(generic_free)NULL,617test_cmp_boolean,618NULL);619for (i = 0; i < ntests; ++i)620free (tests[i].name);621if (ret)622return ret;623624/* test zero length integer (BER format) */625ret = der_get_heim_integer(NULL, 0, &i2, &size);626if (ret)627errx(1, "der_get_heim_integer");628if (i2.length != 0)629errx(1, "der_get_heim_integer wrong length");630der_free_heim_integer(&i2);631632return 0;633}634635static int636check_fail_unsigned(void)637{638struct test_case tests[] = {639{NULL, sizeof(unsigned) + 1,640"\x01\x01\x01\x01\x01\x01\x01\x01\x01", "data overrun" }641};642int ntests = sizeof(tests) / sizeof(*tests);643644return generic_decode_fail(tests, ntests, sizeof(unsigned),645(generic_decode)der_get_unsigned);646}647648static int649check_fail_integer(void)650{651struct test_case tests[] = {652{NULL, sizeof(int) + 1,653"\x01\x01\x01\x01\x01\x01\x01\x01\x01", "data overrun" }654};655int ntests = sizeof(tests) / sizeof(*tests);656657return generic_decode_fail(tests, ntests, sizeof(int),658(generic_decode)der_get_integer);659}660661static int662check_fail_length(void)663{664struct test_case tests[] = {665{NULL, 0, "", "empty input data"},666{NULL, 1, "\x82", "internal length overrun" }667};668int ntests = sizeof(tests) / sizeof(*tests);669670return generic_decode_fail(tests, ntests, sizeof(size_t),671(generic_decode)der_get_length);672}673674static int675check_fail_boolean(void)676{677struct test_case tests[] = {678{NULL, 0, "", "empty input data"}679};680int ntests = sizeof(tests) / sizeof(*tests);681682return generic_decode_fail(tests, ntests, sizeof(int),683(generic_decode)der_get_boolean);684}685686static int687check_fail_general_string(void)688{689struct test_case tests[] = {690{ NULL, 3, "A\x00i", "NUL char in string"}691};692int ntests = sizeof(tests) / sizeof(*tests);693694return generic_decode_fail(tests, ntests, sizeof(heim_general_string),695(generic_decode)der_get_general_string);696}697698static int699check_fail_bmp_string(void)700{701struct test_case tests[] = {702{NULL, 1, "\x00", "odd (1) length bmpstring"},703{NULL, 3, "\x00\x00\x00", "odd (3) length bmpstring"}704};705int ntests = sizeof(tests) / sizeof(*tests);706707return generic_decode_fail(tests, ntests, sizeof(heim_bmp_string),708(generic_decode)der_get_bmp_string);709}710711static int712check_fail_universal_string(void)713{714struct test_case tests[] = {715{NULL, 1, "\x00", "x & 3 == 1 universal string"},716{NULL, 2, "\x00\x00", "x & 3 == 2 universal string"},717{NULL, 3, "\x00\x00\x00", "x & 3 == 3 universal string"},718{NULL, 5, "\x00\x00\x00\x00\x00", "x & 3 == 1 universal string"},719{NULL, 6, "\x00\x00\x00\x00\x00\x00", "x & 3 == 2 universal string"},720{NULL, 7, "\x00\x00\x00\x00\x00\x00\x00", "x & 3 == 3 universal string"}721};722int ntests = sizeof(tests) / sizeof(*tests);723724return generic_decode_fail(tests, ntests, sizeof(heim_universal_string),725(generic_decode)der_get_universal_string);726}727728static int729check_fail_heim_integer(void)730{731#if 0732struct test_case tests[] = {733};734int ntests = sizeof(tests) / sizeof(*tests);735736return generic_decode_fail(tests, ntests, sizeof(heim_integer),737(generic_decode)der_get_heim_integer);738#else739return 0;740#endif741}742743static int744check_fail_generalized_time(void)745{746struct test_case tests[] = {747{NULL, 1, "\x00", "no time"}748};749int ntests = sizeof(tests) / sizeof(*tests);750751return generic_decode_fail(tests, ntests, sizeof(time_t),752(generic_decode)der_get_generalized_time);753}754755static int756check_fail_oid(void)757{758struct test_case tests[] = {759{NULL, 0, "", "empty input data"},760{NULL, 2, "\x00\x80", "last byte continuation" },761{NULL, 11, "\x00\x81\x80\x80\x80\x80\x80\x80\x80\x80\x00",762"oid element overflow" }763};764int ntests = sizeof(tests) / sizeof(*tests);765766return generic_decode_fail(tests, ntests, sizeof(heim_oid),767(generic_decode)der_get_oid);768}769770static int771check_fail_bitstring(void)772{773struct test_case tests[] = {774{NULL, 0, "", "empty input data"},775{NULL, 1, "\x08", "larger then 8 bits trailer"},776{NULL, 1, "\x01", "to few bytes for bits"},777{NULL, -2, "\x00", "length overrun"},778{NULL, -1, "", "length to short"}779};780int ntests = sizeof(tests) / sizeof(*tests);781782return generic_decode_fail(tests, ntests, sizeof(heim_bit_string),783(generic_decode)der_get_bit_string);784}785786static int787check_heim_integer_same(const char *p, const char *norm_p, heim_integer *i)788{789heim_integer i2;790char *str;791int ret;792793ret = der_print_hex_heim_integer(i, &str);794if (ret)795errx(1, "der_print_hex_heim_integer: %d", ret);796797if (strcmp(str, norm_p) != 0)798errx(1, "der_print_hex_heim_integer: %s != %s", str, p);799800ret = der_parse_hex_heim_integer(str, &i2);801if (ret)802errx(1, "der_parse_hex_heim_integer: %d", ret);803804if (der_heim_integer_cmp(i, &i2) != 0)805errx(1, "der_heim_integer_cmp: p %s", p);806807der_free_heim_integer(&i2);808free(str);809810ret = der_parse_hex_heim_integer(p, &i2);811if (ret)812errx(1, "der_parse_hex_heim_integer: %d", ret);813814if (der_heim_integer_cmp(i, &i2) != 0)815errx(1, "der_heim_integer_cmp: norm");816817der_free_heim_integer(&i2);818819return 0;820}821822static int823test_heim_int_format(void)824{825heim_integer i = { 1, "\x10", 0 };826heim_integer i2 = { 1, "\x10", 1 };827heim_integer i3 = { 1, "\01", 0 };828char *p =829"FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"830"29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"831"EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"832"E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"833"EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE65381"834"FFFFFFFF" "FFFFFFFF";835heim_integer bni = {836128,837"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2"838"\x21\x68\xC2\x34\xC4\xC6\x62\x8B\x80\xDC\x1C\xD1"839"\x29\x02\x4E\x08\x8A\x67\xCC\x74\x02\x0B\xBE\xA6"840"\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD"841"\xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D"842"\xF2\x5F\x14\x37\x4F\xE1\x35\x6D\x6D\x51\xC2\x45"843"\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\xF4\x4C\x42\xE9"844"\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED"845"\xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11"846"\x7C\x4B\x1F\xE6\x49\x28\x66\x51\xEC\xE6\x53\x81"847"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF",8480849};850heim_integer f;851int ret = 0;852853ret += check_heim_integer_same(p, p, &bni);854ret += check_heim_integer_same("10", "10", &i);855ret += check_heim_integer_same("00000010", "10", &i);856ret += check_heim_integer_same("-10", "-10", &i2);857ret += check_heim_integer_same("-00000010", "-10", &i2);858ret += check_heim_integer_same("01", "01", &i3);859ret += check_heim_integer_same("1", "01", &i3);860861{862int r;863r = der_parse_hex_heim_integer("-", &f);864if (r == 0) {865der_free_heim_integer(&f);866ret++;867}868/* used to cause UMR */869r = der_parse_hex_heim_integer("00", &f);870if (r == 0)871der_free_heim_integer(&f);872else873ret++;874}875876return ret;877}878879static int880test_heim_oid_format_same(const char *str, const heim_oid *oid)881{882int ret;883char *p;884heim_oid o2;885886ret = der_print_heim_oid(oid, ' ', &p);887if (ret) {888printf("fail to print oid: %s\n", str);889return 1;890}891ret = strcmp(p, str);892if (ret) {893printf("oid %s != formated oid %s\n", str, p);894free(p);895return ret;896}897898ret = der_parse_heim_oid(p, " ", &o2);899if (ret) {900printf("failed to parse %s\n", p);901free(p);902return ret;903}904free(p);905ret = der_heim_oid_cmp(&o2, oid);906der_free_oid(&o2);907908return ret;909}910911static unsigned sha1_oid_tree[] = { 1, 3, 14, 3, 2, 26 };912913static int914test_heim_oid_format(void)915{916heim_oid sha1 = { 6, sha1_oid_tree };917int ret = 0;918919ret += test_heim_oid_format_same("1 3 14 3 2 26", &sha1);920921return ret;922}923924static int925check_trailing_nul(void)926{927int i, ret;928struct {929int fail;930const unsigned char *p;931size_t len;932const char *s;933size_t size;934} foo[] = {935{ 1, (const unsigned char *)"foo\x00o", 5, NULL, 0 },936{ 1, (const unsigned char *)"\x00o", 2, NULL, 0 },937{ 0, (const unsigned char *)"\x00\x00\x00\x00\x00", 5, "", 5 },938{ 0, (const unsigned char *)"\x00", 1, "", 1 },939{ 0, (const unsigned char *)"", 0, "", 0 },940{ 0, (const unsigned char *)"foo\x00\x00", 5, "foo", 5 },941{ 0, (const unsigned char *)"foo\0", 4, "foo", 4 },942{ 0, (const unsigned char *)"foo", 3, "foo", 3 }943};944945for (i = 0; i < sizeof(foo)/sizeof(foo[0]); i++) {946char *s;947size_t size;948ret = der_get_general_string(foo[i].p, foo[i].len, &s, &size);949if (foo[i].fail) {950if (ret == 0)951errx(1, "check %d NULL didn't fail", i);952continue;953}954if (ret)955errx(1, "NULL check %d der_get_general_string failed", i);956if (foo[i].size != size)957errx(1, "NUL check i = %d size failed", i);958if (strcmp(foo[i].s, s) != 0)959errx(1, "NUL check i = %d content failed", i);960free(s);961}962return 0;963}964965static int966test_misc_cmp(void)967{968int ret;969970/* diffrent lengths are diffrent */971{972const heim_octet_string os1 = { 1, "a" } , os2 = { 0, NULL };973ret = der_heim_octet_string_cmp(&os1, &os2);974if (ret == 0)975return 1;976}977/* diffrent data are diffrent */978{979const heim_octet_string os1 = { 1, "a" } , os2 = { 1, "b" };980ret = der_heim_octet_string_cmp(&os1, &os2);981if (ret == 0)982return 1;983}984/* diffrent lengths are diffrent */985{986const heim_bit_string bs1 = { 8, "a" } , bs2 = { 7, "a" };987ret = der_heim_bit_string_cmp(&bs1, &bs2);988if (ret == 0)989return 1;990}991/* diffrent data are diffrent */992{993const heim_bit_string bs1 = { 7, "\x0f" } , bs2 = { 7, "\x02" };994ret = der_heim_bit_string_cmp(&bs1, &bs2);995if (ret == 0)996return 1;997}998/* diffrent lengths are diffrent */999{1000uint16_t data = 1;1001heim_bmp_string bs1 = { 1, NULL } , bs2 = { 0, NULL };1002bs1.data = &data;1003ret = der_heim_bmp_string_cmp(&bs1, &bs2);1004if (ret == 0)1005return 1;1006}1007/* diffrent lengths are diffrent */1008{1009uint32_t data;1010heim_universal_string us1 = { 1, NULL } , us2 = { 0, NULL };1011us1.data = &data;1012ret = der_heim_universal_string_cmp(&us1, &us2);1013if (ret == 0)1014return 1;1015}1016/* same */1017{1018uint32_t data = (uint32_t)'a';1019heim_universal_string us1 = { 1, NULL } , us2 = { 1, NULL };1020us1.data = &data;1021us2.data = &data;1022ret = der_heim_universal_string_cmp(&us1, &us2);1023if (ret != 0)1024return 1;1025}10261027return 0;1028}10291030static int1031corner_generalized_time(void)1032{1033const char *str = "760520140000Z";1034size_t size;1035time_t t;1036int ret;10371038ret = der_get_generalized_time((const unsigned char*)str, strlen(str),1039&t, &size);1040if (ret)1041return 1;1042return 0;1043}10441045static int1046corner_tag(void)1047{1048struct {1049int ok;1050const char *ptr;1051size_t len;1052} tests[] = {1053{ 1, "\x00", 1 },1054{ 0, "\xff", 1 },1055{ 0, "\xff\xff\xff\xff\xff\xff\xff\xff", 8 }1056};1057int i, ret;1058Der_class cl;1059Der_type ty;1060unsigned int tag;1061size_t size;10621063for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {1064ret = der_get_tag((const unsigned char*)tests[i].ptr,1065tests[i].len, &cl, &ty, &tag, &size);1066if (ret) {1067if (tests[i].ok)1068errx(1, "failed while shouldn't");1069} else {1070if (!tests[i].ok)1071errx(1, "passed while shouldn't");1072}1073}1074return 0;1075}10761077int1078main(int argc, char **argv)1079{1080int ret = 0;10811082ret += test_integer ();1083ret += test_integer_more();1084ret += test_unsigned ();1085ret += test_octet_string ();1086ret += test_bmp_string ();1087ret += test_universal_string ();1088ret += test_general_string ();1089ret += test_generalized_time ();1090ret += test_oid ();1091ret += test_bit_string();1092ret += test_heim_integer();1093ret += test_boolean();10941095ret += check_fail_unsigned();1096ret += check_fail_integer();1097ret += check_fail_length();1098ret += check_fail_boolean();1099ret += check_fail_general_string();1100ret += check_fail_bmp_string();1101ret += check_fail_universal_string();1102ret += check_fail_heim_integer();1103ret += check_fail_generalized_time();1104ret += check_fail_oid();1105ret += check_fail_bitstring();1106ret += test_heim_int_format();1107ret += test_heim_oid_format();1108ret += check_trailing_nul();1109ret += test_misc_cmp();1110ret += corner_generalized_time();1111ret += corner_tag();11121113return ret;1114}111511161117