Ryan Sleevi | a93d997 | 2017-08-16 18:27:46 -0400 | [diff] [blame] | 1 | #undef NDEBUG |
| 2 | #include <stdio.h> |
| 3 | #include <stdlib.h> |
| 4 | #include <sys/types.h> |
| 5 | #include <string.h> |
| 6 | #include <assert.h> |
| 7 | |
| 8 | #include <DefaultSequence.h> |
| 9 | #include <DefaultSet.h> |
| 10 | |
| 11 | uint8_t berSeq1[] = { |
| 12 | 32 | 16, /* [UNIVERSAL 16], constructed */ |
| 13 | 6, /* L */ |
| 14 | /* aBool BOOLEAN */ |
| 15 | ((2 << 6) + 0), /* [0], primitive */ |
| 16 | 1, /* L */ |
| 17 | 0, /* FALSE */ |
| 18 | /* anInteger INTEGER */ |
| 19 | ((2 << 6) + 1), /* [1], primitive */ |
| 20 | 1, /* L */ |
| 21 | 1 |
| 22 | }; |
| 23 | |
| 24 | uint8_t derSeq1[] = { |
| 25 | 32 | 16, /* [UNIVERSAL 16], constructed */ |
| 26 | 3, /* L */ |
| 27 | /* anInteger INTEGER */ |
| 28 | ((2 << 6) + 1), /* [1], primitive */ |
| 29 | 1, /* L */ |
| 30 | 1 |
| 31 | }; |
| 32 | |
| 33 | uint8_t berSeq2[] = { |
| 34 | 32 | 16, /* [UNIVERSAL 16], constructed */ |
| 35 | 3, /* L */ |
| 36 | /* aBool BOOLEAN */ |
| 37 | ((2 << 6) + 0), /* [0], primitive */ |
| 38 | 1, /* L */ |
| 39 | 0 /* FALSE */ |
| 40 | }; |
| 41 | |
| 42 | uint8_t derSeq2[] = { |
| 43 | 32 | 16, /* [UNIVERSAL 16], constructed */ |
| 44 | 0 /* L */ |
| 45 | }; |
| 46 | |
| 47 | uint8_t berSet1[] = { |
| 48 | 32 | 17, /* [UNIVERSAL 17], constructed */ |
| 49 | 6, /* L */ |
| 50 | /* aBool BOOLEAN */ |
| 51 | ((2 << 6) + 0), /* [0], primitive */ |
| 52 | 1, /* L */ |
| 53 | 0, /* FALSE */ |
| 54 | /* anInteger INTEGER */ |
| 55 | ((2 << 6) + 1), /* [1], primitive */ |
| 56 | 1, /* L */ |
| 57 | 1 |
| 58 | }; |
| 59 | |
| 60 | uint8_t derSet1[] = { |
| 61 | 32 | 17, /* [UNIVERSAL 17], constructed */ |
| 62 | 3, /* L */ |
| 63 | /* anInteger INTEGER */ |
| 64 | ((2 << 6) + 1), /* [1], primitive */ |
| 65 | 1, /* L */ |
| 66 | 1 |
| 67 | }; |
| 68 | |
| 69 | uint8_t berSet2[] = { |
| 70 | 32 | 17, /* [UNIVERSAL 17], constructed */ |
| 71 | 3, /* L */ |
| 72 | /* aBool BOOLEAN */ |
| 73 | ((2 << 6) + 0), /* [0], primitive */ |
| 74 | 1, /* L */ |
| 75 | 0 /* FALSE */ |
| 76 | }; |
| 77 | |
| 78 | uint8_t derSet2[] = { |
| 79 | 32 | 17, /* [UNIVERSAL 17], constructed */ |
| 80 | 0 /* L */ |
| 81 | }; |
| 82 | |
| 83 | uint8_t buf2[128]; |
| 84 | int buf2_pos; |
| 85 | |
| 86 | static int |
| 87 | buf2_fill(const void *buffer, size_t size, void *app_key) { |
| 88 | |
| 89 | (void)app_key; |
| 90 | |
| 91 | if(buf2_pos + size > sizeof(buf2)) |
| 92 | return -1; |
| 93 | |
| 94 | memcpy(buf2 + buf2_pos, buffer, size); |
| 95 | buf2_pos += size; |
| 96 | |
| 97 | return 0; |
| 98 | } |
| 99 | |
| 100 | static void |
| 101 | compare_encoding(asn_enc_rval_t *erval, uint8_t *expected, size_t expected_size, |
| 102 | uint8_t *actual) { |
Ryan Sleevi | a93d997 | 2017-08-16 18:27:46 -0400 | [diff] [blame] | 103 | |
| 104 | assert(erval->encoded != -1); |
Lev Walkin | bc09dd4 | 2017-10-19 02:16:35 -0700 | [diff] [blame] | 105 | if((size_t)erval->encoded != expected_size) { |
Ryan Sleevi | a93d997 | 2017-08-16 18:27:46 -0400 | [diff] [blame] | 106 | printf("%d != %d\n", (int)erval->encoded, (int)expected_size); |
Lev Walkin | bc09dd4 | 2017-10-19 02:16:35 -0700 | [diff] [blame] | 107 | assert((size_t)erval->encoded == expected_size); |
Ryan Sleevi | a93d997 | 2017-08-16 18:27:46 -0400 | [diff] [blame] | 108 | } |
Lev Walkin | bc09dd4 | 2017-10-19 02:16:35 -0700 | [diff] [blame] | 109 | for(size_t i = 0; i < expected_size; i++) { |
| 110 | if(expected[i] != actual[i]) { |
| 111 | fprintf(stderr, "Recreated buffer content mismatch:\n"); |
| 112 | fprintf(stderr, "Byte %zu, %x != %x (%d != %d)\n", i, expected[i], |
| 113 | actual[i], expected[i], actual[i]); |
| 114 | } |
| 115 | assert(expected[i] == actual[i]); |
| 116 | } |
Ryan Sleevi | a93d997 | 2017-08-16 18:27:46 -0400 | [diff] [blame] | 117 | } |
| 118 | |
| 119 | static void |
| 120 | check_sequence(uint8_t *in, size_t in_size, uint8_t *expected, |
| 121 | size_t expected_size) { |
| 122 | DefaultSequence_t t, *tp; |
| 123 | void *tpp = &tp; |
| 124 | asn_dec_rval_t rval; |
| 125 | asn_enc_rval_t erval; |
| 126 | |
| 127 | tp = memset(&t, 0, sizeof(t)); |
| 128 | |
| 129 | /* Try to decode the BER encoding. */ |
| 130 | rval = ber_decode(0, &asn_DEF_DefaultSequence, (void**)tpp, in, in_size); |
| 131 | assert(rval.code == RC_OK); |
| 132 | assert(rval.consumed == in_size); |
| 133 | |
| 134 | /* Try to re-create using DER encoding. */ |
| 135 | buf2_pos = 0; |
| 136 | erval = der_encode(&asn_DEF_DefaultSequence, tp, buf2_fill, 0); |
| 137 | compare_encoding(&erval, expected, expected_size, buf2); |
Vasil Velichkov | cef21e0 | 2017-10-09 23:40:17 +0300 | [diff] [blame] | 138 | |
| 139 | ASN_STRUCT_RESET(asn_DEF_DefaultSequence, tp); |
Ryan Sleevi | a93d997 | 2017-08-16 18:27:46 -0400 | [diff] [blame] | 140 | } |
| 141 | |
| 142 | static void |
| 143 | check_set(uint8_t *in, size_t in_size, uint8_t *expected, |
| 144 | size_t expected_size) { |
| 145 | DefaultSet_t t, *tp; |
| 146 | void *tpp = &tp; |
| 147 | asn_dec_rval_t rval; |
| 148 | asn_enc_rval_t erval; |
| 149 | |
| 150 | tp = memset(&t, 0, sizeof(t)); |
| 151 | |
| 152 | /* Try to decode the BER encoding. */ |
| 153 | rval = ber_decode(0, &asn_DEF_DefaultSet, (void**)tpp, in, in_size); |
| 154 | assert(rval.code == RC_OK); |
| 155 | assert(rval.consumed == in_size); |
| 156 | |
| 157 | /* Try to re-create using DER encoding. */ |
| 158 | buf2_pos = 0; |
| 159 | erval = der_encode(&asn_DEF_DefaultSet, tp, buf2_fill, 0); |
| 160 | compare_encoding(&erval, expected, expected_size, buf2); |
Vasil Velichkov | cef21e0 | 2017-10-09 23:40:17 +0300 | [diff] [blame] | 161 | ASN_STRUCT_RESET(asn_DEF_DefaultSet, tp); |
Ryan Sleevi | a93d997 | 2017-08-16 18:27:46 -0400 | [diff] [blame] | 162 | } |
| 163 | |
| 164 | int |
| 165 | main(int ac, char **av) { |
| 166 | |
| 167 | (void)ac; /* Unused argument */ |
| 168 | (void)av; /* Unused argument */ |
| 169 | |
| 170 | check_sequence(berSeq1, sizeof(berSeq1), derSeq1, sizeof(derSeq1)); |
| 171 | check_sequence(berSeq2, sizeof(berSeq2), derSeq2, sizeof(derSeq2)); |
| 172 | check_set(berSet1, sizeof(berSet1), derSet1, sizeof(derSet1)); |
| 173 | check_set(berSet2, sizeof(berSet2), derSet2, sizeof(derSet2)); |
| 174 | } |