forsyth20121205-174063a80cc13 years agoHistory
5557 lines · 137.4 KB · Brainfuck
RawDownload
## SSL 3.0 protocol #implement SSL3; include "sys.m";					sys					: Sys; include "keyring.m";					keyring					: Keyring;	IPint, DigestState			: import keyring; include "security.m";					random					: Random;	ssl					: SSL; include "daytime.m";					daytime					: Daytime; include "asn1.m";	asn1					: ASN1; include "pkcs.m";	pkcs					: PKCS;	DHParams, DHPublicKey, DHPrivateKey, 	RSAParams, RSAKey, 	DSSPrivateKey, DSSPublicKey		: import PKCS; include "x509.m";	x509					: X509;	Signed,	Certificate, SubjectPKInfo	: import x509; include "sslsession.m";	sslsession				: SSLsession;	Session					: import sslsession; include "ssl3.m"; ## debug mode#SSL_DEBUG					: con 0;logfd						: ref Sys->FD; ## version {major, minor}#SSL_VERSION_2_0					:= array [] of {byte 0, byte 16r02};SSL_VERSION_3_0					:= array [] of {byte 16r03, byte 0};  # SSL Record Protocol SSL_CHANGE_CIPHER_SPEC 				: con 20;	SSL_ALERT				: con 21;	SSL_HANDSHAKE 				: con 22;	SSL_APPLICATION_DATA 			: con 23;	SSL_V2HANDSHAKE				: con 0; # escape to sslv2 # SSL Application Protocol consists of alert protocol, change cipher spec protocol# v2 and v3 handshake protocol and application data protocol. The v2 handshake# protocol is included only for backward compatibility Protocol: adt {	pick {	pAlert =>		alert				: ref Alert;	pChangeCipherSpec =>		change_cipher_spec		: ref ChangeCipherSpec;	pHandshake =>		handshake			: ref Handshake;	pV2Handshake =>		handshake			: ref V2Handshake;	pApplicationData =>		data				: array of byte;	} 	decode: fn(r: ref Record, ctx: ref Context): (ref Protocol, string);	encode: fn(p: self ref Protocol, vers: array of byte): (ref Record, string);	tostring: fn(p: self ref Protocol): string;}; ## ssl alert protocol#SSL_WARNING	 				: con 1; 	SSL_FATAL				: con 2; SSL_CLOSE_NOTIFY				: con 0;	SSL_UNEXPECTED_MESSAGE			: con 10;	SSL_BAD_RECORD_MAC			: con 20;	SSL_DECOMPRESSION_FAILURE		: con 30;	SSL_HANDSHAKE_FAILURE 			: con 40;	SSL_NO_CERTIFICATE			: con 41;	SSL_BAD_CERTIFICATE 			: con 42;	SSL_UNSUPPORTED_CERTIFICATE 		: con 43;	SSL_CERTIFICATE_REVOKED			: con 44;	SSL_CERTIFICATE_EXPIRED			: con 45;	SSL_CERTIFICATE_UNKNOWN			: con 46;	SSL_ILLEGAL_PARAMETER 			: con 47; Alert: adt {	level 					: int; 	description 				: int;		tostring: fn(a: self ref Alert): string;}; ## ssl change cipher spec protocol#ChangeCipherSpec: adt {	value					: int;}; ## ssl handshake protocol#SSL_HANDSHAKE_HELLO_REQUEST	 		: con 0; 	SSL_HANDSHAKE_CLIENT_HELLO 		: con 1; 	SSL_HANDSHAKE_SERVER_HELLO 		: con 2;	SSL_HANDSHAKE_CERTIFICATE 		: con 11;	SSL_HANDSHAKE_SERVER_KEY_EXCHANGE 	: con 12;	SSL_HANDSHAKE_CERTIFICATE_REQUEST 	: con 13; 	SSL_HANDSHAKE_SERVER_HELLO_DONE 	: con 14;	SSL_HANDSHAKE_CERTIFICATE_VERIFY 	: con 15; 	SSL_HANDSHAKE_CLIENT_KEY_EXCHANGE 	: con 16;	SSL_HANDSHAKE_FINISHED	 		: con 20;  Handshake: adt {	pick {       	HelloRequest =>				        ClientHello =>		version 			: array of byte; # [2]		random 				: array of byte; # [32]		session_id 			: array of byte; # <0..32>		suites	 			: array of byte; # [2] x		compressions			: array of byte; # [1] x        ServerHello =>		version 			: array of byte; # [2]		random 				: array of byte; # [32]		session_id 			: array of byte; # <0..32>		suite	 			: array of byte; # [2]		compression			: byte; # [1]	Certificate =>		cert_list 			: list of array of byte; # X509 cert chain	ServerKeyExchange =>		xkey				: array of byte; # exchange_keys        CertificateRequest =>		cert_types 			: array of byte;		dn_list 			: list of array of byte; # DN list	ServerHelloDone =>        CertificateVerify =>		signature			: array of byte;        ClientKeyExchange =>		xkey				: array of byte;       	Finished =>		md5_hash			: array of byte; # [16] Keyring->MD5dlen		sha_hash 			: array of byte; # [20] Keyring->SHA1dlen	} 	decode: fn(buf: array of byte): (ref Handshake, string);	encode: fn(hm: self ref Handshake): (array of byte, string);	tostring: fn(hm: self ref Handshake): string;}; # cipher suites and cipher specs (default, not all supported)#	- key exchange, signature, encrypt and digest algorithms SSL3_Suites := array [] of {	NULL_WITH_NULL_NULL => 			array [] of {byte 0, byte 16r00}, 	RSA_WITH_NULL_MD5 => 			array [] of {byte 0, byte 16r01},	RSA_WITH_NULL_SHA => 			array [] of {byte 0, byte 16r02},	RSA_EXPORT_WITH_RC4_40_MD5 => 		array [] of {byte 0, byte 16r03},	RSA_WITH_RC4_128_MD5 => 		array [] of {byte 0, byte 16r04},	RSA_WITH_RC4_128_SHA => 		array [] of {byte 0, byte 16r05},	RSA_EXPORT_WITH_RC2_CBC_40_MD5 => 	array [] of {byte 0, byte 16r06},	RSA_WITH_IDEA_CBC_SHA => 		array [] of {byte 0, byte 16r07},	RSA_EXPORT_WITH_DES40_CBC_SHA => 	array [] of {byte 0, byte 16r08},	RSA_WITH_DES_CBC_SHA => 		array [] of {byte 0, byte 16r09},	RSA_WITH_3DES_EDE_CBC_SHA => 		array [] of {byte 0, byte 16r0A}, 	DH_DSS_EXPORT_WITH_DES40_CBC_SHA => 	array [] of {byte 0, byte 16r0B},	DH_DSS_WITH_DES_CBC_SHA => 		array [] of {byte 0, byte 16r0C},	DH_DSS_WITH_3DES_EDE_CBC_SHA => 	array [] of {byte 0, byte 16r0D},	DH_RSA_EXPORT_WITH_DES40_CBC_SHA => 	array [] of {byte 0, byte 16r0E},	DH_RSA_WITH_DES_CBC_SHA => 		array [] of {byte 0, byte 16r0F},	DH_RSA_WITH_3DES_EDE_CBC_SHA => 	array [] of {byte 0, byte 16r10},	DHE_DSS_EXPORT_WITH_DES40_CBC_SHA =>	array [] of {byte 0, byte 16r11},	DHE_DSS_WITH_DES_CBC_SHA => 		array [] of {byte 0, byte 16r12},	DHE_DSS_WITH_3DES_EDE_CBC_SHA => 	array [] of {byte 0, byte 16r13},	DHE_RSA_EXPORT_WITH_DES40_CBC_SHA =>	array [] of {byte 0, byte 16r14},	DHE_RSA_WITH_DES_CBC_SHA => 		array [] of {byte 0, byte 16r15},	DHE_RSA_WITH_3DES_EDE_CBC_SHA => 	array [] of {byte 0, byte 16r16}, 	DH_anon_EXPORT_WITH_RC4_40_MD5 => 	array [] of {byte 0, byte 16r17},	DH_anon_WITH_RC4_128_MD5 => 		array [] of {byte 0, byte 16r18},	DH_anon_EXPORT_WITH_DES40_CBC_SHA =>	array [] of {byte 0, byte 16r19},	DH_anon_WITH_DES_CBC_SHA => 		array [] of {byte 0, byte 16r1A},	DH_anon_WITH_3DES_EDE_CBC_SHA => 	array [] of {byte 0, byte 16r1B}, 	FORTEZZA_KEA_WITH_NULL_SHA => 		array [] of {byte 0, byte 16r1C},	FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA =>	array [] of {byte 0, byte 16r1D},	FORTEZZA_KEA_WITH_RC4_128_SHA => 	array [] of {byte 0, byte 16r1E},}; ## key exchange algorithms#DHmodlen					: con 512; # default length  ## certificate types#SSL_RSA_sign 					: con 1;	SSL_DSS_sign 				: con 2;	SSL_RSA_fixed_DH			: con 3;	SSL_DSS_fixed_DH			: con 4;	SSL_RSA_emhemeral_DH 			: con 5;	SSL_DSS_empemeral_DH 			: con 6;	SSL_FORTEZZA_MISSI			: con 20; ## cipher definitions#SSL_EXPORT_TRUE 				: con 0;	SSL_EXPORT_FALSE 			: con 1; SSL_NULL_CIPHER,	SSL_RC4,	SSL_RC2_CBC,	SSL_IDEA_CBC,	SSL_DES_CBC,	SSL_3DES_EDE_CBC,	SSL_FORTEZZA_CBC			: con iota; SSL_STREAM_CIPHER,	SSL_BLOCK_CIPHER			: con iota; SSL_NULL_MAC,	SSL_MD5,	SSL_SHA					: con iota; ## MAC paddings#SSL_MAX_MAC_PADDING 				: con 48;SSL_MAC_PAD1 := array [] of { 	byte 16r36, byte 16r36, byte 16r36, byte 16r36, 	byte 16r36, byte 16r36, byte 16r36, byte 16r36,	byte 16r36, byte 16r36, byte 16r36, byte 16r36, 	byte 16r36, byte 16r36, byte 16r36, byte 16r36,	byte 16r36, byte 16r36, byte 16r36, byte 16r36, 	byte 16r36, byte 16r36, byte 16r36, byte 16r36,	byte 16r36, byte 16r36, byte 16r36, byte 16r36, 	byte 16r36, byte 16r36, byte 16r36, byte 16r36,	byte 16r36, byte 16r36, byte 16r36, byte 16r36, 	byte 16r36, byte 16r36, byte 16r36, byte 16r36,	byte 16r36, byte 16r36, byte 16r36, byte 16r36, 	byte 16r36, byte 16r36, byte 16r36, byte 16r36,};SSL_MAC_PAD2 := array [] of {	byte 16r5c, byte 16r5c, byte 16r5c, byte 16r5c,	byte 16r5c, byte 16r5c, byte 16r5c, byte 16r5c,	byte 16r5c, byte 16r5c, byte 16r5c, byte 16r5c,	byte 16r5c, byte 16r5c, byte 16r5c, byte 16r5c,	byte 16r5c, byte 16r5c, byte 16r5c, byte 16r5c,	byte 16r5c, byte 16r5c, byte 16r5c, byte 16r5c,	byte 16r5c, byte 16r5c, byte 16r5c, byte 16r5c,	byte 16r5c, byte 16r5c, byte 16r5c, byte 16r5c,	byte 16r5c, byte 16r5c, byte 16r5c, byte 16r5c,	byte 16r5c, byte 16r5c, byte 16r5c, byte 16r5c,	byte 16r5c, byte 16r5c, byte 16r5c, byte 16r5c,	byte 16r5c, byte 16r5c, byte 16r5c, byte 16r5c,}; ## finished messages#SSL_CLIENT_SENDER := array [] of {	byte 16r43, byte 16r4C, byte 16r4E, byte 16r54};SSL_SERVER_SENDER := array [] of {	byte 16r53, byte 16r52, byte 16r56, byte 16r52}; ## a default distiguished names#RSA_COMMERCIAL_CA_ROOT_SUBJECT_NAME := array [] of {   	byte 16r30, byte 16r5F, byte 16r31, byte 16r0B, 	byte 16r30, byte 16r09, byte 16r06, byte 16r03, 	byte 16r55, byte 16r04, byte 16r06, byte 16r13, 	byte 16r02, byte 16r55, byte 16r53, byte 16r31, 	byte 16r20, byte 16r30, byte 16r1E, byte 16r06, 	byte 16r03, byte 16r55, byte 16r04, byte 16r0A, 	byte 16r13, byte 16r17, byte 16r52, byte 16r53, 	byte 16r41, byte 16r20, byte 16r44, byte 16r61, 	byte 16r74, byte 16r61, byte 16r20, byte 16r53, 	byte 16r65, byte 16r63, byte 16r75, byte 16r72, 	byte 16r69, byte 16r74, byte 16r79, byte 16r2C, 	byte 16r20, byte 16r49, byte 16r6E, byte 16r63, 	byte 16r2E, byte 16r31, byte 16r2E, byte 16r30, 	byte 16r2C, byte 16r06, byte 16r03, byte 16r55, 	byte 16r04, byte 16r0B, byte 16r13, byte 16r25, 	byte 16r53, byte 16r65, byte 16r63, byte 16r75, 	byte 16r72, byte 16r65, byte 16r20, byte 16r53, 	byte 16r65, byte 16r72, byte 16r76, byte 16r65, 	byte 16r72, byte 16r20, byte 16r43, byte 16r65, 	byte 16r72, byte 16r74, byte 16r69, byte 16r66, 	byte 16r69, byte 16r63, byte 16r61, byte 16r74, 	byte 16r69, byte 16r6F, byte 16r6E, byte 16r20, 	byte 16r41, byte 16r75, byte 16r74, byte 16r68, 	byte 16r6F, byte 16r72, byte 16r69, byte 16r74, 	byte 16r79,}; # SSL internal statusUSE_DEVSSL,	SSL3_RECORD,	SSL3_HANDSHAKE,	SSL2_HANDSHAKE,	CLIENT_SIDE, 					SESSION_RESUMABLE,	CLIENT_AUTH,	CERT_REQUEST,	CERT_SENT,	CERT_RECEIVED,	OUT_READY,	IN_READY				: con  1 << iota; # SSL internal stateSTATE_EXIT,	STATE_CHANGE_CIPHER_SPEC,	STATE_HELLO_REQUEST,	STATE_CLIENT_HELLO,	STATE_SERVER_HELLO,	STATE_CLIENT_KEY_EXCHANGE,	STATE_SERVER_KEY_EXCHANGE,	STATE_SERVER_HELLO_DONE,	STATE_CLIENT_CERTIFICATE,	STATE_SERVER_CERTIFICATE,	STATE_CERTIFICATE_VERIFY,	STATE_FINISHED				: con iota; ## load necessary modules#init(): string{	sys = load Sys Sys->PATH;	if(sys == nil)		return "ssl3: load sys module failed";	logfd = sys->fildes(1); 	keyring = load Keyring Keyring->PATH;	if(keyring == nil)		return "ssl3: load keyring module failed"; 	random = load Random Random->PATH;	if(random == nil)		return "ssl3: load random module failed"; 	daytime = load Daytime Daytime->PATH;	if(daytime == nil)		return "ssl3: load Daytime module failed"; 	pkcs = load PKCS PKCS->PATH;	if(pkcs == nil)		return "ssl3: load pkcs module failed";	pkcs->init(); 	x509 = load X509 X509->PATH;	if(x509 == nil)		return "ssl3: load x509 module failed";	x509->init(); 	ssl = load SSL SSL->PATH;	if(ssl == nil)		return "ssl3: load SSL module failed";	sslsession = load SSLsession SSLsession->PATH;	if(sslsession == nil)		return "ssl3: load sslsession module failed";	e := sslsession->init();	if(e != nil)		return "ssl3: sslsession init failed: "+e; 	return "";} log(s: string){	a := array of byte (s + "\n");	sys->write(logfd, a, len a);} ## protocol context# Context.new(): ref Context{	ctx := ref Context; 	ctx.c = nil;	ctx.session = nil;	ctx.local_info = nil;			ctx.sha_state = nil;	ctx.md5_state = nil; 	ctx.status = 0;	ctx.state = 0; 	ctx.client_random = array [32] of byte;	ctx.server_random = array [32] of byte; 	ctx.cw_mac = nil;	ctx.sw_mac = nil;	ctx.cw_key = nil;	ctx.sw_key = nil;	ctx.cw_IV = nil;	ctx.sw_IV = nil; 	ctx.in_queue = RecordQueue.new();	ctx.in_queue.data = ref Record(0, nil, array [1<<15] of byte) :: nil;	ctx.out_queue = RecordQueue.new(); 	# set session resumable as default	ctx.status |= SESSION_RESUMABLE; 	return ctx;} Context.client(ctx: self ref Context, fd: ref Sys->FD, peername: string, ver: int, info: ref Authinfo)	: (string, int){	if(SSL_DEBUG)		log(sys->sprint("ssl3: Context.Client peername=%s ver=%d\n", peername, ver));	if ((ckstr := cksuites(info.suites)) != nil)		return (ckstr, ver);	# the order is important	ctx.local_info = info;	ctx.state = STATE_HELLO_REQUEST;	e := ctx.connect(fd);	if(e != "")		return (e, ver);	ctx.session = sslsession->get_session_byname(peername); 	# Request to resume an SSL 3.0 session should use an SSL 3.0 client hello	if(ctx.session.session_id != nil) {		if((ctx.session.version[0] == SSL_VERSION_3_0[0]) &&			(ctx.session.version[1] == SSL_VERSION_3_0[1])) {			ver = 3;			ctx.status |= SSL3_HANDSHAKE;			ctx.status &= ~SSL2_HANDSHAKE;		}	}	e = ctx.set_version(ver);	if(e != "")		return (e, ver);	reset_client_random(ctx);	ctx.status |= CLIENT_SIDE;	e = do_protocol(ctx);	if(e != nil)		return (e, ver); 	if(ctx.status & SSL3_RECORD)		ver = 3;	else		ver = 2;	return (nil, ver);} Context.server(ctx: self ref Context, fd: ref Sys->FD, info: ref Authinfo, client_auth: int)	: string{	if ((ckstr := cksuites(info.suites)) != nil)		return ckstr;	ctx.local_info = info;	if(client_auth)		ctx.status |= CLIENT_AUTH;	ctx.state = STATE_CLIENT_HELLO;	e := ctx.connect(fd);	if(e != "")		return e;	reset_server_random(ctx);	e = ctx.set_version(3); # set ssl device to version 3	if(e != "")		return e;	ctx.status &= ~CLIENT_SIDE;	e = do_protocol(ctx);	if(e != nil)		return e; 	return "";}  Context.use_devssl(ctx: self ref Context)

Lines 1–500 of 5557.