This is SSLSocket.m in view mode; [Download] [Up]
#import <foundation/foundation.h> #import <stdio.h> #import <ansi/string.h> #import <ssl/err.h> #import "SSLSocket.h" #import "CTXHandler.h" extern void OmniLog(NSString *format, ...); @implementation SSLSocket #ifdef DEBUG void _PrintSSLError() { unsigned long l; char buf[200]; while ((l = ERR_get_error())) OmniLog(@"%s", ERR_error_string(l, buf)); } int _verify_callback(int ok, X509 *xs, X509 *xi, int depth, int error) { char *name; name = X509_NAME_oneline(X509_get_subject_name(xs)); if (name == NULL) { _PrintSSLError(); return(0); } OmniLog(@"depth = %d %s", depth, name); free(name); if (error == VERIFY_ERR_UNABLE_TO_GET_ISSUER) { name = X509_NAME_oneline(X509_get_issuer_name(xs)); if (name == NULL) { OmniLog(@"verify error"); _PrintSSLError(); return(0); } OmniLog(@"issuer = %s", name); free(name); return(ok); } if (!ok) { OmniLog(@"verify error: num = %d:%s", error, X509_cert_verify_error_string(error)); } OmniLog(@"verify return: %d", ok); return(ok); } #endif + (SSLSocket *)sslSocket; { return (SSLSocket *)[SSLSocket socket]; } - (void)dealloc; { if (_sslHandle != NULL) { SSL_free(_sslHandle); _sslHandle = NULL; } if (_ctxHandler != nil) { [_ctxHandler release]; _ctxHandler = nil; } [super dealloc]; } - (int)readBytes:(unsigned int)byteCount intoBuffer:(char *)aBuffer; { int bytesRead; bytesRead = SSL_read(_sslHandle, aBuffer, byteCount); if (bytesRead == -1) [NSException raise:@"SocketReadFailed" format:@"Unable to read from socket: %s", strerror(cthread_errno())]; return bytesRead; } - (int)writeBytes:(unsigned int)byteCount fromBuffer:(const char *)aBuffer; { int bytesWritten; bytesWritten = SSL_write(_sslHandle, (char *)aBuffer, byteCount); if (bytesWritten == -1) [NSException raise:@"SocketWriteFailed" format:@"Unable to write to socket: %s", strerror(cthread_errno())]; return bytesWritten; } - (void)connectToAddress:(OmniHostAddress *)hostAddress port:(int)port; { [super connectToAddress:hostAddress port:port]; // Get the CTX-Structure and do some initialization // for the SSLeay-lib. The CTX-Structure is shared by // all SSLSocket-Instances. _ctxHandler = [[CTXHandler sharedCTXHandler] retain]; if (_ctxHandler == nil) { [NSException raise:@"CTXFailure" format:@"SSLSocket: Unable to get CTX-Structure"]; } // Get the SSL-Handle which is different // for each Instance of SSLSocket _sslHandle = SSL_new([_ctxHandler ctx]); SSL_set_fd(_sslHandle, socketFD); #ifdef DEBUG SSL_set_verify(_sslHandle, SSL_VERIFY_NONE, _verify_callback); #else SSL_set_verify(_sslHandle, SSL_VERIFY_NONE, NULL); #endif if (!SSL_connect(_sslHandle)) { [NSException raise:@"ConnectFailed" format:@"SSLSocket: Unable to ssl_connect to remote host (errno = %d): %s %s.", cthread_errno(), ERR_func_error_string(ERR_peek_error()), ERR_reason_error_string(ERR_peek_error())]; } } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.