Annotation of embedaddon/axTLS/ssl/test/ssltest.c, revision 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>