blob: 0d6d0736a85b87b422dd821599db1dcb0691e7dd [file] [log] [blame]
vlm785435b2004-09-14 12:46:35 +00001#define EMIT_ASN_DEBUG 1
vlm785435b2004-09-14 12:46:35 +00002#include <REAL.c>
vlm6678cb12004-09-26 13:10:40 +00003#include <ber_codec_prim.c>
vlm785435b2004-09-14 12:46:35 +00004#include <ber_decoder.c>
5#include <ber_tlv_length.c>
6#include <ber_tlv_tag.c>
7#include <der_encoder.c>
8#include <constraints.c>
9
10static void
11check(REAL_t *rn, double orig_dbl) {
12 double val;
13 uint8_t *p, *end;
14 int ret;
15
16 printf("double value %.12f [", orig_dbl);
17 for(p = (uint8_t *)&orig_dbl, end = p + sizeof(double); p < end ; p++)
18 printf("%02x", *p);
19 printf("] (ilogb %d)\n", ilogb(orig_dbl));
20
21 val = frexp(orig_dbl, &ret);
22 printf("frexp(%f, %d): [", val, ret);
23 for(p = (uint8_t *)&val, end = p + sizeof(double); p < end ; p++)
24 printf("%02x", *p);
25 printf("]\n");
26
27 ret = asn1_double2REAL(rn, orig_dbl);
28 assert(ret == 0);
29
30 printf("converted into [");
31 for(p = rn->buf, end = p + rn->size; p < end; p++)
32 printf("%02x", *p);
33 printf("]\n");
34
35 ret = asn1_REAL2double(rn, &val);
36 assert(ret == 0);
37
38 printf("and back to double: [");
39 for(p = (uint8_t *)&val, end = p + sizeof(double); p < end ; p++)
40 printf("%02x", *p);
41 printf("] (ilogb %d)\n", ilogb(val));
42
43 printf("%.12f vs %.12f\n", orig_dbl, val);
44
45 assert(orig_dbl == val);
46 printf("OK\n");
47}
48
49uint8_t buf_1_0[] = { 0x80, 0xcc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
50uint8_t buf_1_1[] = { 0x80, 0xcc, 0x11, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a };
51uint8_t buf_3_14[] = { 0x80, 0xcd, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f };
52/* These ones are very interesting! It checks mantissa overflow! */
53uint8_t buf_mo1[] = { 0x80, 0xc5, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f,3};
54uint8_t buf_mo2[] = { 0x80, 0xbd, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f,3,2};
55
56static void
57check_buf(uint8_t *buf, size_t bufsize, double verify) {
58 REAL_t rn;
59 double val;
60 uint8_t *p, *end;
61 int ret;
62
63 printf("verify double value %.12f [", verify);
64 for(p = (uint8_t *)&verify, end = p + sizeof(double); p < end ; p++)
65 printf("%02x", *p);
66 printf("] (ilogb %d)\n", ilogb(verify));
67
68 rn.buf = 0;
69 rn.size = 0;
70
71 ret = asn1_double2REAL(&rn, verify);
72 assert(ret == 0);
73
74 printf("canonical DER: [");
75 for(p = rn.buf, end = p + rn.size; p < end; p++)
76 printf("%02x", *p);
77 printf("]\n");
78
79 rn.buf = buf;
80 rn.size = bufsize;
81
82 printf("received as: [");
83 for(p = rn.buf, end = p + rn.size; p < end; p++)
84 printf("%02x", *p);
85 printf("]\n");
86
87 ret = asn1_REAL2double(&rn, &val);
88 assert(ret == 0);
89
90 printf("%.12f vs %.12f\n", verify, val);
91
92 assert(val == verify);
93}
94
95int
96main() {
97 REAL_t rn;
98
99 memset(&rn, 0, sizeof(rn));
100
101 check(&rn, 0.0);
102 check(&rn, 1.0);
103 check(&rn, -1.0);
104 check(&rn, 1.5);
105 check(&rn, 0.1);
106 check(&rn, 0.33333);
107 check(&rn, 2);
108 check(&rn, 2.1);
109 check(&rn, 3);
110 check(&rn, 3.1);
111 check(&rn, 3.14);
112 check(&rn, 3.1415);
113 check(&rn, 3.141592);
114 check(&rn, 3.14159265);
115 check(&rn, -3.14159265);
116 check(&rn, 14159265.0);
117 check(&rn, -123456789123456789.0);
118 check(&rn, 0.00000000001);
119 check(&rn, 0.00000000002);
120 check(&rn, 0.00000000009);
121 check(&rn, 0.0000000000000000000001);
122 check(&rn, 0.000000000000000000000000000001); /* proved 2B a problem */
123 check(&rn,-0.000000000000000000000000000001); /* proved 2B a problem */
124 check(&rn, 0.0000000000010000000001000000000001);
125 check(&rn, 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001);
126 check(&rn, 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001);
127 check(&rn,-0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001);
128 check(&rn,-3.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333);
129 check(&rn, 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333);
130 check(&rn, -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001);
131
132 check_buf(buf_1_0, sizeof(buf_1_0), 1.0);
133 check_buf(buf_1_1, sizeof(buf_1_1), 1.1);
134 check_buf(buf_3_14, sizeof(buf_3_14), 3.14);
135 check_buf(buf_mo1, sizeof(buf_mo1), 3.14);
136 check_buf(buf_mo2, sizeof(buf_mo2), 3.14);
137
138 return 0;
139}