diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 20:52:35 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 20:52:35 +0000 |
| commit | 46439007cf417cbd9ac8049bb4122c890097a0fa (patch) | |
| tree | 6fdb25e5f3a2b6d5657eb23b35774b631d4d97e4 /module/ssl3.m | |
| parent | 37da2899f40661e3e9631e497da8dc59b971cbd0 (diff) | |
20060303-partial
Diffstat (limited to 'module/ssl3.m')
| -rw-r--r-- | module/ssl3.m | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/module/ssl3.m b/module/ssl3.m new file mode 100644 index 00000000..32c47bd7 --- /dev/null +++ b/module/ssl3.m @@ -0,0 +1,204 @@ +# +# ssl 3.0 protocol +# + +SSL3: module { + + PATH: con "/dis/lib/crypt/ssl3.dis"; + + init: fn(): string; + + # SSL cipher suites + + NULL_WITH_NULL_NULL, + RSA_WITH_NULL_MD5, + RSA_WITH_NULL_SHA, + RSA_EXPORT_WITH_RC4_40_MD5, + RSA_WITH_RC4_128_MD5, + RSA_WITH_RC4_128_SHA, + RSA_EXPORT_WITH_RC2_CBC_40_MD5, + RSA_WITH_IDEA_CBC_SHA, + RSA_EXPORT_WITH_DES40_CBC_SHA, + RSA_WITH_DES_CBC_SHA, + RSA_WITH_3DES_EDE_CBC_SHA, + DH_DSS_EXPORT_WITH_DES40_CBC_SHA, + DH_DSS_WITH_DES_CBC_SHA, + DH_DSS_WITH_3DES_EDE_CBC_SHA, + DH_RSA_EXPORT_WITH_DES40_CBC_SHA, + DH_RSA_WITH_DES_CBC_SHA, + DH_RSA_WITH_3DES_EDE_CBC_SHA, + DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, + DHE_DSS_WITH_DES_CBC_SHA, + DHE_DSS_WITH_3DES_EDE_CBC_SHA, + DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, + DHE_RSA_WITH_DES_CBC_SHA, + DHE_RSA_WITH_3DES_EDE_CBC_SHA, + DH_anon_EXPORT_WITH_RC4_40_MD5, + DH_anon_WITH_RC4_128_MD5, + DH_anon_EXPORT_WITH_DES40_CBC_SHA, + DH_anon_WITH_DES_CBC_SHA, + DH_anon_WITH_3DES_EDE_CBC_SHA, + FORTEZZA_KEA_WITH_NULL_SHA, + FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA, + FORTEZZA_KEA_WITH_RC4_128_SHA : con iota; + + Authinfo: adt { + suites: array of byte; # [2] x + comprs: array of byte; # [1] x + + sk: ref PrivateKey; # for user certs + root_type: int; # root type of certs + certs: list of array of byte; # x509 cert chain + + types: array of byte; # acceptable cert types + dns: list of array of byte; # acceptable cert authorities + }; + + PrivateKey: adt { + pick { + RSA => + sk : ref PKCS->RSAKey; + DSS => + sk : ref PKCS->DSSPrivateKey; + DH => + sk : ref PKCS->DHPrivateKey; + } + }; + + Record: adt { + content_type : int; + version : array of byte; # [2] + data : array of byte; + }; + + # key exchange algorithms + + KeyExAlg: adt { + pick { + NULL => + DH => + params : ref PKCS->DHParams; + sk : ref PKCS->DHPrivateKey; + peer_params : ref PKCS->DHParams; + peer_pk : ref PKCS->DHPublicKey; + exch_pk : ref PKCS->DHPublicKey; + RSA => + sk : ref PKCS->RSAKey; # for RSA key exchange + export_key : ref PKCS->RSAKey; # server RSA temp key + peer_pk : ref PKCS->RSAKey; # temp key from server + FORTEZZA_KEA => + # not supported yet + } + }; + + SigAlg: adt { + pick { + anon => + RSA => + sk : ref PKCS->RSAKey; # for sign + peer_pk : ref PKCS->RSAKey; # for verify from peer cert + DSS => + sk : ref PKCS->DSSPrivateKey; # for sign + peer_pk : ref PKCS->DSSPublicKey; # for verify from peer cert + FORTEZZA_KEA => # not supported yet + } + }; + + CipherSpec: adt { + is_exportable : int; + + bulk_cipher_algorithm : int; + cipher_type : int; + key_material : int; + IV_size : int; + + mac_algorithm : int; + hash_size : int; + }; + + # record format queue + + RecordQueue: adt { + macState : ref MacState; + cipherState : ref CipherState; + + length : int; + sequence_numbers : array of int; + + data : list of ref Record; + fragment : int; + b, e : int; + + new: fn(): ref RecordQueue; + read: fn(q: self ref RecordQueue, ctx: ref Context, fd: ref Sys->FD): string; + write: fn(q: self ref RecordQueue, ctx: ref Context, fd: ref Sys->FD, r: ref Record): string; + calcmac: fn(q: self ref RecordQueue, ctx: ref Context, cntype: int, a: array of byte, ofs, n: int) : array of byte; + }; + + MacState: adt { + hash_size : int; + pick { + null => + md5 => + ds : array of ref Keyring->DigestState; + sha => + ds : array of ref Keyring->DigestState; + } + }; + + CipherState: adt { + block_size : int; + pick { + null => + rc4 => + es : ref Keyring->RC4state; + descbc => + es : ref Keyring->DESstate; + ideacbc => + es : ref Keyring->IDEAstate; + } + }; + + # context for processing both v2 and v3 protocols. + + Context: adt { + c : ref Sys->Connection; + session : ref SSLsession->Session; + + sel_keyx : ref KeyExAlg; + sel_sign : ref SigAlg; + sel_ciph : ref CipherSpec; + sel_cmpr : int; + + local_info : ref Authinfo; + + client_random : array of byte; # [32] + server_random : array of byte; # [32] + + sha_state : ref Keyring->DigestState; + md5_state : ref Keyring->DigestState; + + cw_mac : array of byte; + sw_mac : array of byte; + cw_key : array of byte; + sw_key : array of byte; + cw_IV : array of byte; + sw_IV : array of byte; + + in_queue : ref RecordQueue; + out_queue : ref RecordQueue; + + status : int; + state : int; + + + new: fn(): ref Context; + client: fn(ctx: self ref Context, fd: ref Sys->FD, peer: string, ver: int, info: ref Authinfo): (string, int); + server: fn(ctx: self ref Context, fd: ref Sys->FD, info: ref Authinfo, client_auth: int): string; + use_devssl: fn(ctx: self ref Context); + set_version: fn(ctx: self ref Context, vers: int): string; + connect: fn(ctx: self ref Context, fd: ref Sys->FD): string; + read: fn(ctx: self ref Context, a: array of byte, n: int): int; + write: fn(ctx: self ref Context, a: array of byte, n: int): int; + }; +}; |
