2 * An demo illustrating how to retrieve a URI from a secure HTTP server.
5 * Date: September 7, 1999
6 * Comments: This relies heavily on my MacSockets library.
7 * This project is also set up so that it expects the OpenSSL source folder (0.9.4 as I write this)
8 * to live in a folder called "OpenSSL-0.9.4" in this project's parent folder. For example:
13 * (OpenSSL sources here)
15 * (OpenSSL example junk here)
18 * Also-- before attempting to compile this, make sure the aliases in "OpenSSL-0.9.4:include:openssl"
19 * are installed! Use the AppleScript applet in the "openssl-0.9.4" folder to do this!
21 /* modified to seed the PRNG */
22 /* modified to use CRandomizer for seeding */
25 // Include some funky libs I've developed over time
27 #include "CPStringUtils.hpp"
28 #include "ErrorHandling.hpp"
29 #include "MacSocket.h"
30 #include "Randomizer.h"
32 // We use the OpenSSL implementation of SSL....
33 // This was a lot of work to finally get going, though you wouldn't know it by the results!
35 #include <openssl/ssl.h>
36 #include <openssl/err.h>
40 // Let's try grabbing some data from here:
42 #define kHTTPS_DNS "www.apache-ssl.org"
43 #define kHTTPS_Port 443
44 #define kHTTPS_URI "/"
47 // Forward-declare this
49 OSErr
MyMacSocket_IdleWaitCallback(void *inUserRefPtr
);
51 // My idle-wait callback. Doesn't do much, does it? Silly cooperative multitasking.
53 OSErr
MyMacSocket_IdleWaitCallback(void *inUserRefPtr
)
55 #pragma unused(inUserRefPtr)
58 ::EventAvail(everyEvent
,&theEvent
);
60 CRandomizer
*randomizer
= (CRandomizer
*)inUserRefPtr
;
62 randomizer
->PeriodicAction();
76 SSL_CTX
*ssl_ctx
= nil
;
80 UnsignedWide microTickCount
;
83 CRandomizer randomizer
;
85 printf("OpenSSL Demo by Roy Wood, roy@centricsystems.ca\n\n");
87 BailIfError(errCode
= MacSocket_Startup());
91 // Create a socket-like object
93 BailIfError(errCode
= MacSocket_socket(&theSocket
,false,theTimeout
* 60,MyMacSocket_IdleWaitCallback
,&randomizer
));
96 // Set up the connect string and try to connect
98 CopyCStrAndInsertCStrLongIntIntoCStr("%s:%ld",kHTTPS_DNS
,kHTTPS_Port
,tempString
,sizeof(tempString
));
100 printf("Connecting to %s....\n",tempString
);
102 BailIfError(errCode
= MacSocket_connect(theSocket
,tempString
));
107 SSL_load_error_strings();
109 SSLeay_add_ssl_algorithms();
112 // Pick the SSL method
114 // ssl_ctx = SSL_CTX_new(SSLv2_client_method());
115 ssl_ctx
= SSL_CTX_new(SSLv23_client_method());
116 // ssl_ctx = SSL_CTX_new(SSLv3_client_method());
119 // Create an SSL thingey and try to negotiate the connection
121 ssl
= SSL_new(ssl_ctx
);
123 SSL_set_fd(ssl
,theSocket
);
125 errCode
= SSL_connect(ssl
);
129 SetErrorMessageAndLongIntAndBail("OpenSSL: Can't initiate SSL connection, SSL_connect() = ",errCode
);
132 // Request the URI from the host
134 CopyCStrToCStr("GET ",tempString
,sizeof(tempString
));
135 ConcatCStrToCStr(kHTTPS_URI
,tempString
,sizeof(tempString
));
136 ConcatCStrToCStr(" HTTP/1.0\r\n\r\n",tempString
,sizeof(tempString
));
139 errCode
= SSL_write(ssl
,tempString
,CStrLength(tempString
));
143 SetErrorMessageAndLongIntAndBail("OpenSSL: Error writing data via ssl, SSL_write() = ",errCode
);
149 char tempString
[256];
153 // Read some bytes and dump them to the console
155 bytesRead
= SSL_read(ssl
,tempString
,sizeof(tempString
) - 1);
157 if (bytesRead
== 0 && MacSocket_RemoteEndIsClosing(theSocket
))
162 else if (bytesRead
< 0)
164 SetErrorMessageAndLongIntAndBail("OpenSSL: Error reading data via ssl, SSL_read() = ",bytesRead
);
168 tempString
[bytesRead
] = '\0';
170 printf("%s", tempString
);
182 // Clean up and go home
186 MacSocket_close(theSocket
);
196 SSL_CTX_free(ssl_ctx
);
200 if (errCode
!= noErr
)
202 printf("An error occurred:\n");
204 printf("%s",GetErrorMessage());
208 MacSocket_Shutdown();