~ubuntu-branches/ubuntu/precise/mysql-5.1/precise

« back to all changes in this revision

Viewing changes to extra/yassl/examples/client/client.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Norbert Tretkowski
  • Date: 2010-03-17 14:56:02 UTC
  • Revision ID: james.westby@ubuntu.com-20100317145602-x7e30l1b2sb5s6w6
Tags: upstream-5.1.45
ImportĀ upstreamĀ versionĀ 5.1.45

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* client.cpp  */
 
2
 
 
3
#include "../../testsuite/test.hpp"
 
4
 
 
5
//#define TEST_RESUME
 
6
 
 
7
 
 
8
void ClientError(SSL_CTX* ctx, SSL* ssl, SOCKET_T& sockfd, const char* msg)
 
9
{
 
10
    SSL_CTX_free(ctx);
 
11
    SSL_free(ssl);
 
12
    tcp_close(sockfd);
 
13
    err_sys(msg);
 
14
}
 
15
 
 
16
 
 
17
#ifdef NON_BLOCKING
 
18
    void NonBlockingSSL_Connect(SSL* ssl, SSL_CTX* ctx, SOCKET_T& sockfd)
 
19
    {
 
20
        int ret = SSL_connect(ssl);
 
21
        while (ret =! SSL_SUCCESS && SSL_get_error(ssl, 0) ==
 
22
                                     SSL_ERROR_WANT_READ) {
 
23
            printf("... client would block\n");
 
24
            #ifdef _WIN32
 
25
                Sleep(1000);
 
26
            #else
 
27
                sleep(1);
 
28
            #endif
 
29
            ret = SSL_connect(ssl);
 
30
        }
 
31
        if (ret != SSL_SUCCESS)
 
32
            ClientError(ctx, ssl, sockfd, "SSL_connect failed");
 
33
    }
 
34
#endif
 
35
 
 
36
 
 
37
void client_test(void* args)
 
38
{
 
39
#ifdef _WIN32
 
40
    WSADATA wsd;
 
41
    WSAStartup(0x0002, &wsd);
 
42
#endif
 
43
 
 
44
    SOCKET_T sockfd = 0;
 
45
    int      argc = 0;
 
46
    char**   argv = 0;
 
47
 
 
48
    set_args(argc, argv, *static_cast<func_args*>(args));
 
49
    tcp_connect(sockfd);
 
50
#ifdef NON_BLOCKING
 
51
    tcp_set_nonblocking(sockfd);
 
52
#endif
 
53
 
 
54
    SSL_METHOD* method = TLSv1_client_method();
 
55
    SSL_CTX*    ctx = SSL_CTX_new(method);
 
56
 
 
57
    set_certs(ctx);
 
58
    SSL* ssl = SSL_new(ctx);
 
59
 
 
60
    SSL_set_fd(ssl, sockfd);
 
61
 
 
62
 
 
63
#ifdef NON_BLOCKING
 
64
    NonBlockingSSL_Connect(ssl, ctx, sockfd);
 
65
#else
 
66
    if (SSL_connect(ssl) != SSL_SUCCESS)
 
67
        ClientError(ctx, ssl, sockfd, "SSL_connect failed");
 
68
#endif
 
69
    showPeer(ssl);
 
70
 
 
71
    const char* cipher = 0;
 
72
    int index = 0;
 
73
    char list[1024];
 
74
    strncpy(list, "cipherlist", 11);
 
75
    while ( (cipher = SSL_get_cipher_list(ssl, index++)) ) {
 
76
        strncat(list, ":", 2);
 
77
        strncat(list, cipher, strlen(cipher) + 1);
 
78
    }
 
79
    printf("%s\n", list);
 
80
    printf("Using Cipher Suite: %s\n", SSL_get_cipher(ssl));
 
81
 
 
82
    char msg[] = "hello yassl!";
 
83
    if (SSL_write(ssl, msg, sizeof(msg)) != sizeof(msg))
 
84
        ClientError(ctx, ssl, sockfd, "SSL_write failed");
 
85
 
 
86
    char reply[1024];
 
87
    int input = SSL_read(ssl, reply, sizeof(reply));
 
88
    if (input > 0) {
 
89
        reply[input] = 0;
 
90
    printf("Server response: %s\n", reply);
 
91
    }
 
92
 
 
93
#ifdef TEST_RESUME
 
94
    SSL_SESSION* session   = SSL_get_session(ssl);
 
95
    SSL*         sslResume = SSL_new(ctx);
 
96
#endif
 
97
 
 
98
    SSL_shutdown(ssl);
 
99
    SSL_free(ssl);
 
100
    tcp_close(sockfd);
 
101
 
 
102
#ifdef TEST_RESUME
 
103
    tcp_connect(sockfd);
 
104
    SSL_set_fd(sslResume, sockfd);
 
105
    SSL_set_session(sslResume, session);
 
106
    
 
107
    if (SSL_connect(sslResume) != SSL_SUCCESS)
 
108
        ClientError(ctx, sslResume, sockfd, "SSL_resume failed");
 
109
    showPeer(sslResume);
 
110
  
 
111
    if (SSL_write(sslResume, msg, sizeof(msg)) != sizeof(msg))
 
112
        ClientError(ctx, sslResume, sockfd, "SSL_write failed");
 
113
 
 
114
    input = SSL_read(sslResume, reply, sizeof(reply));
 
115
    if (input > 0) {
 
116
        reply[input] = 0;
 
117
    printf("Server response: %s\n", reply);
 
118
    }
 
119
 
 
120
    SSL_shutdown(sslResume);
 
121
    SSL_free(sslResume);
 
122
    tcp_close(sockfd);
 
123
#endif // TEST_RESUME
 
124
 
 
125
    SSL_CTX_free(ctx);
 
126
    ((func_args*)args)->return_code = 0;
 
127
}
 
128
 
 
129
 
 
130
#ifndef NO_MAIN_DRIVER
 
131
 
 
132
    int main(int argc, char** argv)
 
133
    {
 
134
        func_args args;
 
135
 
 
136
        args.argc = argc;
 
137
        args.argv = argv;
 
138
 
 
139
        client_test(&args);
 
140
        yaSSL_CleanUp();
 
141
 
 
142
        return args.return_code;
 
143
    }
 
144
 
 
145
#endif // NO_MAIN_DRIVER
 
146