Logo Search packages:      
Sourcecode: openssl version File versions  Download package

GetHTTPS.cpp

/*
 *    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();
}

Generated by  Doxygen 1.6.0   Back to index