mirror of
https://github.com/xcat2/xNBA.git
synced 2024-12-14 15:21:32 +00:00
Adding SSL Constructs header file. (First version)
This commit is contained in:
parent
5f651f8622
commit
47be47bf17
314
src/crypto/ssl_constructs.h
Normal file
314
src/crypto/ssl_constructs.h
Normal file
@ -0,0 +1,314 @@
|
||||
// Note: This file still needs some work.
|
||||
|
||||
// Typedefs
|
||||
// (As defined by the SSL v3.0 RFC Draft)
|
||||
// URL: http://wp.netscape.com/eng/ssl3/draft302.txt
|
||||
typedef unsigned char uint8;
|
||||
typedef uint8 uint16[2];
|
||||
typedef uint8 uint24[3];
|
||||
typedef uint8 uint32[4];
|
||||
typedef uint8 uint64[8];
|
||||
|
||||
// Record layers
|
||||
typedef struct _ProtocolVersion{
|
||||
uint8 major, minor;
|
||||
} ProtocolVersion;
|
||||
|
||||
ProtocolVersion version = { 3, 0 };
|
||||
|
||||
typedef enum _ContentType{
|
||||
content_type_change_cipher_spec_type=20,
|
||||
content_type_alert=21,
|
||||
content_type_handshake=22,
|
||||
content_type_application_data=23,
|
||||
content_type_size=255 // to force size
|
||||
} ContentType;
|
||||
|
||||
typedef struct _SSLPlaintext{
|
||||
ContentType type;
|
||||
ProtocolVersion version;
|
||||
uint16 length; // can not exceed 2^14 bytes
|
||||
uint8 fragment[16384]; // 2^14 = 16,384 bytes
|
||||
} SSLPlaintext;
|
||||
|
||||
typedef struct _SSLCompressed{
|
||||
ContentType type;
|
||||
ProtocolVersion version;
|
||||
uint16 length; // can not exceed 2^14 + 1024
|
||||
uint8 fragment[17408]; // SSLCompressed.length
|
||||
} SSLCompressed;
|
||||
|
||||
typedef struct _GenericStreamCipher{
|
||||
uint8 content[17408]; // SSLCompressed.length
|
||||
uint8 MAC[]; // CipherSpec.hash_size
|
||||
} GenericStreamCipher;
|
||||
|
||||
typedef struct _SSLStreamCiphertext{
|
||||
ContentType type;
|
||||
ProtocolVersion version;
|
||||
uint16 length; // can not exceed 2^14 + 2048 = 18,456
|
||||
GenericStreamCipher fragment;
|
||||
} SSLStreamCiphertext;
|
||||
|
||||
typedef struct _GenericBlockCipher{
|
||||
uint8 content[17408]; // SSLConpressed.length
|
||||
uint8 MAC[0]; // CipherSpec.hash_size
|
||||
// padding is used to bring the plaintext to
|
||||
// a multiple of the block cipher's block length.
|
||||
uint8 padding[0]; // GenericBlockCipher.padding_length
|
||||
uint8 padding_length;
|
||||
} GenericBlockCipher;
|
||||
|
||||
typedef struct _SSLBlockCiphertext{
|
||||
ContentType type;
|
||||
ProtocolVersion version;
|
||||
uint16 length; // can not exceed 2^14 + 2048 = 18,456
|
||||
GenericBlockCipher fragment;
|
||||
} SSLBlockCiphertext;
|
||||
|
||||
// Change cipher specs message
|
||||
typedef struct _ChangeCipherSpec{
|
||||
enum { type_change_cipher_spec=1, type_size=255 } type;
|
||||
} ChangeCipherSpec;
|
||||
|
||||
// Alert messages
|
||||
typedef enum _AlertLevel{
|
||||
alert_level_warning=1,
|
||||
alert_level_fatal=2,
|
||||
alert_level_size=255
|
||||
} AlertLevel;
|
||||
|
||||
typedef enum _AlertDescription{
|
||||
alert_description_close_notify=0,
|
||||
alert_description_unexpected_message=10,
|
||||
alert_description_bad_record_mac=20,
|
||||
alert_description_decompression_failure=30,
|
||||
alert_description_handshake_failure=40,
|
||||
alert_description_no_certificate=41,
|
||||
alert_description_bad_certificate=42,
|
||||
alert_description_unsupported_certificate=43,
|
||||
alert_description_certificate_revoked=44,
|
||||
alert_description_certificate_expired=45,
|
||||
alert_description_certificate_unknown=46,
|
||||
alert_description_illegal_parameter=47,
|
||||
alert_description_size=255
|
||||
} AlertDescription;
|
||||
|
||||
typedef struct _Alert{
|
||||
AlertLevel level;
|
||||
AlertDescription description;
|
||||
} Alert;
|
||||
|
||||
// Handshake protocol
|
||||
// What is the best way to have a generic pointer to the body struct??
|
||||
typedef enum _HandshakeType{
|
||||
handshake_type_hello_request=0,
|
||||
handshake_type_client_hello=1,
|
||||
handshake_type_server_hello=2,
|
||||
handshake_type_certificate=11,
|
||||
handshake_type_server_key_exchange=12,
|
||||
handshake_type_certificate_request=13,
|
||||
handshake_type_server_done=14,
|
||||
handshake_type_certificate_verify=15,
|
||||
handshake_type_client_key_exchange=16,
|
||||
handshake_type_finished=20,
|
||||
handshake_type_size=255
|
||||
} HandshakeType;
|
||||
|
||||
typedef struct _Handshake{
|
||||
HandshakeType msg_type;
|
||||
uint24 length;
|
||||
} Handshake; // generic Handshake, need to recast to get body
|
||||
|
||||
// Hello messages
|
||||
typedef struct _HelloRequest{} HelloRequest;
|
||||
|
||||
typedef struct _HelloRequestHandshake{
|
||||
HandshakeType msg_type;
|
||||
uint24 length;
|
||||
HelloRequest body;
|
||||
} HelloRequestHandshake;
|
||||
|
||||
typedef struct _Random{
|
||||
uint32 gmt_unix_time;
|
||||
uint8 random_bytes[28];
|
||||
} Random;
|
||||
|
||||
typedef uint8 SessionID[32]; // <0..32>
|
||||
typedef uint8 CipherSuite[2];
|
||||
|
||||
typedef enum _CompressionMethod{ compression_method_null=0, compression_method_size=255 } CompressionMethod;
|
||||
|
||||
typedef struct _ClientHello{
|
||||
ProtocolVersion client_version;
|
||||
Random random;
|
||||
SessionID session_id;
|
||||
CipherSuite cipher_suites[32768]; // <2..2^16-1> = 65,536 bytes and CipherSuite is 2 bytes
|
||||
CompressionMethod compression_methods[256]; // <0..2^8-1> = 256 bytes and CompressionMethod is 1 byte
|
||||
} ClientHello;
|
||||
|
||||
typedef struct _ClientHelloHandshake{
|
||||
HandshakeType msg_type;
|
||||
uint24 length;
|
||||
ClientHello body;
|
||||
} ClientHelloHandshake;
|
||||
|
||||
typedef struct _ServerHello{
|
||||
ProtocolVersion server_version;
|
||||
Random random;
|
||||
SessionID session_id;
|
||||
CipherSuite cipher_suite;
|
||||
CompressionMethod compression_method;
|
||||
} ServerHello;
|
||||
|
||||
typedef struct _ServerHelloHandshake{
|
||||
HandshakeType msg_type;
|
||||
uint24 length;
|
||||
ServerHello body;
|
||||
} ServerHelloHandshake;
|
||||
|
||||
// Server authentication and key exchange messages
|
||||
typedef uint8 ASN1Cert[16777216]; // <1..2^24-1> = 16,777,216 bytes
|
||||
|
||||
typedef struct _Certificate{
|
||||
ASN1Cert certificate_list[1]; // <1..2^24-1> / ANS1Cert = 1
|
||||
// for some reason the size of certificate_list and ASN1Cert is the same, so only one certificate in the list
|
||||
} Certificate;
|
||||
|
||||
typedef enum _KeyExchangeAlgorithm{
|
||||
key_exchange_algorithm_rsa,
|
||||
key_exchange_algorithm_diffie_hellman,
|
||||
key_exchange_algorithm_fortezza_kea
|
||||
} KeyExchangeAlgorithm;
|
||||
|
||||
typedef struct _AnonSignature{
|
||||
struct {};
|
||||
} AnonSignature;
|
||||
|
||||
typedef struct _RSASignature{
|
||||
uint8 md5_hash[16];
|
||||
uint8 sha_hash[20];
|
||||
} RSASignature;
|
||||
|
||||
typedef struct _DSASignature{
|
||||
uint8 sha_hash[20];
|
||||
} DSASignature;
|
||||
|
||||
// use union??, make a mess to reference, but easy to make Signature type.
|
||||
typedef union _Signature{ AnonSignature anon; RSASignature rsa; DSASignature dsa; } Signature;
|
||||
|
||||
typedef struct _ServerRSAParams{
|
||||
uint8 RSA_modulus[65536]; // <1..2^16-1> = 65,536
|
||||
uint8 RSA_exponent[65536]; // <1..2^16-1> = 65,536
|
||||
} ServerRSAParams;
|
||||
|
||||
typedef struct _ServerDHParams{
|
||||
uint8 DH_p[65536]; // <1..2^16-1>
|
||||
uint8 DH_g[65536]; // <1..2^16-1>
|
||||
uint8 DH_Ys[65536]; // <1..2^16-1>
|
||||
} ServerDHParams;
|
||||
|
||||
typedef struct _ServerDHKeyExchange{
|
||||
ServerDHParams params;
|
||||
Signature signed_params;
|
||||
} ServerDHKeyExchange;
|
||||
|
||||
typedef struct _ServerRSAKeyExchange{
|
||||
ServerRSAParams params;
|
||||
Signature signed_params;
|
||||
} ServerRSAKeyExchange;
|
||||
|
||||
typedef enum _SignatureAlgorithm{
|
||||
signature_algorithm_anonymous,
|
||||
signature_algorithm_rsa,
|
||||
signature_algorithm_dsa
|
||||
} SignatureAlgorithm;
|
||||
|
||||
typedef enum _CertificateType{
|
||||
certificate_type_RSA_sign=1,
|
||||
certificate_type_DSS_sign=2,
|
||||
certificate_type_RSA_fixed_DH=3,
|
||||
certificate_type_DSS_fixed_DH=4,
|
||||
certificate_type_RSA_ephemeral_DH=5,
|
||||
certificate_type_DSS_ephemeral_DH=6,
|
||||
certificate_type_FORTEZZA_MISSI=20,
|
||||
certificate_type_size=255
|
||||
} CertificateType;
|
||||
|
||||
typedef uint8 DistinguishedName[65536]; // <1..2^16-1> = 65,536
|
||||
|
||||
typedef struct _CertificateRequest{
|
||||
CertificateType certificate_types[256]; // <1..2^8-1>
|
||||
DistinguishedName certificate_authorities[1]; // <3...2^16-1> / DistinguishedName
|
||||
// this is another one that is odd with a list size of 1
|
||||
} CertificateRequest;
|
||||
|
||||
typedef struct _ServerHelloDone{} ServerHelloDone;
|
||||
|
||||
// Client authentication and key exchange messages
|
||||
typedef struct _PreMasterSecret{
|
||||
ProtocolVersion client_version;
|
||||
uint8 random[46];
|
||||
} PreMasterSecret;
|
||||
|
||||
typedef struct _EncryptedPreMasterSecret{
|
||||
PreMasterSecret pre_master_secret;
|
||||
} EncryptedPreMasterSecret;
|
||||
|
||||
typedef struct _RSAClientKeyExchange{
|
||||
EncryptedPreMasterSecret exchange_keys;
|
||||
} RSAClientKeyExchange;
|
||||
|
||||
typedef enum _PublicValueEncoding{ public_value_encoding_implicit, public_value_encoding_explicit } PublicValueEncoding;
|
||||
|
||||
typedef struct _ClientDiffieHellmanPublic{
|
||||
// This is a select on PublicValueEncoding, and I chose the larger size
|
||||
uint8 dh_public[65536]; // DH_Yc<1..2^16-1>, the dh public value
|
||||
} ClientDiffieHellmanPublic;
|
||||
|
||||
typedef struct _DHClientKeyExhange{
|
||||
ClientDiffieHellmanPublic exchange_keys;
|
||||
} DHClientKeyExchange;
|
||||
|
||||
typedef struct _CertificateVerify{
|
||||
Signature signature;
|
||||
} CertificateVerify;
|
||||
|
||||
// Handshake finalization message
|
||||
typedef struct _Finished{
|
||||
uint8 md5_hash[16];
|
||||
uint8 sha_hash[20];
|
||||
} Finished;
|
||||
|
||||
// The CipherSuite
|
||||
CipherSuite SSL_NULL_WITH_NULL_NULL = { 0x00, 0x00 };
|
||||
CipherSuite SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = { 0x00, 0x0B };
|
||||
CipherSuite SSL_DH_DSS_WITH_DES_CBC_SHA = { 0x00, 0x0C };
|
||||
CipherSuite SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 = { 0x00, 0x17 };
|
||||
CipherSuite SSL_DH_anon_WITH_RC4_128_MD5 = { 0x00, 0x18 };
|
||||
|
||||
// The CipherSpec
|
||||
typedef enum _CipherType{ cipher_type_stream, cipher_type_block } CipherType;
|
||||
typedef enum _IsExportable{ is_exportable_true, is_exportable_false } IsExportable;
|
||||
typedef enum _BulkCipherAlgorithm{
|
||||
bulk_cipher_algorithm_null,
|
||||
bulk_cipher_algorithm_rc4,
|
||||
bulk_cipher_algorithm_rc2,
|
||||
bulk_cipher_algorithm_des,
|
||||
bulk_cipher_algorithm_3des,
|
||||
bulk_cipher_algorithm_des40,
|
||||
bulk_cipher_algorithm_fortezza
|
||||
} BulkCipherAlgorithm;
|
||||
typedef enum _MACAlgorithm{ mac_algorithm_null, mac_algorithm_md5, mac_algorithm_sha } MACAlgorithm;
|
||||
|
||||
typedef struct _CipherSpec{
|
||||
BulkCipherAlgorithm bulk_cipher_algorithm;
|
||||
MACAlgorithm mac_algorithm;
|
||||
CipherType cipher_type;
|
||||
IsExportable is_exportable;
|
||||
uint8 hash_size;
|
||||
uint8 key_material;
|
||||
uint8 IV_size;
|
||||
} CipherSpec;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user