File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / axTLS / ssl / test / ssltest.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Fri Sep 28 11:55:55 2012 UTC (12 years, 6 months ago) by misho
Branches: v1_4_8, MAIN
CVS tags: datecs, HEAD
axTLS

    1: /*
    2:  * Copyright (c) 2007, Cameron Rich
    3:  * 
    4:  * All rights reserved.
    5:  * 
    6:  * Redistribution and use in source and binary forms, with or without 
    7:  * modification, are permitted provided that the following conditions are met:
    8:  *
    9:  * * Redistributions of source code must retain the above copyright notice, 
   10:  *   this list of conditions and the following disclaimer.
   11:  * * Redistributions in binary form must reproduce the above copyright notice, 
   12:  *   this list of conditions and the following disclaimer in the documentation 
   13:  *   and/or other materials provided with the distribution.
   14:  * * Neither the name of the axTLS project nor the names of its contributors 
   15:  *   may be used to endorse or promote products derived from this software 
   16:  *   without specific prior written permission.
   17:  *
   18:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   19:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   20:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   21:  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
   22:  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   23:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   24:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   25:  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   26:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   27:  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   28:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   29:  */
   30: 
   31: /*
   32:  * The testing of the crypto and ssl stuff goes here. Keeps the individual code
   33:  * modules from being uncluttered with test code.
   34:  *
   35:  * This is test code - I make no apologies for the quality!
   36:  */
   37: 
   38: #include <stdio.h>
   39: #include <stdlib.h>
   40: #include <signal.h>
   41: #include <string.h>
   42: #include <errno.h>
   43: #include <sys/stat.h>
   44: #include <fcntl.h>
   45: 
   46: #ifndef WIN32
   47: #include <pthread.h>
   48: #endif
   49: 
   50: #include "os_port.h"
   51: #include "ssl.h"
   52: 
   53: #define DEFAULT_CERT            "../ssl/test/axTLS.x509_512.cer"
   54: #define DEFAULT_KEY             "../ssl/test/axTLS.key_512"     
   55: //#define DEFAULT_SVR_OPTION      SSL_DISPLAY_BYTES|SSL_DISPLAY_STATES
   56: #define DEFAULT_SVR_OPTION      0
   57: //#define DEFAULT_CLNT_OPTION      SSL_DISPLAY_BYTES|SSL_DISPLAY_STATES
   58: #define DEFAULT_CLNT_OPTION     0
   59: 
   60: static int g_port = 19001;
   61: 
   62: /**************************************************************************
   63:  * AES tests 
   64:  * 
   65:  * Run through a couple of the RFC3602 tests to verify that AES is correct.
   66:  **************************************************************************/
   67: #define TEST1_SIZE  16
   68: #define TEST2_SIZE  32
   69: 
   70: static int AES_test(BI_CTX *bi_ctx)
   71: {
   72:     AES_CTX aes_key;
   73:     int res = 1;
   74:     uint8_t key[TEST1_SIZE];
   75:     uint8_t iv[TEST1_SIZE];
   76: 
   77:     {
   78:         /*
   79:             Case #1: Encrypting 16 bytes (1 block) using AES-CBC
   80:             Key       : 0x06a9214036b8a15b512e03d534120006
   81:             IV        : 0x3dafba429d9eb430b422da802c9fac41
   82:             Plaintext : "Single block msg"
   83:             Ciphertext: 0xe353779c1079aeb82708942dbe77181a
   84: 
   85:         */
   86:         char *in_str =  "Single block msg";
   87:         uint8_t ct[TEST1_SIZE];
   88:         uint8_t enc_data[TEST1_SIZE];
   89:         uint8_t dec_data[TEST1_SIZE];
   90: 
   91:         bigint *key_bi = bi_str_import(
   92:                 bi_ctx, "06A9214036B8A15B512E03D534120006");
   93:         bigint *iv_bi = bi_str_import(
   94:                 bi_ctx, "3DAFBA429D9EB430B422DA802C9FAC41");
   95:         bigint *ct_bi = bi_str_import(
   96:                 bi_ctx, "E353779C1079AEB82708942DBE77181A");
   97:         bi_export(bi_ctx, key_bi, key, TEST1_SIZE);
   98:         bi_export(bi_ctx, iv_bi, iv, TEST1_SIZE);
   99:         bi_export(bi_ctx, ct_bi, ct, TEST1_SIZE);
  100: 
  101:         AES_set_key(&aes_key, key, iv, AES_MODE_128);
  102:         AES_cbc_encrypt(&aes_key, (const uint8_t *)in_str, 
  103:                 enc_data, sizeof(enc_data));
  104:         if (memcmp(enc_data, ct, sizeof(ct)))
  105:         {
  106:             printf("Error: AES ENCRYPT #1 failed\n");
  107:             goto end;
  108:         }
  109: 
  110:         AES_set_key(&aes_key, key, iv, AES_MODE_128);
  111:         AES_convert_key(&aes_key);
  112:         AES_cbc_decrypt(&aes_key, enc_data, dec_data, sizeof(enc_data));
  113: 
  114:         if (memcmp(dec_data, in_str, sizeof(dec_data)))
  115:         {
  116:             printf("Error: AES DECRYPT #1 failed\n");
  117:             goto end;
  118:         }
  119:     }
  120: 
  121:     {
  122:         /*
  123:             Case #2: Encrypting 32 bytes (2 blocks) using AES-CBC 
  124:             Key       : 0xc286696d887c9aa0611bbb3e2025a45a
  125:             IV        : 0x562e17996d093d28ddb3ba695a2e6f58
  126:             Plaintext : 0x000102030405060708090a0b0c0d0e0f
  127:                           101112131415161718191a1b1c1d1e1f
  128:             Ciphertext: 0xd296cd94c2cccf8a3a863028b5e1dc0a
  129:                           7586602d253cfff91b8266bea6d61ab1
  130:         */
  131:         uint8_t in_data[TEST2_SIZE];
  132:         uint8_t ct[TEST2_SIZE];
  133:         uint8_t enc_data[TEST2_SIZE];
  134:         uint8_t dec_data[TEST2_SIZE];
  135: 
  136:         bigint *in_bi = bi_str_import(bi_ctx,
  137:             "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F");
  138:         bigint *key_bi = bi_str_import(
  139:                 bi_ctx, "C286696D887C9AA0611BBB3E2025A45A");
  140:         bigint *iv_bi = bi_str_import(
  141:                 bi_ctx, "562E17996D093D28DDB3BA695A2E6F58");
  142:         bigint *ct_bi = bi_str_import(bi_ctx,
  143:             "D296CD94C2CCCF8A3A863028B5E1DC0A7586602D253CFFF91B8266BEA6D61AB1");
  144:         bi_export(bi_ctx, in_bi, in_data, TEST2_SIZE);
  145:         bi_export(bi_ctx, key_bi, key, TEST1_SIZE);
  146:         bi_export(bi_ctx, iv_bi, iv, TEST1_SIZE);
  147:         bi_export(bi_ctx, ct_bi, ct, TEST2_SIZE);
  148: 
  149:         AES_set_key(&aes_key, key, iv, AES_MODE_128);
  150:         AES_cbc_encrypt(&aes_key, (const uint8_t *)in_data, 
  151:                 enc_data, sizeof(enc_data));
  152: 
  153:         if (memcmp(enc_data, ct, sizeof(ct)))
  154:         {
  155:             printf("Error: ENCRYPT #2 failed\n");
  156:             goto end;
  157:         }
  158: 
  159:         AES_set_key(&aes_key, key, iv, AES_MODE_128);
  160:         AES_convert_key(&aes_key);
  161:         AES_cbc_decrypt(&aes_key, enc_data, dec_data, sizeof(enc_data));
  162:         if (memcmp(dec_data, in_data, sizeof(dec_data)))
  163:         {
  164:             printf("Error: DECRYPT #2 failed\n");
  165:             goto end;
  166:         }
  167:     }
  168: 
  169:     res = 0;
  170:     printf("All AES tests passed\n");
  171: 
  172: end:
  173:     return res;
  174: }
  175: 
  176: /**************************************************************************
  177:  * RC4 tests 
  178:  *
  179:  * ARC4 tests vectors from OpenSSL (crypto/rc4/rc4test.c)
  180:  **************************************************************************/
  181: static const uint8_t keys[7][30]=
  182: {
  183:     {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef},
  184:     {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef},
  185:     {8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  186:     {4,0xef,0x01,0x23,0x45},
  187:     {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef},
  188:     {4,0xef,0x01,0x23,0x45},
  189: };
  190: 
  191: static const uint8_t data_len[7]={8,8,8,20,28,10};
  192: static uint8_t data[7][30]=
  193: {
  194:     {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xff},
  195:     {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff},
  196:     {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff},
  197:     {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  198:         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  199:         0x00,0x00,0x00,0x00,0xff},
  200:         {0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0,
  201:             0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0,
  202:             0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0,
  203:             0x12,0x34,0x56,0x78,0xff},
  204:             {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff},
  205:             {0},
  206: };
  207: 
  208: static const uint8_t output[7][30]=
  209: {
  210:     {0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96,0x00},
  211:     {0x74,0x94,0xc2,0xe7,0x10,0x4b,0x08,0x79,0x00},
  212:     {0xde,0x18,0x89,0x41,0xa3,0x37,0x5d,0x3a,0x00},
  213:     {0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,
  214:         0xbd,0x61,0x5a,0x11,0x62,0xe1,0xc7,0xba,
  215:         0x36,0xb6,0x78,0x58,0x00},
  216:         {0x66,0xa0,0x94,0x9f,0x8a,0xf7,0xd6,0x89,
  217:             0x1f,0x7f,0x83,0x2b,0xa8,0x33,0xc0,0x0c,
  218:             0x89,0x2e,0xbe,0x30,0x14,0x3c,0xe2,0x87,
  219:             0x40,0x01,0x1e,0xcf,0x00},
  220:             {0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,0xbd,0x61,0x00},
  221:             {0},
  222: };
  223: 
  224: static int RC4_test(BI_CTX *bi_ctx)
  225: {
  226:     int i, res = 1;
  227:     RC4_CTX s;
  228: 
  229:     for (i = 0; i < 6; i++)
  230:     {
  231:         RC4_setup(&s, &keys[i][1], keys[i][0]);
  232:         RC4_crypt(&s, data[i], data[i], data_len[i]);
  233: 
  234:         if (memcmp(data[i], output[i], data_len[i]))
  235:         {
  236:             printf("Error: RC4 CRYPT #%d failed\n", i);
  237:             goto end;
  238:         }
  239:     }
  240: 
  241:     res = 0;
  242:     printf("All RC4 tests passed\n");
  243: 
  244: end:
  245:     return res;
  246: }
  247: 
  248: /**************************************************************************
  249:  * SHA1 tests 
  250:  *
  251:  * Run through a couple of the RFC3174 tests to verify that SHA1 is correct.
  252:  **************************************************************************/
  253: static int SHA1_test(BI_CTX *bi_ctx)
  254: {
  255:     SHA1_CTX ctx;
  256:     uint8_t ct[SHA1_SIZE];
  257:     uint8_t digest[SHA1_SIZE];
  258:     int res = 1;
  259: 
  260:     {
  261:         const char *in_str = "abc";
  262:         bigint *ct_bi = bi_str_import(bi_ctx,
  263:                 "A9993E364706816ABA3E25717850C26C9CD0D89D");
  264:         bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE);
  265: 
  266:         SHA1_Init(&ctx);
  267:         SHA1_Update(&ctx, (const uint8_t *)in_str, strlen(in_str));
  268:         SHA1_Final(digest, &ctx);
  269: 
  270:         if (memcmp(digest, ct, sizeof(ct)))
  271:         {
  272:             printf("Error: SHA1 #1 failed\n");
  273:             goto end;
  274:         }
  275:     }
  276: 
  277:     {
  278:         const char *in_str =
  279:             "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
  280:         bigint *ct_bi = bi_str_import(bi_ctx,
  281:                 "84983E441C3BD26EBAAE4AA1F95129E5E54670F1");
  282:         bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE);
  283: 
  284:         SHA1_Init(&ctx);
  285:         SHA1_Update(&ctx, (const uint8_t *)in_str, strlen(in_str));
  286:         SHA1_Final(digest, &ctx);
  287: 
  288:         if (memcmp(digest, ct, sizeof(ct)))
  289:         {
  290:             printf("Error: SHA1 #2 failed\n");
  291:             goto end;
  292:         }
  293:     }
  294: 
  295:     res = 0;
  296:     printf("All SHA1 tests passed\n");
  297: 
  298: end:
  299:     return res;
  300: }
  301: 
  302: /**************************************************************************
  303:  * MD5 tests 
  304:  *
  305:  * Run through a couple of the RFC1321 tests to verify that MD5 is correct.
  306:  **************************************************************************/
  307: static int MD5_test(BI_CTX *bi_ctx)
  308: {
  309:     MD5_CTX ctx;
  310:     uint8_t ct[MD5_SIZE];
  311:     uint8_t digest[MD5_SIZE];
  312:     int res = 1;
  313: 
  314:     {
  315:         const char *in_str =  "abc";
  316:         bigint *ct_bi = bi_str_import(bi_ctx, 
  317:                 "900150983CD24FB0D6963F7D28E17F72");
  318:         bi_export(bi_ctx, ct_bi, ct, MD5_SIZE);
  319: 
  320:         MD5_Init(&ctx);
  321:         MD5_Update(&ctx, (const uint8_t *)in_str, strlen(in_str));
  322:         MD5_Final(digest, &ctx);
  323: 
  324:         if (memcmp(digest, ct, sizeof(ct)))
  325:         {
  326:             printf("Error: MD5 #1 failed\n");
  327:             goto end;
  328:         }
  329:     }
  330: 
  331:     {
  332:         const char *in_str =
  333:             "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  334:         bigint *ct_bi = bi_str_import(
  335:                 bi_ctx, "D174AB98D277D9F5A5611C2C9F419D9F");
  336:         bi_export(bi_ctx, ct_bi, ct, MD5_SIZE);
  337: 
  338:         MD5_Init(&ctx);
  339:         MD5_Update(&ctx, (const uint8_t *)in_str, strlen(in_str));
  340:         MD5_Final(digest, &ctx);
  341: 
  342:         if (memcmp(digest, ct, sizeof(ct)))
  343:         {
  344:             printf("Error: MD5 #2 failed\n");
  345:             goto end;
  346:         }
  347:     }
  348:     res = 0;
  349:     printf("All MD5 tests passed\n");
  350: 
  351: end:
  352:     return res;
  353: }
  354: 
  355: /**************************************************************************
  356:  * HMAC tests 
  357:  *
  358:  * Run through a couple of the RFC2202 tests to verify that HMAC is correct.
  359:  **************************************************************************/
  360: static int HMAC_test(BI_CTX *bi_ctx)
  361: {
  362:     uint8_t key[SHA1_SIZE];
  363:     uint8_t ct[SHA1_SIZE];
  364:     uint8_t dgst[SHA1_SIZE];
  365:     int res = 1;
  366:     const char *key_str;
  367: 
  368:     const char *data_str = "Hi There";
  369:     bigint *key_bi = bi_str_import(bi_ctx, "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B");
  370:     bigint *ct_bi = bi_str_import(bi_ctx, "9294727A3638BB1C13F48EF8158BFC9D");
  371:     bi_export(bi_ctx, key_bi, key, MD5_SIZE);
  372:     bi_export(bi_ctx, ct_bi, ct, MD5_SIZE);
  373:     hmac_md5((const uint8_t *)data_str, 8, key, MD5_SIZE, dgst);
  374:     if (memcmp(dgst, ct, MD5_SIZE))
  375:     {
  376:         printf("HMAC MD5 #1 failed\n");
  377:         goto end;
  378:     }
  379: 
  380:     data_str = "what do ya want for nothing?";
  381:     key_str = "Jefe";
  382:     ct_bi = bi_str_import(bi_ctx, "750C783E6AB0B503EAA86E310A5DB738");
  383:     bi_export(bi_ctx, ct_bi, ct, MD5_SIZE);
  384:     hmac_md5((const uint8_t *)data_str, 28, (const uint8_t *)key_str, 4, dgst);
  385:     if (memcmp(dgst, ct, MD5_SIZE))
  386:     {
  387:         printf("HMAC MD5 #2 failed\n");
  388:         goto end;
  389:     }
  390:    
  391:     data_str = "Hi There";
  392:     key_bi = bi_str_import(bi_ctx, "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B");
  393:     bi_export(bi_ctx, key_bi, key, SHA1_SIZE);
  394:     ct_bi = bi_str_import(bi_ctx, "B617318655057264E28BC0B6FB378C8EF146BE00");
  395:     bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE);
  396: 
  397:     hmac_sha1((const uint8_t *)data_str, 8, 
  398:             (const uint8_t *)key, SHA1_SIZE, dgst);
  399:     if (memcmp(dgst, ct, SHA1_SIZE))
  400:     {
  401:         printf("HMAC SHA1 #1 failed\n");
  402:         goto end;
  403:     }
  404: 
  405:     data_str = "what do ya want for nothing?";
  406:     key_str = "Jefe";
  407:     ct_bi = bi_str_import(bi_ctx, "EFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79");
  408:     bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE);
  409: 
  410:     hmac_sha1((const uint8_t *)data_str, 28, (const uint8_t *)key_str, 5, dgst);
  411:     if (memcmp(dgst, ct, SHA1_SIZE))
  412:     {
  413:         printf("HMAC SHA1 failed\n");
  414:         exit(1);
  415:     }
  416: 
  417:     res = 0;
  418:     printf("All HMAC tests passed\n");
  419: 
  420: end:
  421:     return res;
  422: }
  423: 
  424: /**************************************************************************
  425:  * BIGINT tests 
  426:  *
  427:  **************************************************************************/
  428: static int BIGINT_test(BI_CTX *ctx)
  429: {
  430:     int res = 1;
  431: 
  432: #ifndef CONFIG_INTEGER_8BIT 
  433: #ifndef CONFIG_INTEGER_16BIT 
  434:     bigint *bi_data, *bi_exp, *bi_res;
  435:     const char *expnt, *plaintext, *mod;
  436:     uint8_t compare[MAX_KEY_BYTE_SIZE];
  437:     /**
  438:      * 512 bit key
  439:      */
  440:     plaintext = /* 64 byte number */
  441:         "01aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee";
  442: 
  443:     mod = "C30773C8ABE09FCC279EE0E5343370DE"
  444:           "8B2FFDB6059271E3005A7CEEF0D35E0A"
  445:           "1F9915D95E63560836CC2EB2C289270D"
  446:           "BCAE8CAF6F5E907FC2759EE220071E1B";
  447: 
  448:     expnt = "A1E556CD1738E10DF539E35101334E97"
  449:           "BE8D391C57A5C89A7AD9A2EA2ACA1B3D"
  450:           "F3140F5091CC535CBAA47CEC4159EE1F"
  451:           "B6A3661AFF1AB758426EAB158452A9B9";
  452: 
  453:     bi_data = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext));
  454:     bi_exp = int_to_bi(ctx, 0x10001);
  455:     bi_set_mod(ctx, bi_str_import(ctx, mod), 0);
  456:     bi_res = bi_mod_power(ctx, bi_data, bi_exp);
  457: 
  458:     bi_data = bi_res;   /* resuse again - see if we get the original */
  459: 
  460:     bi_exp = bi_str_import(ctx, expnt);
  461:     bi_res = bi_mod_power(ctx, bi_data, bi_exp);
  462:     bi_free_mod(ctx, 0);
  463: 
  464:     bi_export(ctx, bi_res, compare, 64);
  465:     if (memcmp(plaintext, compare, 64) != 0)
  466:         goto end;
  467: #endif
  468: #endif
  469: 
  470:     /*
  471:      * Multiply with psssible carry issue (8 bit)
  472:      */
  473:     {
  474:         bigint *bi_x = bi_str_import(ctx, 
  475:                 "AFD5060E224B70DA99EFB385BA5C0D2BEA0AD1DAAA52686E1A02D677BC65C1DA7A496BBDCC02999E8814F10AFC4B8E0DD4E6687E0762CE717A5EA1E452B5C56065C8431F0FB9D23CFF3A4B4149798C0670AF7F9565A0EAE5CF1AB16A1F0C3DD5E485DC5ABB96EBE0B6778A15B7302CBCE358E4BF2E2E30932758AC6EFA9F5828");
  476:         bigint *arg2 = bi_clone(ctx, bi_x);
  477:         bigint *arg3 = bi_clone(ctx, bi_x);
  478:         bigint *sqr_result = bi_square(ctx, bi_x);
  479:         bigint *mlt_result = bi_multiply(ctx, arg2, arg3);
  480: 
  481:         if (bi_compare(sqr_result, mlt_result) != 0)
  482:         {
  483:             bi_print("SQR_RESULT", sqr_result);
  484:             bi_print("MLT_RESULT", mlt_result);
  485:             bi_free(ctx, sqr_result);
  486:             bi_free(ctx, mlt_result);
  487:             goto end;
  488:         }
  489: 
  490:         bi_free(ctx, sqr_result);
  491:         bi_free(ctx, mlt_result);
  492:     }
  493: 
  494:     printf("All BIGINT tests passed\n");
  495:     res = 0;
  496: 
  497: end:
  498:     return res;
  499: }
  500: 
  501: /**************************************************************************
  502:  * RSA tests 
  503:  *
  504:  * Use the results from openssl to verify PKCS1 etc 
  505:  **************************************************************************/
  506: static int RSA_test(void)
  507: {
  508:     int res = 1;
  509:     const char *plaintext = /* 128 byte hex number */
  510:         "1aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee2"
  511:         "1aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeee2\012";
  512:     uint8_t enc_data[128], dec_data[128];
  513:     RSA_CTX *rsa_ctx = NULL;
  514:     BI_CTX *bi_ctx;
  515:     bigint *plaintext_bi;
  516:     bigint *enc_data_bi, *dec_data_bi;
  517:     uint8_t enc_data2[128], dec_data2[128];
  518:     int len; 
  519:     uint8_t *buf;
  520: 
  521:     /* extract the private key elements */
  522:     len = get_file("../ssl/test/axTLS.key_1024", &buf);
  523:     if (asn1_get_private_key(buf, len, &rsa_ctx) < 0)
  524:     {
  525:         goto end;
  526:     }
  527: 
  528:     free(buf);
  529:     bi_ctx = rsa_ctx->bi_ctx;
  530:     plaintext_bi = bi_import(bi_ctx, 
  531:             (const uint8_t *)plaintext, strlen(plaintext));
  532: 
  533:     /* basic rsa encrypt */
  534:     enc_data_bi = RSA_public(rsa_ctx, plaintext_bi);
  535:     bi_export(bi_ctx, bi_copy(enc_data_bi), enc_data, sizeof(enc_data));
  536: 
  537:     /* basic rsa decrypt */
  538:     dec_data_bi = RSA_private(rsa_ctx, enc_data_bi);
  539:     bi_export(bi_ctx, dec_data_bi, dec_data, sizeof(dec_data));
  540: 
  541:     if (memcmp(dec_data, plaintext, strlen(plaintext)))
  542:     {
  543:         printf("Error: DECRYPT #1 failed\n");
  544:         goto end;
  545:     }
  546: 
  547:     RSA_encrypt(rsa_ctx, (const uint8_t *)"abc", 3, enc_data2, 0);
  548:     RSA_decrypt(rsa_ctx, enc_data2, dec_data2, 1);
  549:     if (memcmp("abc", dec_data2, 3))
  550:     {
  551:         printf("Error: ENCRYPT/DECRYPT #2 failed\n");
  552:         goto end;
  553:     }
  554: 
  555:     RSA_free(rsa_ctx);
  556:     res = 0;
  557:     printf("All RSA tests passed\n");
  558: 
  559: end:
  560:     return res;
  561: }
  562: 
  563: /**************************************************************************
  564:  * Cert Testing
  565:  *
  566:  **************************************************************************/
  567: static int cert_tests(void)
  568: {
  569:     int res = -1, len;
  570:     X509_CTX *x509_ctx;
  571:     SSL_CTX *ssl_ctx;
  572:     uint8_t *buf;
  573: 
  574:     /* check a bunch of 3rd party certificates */
  575:     ssl_ctx = ssl_ctx_new(0, 0);
  576:     len = get_file("../ssl/test/microsoft.x509_ca", &buf);
  577:     if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0)
  578:     {
  579:         printf("Cert #1\n");
  580:         ssl_display_error(res);
  581:         goto bad_cert;
  582:     }
  583: 
  584:     ssl_ctx_free(ssl_ctx);
  585:     free(buf);
  586: 
  587:     ssl_ctx = ssl_ctx_new(0, 0);
  588:     len = get_file("../ssl/test/thawte.x509_ca", &buf);
  589:     if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0)
  590:     {
  591:         printf("Cert #2\n");
  592:         ssl_display_error(res);
  593:         goto bad_cert;
  594:     }
  595: 
  596:     ssl_ctx_free(ssl_ctx);
  597:     free(buf);
  598: 
  599:     ssl_ctx = ssl_ctx_new(0, 0);
  600:     len = get_file("../ssl/test/deutsche_telecom.x509_ca", &buf);
  601:     if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0)
  602:     {
  603:         printf("Cert #3\n");
  604:         ssl_display_error(res);
  605:         goto bad_cert;
  606:     }
  607: 
  608:     ssl_ctx_free(ssl_ctx);
  609:     free(buf);
  610: 
  611:     ssl_ctx = ssl_ctx_new(0, 0);
  612:     len = get_file("../ssl/test/equifax.x509_ca", &buf);
  613:     if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0)
  614:     {
  615:         printf("Cert #4\n");
  616:         ssl_display_error(res);
  617:         goto bad_cert;
  618:     }
  619: 
  620:     ssl_ctx_free(ssl_ctx);
  621:     free(buf);
  622: 
  623:     ssl_ctx = ssl_ctx_new(0, 0);
  624:     len = get_file("../ssl/test/gnutls.cer", &buf);
  625:     if ((res = add_cert(ssl_ctx, buf, len)) < 0)
  626:     {
  627:         printf("Cert #5\n");
  628:         ssl_display_error(res);
  629:         goto bad_cert;
  630:     }
  631: 
  632:     ssl_ctx_free(ssl_ctx);
  633:     free(buf);
  634: 
  635:     ssl_ctx = ssl_ctx_new(0, 0);
  636:     len = get_file("../ssl/test/socgen.cer", &buf);
  637:     if ((res = add_cert(ssl_ctx, buf, len)) < 0)
  638:     {
  639:         printf("Cert #6\n");
  640:         ssl_display_error(res);
  641:         goto bad_cert;
  642:     }
  643: 
  644:     ssl_ctx_free(ssl_ctx);
  645:     free(buf);
  646: 
  647:     ssl_ctx = ssl_ctx_new(0, 0);
  648:     len = get_file("../ssl/test/verisign.x509_ca", &buf);
  649:     if ((res = add_cert_auth(ssl_ctx, buf, len)) <0)
  650:     {
  651:         printf("Cert #7\n");
  652:         ssl_display_error(res);
  653:         goto bad_cert;
  654:     }
  655: 
  656:     ssl_ctx_free(ssl_ctx);
  657:     free(buf);
  658: 
  659:     if (get_file("../ssl/test/verisign.x509_my_cert", &buf) < 0 ||
  660:                                     x509_new(buf, &len, &x509_ctx))
  661:     {
  662:         printf("Cert #8\n");
  663:         ssl_display_error(res);
  664:         goto bad_cert;
  665:     }
  666: 
  667:     x509_free(x509_ctx);
  668:     free(buf);
  669: 
  670:     ssl_ctx = ssl_ctx_new(0, 0);
  671:     if ((res = ssl_obj_load(ssl_ctx, 
  672:               SSL_OBJ_X509_CERT, "../ssl/test/ms_iis.cer", NULL)) != SSL_OK)
  673:     {
  674:         ssl_display_error(res);
  675:         goto bad_cert;
  676:     }
  677: 
  678:     ssl_ctx_free(ssl_ctx);
  679: 
  680:     if (get_file("../ssl/test/qualityssl.com.der", &buf) < 0 ||
  681:                                     x509_new(buf, &len, &x509_ctx))
  682:     {
  683:         printf("Cert #9\n");
  684:         res = -1;
  685:         goto bad_cert;
  686:     }
  687: 
  688:     if (strcmp(x509_ctx->subject_alt_dnsnames[1], "qualityssl.com"))
  689:     {
  690:         printf("Cert #9 (2)\n");
  691:         res = -1;
  692:         goto bad_cert;
  693:     }
  694:     x509_free(x509_ctx);
  695:     free(buf);
  696: 
  697:     ssl_ctx = ssl_ctx_new(0, 0);
  698:     if (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CACERT, 
  699:             "../ssl/test/ca-bundle.crt", NULL))
  700:     {
  701:         printf("Cert #10\n");
  702:         goto bad_cert;
  703:     }
  704: 
  705:     ssl_ctx_free(ssl_ctx);
  706:     res = 0;        /* all ok */
  707:     printf("All Certificate tests passed\n");
  708: 
  709: bad_cert:
  710:     if (res)
  711:         printf("Error: A certificate test failed\n");
  712: 
  713:     return res;
  714: }
  715: 
  716: /**
  717:  * init a server socket.
  718:  */
  719: static int server_socket_init(int *port)
  720: {
  721:     struct sockaddr_in serv_addr;
  722:     int server_fd;
  723:     char yes = 1;
  724: 
  725:     /* Create socket for incoming connections */
  726:     if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  727:     {
  728:         return -1;
  729:     }
  730:       
  731:     setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
  732: 
  733: go_again:
  734:     /* Construct local address structure */
  735:     memset(&serv_addr, 0, sizeof(serv_addr));      /* Zero out structure */
  736:     serv_addr.sin_family = AF_INET;                /* Internet address family */
  737:     serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
  738:     serv_addr.sin_port = htons(*port);              /* Local port */
  739: 
  740:     /* Bind to the local address */
  741:     if (bind(server_fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
  742:     {
  743:         (*port)++;
  744:         goto go_again;
  745:     }
  746:     /* Mark the socket so it will listen for incoming connections */
  747:     if (listen(server_fd, 3000) < 0)
  748:     {
  749:         return -1;
  750:     }
  751: 
  752:     return server_fd;
  753: }
  754: 
  755: /**
  756:  * init a client socket.
  757:  */
  758: static int client_socket_init(uint16_t port)
  759: {
  760:     struct sockaddr_in address;
  761:     int client_fd;
  762: 
  763:     address.sin_family = AF_INET;
  764:     address.sin_port = htons(port);
  765:     address.sin_addr.s_addr =  inet_addr("127.0.0.1");
  766:     client_fd = socket(AF_INET, SOCK_STREAM, 0);
  767:     if (connect(client_fd, (struct sockaddr *)&address, sizeof(address)) < 0)
  768:     {
  769:         perror("socket");
  770:         SOCKET_CLOSE(client_fd);
  771:         client_fd = -1;
  772:     }
  773: 
  774:     return client_fd;
  775: }
  776: 
  777: /**************************************************************************
  778:  * SSL Server Testing
  779:  *
  780:  **************************************************************************/
  781: typedef struct
  782: {
  783:     /* not used as yet */
  784:     int dummy;
  785: } SVR_CTX;
  786: 
  787: typedef struct
  788: {
  789:     const char *testname;
  790:     const char *openssl_option;
  791: } client_t;
  792: 
  793: static void do_client(client_t *clnt)
  794: {
  795:     char openssl_buf[2048];
  796:     usleep(200000);           /* allow server to start */
  797: 
  798:     /* show the session ids in the reconnect test */
  799:     if (strcmp(clnt->testname, "Session Reuse") == 0)
  800:     {
  801:         sprintf(openssl_buf, "echo \"hello client\" | openssl s_client -tls1 "
  802:             "-connect localhost:%d %s 2>&1 | grep \"Session-ID:\"", 
  803:             g_port, clnt->openssl_option);
  804:     }
  805:     else if (strstr(clnt->testname, "GNUTLS") == NULL)
  806:     {
  807:         sprintf(openssl_buf, "echo \"hello client\" | openssl s_client -tls1 "
  808: #ifdef WIN32
  809:             "-connect localhost:%d -quiet %s",
  810: #else
  811:             "-connect localhost:%d -quiet %s > /dev/null 2>&1",
  812: #endif
  813:         g_port, clnt->openssl_option);
  814:     }
  815:     else /* gnutls */
  816:     {
  817:         sprintf(openssl_buf, "echo \"hello client\" | gnutls-cli "
  818: #ifdef WIN32
  819:             "-p %d %s 127.0.0.1",
  820: #else
  821:             "-p %d %s 127.0.0.1 > /dev/null 2>&1",
  822: #endif
  823:         g_port, clnt->openssl_option);
  824:     }
  825: 
  826:     system(openssl_buf);
  827: }
  828: 
  829: static int SSL_server_test(
  830:         const char *testname, 
  831:         const char *openssl_option, 
  832:         const char *device_cert, 
  833:         const char *product_cert, 
  834:         const char *private_key,
  835:         const char *ca_cert,
  836:         const char *password,
  837:         int axtls_option)
  838: {
  839:     int server_fd, ret = 0;
  840:     SSL_CTX *ssl_ctx = NULL;
  841:     struct sockaddr_in client_addr;
  842:     uint8_t *read_buf;
  843:     socklen_t clnt_len = sizeof(client_addr);
  844:     client_t client_data;
  845: #ifndef WIN32
  846:     pthread_t thread;
  847: #endif
  848:     g_port++;
  849: 
  850:     client_data.testname = testname;
  851:     client_data.openssl_option = openssl_option;
  852: 
  853:     if ((server_fd = server_socket_init(&g_port)) < 0)
  854:         goto error;
  855: 
  856:     if (private_key)
  857:     {
  858:         axtls_option |= SSL_NO_DEFAULT_KEY;
  859:     }
  860: 
  861:     if ((ssl_ctx = ssl_ctx_new(axtls_option, SSL_DEFAULT_SVR_SESS)) == NULL)
  862:     {
  863:         ret = SSL_ERROR_INVALID_KEY;
  864:         goto error;
  865:     }
  866: 
  867:     if (private_key)
  868:     {
  869:         int obj_type = SSL_OBJ_RSA_KEY;
  870: 
  871:         if (strstr(private_key, ".p8"))
  872:             obj_type = SSL_OBJ_PKCS8;
  873:         else if (strstr(private_key, ".p12"))
  874:             obj_type = SSL_OBJ_PKCS12;
  875: 
  876:         if (ssl_obj_load(ssl_ctx, obj_type, private_key, password))
  877:         {
  878:             ret = SSL_ERROR_INVALID_KEY;
  879:             goto error;
  880:         }
  881:     }
  882: 
  883:     if (device_cert)             /* test chaining */
  884:     {
  885:         if ((ret = ssl_obj_load(ssl_ctx, 
  886:                         SSL_OBJ_X509_CERT, device_cert, NULL)) != SSL_OK)
  887:             goto error;
  888:     }
  889: 
  890:     if (product_cert)             /* test chaining */
  891:     {
  892:         if ((ret = ssl_obj_load(ssl_ctx, 
  893:                         SSL_OBJ_X509_CERT, product_cert, NULL)) != SSL_OK)
  894:             goto error;
  895:     }
  896: 
  897:     if (ca_cert)                  /* test adding certificate authorities */
  898:     {
  899:         if ((ret = ssl_obj_load(ssl_ctx, 
  900:                         SSL_OBJ_X509_CACERT, ca_cert, NULL)) != SSL_OK)
  901:             goto error;
  902:     }
  903: 
  904: #ifndef WIN32
  905:     pthread_create(&thread, NULL, 
  906:                 (void *(*)(void *))do_client, (void *)&client_data);
  907:     pthread_detach(thread);
  908: #else
  909:     CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_client, 
  910:             (LPVOID)&client_data, 0, NULL);
  911: #endif
  912: 
  913:     for (;;)
  914:     {
  915:         int client_fd, size = 0; 
  916:         SSL *ssl;
  917: 
  918:         /* Wait for a client to connect */
  919:         if ((client_fd = accept(server_fd, 
  920:                         (struct sockaddr *)&client_addr, &clnt_len)) < 0)
  921:         {
  922:             ret = SSL_ERROR_SOCK_SETUP_FAILURE;
  923:             goto error;
  924:         }
  925:         
  926:         /* we are ready to go */
  927:         ssl = ssl_server_new(ssl_ctx, client_fd);
  928:         while ((size = ssl_read(ssl, &read_buf)) == SSL_OK);
  929:         SOCKET_CLOSE(client_fd);
  930:         
  931:         if (size == SSL_CLOSE_NOTIFY)
  932:         {
  933:             /* do nothing */ 
  934:         }
  935:         else if (size < SSL_OK) /* got some alert or something nasty */
  936:         {
  937:             ret = size;
  938: 
  939:             if (ret == SSL_ERROR_CONN_LOST)
  940:                 continue;
  941: 
  942:             break;  /* we've got a problem */
  943:         }
  944:         else /* looks more promising */
  945:         {
  946:             if (strstr("hello client", (char *)read_buf) == NULL)
  947:             {
  948:                 printf("SSL server test \"%s\" passed\n", testname);
  949:                 TTY_FLUSH();
  950:                 ret = 0;
  951:                 break;
  952:             }
  953:         }
  954: 
  955:         ssl_free(ssl);
  956:     }
  957: 
  958:     SOCKET_CLOSE(server_fd);
  959: 
  960: error:
  961:     ssl_ctx_free(ssl_ctx);
  962:     return ret;
  963: }
  964: 
  965: int SSL_server_tests(void)
  966: {
  967:     int ret = -1;
  968:     struct stat stat_buf;
  969:     SVR_CTX svr_test_ctx;
  970:     memset(&svr_test_ctx, 0, sizeof(SVR_CTX));
  971: 
  972:     printf("### starting server tests\n"); TTY_FLUSH();
  973: 
  974:     /* Go through the algorithms */
  975: 
  976:     /* 
  977:      * TLS1 client hello 
  978:      */
  979:     if ((ret = SSL_server_test("TLSv1", "-cipher RC4-SHA -tls1", 
  980:                     NULL, NULL, NULL, NULL, NULL, DEFAULT_SVR_OPTION)))
  981:         goto cleanup;
  982: 
  983:     /*
  984:      * AES128-SHA
  985:      */
  986:     if ((ret = SSL_server_test("AES256-SHA", "-cipher AES128-SHA", 
  987:                     DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
  988:                     DEFAULT_SVR_OPTION)))
  989:         goto cleanup;
  990: 
  991:     /*
  992:      * AES256-SHA
  993:      */
  994:     if ((ret = SSL_server_test("AES256-SHA", "-cipher AES128-SHA", 
  995:                     DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
  996:                     DEFAULT_SVR_OPTION)))
  997:         goto cleanup;
  998: 
  999:     /*
 1000:      * RC4-SHA
 1001:      */
 1002:     if ((ret = SSL_server_test("RC4-SHA", "-cipher RC4-SHA", 
 1003:                 DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
 1004:                 DEFAULT_SVR_OPTION)))
 1005:         goto cleanup;
 1006: 
 1007:     /*
 1008:      * RC4-MD5
 1009:      */
 1010:     if ((ret = SSL_server_test("RC4-MD5", "-cipher RC4-MD5", 
 1011:                 DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
 1012:                 DEFAULT_SVR_OPTION)))
 1013:         goto cleanup;
 1014: 
 1015:     /*
 1016:      * Session Reuse
 1017:      * all the session id's should match for session resumption.
 1018:      */
 1019:     if ((ret = SSL_server_test("Session Reuse", 
 1020:                     "-cipher RC4-SHA -reconnect", 
 1021:                     DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
 1022:                     DEFAULT_SVR_OPTION)))
 1023:         goto cleanup;
 1024: 
 1025:     /* 
 1026:      * 512 bit RSA key 
 1027:      */
 1028:     if ((ret = SSL_server_test("512 bit key", 
 1029:                     "-cipher RC4-SHA", 
 1030:                     "../ssl/test/axTLS.x509_512.cer", NULL, 
 1031:                     "../ssl/test/axTLS.key_512",
 1032:                     NULL, NULL, DEFAULT_SVR_OPTION)))
 1033:         goto cleanup;
 1034: 
 1035:     /* 
 1036:      * 1024 bit RSA key (check certificate chaining)
 1037:      */
 1038:     if ((ret = SSL_server_test("1024 bit key", 
 1039:                     "-cipher RC4-SHA",
 1040:                     "../ssl/test/axTLS.x509_1024.cer", NULL, 
 1041:                     "../ssl/test/axTLS.key_1024",
 1042:                     NULL, NULL, DEFAULT_SVR_OPTION)))
 1043:         goto cleanup;
 1044: 
 1045:     /* 
 1046:      * 1042 bit RSA key (check certificate chaining)
 1047:      */
 1048:     if ((ret = SSL_server_test("1042 bit key", 
 1049:                     "-cipher RC4-SHA",
 1050:                     "../ssl/test/axTLS.x509_1042.cer", NULL, 
 1051:                     "../ssl/test/axTLS.key_1042",
 1052:                     NULL, NULL, DEFAULT_SVR_OPTION)))
 1053:         goto cleanup;
 1054:     /* 
 1055:      * 2048 bit RSA key 
 1056:      */
 1057:     if ((ret = SSL_server_test("2048 bit key", 
 1058:                     "-cipher RC4-SHA",
 1059:                     "../ssl/test/axTLS.x509_2048.cer", NULL, 
 1060:                     "../ssl/test/axTLS.key_2048",
 1061:                     NULL, NULL, DEFAULT_SVR_OPTION)))
 1062:         goto cleanup;
 1063: 
 1064:     /* 
 1065:      * 4096 bit RSA key 
 1066:      */
 1067:     if ((ret = SSL_server_test("4096 bit key", 
 1068:                     "-cipher RC4-SHA",
 1069:                     "../ssl/test/axTLS.x509_4096.cer", NULL, 
 1070:                     "../ssl/test/axTLS.key_4096",
 1071:                     NULL, NULL, DEFAULT_SVR_OPTION)))
 1072:         goto cleanup;
 1073: 
 1074:     /* 
 1075:      * Client Verification
 1076:      */
 1077:     if ((ret = SSL_server_test("Client Verification", 
 1078:                     "-cipher RC4-SHA -tls1 "
 1079:                     "-cert ../ssl/test/axTLS.x509_2048.pem "
 1080:                     "-key ../ssl/test/axTLS.key_2048.pem ",
 1081:                     NULL, NULL, NULL, 
 1082:                     "../ssl/test/axTLS.ca_x509.cer", NULL,
 1083:                     DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)))
 1084:         goto cleanup;
 1085: 
 1086:     /* this test should fail */
 1087:     if (stat("../ssl/test/axTLS.x509_bad_before.pem", &stat_buf) >= 0)
 1088:     {
 1089:         if ((ret = SSL_server_test("Error: Bad Before Cert", 
 1090:                     "-cipher RC4-SHA -tls1 "
 1091:                     "-cert ../ssl/test/axTLS.x509_bad_before.pem "
 1092:                     "-key ../ssl/test/axTLS.key_512.pem ",
 1093:                     NULL, NULL, NULL, 
 1094:                     "../ssl/test/axTLS.ca_x509.cer", NULL,
 1095:                     DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) !=
 1096:                             SSL_X509_ERROR(X509_VFY_ERROR_NOT_YET_VALID))
 1097:             goto cleanup;
 1098: 
 1099:         printf("SSL server test \"%s\" passed\n", "Bad Before Cert");
 1100:         TTY_FLUSH();
 1101:     }
 1102: 
 1103:     /* this test should fail */
 1104:     if ((ret = SSL_server_test("Error: Bad After Cert", 
 1105:                     "-cipher RC4-SHA -tls1 "
 1106:                     "-cert ../ssl/test/axTLS.x509_bad_after.pem "
 1107:                     "-key ../ssl/test/axTLS.key_512.pem ",
 1108:                     NULL, NULL, NULL, 
 1109:                     "../ssl/test/axTLS.ca_x509.cer", NULL,
 1110:                     DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) !=
 1111:                             SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED))
 1112:         goto cleanup;
 1113: 
 1114:     printf("SSL server test \"%s\" passed\n", "Bad After Cert");
 1115:     TTY_FLUSH();
 1116: 
 1117:     /*
 1118:      * No trusted cert
 1119:      */
 1120:     if ((ret = SSL_server_test("Error: No trusted certificate", 
 1121:                     "-cipher RC4-SHA -tls1 "
 1122:                     "-cert ../ssl/test/axTLS.x509_512.pem "
 1123:                     "-key ../ssl/test/axTLS.key_512.pem ",
 1124:                     NULL, NULL, NULL, 
 1125:                     NULL, NULL,
 1126:                     DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) !=
 1127:                             SSL_X509_ERROR(X509_VFY_ERROR_NO_TRUSTED_CERT))
 1128:         goto cleanup;
 1129: 
 1130:     printf("SSL server test \"%s\" passed\n", "No trusted certificate");
 1131:     TTY_FLUSH();
 1132: 
 1133:     /*
 1134:      * Self-signed (from the server)
 1135:      */
 1136:     if ((ret = SSL_server_test("Error: Self-signed certificate (from server)", 
 1137:                     "-cipher RC4-SHA -tls1 "
 1138:                     "-cert ../ssl/test/axTLS.x509_512.pem "
 1139:                     "-key ../ssl/test/axTLS.key_512.pem "
 1140:                     "-CAfile ../ssl/test/axTLS.ca_x509.pem ",
 1141:                     NULL, NULL, NULL, 
 1142:                     NULL, NULL,
 1143:                     DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) !=
 1144:                             SSL_X509_ERROR(X509_VFY_ERROR_SELF_SIGNED))
 1145:         goto cleanup;
 1146: 
 1147:     printf("SSL server test \"%s\" passed\n", 
 1148:                             "Self-signed certificate (from server)");
 1149:     TTY_FLUSH();
 1150: 
 1151:     /*
 1152:      * Self-signed (from the client)
 1153:      */
 1154:     if ((ret = SSL_server_test("Self-signed certificate (from client)", 
 1155:                     "-cipher RC4-SHA -tls1 "
 1156:                     "-cert ../ssl/test/axTLS.x509_512.pem "
 1157:                     "-key ../ssl/test/axTLS.key_512.pem ",
 1158:                     NULL, NULL, NULL, 
 1159:                     "../ssl/test/axTLS.ca_x509.cer",
 1160:                     NULL,
 1161:                     DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)))
 1162:         goto cleanup;
 1163: 
 1164:     /* 
 1165:      * Key in PEM format
 1166:      */
 1167:     if ((ret = SSL_server_test("Key in PEM format",
 1168:                     "-cipher RC4-SHA", 
 1169:                     "../ssl/test/axTLS.x509_512.cer", NULL, 
 1170:                     "../ssl/test/axTLS.key_512.pem", NULL,
 1171:                     NULL, DEFAULT_SVR_OPTION)))
 1172:         goto cleanup;
 1173: 
 1174:     /* 
 1175:      * Cert in PEM format
 1176:      */
 1177:     if ((ret = SSL_server_test("Cert in PEM format", 
 1178:                     "-cipher RC4-SHA", 
 1179:                     "../ssl/test/axTLS.x509_512.pem", NULL, 
 1180:                     "../ssl/test/axTLS.key_512.pem", NULL,
 1181:                     NULL, DEFAULT_SVR_OPTION)))
 1182:         goto cleanup;
 1183: 
 1184:     /* 
 1185:      * Cert chain in PEM format
 1186:      */
 1187:     if ((ret = SSL_server_test("Cert chain in PEM format", 
 1188:                     "-cipher RC4-SHA", 
 1189:                     "../ssl/test/axTLS.x509_device.pem", 
 1190:                     NULL, "../ssl/test/axTLS.device_key.pem",
 1191:                     "../ssl/test/axTLS.ca_x509.pem", NULL, DEFAULT_SVR_OPTION)))
 1192:         goto cleanup;
 1193: 
 1194:     /* 
 1195:      * AES128 Encrypted key 
 1196:      */
 1197:     if ((ret = SSL_server_test("AES128 encrypted key", 
 1198:                     "-cipher RC4-SHA", 
 1199:                     "../ssl/test/axTLS.x509_aes128.pem", NULL, 
 1200:                     "../ssl/test/axTLS.key_aes128.pem",
 1201:                     NULL, "abcd", DEFAULT_SVR_OPTION)))
 1202:         goto cleanup;
 1203: 
 1204:     /* 
 1205:      * AES256 Encrypted key 
 1206:      */
 1207:     if ((ret = SSL_server_test("AES256 encrypted key", 
 1208:                     "-cipher RC4-SHA", 
 1209:                     "../ssl/test/axTLS.x509_aes256.pem", NULL, 
 1210:                     "../ssl/test/axTLS.key_aes256.pem",
 1211:                     NULL, "abcd", DEFAULT_SVR_OPTION)))
 1212:         goto cleanup;
 1213: 
 1214:     /* 
 1215:      * AES128 Encrypted invalid key 
 1216:      */
 1217:     if ((ret = SSL_server_test("AES128 encrypted invalid key", 
 1218:                     "-cipher RC4-SHA", 
 1219:                     "../ssl/test/axTLS.x509_aes128.pem", NULL, 
 1220:                     "../ssl/test/axTLS.key_aes128.pem",
 1221:                     NULL, "xyz", DEFAULT_SVR_OPTION)) != SSL_ERROR_INVALID_KEY)
 1222:         goto cleanup;
 1223: 
 1224:     printf("SSL server test \"%s\" passed\n", "AES128 encrypted invalid key");
 1225:     TTY_FLUSH();
 1226: 
 1227:     /*
 1228:      * PKCS#8 key (encrypted)
 1229:      */
 1230:     if ((ret = SSL_server_test("pkcs#8 encrypted", "-cipher RC4-SHA", 
 1231:                 DEFAULT_CERT, NULL, "../ssl/test/axTLS.encrypted.p8", 
 1232:                 NULL, "abcd", DEFAULT_SVR_OPTION)))
 1233:         goto cleanup;
 1234: 
 1235:     /*
 1236:      * PKCS#8 key (unencrypted DER format)
 1237:      */
 1238:     if ((ret = SSL_server_test("pkcs#8 DER unencrypted", "-cipher RC4-SHA", 
 1239:                 DEFAULT_CERT, NULL, "../ssl/test/axTLS.unencrypted.p8", 
 1240:                 NULL, NULL, DEFAULT_SVR_OPTION)))
 1241:         goto cleanup;
 1242: 
 1243:     /*
 1244:      * PKCS#8 key (unencrypted PEM format)
 1245:      */
 1246:     if ((ret = SSL_server_test("pkcs#8 PEM unencrypted", "-cipher RC4-SHA", 
 1247:                 DEFAULT_CERT, NULL, "../ssl/test/axTLS.unencrypted_pem.p8", 
 1248:                 NULL, NULL, DEFAULT_SVR_OPTION)))
 1249:         goto cleanup;
 1250: 
 1251:     /*
 1252:      * PKCS#12 key/certificate
 1253:      */
 1254:     if ((ret = SSL_server_test("pkcs#12 with CA", "-cipher RC4-SHA", 
 1255:                 NULL, NULL, "../ssl/test/axTLS.withCA.p12", 
 1256:                 NULL, "abcd", DEFAULT_SVR_OPTION)))
 1257:         goto cleanup;
 1258: 
 1259:     if ((ret = SSL_server_test("pkcs#12 no CA", "-cipher RC4-SHA", 
 1260:                 DEFAULT_CERT, NULL, "../ssl/test/axTLS.withoutCA.p12", 
 1261:                 NULL, "abcd", DEFAULT_SVR_OPTION)))
 1262:         goto cleanup;
 1263: 
 1264:     /* 
 1265:      * GNUTLS
 1266:      */
 1267:     if ((ret = SSL_server_test("GNUTLS client", 
 1268:                     "",
 1269:                     "../ssl/test/axTLS.x509_1024.cer", NULL, 
 1270:                     "../ssl/test/axTLS.key_1024",
 1271:                     NULL, NULL, DEFAULT_SVR_OPTION)))
 1272:         goto cleanup;
 1273:     ret = 0;
 1274: 
 1275: cleanup:
 1276:     if (ret)
 1277:     {
 1278:         printf("Error: A server test failed\n");
 1279:         ssl_display_error(ret);
 1280:         exit(1);
 1281:     }
 1282:     else
 1283:     {
 1284:         printf("All server tests passed\n"); TTY_FLUSH();
 1285:     }
 1286: 
 1287:     return ret;
 1288: }
 1289: 
 1290: /**************************************************************************
 1291:  * SSL Client Testing
 1292:  *
 1293:  **************************************************************************/
 1294: typedef struct
 1295: {
 1296:     uint8_t session_id[SSL_SESSION_ID_SIZE];
 1297: #ifndef WIN32
 1298:     pthread_t server_thread;
 1299: #endif
 1300:     int start_server;
 1301:     int stop_server;
 1302:     int do_reneg;
 1303: } CLNT_SESSION_RESUME_CTX;
 1304: 
 1305: typedef struct
 1306: {
 1307:     const char *testname;
 1308:     const char *openssl_option;
 1309:     int do_gnutls;
 1310: } server_t;
 1311: 
 1312: static void do_server(server_t *svr)
 1313: {
 1314:     char openssl_buf[2048];
 1315: #ifndef WIN32
 1316:     pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
 1317: #endif
 1318:     if (svr->do_gnutls)
 1319:     {
 1320:         sprintf(openssl_buf, "gnutls-serv " 
 1321:                 "-p %d --quiet %s ", g_port, svr->openssl_option);
 1322:     }
 1323:     else
 1324:     {
 1325:         sprintf(openssl_buf, "openssl s_server -tls1 " 
 1326:                 "-accept %d -quiet %s ", g_port, svr->openssl_option);
 1327:     }
 1328: 
 1329:     system(openssl_buf);
 1330: }
 1331: 
 1332: static int SSL_client_test(
 1333:         const char *test,
 1334:         SSL_CTX **ssl_ctx,
 1335:         const char *openssl_option, 
 1336:         CLNT_SESSION_RESUME_CTX *sess_resume,
 1337:         uint32_t client_options,
 1338:         const char *private_key,
 1339:         const char *password,
 1340:         const char *cert)
 1341: {
 1342:     server_t server_data;
 1343:     SSL *ssl = NULL;
 1344:     int client_fd = -1;
 1345:     uint8_t *session_id = NULL;
 1346:     int ret = 1;
 1347: #ifndef WIN32
 1348:     pthread_t thread;
 1349: #endif
 1350: 
 1351:     server_data.do_gnutls = strstr(test, "GNUTLS") != NULL;
 1352: 
 1353:     if (sess_resume == NULL || sess_resume->start_server)
 1354:     {
 1355:         g_port++;
 1356:         server_data.openssl_option = openssl_option;
 1357: 
 1358: #ifndef WIN32
 1359:         pthread_create(&thread, NULL, 
 1360:                 (void *(*)(void *))do_server, (void *)&server_data);
 1361:         pthread_detach(thread);
 1362: #else
 1363:         CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_server, 
 1364:             (LPVOID)&server_data, 0, NULL);
 1365: #endif
 1366:     }
 1367:     
 1368:     usleep(200000);           /* allow server to start */
 1369: 
 1370:     if (*ssl_ctx == NULL)
 1371:     {
 1372:         if (private_key)
 1373:         {
 1374:             client_options |= SSL_NO_DEFAULT_KEY;
 1375:         }
 1376: 
 1377:         if ((*ssl_ctx = ssl_ctx_new(
 1378:                             client_options, SSL_DEFAULT_CLNT_SESS)) == NULL)
 1379:         {
 1380:             ret = SSL_ERROR_INVALID_KEY;
 1381:             goto client_test_exit;
 1382:         }
 1383: 
 1384:         if (private_key)
 1385:         {
 1386:             int obj_type = SSL_OBJ_RSA_KEY;
 1387: 
 1388:             if (strstr(private_key, ".p8"))
 1389:                 obj_type = SSL_OBJ_PKCS8;
 1390:             else if (strstr(private_key, ".p12"))
 1391:                 obj_type = SSL_OBJ_PKCS12;
 1392: 
 1393:             if (ssl_obj_load(*ssl_ctx, obj_type, private_key, password))
 1394:             {
 1395:                 ret = SSL_ERROR_INVALID_KEY;
 1396:                 goto client_test_exit;
 1397:             }
 1398:         }
 1399: 
 1400:         if (cert)                  
 1401:         {
 1402:             if ((ret = ssl_obj_load(*ssl_ctx, 
 1403:                             SSL_OBJ_X509_CERT, cert, NULL)) != SSL_OK)
 1404:             {
 1405:                 printf("could not add cert %s (%d)\n", cert, ret);
 1406:                 TTY_FLUSH();
 1407:                 goto client_test_exit;
 1408:             }
 1409:         }
 1410: 
 1411:         if (ssl_obj_load(*ssl_ctx, SSL_OBJ_X509_CACERT, 
 1412:                 "../ssl/test/axTLS.ca_x509.cer", NULL))
 1413:         {
 1414:             printf("could not add cert auth\n"); TTY_FLUSH();
 1415:             goto client_test_exit;
 1416:         }
 1417:     }
 1418:     
 1419:     if (sess_resume && !sess_resume->start_server) 
 1420:     {
 1421:         session_id = sess_resume->session_id;
 1422:     }
 1423: 
 1424:     if ((client_fd = client_socket_init(g_port)) < 0)
 1425:     {
 1426:         printf("could not start socket on %d\n", g_port); TTY_FLUSH();
 1427:         goto client_test_exit;
 1428:     }
 1429: 
 1430:     ssl = ssl_client_new(*ssl_ctx, client_fd, session_id, sizeof(session_id));
 1431: 
 1432:     /* check the return status */
 1433:     if ((ret = ssl_handshake_status(ssl)))
 1434:         goto client_test_exit;
 1435: 
 1436:     /* renegotiate client */
 1437:     if (sess_resume && sess_resume->do_reneg) 
 1438:     {
 1439:         if (ssl_renegotiate(ssl) == -SSL_ALERT_NO_RENEGOTIATION) 
 1440:             ret = 0;
 1441:         else
 1442:             ret = -SSL_ALERT_NO_RENEGOTIATION;
 1443: 
 1444:         goto client_test_exit;
 1445:     }
 1446: 
 1447:     if (sess_resume)
 1448:     {
 1449:         memcpy(sess_resume->session_id, 
 1450:                 ssl_get_session_id(ssl), SSL_SESSION_ID_SIZE);
 1451:     }
 1452: 
 1453:     if (IS_SET_SSL_FLAG(SSL_SERVER_VERIFY_LATER) && 
 1454:                                             (ret = ssl_verify_cert(ssl)))
 1455:     {
 1456:         goto client_test_exit;
 1457:     }
 1458: 
 1459:     ssl_write(ssl, (uint8_t *)"hello world\n", 13);
 1460:     if (sess_resume)
 1461:     {
 1462:         const uint8_t *sess_id = ssl_get_session_id(ssl);
 1463:         int i;
 1464: 
 1465:         printf("    Session-ID: ");
 1466:         for (i = 0; i < SSL_SESSION_ID_SIZE; i++)
 1467:         {
 1468:             printf("%02X", sess_id[i]);
 1469:         }
 1470:         printf("\n");
 1471:         TTY_FLUSH();
 1472:     }
 1473: 
 1474:     ret = 0;
 1475: 
 1476: client_test_exit:
 1477:     ssl_free(ssl);
 1478:     SOCKET_CLOSE(client_fd);
 1479:     usleep(200000);           /* allow openssl to say something */
 1480: 
 1481:     if (sess_resume)
 1482:     {
 1483:         if (sess_resume->stop_server)
 1484:         {
 1485:             ssl_ctx_free(*ssl_ctx);
 1486:             *ssl_ctx = NULL;
 1487:         }
 1488:         else if (sess_resume->start_server)
 1489:         {
 1490: #ifndef WIN32
 1491:            sess_resume->server_thread = thread;
 1492: #endif
 1493:         }
 1494:     }
 1495:     else
 1496:     {
 1497:         ssl_ctx_free(*ssl_ctx);
 1498:         *ssl_ctx = NULL;
 1499:     }
 1500: 
 1501:     if (ret == 0)
 1502:     {
 1503:         printf("SSL client test \"%s\" passed\n", test);
 1504:         TTY_FLUSH();
 1505:     }
 1506: 
 1507:     return ret;
 1508: }
 1509: 
 1510: int SSL_client_tests(void)
 1511: {
 1512:     int ret =  -1;
 1513:     SSL_CTX *ssl_ctx = NULL;
 1514:     CLNT_SESSION_RESUME_CTX sess_resume;
 1515:     memset(&sess_resume, 0, sizeof(CLNT_SESSION_RESUME_CTX));
 1516: 
 1517:     sess_resume.start_server = 1;
 1518:     printf("### starting client tests\n");
 1519:    
 1520:     if ((ret = SSL_client_test("512 bit key", 
 1521:                     &ssl_ctx,
 1522:                     "-cert ../ssl/test/axTLS.x509_512.pem "
 1523:                     "-key ../ssl/test/axTLS.key_512.pem", &sess_resume, 
 1524:                     DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
 1525:         goto cleanup;
 1526: 
 1527:     /* all the session id's should match for session resumption */
 1528:     sess_resume.start_server = 0;
 1529:     if ((ret = SSL_client_test("Client session resumption #1", 
 1530:                     &ssl_ctx, NULL, &sess_resume, 
 1531:                     DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
 1532:         goto cleanup;
 1533: 
 1534:     // no client renegotiation
 1535:     sess_resume.do_reneg = 1;
 1536:     // test relies on openssl killing the call
 1537:     if ((ret = SSL_client_test("Client renegotiation", 
 1538:                     &ssl_ctx, NULL, &sess_resume, 
 1539:                     DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
 1540:         goto cleanup;
 1541:     sess_resume.do_reneg = 0;
 1542: 
 1543:     sess_resume.stop_server = 1;
 1544:     if ((ret = SSL_client_test("Client session resumption #2", 
 1545:                     &ssl_ctx, NULL, &sess_resume, 
 1546:                     DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
 1547:         goto cleanup;
 1548: 
 1549:     if ((ret = SSL_client_test("1024 bit key", 
 1550:                     &ssl_ctx,
 1551:                     "-cert ../ssl/test/axTLS.x509_1024.pem "
 1552:                     "-key ../ssl/test/axTLS.key_1024.pem", NULL,
 1553:                     DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
 1554:         goto cleanup;
 1555: 
 1556:     if ((ret = SSL_client_test("2048 bit key", 
 1557:                     &ssl_ctx,
 1558:                     "-cert ../ssl/test/axTLS.x509_2048.pem "
 1559:                     "-key ../ssl/test/axTLS.key_2048.pem",  NULL,
 1560:                     DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
 1561:         goto cleanup;
 1562: 
 1563:     if ((ret = SSL_client_test("4096 bit key", 
 1564:                     &ssl_ctx,
 1565:                     "-cert ../ssl/test/axTLS.x509_4096.pem "
 1566:                     "-key ../ssl/test/axTLS.key_4096.pem", NULL,
 1567:                     DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
 1568:         goto cleanup;
 1569: 
 1570:     if ((ret = SSL_client_test("Server cert chaining", 
 1571:                     &ssl_ctx,
 1572:                     "-cert ../ssl/test/axTLS.x509_device.pem "
 1573:                     "-key ../ssl/test/axTLS.device_key.pem "
 1574:                     "-CAfile ../ssl/test/axTLS.x509_512.pem ", NULL,
 1575:                     DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
 1576:         goto cleanup;
 1577: 
 1578:     /* Check the server can verify the client */
 1579:     if ((ret = SSL_client_test("Client peer authentication",
 1580:                     &ssl_ctx,
 1581:                     "-cert ../ssl/test/axTLS.x509_2048.pem "
 1582:                     "-key ../ssl/test/axTLS.key_2048.pem "
 1583:                     "-CAfile ../ssl/test/axTLS.ca_x509.pem "
 1584:                     "-verify 1 ", NULL, DEFAULT_CLNT_OPTION, 
 1585:                     "../ssl/test/axTLS.key_1024", NULL,
 1586:                     "../ssl/test/axTLS.x509_1024.cer")))
 1587:         goto cleanup;
 1588: 
 1589:     /* Should get an "ERROR" from openssl (as the handshake fails as soon as
 1590:      * the certificate verification fails) */
 1591:     if ((ret = SSL_client_test("Error: Expired cert (verify now)",
 1592:                     &ssl_ctx,
 1593:                     "-cert ../ssl/test/axTLS.x509_bad_after.pem "
 1594:                     "-key ../ssl/test/axTLS.key_512.pem", NULL,
 1595:                     DEFAULT_CLNT_OPTION, NULL, NULL, NULL)) != 
 1596:                             SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED))
 1597:     {
 1598:         printf("*** Error: %d\n", ret);
 1599:         goto cleanup;
 1600:     }
 1601: 
 1602:     printf("SSL client test \"Expired cert (verify now)\" passed\n");
 1603: 
 1604:     /* There is no "ERROR" from openssl */
 1605:     if ((ret = SSL_client_test("Error: Expired cert (verify later)", 
 1606:                     &ssl_ctx,
 1607:                     "-cert ../ssl/test/axTLS.x509_bad_after.pem "
 1608:                     "-key ../ssl/test/axTLS.key_512.pem", NULL,
 1609:                     DEFAULT_CLNT_OPTION|SSL_SERVER_VERIFY_LATER, NULL, 
 1610:                     NULL, NULL)) != SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED))
 1611:     {
 1612:         printf("*** Error: %d\n", ret); TTY_FLUSH();
 1613:         goto cleanup;
 1614:     }
 1615: 
 1616:     printf("SSL client test \"Expired cert (verify later)\" passed\n");
 1617: 
 1618:     /* invalid cert type */
 1619:     if ((ret = SSL_client_test("Error: Invalid certificate type", 
 1620:                     &ssl_ctx,
 1621:                     "-cert ../ssl/test/axTLS.x509_2048.pem "
 1622:                     "-key ../ssl/test/axTLS.key_2048.pem "
 1623:                     "-CAfile ../ssl/test/axTLS.ca_x509.pem "
 1624:                     "-verify 1 ", NULL, DEFAULT_CLNT_OPTION, 
 1625:                     "../ssl/test/axTLS.x509_1024.cer", NULL,
 1626:                     "../ssl/test/axTLS.x509_1024.cer")) 
 1627:                             != SSL_ERROR_INVALID_KEY)
 1628:     {
 1629:         printf("*** Error: %d\n", ret); TTY_FLUSH();
 1630:         goto cleanup;
 1631:     }
 1632: 
 1633:     printf("SSL client test \"Invalid certificate type\" passed\n");
 1634: 
 1635:     if ((ret = SSL_client_test("GNUTLS client", 
 1636:                     &ssl_ctx,
 1637:                     "--x509certfile ../ssl/test/axTLS.x509_1024.pem "
 1638:                     "--x509keyfile ../ssl/test/axTLS.key_1024.pem -q", NULL,
 1639:                     DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
 1640:         goto cleanup;
 1641: 
 1642:     ret = 0;
 1643: 
 1644: cleanup:
 1645:     if (ret)
 1646:     {
 1647:         ssl_display_error(ret);
 1648:         printf("Error: A client test failed\n");
 1649:         system("sh ../ssl/test/killopenssl.sh");
 1650:         system("sh ../ssl/test/killgnutls.sh");
 1651:         exit(1);
 1652:     }
 1653:     else
 1654:     {
 1655:         printf("All client tests passed\n"); TTY_FLUSH();
 1656:     }
 1657: 
 1658:     ssl_ctx_free(ssl_ctx);
 1659:     return ret;
 1660: }
 1661: 
 1662: /**************************************************************************
 1663:  * SSL Basic Testing (test a big packet handshake)
 1664:  *
 1665:  **************************************************************************/
 1666: static uint8_t basic_buf[256*1024];
 1667: 
 1668: static void do_basic(void)
 1669: {
 1670:     int client_fd;
 1671:     SSL *ssl_clnt;
 1672:     SSL_CTX *ssl_clnt_ctx = ssl_ctx_new(
 1673:                             DEFAULT_CLNT_OPTION, SSL_DEFAULT_CLNT_SESS);
 1674:     usleep(200000);           /* allow server to start */
 1675: 
 1676:     if ((client_fd = client_socket_init(g_port)) < 0)
 1677:         goto error;
 1678: 
 1679:     if (ssl_obj_load(ssl_clnt_ctx, SSL_OBJ_X509_CACERT, 
 1680:                                         "../ssl/test/axTLS.ca_x509.cer", NULL))
 1681:         goto error;
 1682: 
 1683:     ssl_clnt = ssl_client_new(ssl_clnt_ctx, client_fd, NULL, 0);
 1684: 
 1685:     /* check the return status */
 1686:     if (ssl_handshake_status(ssl_clnt) < 0)
 1687:     {
 1688:         ssl_display_error(ssl_handshake_status(ssl_clnt));
 1689:         goto error;
 1690:     }
 1691: 
 1692:     ssl_write(ssl_clnt, basic_buf, sizeof(basic_buf));
 1693:     ssl_free(ssl_clnt);
 1694: 
 1695: error:
 1696:     ssl_ctx_free(ssl_clnt_ctx);
 1697:     SOCKET_CLOSE(client_fd);
 1698: 
 1699:     /* exit this thread */
 1700: }
 1701: 
 1702: static int SSL_basic_test(void)
 1703: {
 1704:     int server_fd, client_fd, ret = 0, size = 0, offset = 0;
 1705:     SSL_CTX *ssl_svr_ctx = NULL;
 1706:     struct sockaddr_in client_addr;
 1707:     uint8_t *read_buf;
 1708:     socklen_t clnt_len = sizeof(client_addr);
 1709:     SSL *ssl_svr;
 1710: #ifndef WIN32
 1711:     pthread_t thread;
 1712: #endif
 1713:     memset(basic_buf, 0xA5, sizeof(basic_buf)/2);
 1714:     memset(&basic_buf[sizeof(basic_buf)/2], 0x5A, sizeof(basic_buf)/2);
 1715: 
 1716:     if ((server_fd = server_socket_init(&g_port)) < 0)
 1717:         goto error;
 1718: 
 1719:     ssl_svr_ctx = ssl_ctx_new(DEFAULT_SVR_OPTION, SSL_DEFAULT_SVR_SESS);
 1720: 
 1721: #ifndef WIN32
 1722:     pthread_create(&thread, NULL, 
 1723:                 (void *(*)(void *))do_basic, NULL);
 1724:     pthread_detach(thread);
 1725: #else
 1726:     CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_basic, NULL, 0, NULL);
 1727: #endif
 1728: 
 1729:     /* Wait for a client to connect */
 1730:     if ((client_fd = accept(server_fd, 
 1731:                     (struct sockaddr *) &client_addr, &clnt_len)) < 0)
 1732:     {
 1733:         ret = SSL_ERROR_SOCK_SETUP_FAILURE;
 1734:         goto error;
 1735:     }
 1736:     
 1737:     /* we are ready to go */
 1738:     ssl_svr = ssl_server_new(ssl_svr_ctx, client_fd);
 1739:     
 1740:     do
 1741:     {
 1742:         while ((size = ssl_read(ssl_svr, &read_buf)) == SSL_OK);
 1743: 
 1744:         if (size < SSL_OK) /* got some alert or something nasty */
 1745:         {
 1746:             ssl_display_error(size);
 1747:             ret = size;
 1748:             break;
 1749:         }
 1750:         else /* looks more promising */
 1751:         {
 1752:             if (memcmp(read_buf, &basic_buf[offset], size) != 0)
 1753:             {
 1754:                 ret = SSL_NOT_OK;
 1755:                 break;
 1756:             }
 1757:         }
 1758: 
 1759:         offset += size;
 1760:     } while (offset < sizeof(basic_buf));
 1761: 
 1762:     printf(ret == SSL_OK && offset == sizeof(basic_buf) ? 
 1763:                             "SSL basic test passed\n" :
 1764:                             "SSL basic test failed\n");
 1765:     TTY_FLUSH();
 1766: 
 1767:     ssl_free(ssl_svr);
 1768:     SOCKET_CLOSE(server_fd);
 1769:     SOCKET_CLOSE(client_fd);
 1770: 
 1771: error:
 1772:     ssl_ctx_free(ssl_svr_ctx);
 1773:     return ret;
 1774: }
 1775: 
 1776: /**************************************************************************
 1777:  * SSL unblocked case
 1778:  *
 1779:  **************************************************************************/
 1780: static void do_unblocked(void)
 1781: {
 1782:     int client_fd;
 1783:     SSL *ssl_clnt;
 1784:     SSL_CTX *ssl_clnt_ctx = ssl_ctx_new(
 1785:                             DEFAULT_CLNT_OPTION, 
 1786:                             SSL_DEFAULT_CLNT_SESS |
 1787:                             SSL_CONNECT_IN_PARTS);
 1788:     usleep(200000);           /* allow server to start */
 1789: 
 1790:     if ((client_fd = client_socket_init(g_port)) < 0)
 1791:         goto error;
 1792: 
 1793:     {
 1794: #ifdef WIN32
 1795:         u_long argp = 1;
 1796:         ioctlsocket(client_fd, FIONBIO, &argp);
 1797: #else
 1798:         int flags = fcntl(client_fd, F_GETFL, NULL);
 1799:         fcntl(client_fd, F_SETFL, flags | O_NONBLOCK);
 1800: #endif
 1801:     }
 1802: 
 1803:     if (ssl_obj_load(ssl_clnt_ctx, SSL_OBJ_X509_CACERT, 
 1804:                                         "../ssl/test/axTLS.ca_x509.cer", NULL))
 1805:         goto error;
 1806: 
 1807:     ssl_clnt = ssl_client_new(ssl_clnt_ctx, client_fd, NULL, 0);
 1808: 
 1809:     while (ssl_handshake_status(ssl_clnt) != SSL_OK)
 1810:     {
 1811:         if (ssl_read(ssl_clnt, NULL) < 0)
 1812:         {
 1813:             ssl_display_error(ssl_handshake_status(ssl_clnt));
 1814:             goto error;
 1815:         }
 1816:     }
 1817: 
 1818:     ssl_write(ssl_clnt, basic_buf, sizeof(basic_buf));
 1819:     ssl_free(ssl_clnt);
 1820: 
 1821: error:
 1822:     ssl_ctx_free(ssl_clnt_ctx);
 1823:     SOCKET_CLOSE(client_fd);
 1824: 
 1825:     /* exit this thread */
 1826: }
 1827: 
 1828: static int SSL_unblocked_test(void)
 1829: {
 1830:     int server_fd, client_fd, ret = 0, size = 0, offset = 0;
 1831:     SSL_CTX *ssl_svr_ctx = NULL;
 1832:     struct sockaddr_in client_addr;
 1833:     uint8_t *read_buf;
 1834:     socklen_t clnt_len = sizeof(client_addr);
 1835:     SSL *ssl_svr;
 1836: #ifndef WIN32
 1837:     pthread_t thread;
 1838: #endif
 1839:     memset(basic_buf, 0xA5, sizeof(basic_buf)/2);
 1840:     memset(&basic_buf[sizeof(basic_buf)/2], 0x5A, sizeof(basic_buf)/2);
 1841: 
 1842:     if ((server_fd = server_socket_init(&g_port)) < 0)
 1843:         goto error;
 1844: 
 1845:     ssl_svr_ctx = ssl_ctx_new(DEFAULT_SVR_OPTION, SSL_DEFAULT_SVR_SESS);
 1846: 
 1847: #ifndef WIN32
 1848:     pthread_create(&thread, NULL, 
 1849:                 (void *(*)(void *))do_unblocked, NULL);
 1850:     pthread_detach(thread);
 1851: #else
 1852:     CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_unblocked, 
 1853:                         NULL, 0, NULL);
 1854: #endif
 1855: 
 1856:     /* Wait for a client to connect */
 1857:     if ((client_fd = accept(server_fd, 
 1858:                     (struct sockaddr *) &client_addr, &clnt_len)) < 0)
 1859:     {
 1860:         ret = SSL_ERROR_SOCK_SETUP_FAILURE;
 1861:         goto error;
 1862:     }
 1863:     
 1864:     /* we are ready to go */
 1865:     ssl_svr = ssl_server_new(ssl_svr_ctx, client_fd);
 1866:     
 1867:     do
 1868:     {
 1869:         while ((size = ssl_read(ssl_svr, &read_buf)) == SSL_OK);
 1870: 
 1871:         if (size < SSL_OK) /* got some alert or something nasty */
 1872:         {
 1873:             ssl_display_error(size);
 1874:             ret = size;
 1875:             break;
 1876:         }
 1877:         else /* looks more promising */
 1878:         {
 1879:             if (memcmp(read_buf, &basic_buf[offset], size) != 0)
 1880:             {
 1881:                 ret = SSL_NOT_OK;
 1882:                 break;
 1883:             }
 1884:         }
 1885: 
 1886:         offset += size;
 1887:     } while (offset < sizeof(basic_buf));
 1888: 
 1889:     printf(ret == SSL_OK && offset == sizeof(basic_buf) ? 
 1890:                             "SSL unblocked test passed\n" :
 1891:                             "SSL unblocked test failed\n");
 1892:     TTY_FLUSH();
 1893: 
 1894:     ssl_free(ssl_svr);
 1895:     SOCKET_CLOSE(server_fd);
 1896:     SOCKET_CLOSE(client_fd);
 1897: 
 1898: error:
 1899:     ssl_ctx_free(ssl_svr_ctx);
 1900:     return ret;
 1901: }
 1902: 
 1903: #if !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING)
 1904: /**************************************************************************
 1905:  * Multi-Threading Tests
 1906:  *
 1907:  **************************************************************************/
 1908: #define NUM_THREADS         100
 1909: 
 1910: typedef struct
 1911: {
 1912:     SSL_CTX *ssl_clnt_ctx;
 1913:     int port;
 1914:     int thread_id;
 1915: } multi_t;
 1916: 
 1917: void do_multi_clnt(multi_t *multi_data)
 1918: {
 1919:     int res = 1, client_fd, i;
 1920:     SSL *ssl = NULL;
 1921:     char tmp[5];
 1922: 
 1923:     if ((client_fd = client_socket_init(multi_data->port)) < 0)
 1924:         goto client_test_exit;
 1925: 
 1926:     usleep(200000);
 1927:     ssl = ssl_client_new(multi_data->ssl_clnt_ctx, client_fd, NULL, 0);
 1928: 
 1929:     if ((res = ssl_handshake_status(ssl)))
 1930:     {
 1931:         printf("Client ");
 1932:         ssl_display_error(res);
 1933:         goto client_test_exit;
 1934:     }
 1935: 
 1936:     sprintf(tmp, "%d\n", multi_data->thread_id);
 1937:     for (i = 0; i < 10; i++)
 1938:         ssl_write(ssl, (uint8_t *)tmp, strlen(tmp)+1);
 1939: 
 1940: client_test_exit:
 1941:     ssl_free(ssl);
 1942:     SOCKET_CLOSE(client_fd);
 1943:     free(multi_data);
 1944: }
 1945: 
 1946: void do_multi_svr(SSL *ssl)
 1947: {
 1948:     uint8_t *read_buf;
 1949:     int *res_ptr = malloc(sizeof(int));
 1950:     int res;
 1951: 
 1952:     for (;;)
 1953:     {
 1954:         res = ssl_read(ssl, &read_buf);
 1955: 
 1956:         /* kill the client */
 1957:         if (res != SSL_OK)
 1958:         {
 1959:             if (res == SSL_ERROR_CONN_LOST)
 1960:             {
 1961:                 SOCKET_CLOSE(ssl->client_fd);
 1962:                 ssl_free(ssl);
 1963:                 break;
 1964:             }
 1965:             else if (res > 0)
 1966:             {
 1967:                 /* do nothing */
 1968:             }
 1969:             else /* some problem */
 1970:             {
 1971:                 printf("Server ");
 1972:                 ssl_display_error(res);
 1973:                 goto error;
 1974:             }
 1975:         }
 1976:     }
 1977: 
 1978:     res = SSL_OK;
 1979: error:
 1980:     *res_ptr = res;
 1981:     pthread_exit(res_ptr);
 1982: }
 1983: 
 1984: int multi_thread_test(void)
 1985: {
 1986:     int server_fd = -1;
 1987:     SSL_CTX *ssl_server_ctx;
 1988:     SSL_CTX *ssl_clnt_ctx;
 1989:     pthread_t clnt_threads[NUM_THREADS];
 1990:     pthread_t svr_threads[NUM_THREADS];
 1991:     int i, res = 0;
 1992:     struct sockaddr_in client_addr;
 1993:     socklen_t clnt_len = sizeof(client_addr);
 1994: 
 1995:     printf("Do multi-threading test (takes a minute)\n");
 1996: 
 1997:     ssl_server_ctx = ssl_ctx_new(DEFAULT_SVR_OPTION, SSL_DEFAULT_SVR_SESS);
 1998:     ssl_clnt_ctx = ssl_ctx_new(DEFAULT_CLNT_OPTION, SSL_DEFAULT_CLNT_SESS);
 1999: 
 2000:     if (ssl_obj_load(ssl_clnt_ctx, SSL_OBJ_X509_CACERT, 
 2001:                                         "../ssl/test/axTLS.ca_x509.cer", NULL))
 2002:         goto error;
 2003: 
 2004:     if ((server_fd = server_socket_init(&g_port)) < 0)
 2005:         goto error;
 2006: 
 2007:     for (i = 0; i < NUM_THREADS; i++)
 2008:     {
 2009:         multi_t *multi_data = (multi_t *)malloc(sizeof(multi_t));
 2010:         multi_data->ssl_clnt_ctx = ssl_clnt_ctx;
 2011:         multi_data->port = g_port;
 2012:         multi_data->thread_id = i+1;
 2013:         pthread_create(&clnt_threads[i], NULL, 
 2014:                 (void *(*)(void *))do_multi_clnt, (void *)multi_data);
 2015:         pthread_detach(clnt_threads[i]);
 2016:     }
 2017: 
 2018:     for (i = 0; i < NUM_THREADS; i++)
 2019:     { 
 2020:         SSL *ssl_svr;
 2021:         int client_fd = accept(server_fd, 
 2022:                       (struct sockaddr *)&client_addr, &clnt_len);
 2023: 
 2024:         if (client_fd < 0)
 2025:             goto error;
 2026: 
 2027:         ssl_svr = ssl_server_new(ssl_server_ctx, client_fd);
 2028: 
 2029:         pthread_create(&svr_threads[i], NULL, 
 2030:                         (void *(*)(void *))do_multi_svr, (void *)ssl_svr);
 2031:     }
 2032: 
 2033:     /* make sure we've run all of the threads */
 2034:     for (i = 0; i < NUM_THREADS; i++)
 2035:     {
 2036:         void *thread_res;
 2037:         pthread_join(svr_threads[i], &thread_res);
 2038: 
 2039:         if (*((int *)thread_res) != 0)
 2040:             res = 1;
 2041: 
 2042:         free(thread_res);
 2043:     } 
 2044: 
 2045:     if (res) 
 2046:         goto error;
 2047: 
 2048:     printf("Multi-thread test passed (%d)\n", NUM_THREADS);
 2049: error:
 2050:     ssl_ctx_free(ssl_server_ctx);
 2051:     ssl_ctx_free(ssl_clnt_ctx);
 2052:     SOCKET_CLOSE(server_fd);
 2053:     return res;
 2054: }
 2055: #endif /* !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING) */ 
 2056: 
 2057: /**************************************************************************
 2058:  * Header issue
 2059:  *
 2060:  **************************************************************************/
 2061: static void do_header_issue(void)
 2062: {
 2063:     char axtls_buf[2048];
 2064: #ifndef WIN32
 2065:     pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
 2066: #endif
 2067:     sprintf(axtls_buf, "./axssl s_client -connect localhost:%d", g_port);
 2068:     system(axtls_buf);
 2069: }
 2070: 
 2071: static int header_issue(void)
 2072: {
 2073:     FILE *f = fopen("../ssl/test/header_issue.dat", "r");
 2074:     int server_fd = -1, client_fd = -1, ret = 1;
 2075:     uint8_t buf[2048];
 2076:     int size = 0;
 2077:     struct sockaddr_in client_addr;
 2078:     socklen_t clnt_len = sizeof(client_addr);
 2079: #ifndef WIN32
 2080:     pthread_t thread;
 2081: #endif
 2082: 
 2083:     if (f == NULL || (server_fd = server_socket_init(&g_port)) < 0)
 2084:         goto error;
 2085: 
 2086: #ifndef WIN32
 2087:     pthread_create(&thread, NULL, 
 2088:                 (void *(*)(void *))do_header_issue, NULL);
 2089:     pthread_detach(thread);
 2090: #else
 2091:     CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_header_issue, 
 2092:                 NULL, 0, NULL);
 2093: #endif
 2094:     if ((client_fd = accept(server_fd, 
 2095:                     (struct sockaddr *) &client_addr, &clnt_len)) < 0)
 2096:     {
 2097:         ret = SSL_ERROR_SOCK_SETUP_FAILURE;
 2098:         goto error;
 2099:     }
 2100: 
 2101:     size = fread(buf, 1, sizeof(buf), f);
 2102:     SOCKET_WRITE(client_fd, buf, size);
 2103:     usleep(200000);
 2104: 
 2105:     ret = 0;
 2106: error:
 2107:     fclose(f);
 2108:     SOCKET_CLOSE(client_fd);
 2109:     SOCKET_CLOSE(server_fd);
 2110:     TTY_FLUSH();
 2111:     system("killall axssl");
 2112:     return ret;
 2113: }
 2114: 
 2115: /**************************************************************************
 2116:  * main()
 2117:  *
 2118:  **************************************************************************/
 2119: int main(int argc, char *argv[])
 2120: {
 2121:     int ret = 1;
 2122:     BI_CTX *bi_ctx;
 2123:     int fd;
 2124: 
 2125: #ifdef WIN32
 2126:     WSADATA wsaData;
 2127:     WORD wVersionRequested = MAKEWORD(2, 2);
 2128:     WSAStartup(wVersionRequested, &wsaData);
 2129:     fd = _open("test_result.txt", O_WRONLY|O_TEMPORARY|O_CREAT, _S_IWRITE);
 2130:     dup2(fd, 2);                        /* write stderr to this file */
 2131: #else
 2132:     fd = open("/dev/null", O_WRONLY);   /* write stderr to /dev/null */
 2133:     signal(SIGPIPE, SIG_IGN);           /* ignore pipe errors */
 2134:     dup2(fd, 2);
 2135: #endif
 2136: 
 2137:     /* can't do testing in this mode */
 2138: #if defined CONFIG_SSL_GENERATE_X509_CERT
 2139:     printf("Error: Must compile with default key/certificates\n");
 2140:     exit(1);
 2141: #endif
 2142: 
 2143:     bi_ctx = bi_initialize();
 2144: 
 2145:     if (AES_test(bi_ctx))
 2146:     {
 2147:         printf("AES tests failed\n");
 2148:         goto cleanup;
 2149:     }
 2150:     TTY_FLUSH();
 2151: 
 2152:     if (RC4_test(bi_ctx))
 2153:     {
 2154:         printf("RC4 tests failed\n");
 2155:         goto cleanup;
 2156:     }
 2157:     TTY_FLUSH();
 2158: 
 2159:     if (MD5_test(bi_ctx))
 2160:     {
 2161:         printf("MD5 tests failed\n");
 2162:         goto cleanup;
 2163:     }
 2164:     TTY_FLUSH();
 2165: 
 2166:     if (SHA1_test(bi_ctx))
 2167:     {
 2168:         printf("SHA1 tests failed\n");
 2169:         goto cleanup;
 2170:     }
 2171:     TTY_FLUSH();
 2172: 
 2173:     if (HMAC_test(bi_ctx))
 2174:     {
 2175:         printf("HMAC tests failed\n");
 2176:         goto cleanup;
 2177:     }
 2178:     TTY_FLUSH();
 2179: 
 2180:     if (BIGINT_test(bi_ctx))
 2181:     {
 2182:         printf("BigInt tests failed!\n");
 2183:         goto cleanup;
 2184:     }
 2185:     TTY_FLUSH();
 2186: 
 2187:     bi_terminate(bi_ctx);
 2188: 
 2189:     if (RSA_test())
 2190:     {
 2191:         printf("RSA tests failed\n");
 2192:         goto cleanup;
 2193:     }
 2194:     TTY_FLUSH();
 2195: 
 2196:     if (cert_tests())
 2197:     {
 2198:         printf("CERT tests failed\n");
 2199:         goto cleanup;
 2200:     }
 2201:     TTY_FLUSH();
 2202: 
 2203: #if !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING)
 2204:     if (multi_thread_test())
 2205:         goto cleanup;
 2206: #endif
 2207: 
 2208:     if (SSL_basic_test())
 2209:         goto cleanup;
 2210: 
 2211:     system("sh ../ssl/test/killopenssl.sh");
 2212: 
 2213:     if (SSL_unblocked_test())
 2214:         goto cleanup;
 2215: 
 2216:     system("sh ../ssl/test/killopenssl.sh");
 2217: 
 2218:     if (SSL_client_tests())
 2219:         goto cleanup;
 2220: 
 2221:     system("sh ../ssl/test/killopenssl.sh");
 2222:     system("sh ../ssl/test/killgnutls.sh");
 2223: 
 2224:     if (SSL_server_tests())
 2225:         goto cleanup;
 2226: 
 2227:     system("sh ../ssl/test/killopenssl.sh");
 2228: 
 2229:     if (header_issue())
 2230:     {
 2231:         printf("Header tests failed\n"); TTY_FLUSH();
 2232:         goto cleanup;
 2233:     }
 2234: 
 2235:     ret = 0;        /* all ok */
 2236:     printf("**** ALL TESTS PASSED ****\n"); TTY_FLUSH();
 2237: cleanup:
 2238: 
 2239:     if (ret)
 2240:         printf("Error: Some tests failed!\n");
 2241: 
 2242:     close(fd);
 2243:     return ret;
 2244: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>