| /* | |
| * An demo illustrating how to retrieve a URI from a secure HTTP server. | |
| * | |
| * Author: Roy Wood | |
| * Date: September 7, 1999 | |
| * Comments: This relies heavily on my MacSockets library. | |
| * This project is also set up so that it expects the OpenSSL source folder (0.9.4 as I write this) | |
| * to live in a folder called "OpenSSL-0.9.4" in this project's parent folder. For example: | |
| * | |
| * Macintosh HD: | |
| * Development: | |
| * OpenSSL-0.9.4: | |
| * (OpenSSL sources here) | |
| * OpenSSL Example: | |
| * (OpenSSL example junk here) | |
| * | |
| * | |
| * Also-- before attempting to compile this, make sure the aliases in "OpenSSL-0.9.4:include:openssl" | |
| * are installed! Use the AppleScript applet in the "openssl-0.9.4" folder to do this! | |
| */ | |
| /* modified to seed the PRNG */ | |
| /* modified to use CRandomizer for seeding */ | |
| // Include some funky libs I've developed over time | |
| #include "CPStringUtils.hpp" | |
| #include "ErrorHandling.hpp" | |
| #include "MacSocket.h" | |
| #include "Randomizer.h" | |
| // We use the OpenSSL implementation of SSL.... | |
| // This was a lot of work to finally get going, though you wouldn't know it by the results! | |
| #include <openssl/ssl.h> | |
| #include <openssl/err.h> | |
| #include <timer.h> | |
| // Let's try grabbing some data from here: | |
| #define kHTTPS_DNS "www.apache-ssl.org" | |
| #define kHTTPS_Port 443 | |
| #define kHTTPS_URI "/" | |
| // Forward-declare this | |
| OSErr MyMacSocket_IdleWaitCallback(void *inUserRefPtr); | |
| // My idle-wait callback. Doesn't do much, does it? Silly cooperative multitasking. | |
| OSErr MyMacSocket_IdleWaitCallback(void *inUserRefPtr) | |
| { | |
| #pragma unused(inUserRefPtr) | |
| EventRecord theEvent; | |
| ::EventAvail(everyEvent,&theEvent); | |
| CRandomizer *randomizer = (CRandomizer*)inUserRefPtr; | |
| if (randomizer) | |
| randomizer->PeriodicAction(); | |
| return(noErr); | |
| } | |
| // Finally! | |
| void main(void) | |
| { | |
| OSErr errCode; | |
| int theSocket = -1; | |
| int theTimeout = 30; | |
| SSL_CTX *ssl_ctx = nil; | |
| SSL *ssl = nil; | |
| char tempString[256]; | |
| UnsignedWide microTickCount; | |
| CRandomizer randomizer; | |
| printf("OpenSSL Demo by Roy Wood, roy@centricsystems.ca\n\n"); | |
| BailIfError(errCode = MacSocket_Startup()); | |
| // Create a socket-like object | |
| BailIfError(errCode = MacSocket_socket(&theSocket,false,theTimeout * 60,MyMacSocket_IdleWaitCallback,&randomizer)); | |
| // Set up the connect string and try to connect | |
| CopyCStrAndInsertCStrLongIntIntoCStr("%s:%ld",kHTTPS_DNS,kHTTPS_Port,tempString,sizeof(tempString)); | |
| printf("Connecting to %s....\n",tempString); | |
| BailIfError(errCode = MacSocket_connect(theSocket,tempString)); | |
| // Init SSL stuff | |
| SSL_load_error_strings(); | |
| SSLeay_add_ssl_algorithms(); | |
| // Pick the SSL method | |
| // ssl_ctx = SSL_CTX_new(SSLv2_client_method()); | |
| ssl_ctx = SSL_CTX_new(SSLv23_client_method()); | |
| // ssl_ctx = SSL_CTX_new(SSLv3_client_method()); | |
| // Create an SSL thingey and try to negotiate the connection | |
| ssl = SSL_new(ssl_ctx); | |
| SSL_set_fd(ssl,theSocket); | |
| errCode = SSL_connect(ssl); | |
| if (errCode < 0) | |
| { | |
| SetErrorMessageAndLongIntAndBail("OpenSSL: Can't initiate SSL connection, SSL_connect() = ",errCode); | |
| } | |
| // Request the URI from the host | |
| CopyCStrToCStr("GET ",tempString,sizeof(tempString)); | |
| ConcatCStrToCStr(kHTTPS_URI,tempString,sizeof(tempString)); | |
| ConcatCStrToCStr(" HTTP/1.0\r\n\r\n",tempString,sizeof(tempString)); | |
| errCode = SSL_write(ssl,tempString,CStrLength(tempString)); | |
| if (errCode < 0) | |
| { | |
| SetErrorMessageAndLongIntAndBail("OpenSSL: Error writing data via ssl, SSL_write() = ",errCode); | |
| } | |
| for (;;) | |
| { | |
| char tempString[256]; | |
| int bytesRead; | |
| // Read some bytes and dump them to the console | |
| bytesRead = SSL_read(ssl,tempString,sizeof(tempString) - 1); | |
| if (bytesRead == 0 && MacSocket_RemoteEndIsClosing(theSocket)) | |
| { | |
| break; | |
| } | |
| else if (bytesRead < 0) | |
| { | |
| SetErrorMessageAndLongIntAndBail("OpenSSL: Error reading data via ssl, SSL_read() = ",bytesRead); | |
| } | |
| tempString[bytesRead] = '\0'; | |
| printf("%s", tempString); | |
| } | |
| printf("\n\n\n"); | |
| // All done! | |
| errCode = noErr; | |
| EXITPOINT: | |
| // Clean up and go home | |
| if (theSocket >= 0) | |
| { | |
| MacSocket_close(theSocket); | |
| } | |
| if (ssl != nil) | |
| { | |
| SSL_free(ssl); | |
| } | |
| if (ssl_ctx != nil) | |
| { | |
| SSL_CTX_free(ssl_ctx); | |
| } | |
| if (errCode != noErr) | |
| { | |
| printf("An error occurred:\n"); | |
| printf("%s",GetErrorMessage()); | |
| } | |
| MacSocket_Shutdown(); | |
| } |