123 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <tomcrypt_test.h>
 | |
| 
 | |
| #ifdef MDH 
 | |
| 
 | |
| #ifdef DH4096
 | |
| #define KEYSIZE 4096
 | |
| #else
 | |
| #define KEYSIZE 2048
 | |
| #endif
 | |
| 
 | |
| int dh_test (void)
 | |
| {
 | |
|   unsigned char buf[3][4096];
 | |
|   unsigned long x, y, z;
 | |
|   int           stat, stat2;
 | |
|   dh_key        usera, userb;
 | |
|   prng_state yarrow_prng;
 | |
| 
 | |
|    if (register_prng(&yarrow_desc) == -1) {
 | |
|       printf("Error registering yarrow PRNG\n");
 | |
|       exit(-1);
 | |
|    }
 | |
|    if (register_hash(&md5_desc) == -1) {
 | |
|       printf("Error registering md5 hash\n");
 | |
|       exit(-1);
 | |
|    }
 | |
|    
 | |
|   DO(dh_compat_test());
 | |
| 
 | |
| 
 | |
|   /* make up two keys */
 | |
|   DO(dh_make_key (&yarrow_prng, find_prng ("yarrow"), KEYSIZE/8, &usera));
 | |
|   DO(dh_make_key (&yarrow_prng, find_prng ("yarrow"), KEYSIZE/8, &userb));
 | |
| 
 | |
|   /* make the shared secret */
 | |
|   x = KEYSIZE;
 | |
|   DO(dh_shared_secret (&usera, &userb, buf[0], &x));
 | |
| 
 | |
|   y = KEYSIZE;
 | |
|   DO(dh_shared_secret (&userb, &usera, buf[1], &y));
 | |
|   if (y != x) {
 | |
|     fprintf(stderr, "DH Shared keys are not same size.\n");
 | |
|     dh_free (&usera);
 | |
|     dh_free (&userb);
 | |
|     return 1;
 | |
|   }
 | |
|   if (memcmp (buf[0], buf[1], x)) {
 | |
|     fprintf(stderr, "DH Shared keys not same contents.\n");
 | |
|     dh_free (&usera);
 | |
|     dh_free (&userb);
 | |
|     return 1;
 | |
|   }
 | |
| 
 | |
|   /* now export userb */
 | |
|   y = KEYSIZE;
 | |
|   DO(dh_export (buf[1], &y, PK_PUBLIC, &userb));
 | |
|   dh_free (&userb);
 | |
| 
 | |
|   /* import and make the shared secret again */
 | |
|   DO(dh_import (buf[1], y, &userb));
 | |
|   z = KEYSIZE;
 | |
|   DO(dh_shared_secret (&usera, &userb, buf[2], &z));
 | |
| 
 | |
|   dh_free (&usera);
 | |
|   dh_free (&userb);
 | |
| 
 | |
|   if (z != x) {
 | |
|     fprintf(stderr, "failed.  Size don't match?\n");
 | |
|     return 1;
 | |
|   }
 | |
|   if (memcmp (buf[0], buf[2], x)) {
 | |
|     fprintf(stderr, "Failed.  Content didn't match.\n");
 | |
|     return 1;
 | |
|   }
 | |
| 
 | |
| /* test encrypt_key */
 | |
|   dh_make_key (&yarrow_prng, find_prng ("yarrow"), KEYSIZE/8, &usera);
 | |
|   for (x = 0; x < 16; x++) {
 | |
|     buf[0][x] = x;
 | |
|   }
 | |
|   y = sizeof (buf[1]);
 | |
|   DO(dh_encrypt_key (buf[0], 16, buf[1], &y, &yarrow_prng, find_prng ("yarrow"), find_hash ("md5"), &usera));
 | |
|   zeromem (buf[0], sizeof (buf[0]));
 | |
|   x = sizeof (buf[0]);
 | |
|   DO(dh_decrypt_key (buf[1], y, buf[0], &x, &usera));
 | |
|   if (x != 16) {
 | |
|     fprintf(stderr, "Failed (length)\n");
 | |
|     dh_free (&usera);
 | |
|     return 1;
 | |
|   }
 | |
|   for (x = 0; x < 16; x++)
 | |
|     if (buf[0][x] != x) {
 | |
|       fprintf(stderr, "Failed (contents)\n");
 | |
|       dh_free (&usera);
 | |
|       return 1;
 | |
|     }
 | |
| 
 | |
| /* test sign_hash */
 | |
|   for (x = 0; x < 16; x++) {
 | |
|      buf[0][x] = x;
 | |
|   }
 | |
|   x = sizeof (buf[1]);
 | |
|   DO(dh_sign_hash (buf[0], 16, buf[1], &x, &yarrow_prng, find_prng ("yarrow"), &usera));
 | |
|   DO(dh_verify_hash (buf[1], x, buf[0], 16, &stat, &usera));
 | |
|   buf[0][0] ^= 1;
 | |
|   DO(dh_verify_hash (buf[1], x, buf[0], 16, &stat2, &usera));
 | |
|   dh_free (&usera);
 | |
|   if (!(stat == 1 && stat2 == 0)) { 
 | |
|      fprintf(stderr, "dh_sign/verify_hash %d %d", stat, stat2);
 | |
|      return 1;
 | |
|   }
 | |
|   return 0;
 | |
| }
 | |
| #else
 | |
| 
 | |
| int dh_test(void)
 | |
| {
 | |
|    fprintf(stderr, "NOP");
 | |
|    return 0;
 | |
| }
 | |
| 
 | |
| #endif
 |