1/* 2 * Copyright (c) 1999 - 2005 Kungliga Tekniska Högskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Portions Copyright (c) 2009 Apple Inc. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * 3. Neither the name of the Institute nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36#include <config.h> 37 38#include <stdio.h> 39#include <string.h> 40#include <err.h> 41#include <roken.h> 42 43#include <asn1-common.h> 44#include <asn1_err.h> 45#include <der.h> 46#include <test_asn1.h> 47 48#include "check-common.h" 49 50static int 51cmp_dummy (void *a, void *b) 52{ 53 return 0; 54} 55 56static int 57test_seqofseq(void) 58{ 59 struct test_case tests[] = { 60 { NULL, 2, 61 "\x30\x00", 62 "seqofseq 0" }, 63 { NULL, 9, 64 "\x30\x07\x30\x05\xa0\x03\x02\x01\x00", 65 "seqofseq 1" }, 66 { NULL, 16, 67 "\x30\x0e\x30\x05\xa0\x03\x02\x01\x00\x30\x05\xa0\x03\x02\x01\x01", 68 "seqofseq 2" } 69 }; 70 71 int ret = 0, ntests = sizeof(tests) / sizeof(*tests); 72 TESTSeqOfSeq c0, c1, c2; 73 struct TESTSeqOfSeq_val i[2]; 74 75 i[0].zero = 0; 76 i[1].zero = 1; 77 78 c0.len = 0; 79 c0.val = NULL; 80 tests[0].val = &c0; 81 82 c1.len = 1; 83 c1.val = i; 84 tests[1].val = &c1; 85 86 c2.len = 2; 87 c2.val = i; 88 tests[2].val = &c2; 89 90 ret += generic_test (tests, ntests, sizeof(TESTSeqOfSeq), 91 (generic_encode)encode_TESTSeqOfSeq, 92 (generic_length)length_TESTSeqOfSeq, 93 (generic_decode)decode_TESTSeqOfSeq, 94 (generic_free)free_TESTSeqOfSeq, 95 cmp_dummy, 96 NULL); 97 return ret; 98} 99 100static int 101test_seqofseq2(void) 102{ 103 struct test_case tests[] = { 104 { NULL, 2, 105 "\x30\x00", 106 "seqofseq2 0" }, 107 { NULL, 11, 108 "\x30\x09\x30\x07\xa0\x05\x1b\x03\x65\x74\x74", 109 "seqofseq2 1" }, 110 { NULL, 21, 111 "\x30\x13\x30\x07\xa0\x05\x1b\x03\x65\x74\x74\x30\x08\xa0" 112 "\x06\x1b\x04\x74\x76\x61\x61", 113 "seqofseq2 2" } 114 }; 115 116 int ret = 0, ntests = sizeof(tests) / sizeof(*tests); 117 TESTSeqOfSeq2 c0, c1, c2; 118 struct TESTSeqOfSeq2_val i[2]; 119 120 i[0].string = "ett"; 121 i[1].string = "tvaa"; 122 123 c0.len = 0; 124 c0.val = NULL; 125 tests[0].val = &c0; 126 127 c1.len = 1; 128 c1.val = i; 129 tests[1].val = &c1; 130 131 c2.len = 2; 132 c2.val = i; 133 tests[2].val = &c2; 134 135 ret += generic_test (tests, ntests, sizeof(TESTSeqOfSeq2), 136 (generic_encode)encode_TESTSeqOfSeq2, 137 (generic_length)length_TESTSeqOfSeq2, 138 (generic_decode)decode_TESTSeqOfSeq2, 139 (generic_free)free_TESTSeqOfSeq2, 140 cmp_dummy, 141 NULL); 142 return ret; 143} 144 145static int 146test_seqof2(void) 147{ 148 struct test_case tests[] = { 149 { NULL, 4, 150 "\x30\x02\x30\x00", 151 "seqof2 1" }, 152 { NULL, 9, 153 "\x30\x07\x30\x05\x1b\x03\x66\x6f\x6f", 154 "seqof2 2" }, 155 { NULL, 14, 156 "\x30\x0c\x30\x0a\x1b\x03\x66\x6f\x6f\x1b\x03\x62\x61\x72", 157 "seqof2 3" } 158 }; 159 160 int ret = 0, ntests = sizeof(tests) / sizeof(*tests); 161 TESTSeqOf2 c0, c1, c2; 162 heim_general_string i[2]; 163 164 i[0] = "foo"; 165 i[1] = "bar"; 166 167 c0.strings.val = NULL; 168 c0.strings.len = 0; 169 tests[0].val = &c0; 170 171 c1.strings.len = 1; 172 c1.strings.val = i; 173 tests[1].val = &c1; 174 175 c2.strings.len = 2; 176 c2.strings.val = i; 177 tests[2].val = &c2; 178 179 ret += generic_test (tests, ntests, sizeof(TESTSeqOf2), 180 (generic_encode)encode_TESTSeqOf2, 181 (generic_length)length_TESTSeqOf2, 182 (generic_decode)decode_TESTSeqOf2, 183 (generic_free)free_TESTSeqOf2, 184 cmp_dummy, 185 NULL); 186 return ret; 187} 188 189static int 190test_seqof3(void) 191{ 192 struct test_case tests[] = { 193 { NULL, 2, 194 "\x30\x00", 195 "seqof3 0" }, 196 { NULL, 4, 197 "\x30\x02\x30\x00", 198 "seqof3 1" }, 199 { NULL, 9, 200 "\x30\x07\x30\x05\x1b\x03\x66\x6f\x6f", 201 "seqof3 2" }, 202 { NULL, 14, 203 "\x30\x0c\x30\x0a\x1b\x03\x66\x6f\x6f\x1b\x03\x62\x61\x72", 204 "seqof3 3" } 205 }; 206 207 int ret = 0, ntests = sizeof(tests) / sizeof(*tests); 208 TESTSeqOf3 c0, c1, c2, c3; 209 struct TESTSeqOf3_strings s1, s2, s3; 210 heim_general_string i[2]; 211 212 i[0] = "foo"; 213 i[1] = "bar"; 214 215 c0.strings = NULL; 216 tests[0].val = &c0; 217 218 s1.val = NULL; 219 s1.len = 0; 220 c1.strings = &s1; 221 tests[1].val = &c1; 222 223 s2.len = 1; 224 s2.val = i; 225 c2.strings = &s2; 226 tests[2].val = &c2; 227 228 s3.len = 2; 229 s3.val = i; 230 c3.strings = &s3; 231 tests[3].val = &c3; 232 233 ret += generic_test (tests, ntests, sizeof(TESTSeqOf3), 234 (generic_encode)encode_TESTSeqOf3, 235 (generic_length)length_TESTSeqOf3, 236 (generic_decode)decode_TESTSeqOf3, 237 (generic_free)free_TESTSeqOf3, 238 cmp_dummy, 239 NULL); 240 return ret; 241} 242 243 244int 245main(int argc, char **argv) 246{ 247 int ret = 0; 248 249 ret += test_seqofseq(); 250 ret += test_seqofseq2(); 251 ret += test_seqof2(); 252 ret += test_seqof3(); 253 254 return ret; 255} 256