PolarSSL v1.2.5
test_suite_debug.c
Go to the documentation of this file.
1 #include "fct.h"
2 
3 #include <polarssl/debug.h>
4 
5 struct buffer_data
6 {
7  char buf[2000];
8  char *ptr;
9 };
10 
11 void string_debug(void *data, int level, const char *str)
12 {
13  struct buffer_data *buffer = (struct buffer_data *) data;
14  ((void) level);
15 
16  memcpy(buffer->ptr, str, strlen(str));
17  buffer->ptr += strlen(str);
18 }
19 
20 #include <polarssl/config.h>
21 
22 #ifdef _MSC_VER
23 #include <basetsd.h>
24 typedef UINT32 uint32_t;
25 #else
26 #include <inttypes.h>
27 #endif
28 
29 /*
30  * 32-bit integer manipulation macros (big endian)
31  */
32 #ifndef GET_UINT32_BE
33 #define GET_UINT32_BE(n,b,i) \
34 { \
35  (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
36  | ( (uint32_t) (b)[(i) + 1] << 16 ) \
37  | ( (uint32_t) (b)[(i) + 2] << 8 ) \
38  | ( (uint32_t) (b)[(i) + 3] ); \
39 }
40 #endif
41 
42 #ifndef PUT_UINT32_BE
43 #define PUT_UINT32_BE(n,b,i) \
44 { \
45  (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
46  (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
47  (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
48  (b)[(i) + 3] = (unsigned char) ( (n) ); \
49 }
50 #endif
51 
52 int unhexify(unsigned char *obuf, const char *ibuf)
53 {
54  unsigned char c, c2;
55  int len = strlen(ibuf) / 2;
56  assert(!(strlen(ibuf) %1)); // must be even number of bytes
57 
58  while (*ibuf != 0)
59  {
60  c = *ibuf++;
61  if( c >= '0' && c <= '9' )
62  c -= '0';
63  else if( c >= 'a' && c <= 'f' )
64  c -= 'a' - 10;
65  else if( c >= 'A' && c <= 'F' )
66  c -= 'A' - 10;
67  else
68  assert( 0 );
69 
70  c2 = *ibuf++;
71  if( c2 >= '0' && c2 <= '9' )
72  c2 -= '0';
73  else if( c2 >= 'a' && c2 <= 'f' )
74  c2 -= 'a' - 10;
75  else if( c2 >= 'A' && c2 <= 'F' )
76  c2 -= 'A' - 10;
77  else
78  assert( 0 );
79 
80  *obuf++ = ( c << 4 ) | c2;
81  }
82 
83  return len;
84 }
85 
86 void hexify(unsigned char *obuf, const unsigned char *ibuf, int len)
87 {
88  unsigned char l, h;
89 
90  while (len != 0)
91  {
92  h = (*ibuf) / 16;
93  l = (*ibuf) % 16;
94 
95  if( h < 10 )
96  *obuf++ = '0' + h;
97  else
98  *obuf++ = 'a' + h - 10;
99 
100  if( l < 10 )
101  *obuf++ = '0' + l;
102  else
103  *obuf++ = 'a' + l - 10;
104 
105  ++ibuf;
106  len--;
107  }
108 }
109 
119 static int rnd_std_rand( void *rng_state, unsigned char *output, size_t len )
120 {
121  size_t i;
122 
123  if( rng_state != NULL )
124  rng_state = NULL;
125 
126  for( i = 0; i < len; ++i )
127  output[i] = rand();
128 
129  return( 0 );
130 }
131 
137 static int rnd_zero_rand( void *rng_state, unsigned char *output, size_t len )
138 {
139  if( rng_state != NULL )
140  rng_state = NULL;
141 
142  memset( output, 0, len );
143 
144  return( 0 );
145 }
146 
147 typedef struct
148 {
149  unsigned char *buf;
150  size_t length;
151 } rnd_buf_info;
152 
164 static int rnd_buffer_rand( void *rng_state, unsigned char *output, size_t len )
165 {
166  rnd_buf_info *info = (rnd_buf_info *) rng_state;
167  size_t use_len;
168 
169  if( rng_state == NULL )
170  return( rnd_std_rand( NULL, output, len ) );
171 
172  use_len = len;
173  if( len > info->length )
174  use_len = info->length;
175 
176  if( use_len )
177  {
178  memcpy( output, info->buf, use_len );
179  info->buf += use_len;
180  info->length -= use_len;
181  }
182 
183  if( len - use_len > 0 )
184  return( rnd_std_rand( NULL, output + use_len, len - use_len ) );
185 
186  return( 0 );
187 }
188 
196 typedef struct
197 {
198  uint32_t key[16];
199  uint32_t v0, v1;
201 
210 static int rnd_pseudo_rand( void *rng_state, unsigned char *output, size_t len )
211 {
212  rnd_pseudo_info *info = (rnd_pseudo_info *) rng_state;
213  uint32_t i, *k, sum, delta=0x9E3779B9;
214  unsigned char result[4];
215 
216  if( rng_state == NULL )
217  return( rnd_std_rand( NULL, output, len ) );
218 
219  k = info->key;
220 
221  while( len > 0 )
222  {
223  size_t use_len = ( len > 4 ) ? 4 : len;
224  sum = 0;
225 
226  for( i = 0; i < 32; i++ )
227  {
228  info->v0 += (((info->v1 << 4) ^ (info->v1 >> 5)) + info->v1) ^ (sum + k[sum & 3]);
229  sum += delta;
230  info->v1 += (((info->v0 << 4) ^ (info->v0 >> 5)) + info->v0) ^ (sum + k[(sum>>11) & 3]);
231  }
232 
233  PUT_UINT32_BE( info->v0, result, 0 );
234  memcpy( output, result, use_len );
235  len -= use_len;
236  }
237 
238  return( 0 );
239 }
240 
241 
243 {
244 #ifdef POLARSSL_DEBUG_C
245 #ifdef POLARSSL_BIGNUM_C
246 #ifdef POLARSSL_SSL_TLS_C
247 #ifdef POLARSSL_RSA_C
248 
249 
250  FCT_SUITE_BGN(test_suite_debug)
251  {
252 #ifdef POLARSSL_FS_IO
253 #ifdef POLARSSL_PEM_C
254 #ifdef POLARSSL_BASE64_C
255 
256  FCT_TEST_BGN(debug_print_certificate_1)
257  {
258  x509_cert crt;
259  ssl_context ssl;
260  struct buffer_data buffer;
261 
262  memset( &crt, 0, sizeof( x509_cert ) );
263  memset( &ssl, 0, sizeof( ssl_context ) );
264  memset( buffer.buf, 0, 2000 );
265  buffer.ptr = buffer.buf;
266 
267  ssl_set_dbg(&ssl, string_debug, &buffer);
268 
269  fct_chk( x509parse_crtfile( &crt, "data_files/server1.crt" ) == 0 );
270  debug_print_crt( &ssl, 0, "MyFile", 999, "PREFIX_", &crt);
271 
272  fct_chk( strcmp( buffer.buf, "MyFile(0999): PREFIX_ #1:\nMyFile(0999): cert. version : 3\nMyFile(0999): serial number : 01\nMyFile(0999): issuer name : C=NL, O=PolarSSL, CN=PolarSSL Test CA\nMyFile(0999): subject name : C=NL, O=PolarSSL, CN=PolarSSL Server 1\nMyFile(0999): issued on : 2011-02-12 14:44:06\nMyFile(0999): expires on : 2021-02-12 14:44:06\nMyFile(0999): signed using : RSA+SHA1\nMyFile(0999): RSA key size : 2048 bits\nMyFile(0999): value of 'crt->rsa.N' (2048 bits) is:\nMyFile(0999): a9 02 1f 3d 40 6a d5 55 53 8b fd 36 ee 82 65 2e\nMyFile(0999): 15 61 5e 89 bf b8 e8 45 90 db ee 88 16 52 d3 f1\nMyFile(0999): 43 50 47 96 12 59 64 87 6b fd 2b e0 46 f9 73 be\nMyFile(0999): dd cf 92 e1 91 5b ed 66 a0 6f 89 29 79 45 80 d0\nMyFile(0999): 83 6a d5 41 43 77 5f 39 7c 09 04 47 82 b0 57 39\nMyFile(0999): 70 ed a3 ec 15 19 1e a8 33 08 47 c1 05 42 a9 fd\nMyFile(0999): 4c c3 b4 df dd 06 1f 4d 10 51 40 67 73 13 0f 40\nMyFile(0999): f8 6d 81 25 5f 0a b1 53 c6 30 7e 15 39 ac f9 5a\nMyFile(0999): ee 7f 92 9e a6 05 5b e7 13 97 85 b5 23 92 d9 d4\nMyFile(0999): 24 06 d5 09 25 89 75 07 dd a6 1a 8f 3f 09 19 be\nMyFile(0999): ad 65 2c 64 eb 95 9b dc fe 41 5e 17 a6 da 6c 5b\nMyFile(0999): 69 cc 02 ba 14 2c 16 24 9c 4a dc cd d0 f7 52 67\nMyFile(0999): 73 f1 2d a0 23 fd 7e f4 31 ca 2d 70 ca 89 0b 04\nMyFile(0999): db 2e a6 4f 70 6e 9e ce bd 58 89 e2 53 59 9e 6e\nMyFile(0999): 5a 92 65 e2 88 3f 0c 94 19 a3 dd e5 e8 9d 95 13\nMyFile(0999): ed 29 db ab 70 12 dc 5a ca 6b 17 ab 52 82 54 b1\nMyFile(0999): value of 'crt->rsa.E' (17 bits) is:\nMyFile(0999): 01 00 01\n" ) == 0 );
273 
274  x509_free( &crt );
275  }
276  FCT_TEST_END();
277 #endif /* POLARSSL_FS_IO */
278 #endif /* POLARSSL_PEM_C */
279 #endif /* POLARSSL_BASE64_C */
280 
281 
282  FCT_TEST_BGN(debug_print_mpi_1)
283  {
284  ssl_context ssl;
285  struct buffer_data buffer;
286  mpi val;
287 
288  mpi_init( &val );
289 
290  memset( &ssl, 0, sizeof( ssl_context ) );
291  memset( buffer.buf, 0, 2000 );
292  buffer.ptr = buffer.buf;
293 
294  fct_chk( mpi_read_string( &val, 16, "01020304050607" ) == 0 );
295  ssl_set_dbg(&ssl, string_debug, &buffer);
296 
297  debug_print_mpi( &ssl, 0, "MyFile", 999, "VALUE", &val);
298 
299  fct_chk( strcmp( buffer.buf, "MyFile(0999): value of 'VALUE' (49 bits) is:\nMyFile(0999): 01 02 03 04 05 06 07\n" ) == 0 );
300 
301  mpi_free( &val );
302  }
303  FCT_TEST_END();
304 
305 
306  FCT_TEST_BGN(debug_print_mpi_2)
307  {
308  ssl_context ssl;
309  struct buffer_data buffer;
310  mpi val;
311 
312  mpi_init( &val );
313 
314  memset( &ssl, 0, sizeof( ssl_context ) );
315  memset( buffer.buf, 0, 2000 );
316  buffer.ptr = buffer.buf;
317 
318  fct_chk( mpi_read_string( &val, 16, "00000000000007" ) == 0 );
319  ssl_set_dbg(&ssl, string_debug, &buffer);
320 
321  debug_print_mpi( &ssl, 0, "MyFile", 999, "VALUE", &val);
322 
323  fct_chk( strcmp( buffer.buf, "MyFile(0999): value of 'VALUE' (3 bits) is:\nMyFile(0999): 07\n" ) == 0 );
324 
325  mpi_free( &val );
326  }
327  FCT_TEST_END();
328 
329 
330  FCT_TEST_BGN(debug_print_mpi_3)
331  {
332  ssl_context ssl;
333  struct buffer_data buffer;
334  mpi val;
335 
336  mpi_init( &val );
337 
338  memset( &ssl, 0, sizeof( ssl_context ) );
339  memset( buffer.buf, 0, 2000 );
340  buffer.ptr = buffer.buf;
341 
342  fct_chk( mpi_read_string( &val, 16, "00000000000000" ) == 0 );
343  ssl_set_dbg(&ssl, string_debug, &buffer);
344 
345  debug_print_mpi( &ssl, 0, "MyFile", 999, "VALUE", &val);
346 
347  fct_chk( strcmp( buffer.buf, "MyFile(0999): value of 'VALUE' (0 bits) is:\nMyFile(0999): 00\n" ) == 0 );
348 
349  mpi_free( &val );
350  }
351  FCT_TEST_END();
352 
353 
354  FCT_TEST_BGN(debug_print_mpi_4)
355  {
356  ssl_context ssl;
357  struct buffer_data buffer;
358  mpi val;
359 
360  mpi_init( &val );
361 
362  memset( &ssl, 0, sizeof( ssl_context ) );
363  memset( buffer.buf, 0, 2000 );
364  buffer.ptr = buffer.buf;
365 
366  fct_chk( mpi_read_string( &val, 16, "0941379d00fed1491fe15df284dfde4a142f68aa8d412023195cee66883e6290ffe703f4ea5963bf212713cee46b107c09182b5edcd955adac418bf4918e2889af48e1099d513830cec85c26ac1e158b52620e33ba8692f893efbb2f958b4424" ) == 0 );
367  ssl_set_dbg(&ssl, string_debug, &buffer);
368 
369  debug_print_mpi( &ssl, 0, "MyFile", 999, "VALUE", &val);
370 
371  fct_chk( strcmp( buffer.buf, "MyFile(0999): value of 'VALUE' (764 bits) is:\nMyFile(0999): 09 41 37 9d 00 fe d1 49 1f e1 5d f2 84 df de 4a\nMyFile(0999): 14 2f 68 aa 8d 41 20 23 19 5c ee 66 88 3e 62 90\nMyFile(0999): ff e7 03 f4 ea 59 63 bf 21 27 13 ce e4 6b 10 7c\nMyFile(0999): 09 18 2b 5e dc d9 55 ad ac 41 8b f4 91 8e 28 89\nMyFile(0999): af 48 e1 09 9d 51 38 30 ce c8 5c 26 ac 1e 15 8b\nMyFile(0999): 52 62 0e 33 ba 86 92 f8 93 ef bb 2f 95 8b 44 24\n" ) == 0 );
372 
373  mpi_free( &val );
374  }
375  FCT_TEST_END();
376 
377 
378  FCT_TEST_BGN(debug_print_mpi_5)
379  {
380  ssl_context ssl;
381  struct buffer_data buffer;
382  mpi val;
383 
384  mpi_init( &val );
385 
386  memset( &ssl, 0, sizeof( ssl_context ) );
387  memset( buffer.buf, 0, 2000 );
388  buffer.ptr = buffer.buf;
389 
390  fct_chk( mpi_read_string( &val, 16, "0000000000000000000000000000000000000000000000000000000941379d00fed1491fe15df284dfde4a142f68aa8d412023195cee66883e6290ffe703f4ea5963bf212713cee46b107c09182b5edcd955adac418bf4918e2889af48e1099d513830cec85c26ac1e158b52620e33ba8692f893efbb2f958b4424" ) == 0 );
391  ssl_set_dbg(&ssl, string_debug, &buffer);
392 
393  debug_print_mpi( &ssl, 0, "MyFile", 999, "VALUE", &val);
394 
395  fct_chk( strcmp( buffer.buf, "MyFile(0999): value of 'VALUE' (764 bits) is:\nMyFile(0999): 09 41 37 9d 00 fe d1 49 1f e1 5d f2 84 df de 4a\nMyFile(0999): 14 2f 68 aa 8d 41 20 23 19 5c ee 66 88 3e 62 90\nMyFile(0999): ff e7 03 f4 ea 59 63 bf 21 27 13 ce e4 6b 10 7c\nMyFile(0999): 09 18 2b 5e dc d9 55 ad ac 41 8b f4 91 8e 28 89\nMyFile(0999): af 48 e1 09 9d 51 38 30 ce c8 5c 26 ac 1e 15 8b\nMyFile(0999): 52 62 0e 33 ba 86 92 f8 93 ef bb 2f 95 8b 44 24\n" ) == 0 );
396 
397  mpi_free( &val );
398  }
399  FCT_TEST_END();
400 
401 
402  FCT_TEST_BGN(debug_print_mpi_6)
403  {
404  ssl_context ssl;
405  struct buffer_data buffer;
406  mpi val;
407 
408  mpi_init( &val );
409 
410  memset( &ssl, 0, sizeof( ssl_context ) );
411  memset( buffer.buf, 0, 2000 );
412  buffer.ptr = buffer.buf;
413 
414  fct_chk( mpi_read_string( &val, 16, "0000000000000000000000000000000000000000000000000000000041379d00fed1491fe15df284dfde4a142f68aa8d412023195cee66883e6290ffe703f4ea5963bf212713cee46b107c09182b5edcd955adac418bf4918e2889af48e1099d513830cec85c26ac1e158b52620e33ba8692f893efbb2f958b4424" ) == 0 );
415  ssl_set_dbg(&ssl, string_debug, &buffer);
416 
417  debug_print_mpi( &ssl, 0, "MyFile", 999, "VALUE", &val);
418 
419  fct_chk( strcmp( buffer.buf, "MyFile(0999): value of 'VALUE' (759 bits) is:\nMyFile(0999): 41 37 9d 00 fe d1 49 1f e1 5d f2 84 df de 4a 14\nMyFile(0999): 2f 68 aa 8d 41 20 23 19 5c ee 66 88 3e 62 90 ff\nMyFile(0999): e7 03 f4 ea 59 63 bf 21 27 13 ce e4 6b 10 7c 09\nMyFile(0999): 18 2b 5e dc d9 55 ad ac 41 8b f4 91 8e 28 89 af\nMyFile(0999): 48 e1 09 9d 51 38 30 ce c8 5c 26 ac 1e 15 8b 52\nMyFile(0999): 62 0e 33 ba 86 92 f8 93 ef bb 2f 95 8b 44 24\n" ) == 0 );
420 
421  mpi_free( &val );
422  }
423  FCT_TEST_END();
424 
425  }
426  FCT_SUITE_END();
427 
428 #endif /* POLARSSL_DEBUG_C */
429 #endif /* POLARSSL_BIGNUM_C */
430 #endif /* POLARSSL_SSL_TLS_C */
431 #endif /* POLARSSL_RSA_C */
432 
433 }
434 FCT_END();
435