Annotation of embedaddon/axTLS/ssl/test/ssltest.c, revision 1.1.1.1

1.1       misho       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>