1553 lines
104 KiB
OCaml
1553 lines
104 KiB
OCaml
open Tls
|
|
open OUnit2
|
|
open Testlib
|
|
|
|
let good_any_version_parser major minor result _ =
|
|
let ver = list_to_cstruct [ major ; minor ] in
|
|
match Reader.parse_any_version ver with
|
|
| Ok v -> assert_equal v result
|
|
| Error _ -> assert_failure "Version parser broken"
|
|
|
|
let bad_any_version_parser major minor _ =
|
|
let ver = list_to_cstruct [ major ; minor ] in
|
|
match Reader.parse_any_version ver with
|
|
| Ok _ -> assert_failure "Version parser broken"
|
|
| Error _ -> ()
|
|
|
|
let parse_any_version_too_short _ =
|
|
let ver = list_to_cstruct [ 0 ] in
|
|
match Reader.parse_any_version ver with
|
|
| Ok _ -> assert_failure "Version parser broken"
|
|
| Error _ -> ()
|
|
|
|
let any_version_parser_tests = [
|
|
good_any_version_parser 3 0 `SSL_3 ;
|
|
good_any_version_parser 3 1 `TLS_1_0 ;
|
|
good_any_version_parser 3 2 `TLS_1_1 ;
|
|
good_any_version_parser 3 3 `TLS_1_2 ;
|
|
good_any_version_parser 3 4 `TLS_1_3 ;
|
|
good_any_version_parser 3 42 (`TLS_1_X 42);
|
|
|
|
bad_any_version_parser 2 4 ;
|
|
bad_any_version_parser 4 4 ;
|
|
bad_any_version_parser 0 2 ;
|
|
|
|
parse_any_version_too_short
|
|
]
|
|
|
|
let any_version_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse any version " ^ string_of_int i >:: f)
|
|
any_version_parser_tests
|
|
|
|
let good_version_parser major minor result _ =
|
|
let ver = list_to_cstruct [ major ; minor ] in
|
|
match Reader.parse_version ver with
|
|
| Ok v -> assert_equal v result
|
|
| Error _ -> assert_failure "Version parser broken"
|
|
|
|
let bad_version_parser major minor _ =
|
|
let ver = list_to_cstruct [ major ; minor ] in
|
|
match Reader.parse_version ver with
|
|
| Ok _ -> assert_failure "Version parser broken"
|
|
| Error _ -> ()
|
|
|
|
let parse_version_too_short _ =
|
|
let ver = list_to_cstruct [ 0 ] in
|
|
match Reader.parse_version ver with
|
|
| Ok _ -> assert_failure "Version parser broken"
|
|
| Error _ -> ()
|
|
|
|
let version_parser_tests = [
|
|
good_version_parser 3 1 `TLS_1_0 ;
|
|
good_version_parser 3 2 `TLS_1_1 ;
|
|
good_version_parser 3 3 `TLS_1_2 ;
|
|
good_version_parser 3 4 `TLS_1_3 ;
|
|
|
|
bad_version_parser 3 0 ;
|
|
bad_version_parser 3 42 ;
|
|
bad_version_parser 2 4 ;
|
|
bad_version_parser 4 4 ;
|
|
bad_version_parser 0 2 ;
|
|
|
|
parse_version_too_short
|
|
]
|
|
|
|
let version_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse version " ^ string_of_int i >:: f)
|
|
version_parser_tests
|
|
|
|
|
|
let good_record_parser (bytes, result) _ =
|
|
let buf = list_to_cstruct bytes in
|
|
let open Reader in
|
|
match parse_record buf, result with
|
|
| Ok (`Record ((hdr, x), f)), `Record ((rhdr, y), g) ->
|
|
assert_equal rhdr hdr ;
|
|
assert_cs_eq y x ;
|
|
assert_cs_eq g f
|
|
| Ok `Fragment x, `Fragment y -> assert_cs_eq y x
|
|
| Error `Record_overflow x, `Overflow y -> assert_equal y x
|
|
| Error `Protocol_version `Unknown_record x, `UnknownVersion y -> assert_equal y x
|
|
| Error `Unexpected `Content_type x, `UnknownContent y -> assert_equal y x
|
|
| _ -> assert_failure "record parser broken"
|
|
|
|
let good_records =
|
|
let open Core in
|
|
let open Packet in
|
|
let empty = "" in
|
|
[
|
|
([ 20 ; 3 ; 1 ; 0 ; 0 ], `Record (({ content_type = CHANGE_CIPHER_SPEC ; version = `TLS_1_0 }, empty), empty) ) ;
|
|
([ 21 ; 3 ; 2 ; 0 ; 0 ], `Record (({ content_type = ALERT ; version = `TLS_1_1 }, empty), empty) ) ;
|
|
([ 22 ; 3 ; 3 ; 0 ; 0 ], `Record (({ content_type = HANDSHAKE ; version = `TLS_1_2 }, empty), empty) ) ;
|
|
([ 23 ; 3 ; 0 ; 0 ; 0 ], `Record (({ content_type = APPLICATION_DATA ; version = `SSL_3 }, empty), empty) ) ;
|
|
([ 16 ; 3 ; 1 ; 0 ; 0 ], `UnknownContent 16 ) ;
|
|
([ 19 ; 3 ; 1 ; 0 ; 0 ], `UnknownContent 19 ) ;
|
|
([ 20 ; 5 ; 1 ; 0 ; 0 ], `UnknownVersion (5, 1) ) ;
|
|
([ 20 ; 3 ; 1 ; 0 ; 100 ], `Fragment (list_to_cstruct [ 20 ; 3 ; 1 ; 0 ; 100 ] )) ;
|
|
([ 0 ], `Fragment (list_to_cstruct [ 0 ])) ;
|
|
([ ], `Fragment empty) ;
|
|
([ 20 ; 3 ; 1 ; 0 ; 0 ; 0 ], `Record (({ content_type = CHANGE_CIPHER_SPEC ; version = `TLS_1_0 }, empty), list_to_cstruct [ 0 ]) ) ;
|
|
([ 0 ; 0 ; 0 ; 255 ; 255 ], `Overflow 65535) ;
|
|
([ 0 ; 0 ; 0 ; 72 ; 1 ], `Overflow 18433)
|
|
]
|
|
|
|
let good_records_tests =
|
|
List.mapi
|
|
(fun i args -> "Good record " ^ string_of_int i >:: good_record_parser args)
|
|
good_records
|
|
|
|
let good_alert_parser (lvl, typ, expected) _ =
|
|
let buf = list_to_cstruct [ lvl ; typ ] in
|
|
match Reader.parse_alert buf with
|
|
| Ok al -> assert_equal al expected
|
|
| Error _ -> assert_failure "alert parser broken"
|
|
|
|
let good_alerts =
|
|
let w = Packet.WARNING in
|
|
let f = Packet.FATAL in
|
|
[
|
|
(1, 0, (w, Packet.CLOSE_NOTIFY));
|
|
(2, 0, (f, Packet.CLOSE_NOTIFY));
|
|
(* (1, 10, (w, Packet.UNEXPECTED_MESSAGE)); *)
|
|
(2, 10, (f, Packet.UNEXPECTED_MESSAGE));
|
|
(* (1, 20, (w, Packet.BAD_RECORD_MAC)); *)
|
|
(2, 20, (f, Packet.BAD_RECORD_MAC));
|
|
(* (1, 22, (w, Packet.RECORD_OVERFLOW)); *)
|
|
(2, 22, (f, Packet.RECORD_OVERFLOW));
|
|
(* (1, 40, (w, Packet.HANDSHAKE_FAILURE)); *)
|
|
(2, 40, (f, Packet.HANDSHAKE_FAILURE));
|
|
(* (1, 42, (w, Packet.BAD_CERTIFICATE)); *)
|
|
(2, 42, (f, Packet.BAD_CERTIFICATE));
|
|
(1, 45, (w, Packet.CERTIFICATE_EXPIRED));
|
|
(2, 45, (f, Packet.CERTIFICATE_EXPIRED));
|
|
(* (1, 50, (w, Packet.DECODE_ERROR)); *)
|
|
(2, 50, (f, Packet.DECODE_ERROR));
|
|
(* (1, 70, (w, Packet.PROTOCOL_VERSION)); *)
|
|
(2, 70, (f, Packet.PROTOCOL_VERSION));
|
|
(1, 90, (w, Packet.USER_CANCELED));
|
|
(* (2, 90, (f, Packet.USER_CANCELED)); *)
|
|
(1, 100, (w, Packet.NO_RENEGOTIATION));
|
|
(* (2, 100, (f, Packet.NO_RENEGOTIATION)); *)
|
|
(* (1, 110, (w, Packet.UNSUPPORTED_EXTENSION)); *)
|
|
(2, 110, (f, Packet.UNSUPPORTED_EXTENSION));
|
|
(* (1, 112, (w, Packet.UNRECOGNIZED_NAME)); *)
|
|
(2, 112, (f, Packet.UNRECOGNIZED_NAME));
|
|
(2, 120, (f, Packet.NO_APPLICATION_PROTOCOL));
|
|
]
|
|
|
|
let good_alert_tests =
|
|
List.mapi
|
|
(fun i args -> "Good alert " ^ string_of_int i >:: good_alert_parser args)
|
|
good_alerts
|
|
|
|
let alert_too_small _ =
|
|
let buf = list_to_cstruct [ 0 ] in
|
|
match Reader.parse_alert buf with
|
|
| Ok _ -> assert_failure "short alert passes"
|
|
| Error _ -> ()
|
|
|
|
let alert_too_small2 _ =
|
|
let buf = list_to_cstruct [ 25 ] in
|
|
match Reader.parse_alert buf with
|
|
| Ok _ -> assert_failure "short alert passes"
|
|
| Error _ -> ()
|
|
|
|
let bad_alerts_tests =
|
|
[ ("short alert" >:: alert_too_small) ;
|
|
("short alert 2" >:: alert_too_small2) ]
|
|
|
|
let good_dhparams = [
|
|
[
|
|
0x01; 0x00; 0xf6; 0x42; 0x57; 0xb7; 0x08; 0x7f; 0x08; 0x17; 0x72; 0xa2; 0xba; 0xd6; 0xa9; 0x42;
|
|
0xf3; 0x05; 0xe8; 0xf9; 0x53; 0x11; 0x39; 0x4f; 0xb6; 0xf1; 0x6e; 0xb9; 0x4b; 0x38; 0x20; 0xda;
|
|
0x01; 0xa7; 0x56; 0xa3; 0x14; 0xe9; 0x8f; 0x40; 0x55; 0xf3; 0xd0; 0x07; 0xc6; 0xcb; 0x43; 0xa9;
|
|
0x94; 0xad; 0xf7; 0x4c; 0x64; 0x86; 0x49; 0xf8; 0x0c; 0x83; 0xbd; 0x65; 0xe9; 0x17; 0xd4; 0xa1;
|
|
0xd3; 0x50; 0xf8; 0xf5; 0x59; 0x5f; 0xdc; 0x76; 0x52; 0x4f; 0x3d; 0x3d; 0x8d; 0xdb; 0xce; 0x99;
|
|
0xe1; 0x57; 0x92; 0x59; 0xcd; 0xfd; 0xb8; 0xae; 0x74; 0x4f; 0xc5; 0xfc; 0x76; 0xbc; 0x83; 0xc5;
|
|
0x47; 0x30; 0x61; 0xce; 0x7c; 0xc9; 0x66; 0xff; 0x15; 0xf9; 0xbb; 0xfd; 0x91; 0x5e; 0xc7; 0x01;
|
|
0xaa; 0xd3; 0x5b; 0x9e; 0x8d; 0xa0; 0xa5; 0x72; 0x3a; 0xd4; 0x1a; 0xf0; 0xbf; 0x46; 0x00; 0x58;
|
|
0x2b; 0xe5; 0xf4; 0x88; 0xfd; 0x58; 0x4e; 0x49; 0xdb; 0xcd; 0x20; 0xb4; 0x9d; 0xe4; 0x91; 0x07;
|
|
0x36; 0x6b; 0x33; 0x6c; 0x38; 0x0d; 0x45; 0x1d; 0x0f; 0x7c; 0x88; 0xb3; 0x1c; 0x7c; 0x5b; 0x2d;
|
|
0x8e; 0xf6; 0xf3; 0xc9; 0x23; 0xc0; 0x43; 0xf0; 0xa5; 0x5b; 0x18; 0x8d; 0x8e; 0xbb; 0x55; 0x8c;
|
|
0xb8; 0x5d; 0x38; 0xd3; 0x34; 0xfd; 0x7c; 0x17; 0x57; 0x43; 0xa3; 0x1d; 0x18; 0x6c; 0xde; 0x33;
|
|
0x21; 0x2c; 0xb5; 0x2a; 0xff; 0x3c; 0xe1; 0xb1; 0x29; 0x40; 0x18; 0x11; 0x8d; 0x7c; 0x84; 0xa7;
|
|
0x0a; 0x72; 0xd6; 0x86; 0xc4; 0x03; 0x19; 0xc8; 0x07; 0x29; 0x7a; 0xca; 0x95; 0x0c; 0xd9; 0x96;
|
|
0x9f; 0xab; 0xd0; 0x0a; 0x50; 0x9b; 0x02; 0x46; 0xd3; 0x08; 0x3d; 0x66; 0xa4; 0x5d; 0x41; 0x9f;
|
|
0x9c; 0x7c; 0xbd; 0x89; 0x4b; 0x22; 0x19; 0x26; 0xba; 0xab; 0xa2; 0x5e; 0xc3; 0x55; 0xe9; 0x32;
|
|
0x0b; 0x3b; 0x00; 0x01; 0x02; 0x01; 0x00; 0x54; 0x7d; 0x06; 0xfb; 0x28; 0xe3; 0x64; 0x86; 0x53;
|
|
0x6e; 0xf0; 0xfc; 0xdc; 0x57; 0xb6; 0x86; 0xae; 0xa7; 0x20; 0xbc; 0xac; 0x76; 0x38; 0xf5; 0x64;
|
|
0x02; 0x9d; 0x19; 0x1a; 0xfe; 0x4d; 0x0d; 0x5a; 0xd3; 0xc6; 0x76; 0x9b; 0x33; 0x8d; 0x3a; 0x96;
|
|
0xcc; 0x3f; 0x72; 0xdf; 0x1d; 0x19; 0xd2; 0x61; 0x41; 0x95; 0x3a; 0x2d; 0x83; 0x7f; 0x4e; 0xbb;
|
|
0x48; 0xf4; 0x77; 0x05; 0xd3; 0x23; 0xff; 0x49; 0xd8; 0xc8; 0x70; 0x0a; 0x69; 0xd4; 0xf7; 0x64;
|
|
0xfa; 0x86; 0x8c; 0x94; 0x96; 0x41; 0x14; 0xf1; 0x6e; 0x6f; 0x09; 0x21; 0x2b; 0xd5; 0xfa; 0x52;
|
|
0x56; 0xf4; 0x44; 0x25; 0x29; 0xb2; 0x51; 0x4e; 0x57; 0xd7; 0x8b; 0xcb; 0x70; 0x3b; 0x94; 0x4f;
|
|
0x2b; 0xe2; 0xa7; 0xfc; 0xaa; 0x09; 0xd0; 0x82; 0x9e; 0xa8; 0x17; 0xbe; 0x84; 0xf0; 0x1a; 0xae;
|
|
0xe1; 0x97; 0x14; 0x7b; 0x74; 0xd4; 0x12; 0xf8; 0x96; 0xbe; 0xa9; 0x2e; 0xdd; 0xbe; 0x28; 0xcd;
|
|
0xe8; 0x9f; 0x67; 0x31; 0x98; 0xcb; 0x74; 0xae; 0xd4; 0x50; 0xa5; 0x77; 0xc4; 0xc1; 0x39; 0x9c;
|
|
0xcd; 0xc2; 0x8a; 0xfe; 0xe2; 0x77; 0x1c; 0x09; 0x75; 0x3e; 0xf7; 0x96; 0x6a; 0x92; 0x96; 0x06;
|
|
0x1e; 0x8d; 0x22; 0xdd; 0x58; 0xfe; 0x3d; 0x84; 0x56; 0x09; 0x17; 0xe2; 0x50; 0xb1; 0xf6; 0x61;
|
|
0x54; 0x6e; 0x5e; 0x94; 0xca; 0xf0; 0x40; 0x68; 0x84; 0xeb; 0xc1; 0x0c; 0x43; 0x3e; 0xbc; 0xb3;
|
|
0x0e; 0x81; 0x4d; 0xc0; 0x21; 0xdb; 0x97; 0xc6; 0x8b; 0x27; 0x10; 0x5c; 0xae; 0xe3; 0x6e; 0x66;
|
|
0x85; 0xaf; 0xff; 0x19; 0x8b; 0xf8; 0xd5; 0x93; 0x4b; 0xd2; 0xd8; 0x7c; 0x64; 0x04; 0xed; 0xce;
|
|
0x88; 0xce; 0xb8; 0x2c; 0x4f; 0xe0; 0xf5; 0x0d; 0x3a; 0xeb; 0x78; 0xee; 0xcf; 0x1a; 0xd1; 0x02;
|
|
0xcf; 0x0f; 0x68; 0xed; 0xd2; 0xca; 0xf6
|
|
|
|
] ; [
|
|
|
|
0x01; 0x00; 0xf6; 0x42; 0x57; 0xb7; 0x08; 0x7f; 0x08; 0x17; 0x72; 0xa2; 0xba; 0xd6; 0xa9; 0x42;
|
|
0xf3; 0x05; 0xe8; 0xf9; 0x53; 0x11; 0x39; 0x4f; 0xb6; 0xf1; 0x6e; 0xb9; 0x4b; 0x38; 0x20; 0xda;
|
|
0x01; 0xa7; 0x56; 0xa3; 0x14; 0xe9; 0x8f; 0x40; 0x55; 0xf3; 0xd0; 0x07; 0xc6; 0xcb; 0x43; 0xa9;
|
|
0x94; 0xad; 0xf7; 0x4c; 0x64; 0x86; 0x49; 0xf8; 0x0c; 0x83; 0xbd; 0x65; 0xe9; 0x17; 0xd4; 0xa1;
|
|
0xd3; 0x50; 0xf8; 0xf5; 0x59; 0x5f; 0xdc; 0x76; 0x52; 0x4f; 0x3d; 0x3d; 0x8d; 0xdb; 0xce; 0x99;
|
|
0xe1; 0x57; 0x92; 0x59; 0xcd; 0xfd; 0xb8; 0xae; 0x74; 0x4f; 0xc5; 0xfc; 0x76; 0xbc; 0x83; 0xc5;
|
|
0x47; 0x30; 0x61; 0xce; 0x7c; 0xc9; 0x66; 0xff; 0x15; 0xf9; 0xbb; 0xfd; 0x91; 0x5e; 0xc7; 0x01;
|
|
0xaa; 0xd3; 0x5b; 0x9e; 0x8d; 0xa0; 0xa5; 0x72; 0x3a; 0xd4; 0x1a; 0xf0; 0xbf; 0x46; 0x00; 0x58;
|
|
0x2b; 0xe5; 0xf4; 0x88; 0xfd; 0x58; 0x4e; 0x49; 0xdb; 0xcd; 0x20; 0xb4; 0x9d; 0xe4; 0x91; 0x07;
|
|
0x36; 0x6b; 0x33; 0x6c; 0x38; 0x0d; 0x45; 0x1d; 0x0f; 0x7c; 0x88; 0xb3; 0x1c; 0x7c; 0x5b; 0x2d;
|
|
0x8e; 0xf6; 0xf3; 0xc9; 0x23; 0xc0; 0x43; 0xf0; 0xa5; 0x5b; 0x18; 0x8d; 0x8e; 0xbb; 0x55; 0x8c;
|
|
0xb8; 0x5d; 0x38; 0xd3; 0x34; 0xfd; 0x7c; 0x17; 0x57; 0x43; 0xa3; 0x1d; 0x18; 0x6c; 0xde; 0x33;
|
|
0x21; 0x2c; 0xb5; 0x2a; 0xff; 0x3c; 0xe1; 0xb1; 0x29; 0x40; 0x18; 0x11; 0x8d; 0x7c; 0x84; 0xa7;
|
|
0x0a; 0x72; 0xd6; 0x86; 0xc4; 0x03; 0x19; 0xc8; 0x07; 0x29; 0x7a; 0xca; 0x95; 0x0c; 0xd9; 0x96;
|
|
0x9f; 0xab; 0xd0; 0x0a; 0x50; 0x9b; 0x02; 0x46; 0xd3; 0x08; 0x3d; 0x66; 0xa4; 0x5d; 0x41; 0x9f;
|
|
0x9c; 0x7c; 0xbd; 0x89; 0x4b; 0x22; 0x19; 0x26; 0xba; 0xab; 0xa2; 0x5e; 0xc3; 0x55; 0xe9; 0x32;
|
|
0x0b; 0x3b; 0x00; 0x01; 0x02; 0x01; 0x00; 0x7d; 0x17; 0xb3; 0xc8; 0x40; 0xcd; 0xa0; 0x75; 0x5b;
|
|
0xa4; 0xe1; 0xed; 0xef; 0xd3; 0xed; 0x74; 0x8e; 0x3c; 0xd5; 0x37; 0x17; 0xe2; 0x2b; 0x3d; 0x4e;
|
|
0x20; 0x2b; 0xf4; 0xdc; 0x83; 0x5a; 0x8b; 0x86; 0xed; 0x7b; 0xa3; 0x8d; 0xfa; 0xb4; 0x3a; 0x72;
|
|
0x95; 0xca; 0x5a; 0xd9; 0xf9; 0x27; 0x08; 0x10; 0xec; 0x9b; 0x9b; 0x86; 0xad; 0xbe; 0xfe; 0x77;
|
|
0xcb; 0xf7; 0xf6; 0x03; 0x35; 0x9f; 0x16; 0x97; 0x72; 0x6e; 0x92; 0xb8; 0xd7; 0xd3; 0x09; 0x58;
|
|
0x1d; 0xd0; 0x8a; 0xeb; 0x16; 0xa9; 0x71; 0x9a; 0xf8; 0xb6; 0xc8; 0xcc; 0x63; 0x52; 0x8d; 0x8f;
|
|
0x93; 0x23; 0x1b; 0xa8; 0xfe; 0x3c; 0x17; 0x9b; 0xe6; 0x64; 0x3d; 0xab; 0x57; 0x0c; 0xb1; 0x17;
|
|
0x71; 0xc1; 0x40; 0x72; 0xc9; 0x42; 0x43; 0x68; 0x39; 0xa5; 0x7f; 0x63; 0x03; 0x7e; 0xff; 0xd6;
|
|
0x11; 0xe1; 0x1a; 0xe1; 0xd9; 0x2f; 0xa3; 0x4a; 0x93; 0x4f; 0x09; 0x79; 0xbd; 0x78; 0xf3; 0xf4;
|
|
0xe1; 0x44; 0x7d; 0xaf; 0x7b; 0xd7; 0x82; 0x11; 0xc9; 0xd9; 0x91; 0x01; 0x9a; 0x2c; 0xcb; 0xd1;
|
|
0x41; 0xcc; 0xf5; 0x5c; 0x9f; 0xb5; 0xa2; 0x7c; 0x8b; 0x2d; 0xf6; 0x16; 0xab; 0x68; 0x99; 0x99;
|
|
0x33; 0x80; 0x72; 0xee; 0xce; 0x13; 0xea; 0x3f; 0x62; 0xca; 0xfc; 0x56; 0xd6; 0x6d; 0xa2; 0x8a;
|
|
0xfe; 0xdf; 0x71; 0x7a; 0x82; 0x39; 0xd1; 0x5d; 0x09; 0x27; 0x26; 0x26; 0x5c; 0x6e; 0xab; 0x28;
|
|
0xb2; 0xa1; 0x6f; 0xb9; 0x08; 0x25; 0xd0; 0xa1; 0x68; 0x25; 0x31; 0xae; 0x4a; 0xef; 0x62; 0x99;
|
|
0xb6; 0x4d; 0xd2; 0xa9; 0x27; 0x20; 0x99; 0xc4; 0xdc; 0x44; 0x81; 0x0c; 0xc0; 0xfe; 0xa9; 0xab;
|
|
0xc9; 0xe8; 0x26; 0x00; 0x60; 0x40; 0x0e; 0xb4; 0x07; 0xfc; 0xcf; 0x7f; 0x93; 0xc5; 0x20; 0x10;
|
|
0x49; 0x72; 0xd2; 0x9b; 0x4b; 0x70; 0x03
|
|
|
|
] ; [
|
|
|
|
0x01; 0x00; 0xf6; 0x42; 0x57; 0xb7; 0x08; 0x7f; 0x08; 0x17; 0x72; 0xa2; 0xba; 0xd6; 0xa9; 0x42;
|
|
0xf3; 0x05; 0xe8; 0xf9; 0x53; 0x11; 0x39; 0x4f; 0xb6; 0xf1; 0x6e; 0xb9; 0x4b; 0x38; 0x20; 0xda;
|
|
0x01; 0xa7; 0x56; 0xa3; 0x14; 0xe9; 0x8f; 0x40; 0x55; 0xf3; 0xd0; 0x07; 0xc6; 0xcb; 0x43; 0xa9;
|
|
0x94; 0xad; 0xf7; 0x4c; 0x64; 0x86; 0x49; 0xf8; 0x0c; 0x83; 0xbd; 0x65; 0xe9; 0x17; 0xd4; 0xa1;
|
|
0xd3; 0x50; 0xf8; 0xf5; 0x59; 0x5f; 0xdc; 0x76; 0x52; 0x4f; 0x3d; 0x3d; 0x8d; 0xdb; 0xce; 0x99;
|
|
0xe1; 0x57; 0x92; 0x59; 0xcd; 0xfd; 0xb8; 0xae; 0x74; 0x4f; 0xc5; 0xfc; 0x76; 0xbc; 0x83; 0xc5;
|
|
0x47; 0x30; 0x61; 0xce; 0x7c; 0xc9; 0x66; 0xff; 0x15; 0xf9; 0xbb; 0xfd; 0x91; 0x5e; 0xc7; 0x01;
|
|
0xaa; 0xd3; 0x5b; 0x9e; 0x8d; 0xa0; 0xa5; 0x72; 0x3a; 0xd4; 0x1a; 0xf0; 0xbf; 0x46; 0x00; 0x58;
|
|
0x2b; 0xe5; 0xf4; 0x88; 0xfd; 0x58; 0x4e; 0x49; 0xdb; 0xcd; 0x20; 0xb4; 0x9d; 0xe4; 0x91; 0x07;
|
|
0x36; 0x6b; 0x33; 0x6c; 0x38; 0x0d; 0x45; 0x1d; 0x0f; 0x7c; 0x88; 0xb3; 0x1c; 0x7c; 0x5b; 0x2d;
|
|
0x8e; 0xf6; 0xf3; 0xc9; 0x23; 0xc0; 0x43; 0xf0; 0xa5; 0x5b; 0x18; 0x8d; 0x8e; 0xbb; 0x55; 0x8c;
|
|
0xb8; 0x5d; 0x38; 0xd3; 0x34; 0xfd; 0x7c; 0x17; 0x57; 0x43; 0xa3; 0x1d; 0x18; 0x6c; 0xde; 0x33;
|
|
0x21; 0x2c; 0xb5; 0x2a; 0xff; 0x3c; 0xe1; 0xb1; 0x29; 0x40; 0x18; 0x11; 0x8d; 0x7c; 0x84; 0xa7;
|
|
0x0a; 0x72; 0xd6; 0x86; 0xc4; 0x03; 0x19; 0xc8; 0x07; 0x29; 0x7a; 0xca; 0x95; 0x0c; 0xd9; 0x96;
|
|
0x9f; 0xab; 0xd0; 0x0a; 0x50; 0x9b; 0x02; 0x46; 0xd3; 0x08; 0x3d; 0x66; 0xa4; 0x5d; 0x41; 0x9f;
|
|
0x9c; 0x7c; 0xbd; 0x89; 0x4b; 0x22; 0x19; 0x26; 0xba; 0xab; 0xa2; 0x5e; 0xc3; 0x55; 0xe9; 0x32;
|
|
0x0b; 0x3b; 0x00; 0x01; 0x02; 0x01; 0x00; 0x4e; 0x72; 0x1e; 0x54; 0x1d; 0x3b; 0x3c; 0xad; 0xc7;
|
|
0x42; 0xf4; 0x2b; 0xcc; 0xce; 0xc9; 0x71; 0x4a; 0x85; 0xa1; 0x21; 0xda; 0x81; 0x40; 0x6a; 0xeb;
|
|
0x8a; 0x0a; 0x0f; 0xca; 0x73; 0x32; 0x5f; 0xa9; 0x5c; 0x24; 0x21; 0x1d; 0x1d; 0xd6; 0x10; 0xe0;
|
|
0x7f; 0x9e; 0xc4; 0x86; 0x2f; 0xa3; 0xcc; 0xc2; 0x60; 0x5d; 0xed; 0x7f; 0x7d; 0xb7; 0xa2; 0x96;
|
|
0x4f; 0xe6; 0x81; 0x1b; 0x29; 0xf9; 0xf4; 0xc1; 0x00; 0x46; 0x68; 0x4d; 0x72; 0x0e; 0x36; 0x21;
|
|
0xc3; 0x46; 0xf2; 0x81; 0x83; 0xed; 0x30; 0x89; 0x3f; 0xd8; 0x98; 0x39; 0xe5; 0x46; 0x90; 0xeb;
|
|
0x68; 0xe6; 0x3b; 0x8f; 0xc5; 0xd3; 0xa7; 0xfe; 0x87; 0xd7; 0x14; 0x33; 0x5b; 0x70; 0x82; 0x82;
|
|
0x57; 0x2f; 0xd8; 0xb2; 0x91; 0xc3; 0xe5; 0x19; 0x15; 0x5b; 0x76; 0xe6; 0x94; 0x1a; 0xe9; 0x11;
|
|
0x2c; 0xa5; 0x57; 0x55; 0xf0; 0x20; 0x36; 0xc9; 0xe1; 0x32; 0x94; 0x26; 0x47; 0xb8; 0x10; 0x40;
|
|
0xc0; 0x47; 0xf6; 0x66; 0x53; 0x49; 0xe3; 0x85; 0xe1; 0x0e; 0x1e; 0xba; 0xc0; 0xb8; 0x97; 0x8b;
|
|
0x16; 0x8e; 0x48; 0x71; 0xdd; 0x88; 0x3a; 0x8b; 0x21; 0x89; 0xeb; 0x28; 0x8d; 0xaa; 0x97; 0xcf;
|
|
0x4a; 0x45; 0xa4; 0xb8; 0x7d; 0x0f; 0x1e; 0x29; 0xc1; 0xe2; 0xc3; 0x75; 0x43; 0xb5; 0xbf; 0xcf;
|
|
0x14; 0xa4; 0xea; 0x3e; 0xe5; 0x94; 0x0c; 0x32; 0x8a; 0x91; 0xcb; 0x47; 0x7f; 0x23; 0x5b; 0xe9;
|
|
0x79; 0x96; 0x7c; 0xdb; 0xbc; 0x32; 0xce; 0x96; 0xb5; 0x34; 0x68; 0x94; 0xbf; 0x4f; 0xd7; 0x16;
|
|
0x74; 0x4c; 0x52; 0xf2; 0x04; 0xfb; 0x6a; 0xe6; 0xb9; 0x07; 0x7c; 0x8f; 0x62; 0xdf; 0x13; 0xb7;
|
|
0x3e; 0xd6; 0x85; 0x12; 0x46; 0xfd; 0xb8; 0x2b; 0x30; 0x5e; 0x16; 0x25; 0x8e; 0x2a; 0x20; 0x01;
|
|
0x07; 0xe8; 0x5f; 0x0d; 0x77; 0x08; 0xd5
|
|
|
|
] ; [
|
|
|
|
0x00; 0x80; 0xbb; 0xbc; 0x2d; 0xca; 0xd8; 0x46; 0x74; 0x90; 0x7c; 0x43; 0xfc; 0xf5; 0x80; 0xe9;
|
|
0xcf; 0xdb; 0xd9; 0x58; 0xa3; 0xf5; 0x68; 0xb4; 0x2d; 0x4b; 0x08; 0xee; 0xd4; 0xeb; 0x0f; 0xb3;
|
|
0x50; 0x4c; 0x6c; 0x03; 0x02; 0x76; 0xe7; 0x10; 0x80; 0x0c; 0x5c; 0xcb; 0xba; 0xa8; 0x92; 0x26;
|
|
0x14; 0xc5; 0xbe; 0xec; 0xa5; 0x65; 0xa5; 0xfd; 0xf1; 0xd2; 0x87; 0xa2; 0xbc; 0x04; 0x9b; 0xe6;
|
|
0x77; 0x80; 0x60; 0xe9; 0x1a; 0x92; 0xa7; 0x57; 0xe3; 0x04; 0x8f; 0x68; 0xb0; 0x76; 0xf7; 0xd3;
|
|
0x6c; 0xc8; 0xf2; 0x9b; 0xa5; 0xdf; 0x81; 0xdc; 0x2c; 0xa7; 0x25; 0xec; 0xe6; 0x62; 0x70; 0xcc;
|
|
0x9a; 0x50; 0x35; 0xd8; 0xce; 0xce; 0xef; 0x9e; 0xa0; 0x27; 0x4a; 0x63; 0xab; 0x1e; 0x58; 0xfa;
|
|
0xfd; 0x49; 0x88; 0xd0; 0xf6; 0x5d; 0x14; 0x67; 0x57; 0xda; 0x07; 0x1d; 0xf0; 0x45; 0xcf; 0xe1;
|
|
0x6b; 0x9b; 0x00; 0x01; 0x02; 0x00; 0x80; 0x4a; 0x2d; 0x33; 0x76; 0x4d; 0x32; 0x70; 0xf1; 0x94;
|
|
0x1a; 0xc1; 0x35; 0x63; 0x97; 0x62; 0xca; 0xcc; 0xd6; 0x2d; 0xfd; 0x23; 0x2d; 0x3a; 0x71; 0x03;
|
|
0xc4; 0x9d; 0x42; 0x93; 0x78; 0x8c; 0x32; 0xc4; 0x8b; 0x0d; 0xad; 0xdd; 0xe2; 0x30; 0x96; 0xf1;
|
|
0xb9; 0xef; 0x16; 0x72; 0x2e; 0x6d; 0x1f; 0xb9; 0x92; 0x5d; 0x17; 0xc5; 0x0f; 0x2b; 0x07; 0xc8;
|
|
0xae; 0xf7; 0x60; 0x3d; 0x53; 0x62; 0x2e; 0xb5; 0xe3; 0x0b; 0x20; 0x67; 0xb1; 0xdf; 0x57; 0x14;
|
|
0x59; 0xff; 0xca; 0xe6; 0x72; 0x5d; 0xd7; 0x1a; 0x98; 0x1e; 0xa1; 0x2b; 0xce; 0xf7; 0x9e; 0xcf;
|
|
0x45; 0x41; 0xa4; 0xa8; 0xdc; 0x98; 0xf7; 0x0d; 0x98; 0xf3; 0x47; 0x7a; 0xe3; 0x25; 0x41; 0x02;
|
|
0x31; 0x26; 0x1f; 0x4d; 0xbb; 0x36; 0xcd; 0xcc; 0x64; 0x74; 0xae; 0xb5; 0x19; 0xd9; 0xa3; 0xd6;
|
|
0x89; 0x6f; 0x9d; 0x02; 0xd4; 0x52; 0xdd
|
|
|
|
] ; [
|
|
|
|
0x00; 0x80; 0xbb; 0xbc; 0x2d; 0xca; 0xd8; 0x46; 0x74; 0x90; 0x7c; 0x43; 0xfc; 0xf5; 0x80; 0xe9;
|
|
0xcf; 0xdb; 0xd9; 0x58; 0xa3; 0xf5; 0x68; 0xb4; 0x2d; 0x4b; 0x08; 0xee; 0xd4; 0xeb; 0x0f; 0xb3;
|
|
0x50; 0x4c; 0x6c; 0x03; 0x02; 0x76; 0xe7; 0x10; 0x80; 0x0c; 0x5c; 0xcb; 0xba; 0xa8; 0x92; 0x26;
|
|
0x14; 0xc5; 0xbe; 0xec; 0xa5; 0x65; 0xa5; 0xfd; 0xf1; 0xd2; 0x87; 0xa2; 0xbc; 0x04; 0x9b; 0xe6;
|
|
0x77; 0x80; 0x60; 0xe9; 0x1a; 0x92; 0xa7; 0x57; 0xe3; 0x04; 0x8f; 0x68; 0xb0; 0x76; 0xf7; 0xd3;
|
|
0x6c; 0xc8; 0xf2; 0x9b; 0xa5; 0xdf; 0x81; 0xdc; 0x2c; 0xa7; 0x25; 0xec; 0xe6; 0x62; 0x70; 0xcc;
|
|
0x9a; 0x50; 0x35; 0xd8; 0xce; 0xce; 0xef; 0x9e; 0xa0; 0x27; 0x4a; 0x63; 0xab; 0x1e; 0x58; 0xfa;
|
|
0xfd; 0x49; 0x88; 0xd0; 0xf6; 0x5d; 0x14; 0x67; 0x57; 0xda; 0x07; 0x1d; 0xf0; 0x45; 0xcf; 0xe1;
|
|
0x6b; 0x9b; 0x00; 0x01; 0x02; 0x00; 0x80; 0x0c; 0x00; 0xda; 0x79; 0x24; 0x02; 0x33; 0x29; 0xf5;
|
|
0x81; 0xc4; 0x67; 0x5a; 0x03; 0x2b; 0xbf; 0xaf; 0xd6; 0x76; 0xdd; 0x26; 0xdc; 0xd4; 0x38; 0x35;
|
|
0xc1; 0x7f; 0x3a; 0x9e; 0x02; 0x31; 0x73; 0x17; 0xf2; 0x68; 0x5f; 0xd4; 0xf0; 0x6a; 0x97; 0x51;
|
|
0xb2; 0x42; 0xb4; 0x8d; 0x35; 0x89; 0x29; 0x96; 0x27; 0xf7; 0x89; 0x59; 0x9b; 0x93; 0xb0; 0x4f;
|
|
0x85; 0x28; 0xfa; 0x10; 0xe7; 0x15; 0x09; 0x71; 0x10; 0x36; 0x01; 0x60; 0xcf; 0xe0; 0x37; 0xbb;
|
|
0xfd; 0xcd; 0xc3; 0x9e; 0x27; 0xf8; 0xf4; 0x90; 0xcd; 0x87; 0xd9; 0x5c; 0x92; 0x08; 0x44; 0x32;
|
|
0xb5; 0x2b; 0xe2; 0xa5; 0x72; 0xde; 0x97; 0x0c; 0x4f; 0xc7; 0x60; 0x8d; 0xe7; 0xcf; 0x64; 0xba;
|
|
0x7e; 0x0d; 0x0f; 0x91; 0x58; 0x0d; 0x47; 0x6c; 0x3f; 0xb8; 0x4f; 0xb9; 0x02; 0xc5; 0xcc; 0x72;
|
|
0x33; 0x33; 0xde; 0xf2; 0x8f; 0x6b; 0x8c
|
|
|
|
] ; [
|
|
|
|
0x00; 0x80; 0xbb; 0xbc; 0x2d; 0xca; 0xd8; 0x46; 0x74; 0x90; 0x7c; 0x43; 0xfc; 0xf5; 0x80; 0xe9;
|
|
0xcf; 0xdb; 0xd9; 0x58; 0xa3; 0xf5; 0x68; 0xb4; 0x2d; 0x4b; 0x08; 0xee; 0xd4; 0xeb; 0x0f; 0xb3;
|
|
0x50; 0x4c; 0x6c; 0x03; 0x02; 0x76; 0xe7; 0x10; 0x80; 0x0c; 0x5c; 0xcb; 0xba; 0xa8; 0x92; 0x26;
|
|
0x14; 0xc5; 0xbe; 0xec; 0xa5; 0x65; 0xa5; 0xfd; 0xf1; 0xd2; 0x87; 0xa2; 0xbc; 0x04; 0x9b; 0xe6;
|
|
0x77; 0x80; 0x60; 0xe9; 0x1a; 0x92; 0xa7; 0x57; 0xe3; 0x04; 0x8f; 0x68; 0xb0; 0x76; 0xf7; 0xd3;
|
|
0x6c; 0xc8; 0xf2; 0x9b; 0xa5; 0xdf; 0x81; 0xdc; 0x2c; 0xa7; 0x25; 0xec; 0xe6; 0x62; 0x70; 0xcc;
|
|
0x9a; 0x50; 0x35; 0xd8; 0xce; 0xce; 0xef; 0x9e; 0xa0; 0x27; 0x4a; 0x63; 0xab; 0x1e; 0x58; 0xfa;
|
|
0xfd; 0x49; 0x88; 0xd0; 0xf6; 0x5d; 0x14; 0x67; 0x57; 0xda; 0x07; 0x1d; 0xf0; 0x45; 0xcf; 0xe1;
|
|
0x6b; 0x9b; 0x00; 0x01; 0x02; 0x00; 0x80; 0x7e; 0x8f; 0xc7; 0x38; 0x8a; 0xf8; 0xdd; 0x7a; 0xb2;
|
|
0x0a; 0x07; 0xdd; 0x00; 0xfb; 0x63; 0x58; 0x85; 0xde; 0xc7; 0x6a; 0xe0; 0x0a; 0x51; 0x06; 0x7b;
|
|
0x3e; 0xfd; 0xac; 0xfe; 0xe2; 0x7a; 0xf7; 0x3f; 0xcb; 0xb2; 0xfc; 0x30; 0x45; 0xfa; 0x2b; 0x74;
|
|
0xb7; 0x2f; 0xf5; 0xf9; 0x52; 0xef; 0x93; 0x3f; 0xdb; 0x7e; 0x00; 0xe7; 0xd4; 0xa4; 0x20; 0xbe;
|
|
0x2d; 0x6f; 0xde; 0x28; 0x6c; 0x74; 0x8b; 0x23; 0xc6; 0x14; 0xdc; 0xb9; 0x24; 0xca; 0x87; 0xe0;
|
|
0xe9; 0x5e; 0xb0; 0x4e; 0x55; 0x74; 0x54; 0x4d; 0x8a; 0x21; 0x26; 0x62; 0x28; 0x2a; 0xe6; 0xb1;
|
|
0x29; 0xdc; 0xcd; 0xda; 0x27; 0xc4; 0xcd; 0x8d; 0xd3; 0x47; 0x40; 0x05; 0x1f; 0xbb; 0x80; 0xef;
|
|
0xa0; 0xf4; 0x5a; 0x22; 0x7c; 0x4a; 0xe5; 0xb0; 0x59; 0x68; 0xa5; 0x3e; 0xbb; 0x6f; 0x62; 0x30;
|
|
0x20; 0xc1; 0x43; 0x91; 0xd2; 0x79; 0xf5
|
|
|
|
] ; [
|
|
|
|
0x00; 0x80; 0xbb; 0xbc; 0x2d; 0xca; 0xd8; 0x46; 0x74; 0x90; 0x7c; 0x43; 0xfc; 0xf5; 0x80; 0xe9;
|
|
0xcf; 0xdb; 0xd9; 0x58; 0xa3; 0xf5; 0x68; 0xb4; 0x2d; 0x4b; 0x08; 0xee; 0xd4; 0xeb; 0x0f; 0xb3;
|
|
0x50; 0x4c; 0x6c; 0x03; 0x02; 0x76; 0xe7; 0x10; 0x80; 0x0c; 0x5c; 0xcb; 0xba; 0xa8; 0x92; 0x26;
|
|
0x14; 0xc5; 0xbe; 0xec; 0xa5; 0x65; 0xa5; 0xfd; 0xf1; 0xd2; 0x87; 0xa2; 0xbc; 0x04; 0x9b; 0xe6;
|
|
0x77; 0x80; 0x60; 0xe9; 0x1a; 0x92; 0xa7; 0x57; 0xe3; 0x04; 0x8f; 0x68; 0xb0; 0x76; 0xf7; 0xd3;
|
|
0x6c; 0xc8; 0xf2; 0x9b; 0xa5; 0xdf; 0x81; 0xdc; 0x2c; 0xa7; 0x25; 0xec; 0xe6; 0x62; 0x70; 0xcc;
|
|
0x9a; 0x50; 0x35; 0xd8; 0xce; 0xce; 0xef; 0x9e; 0xa0; 0x27; 0x4a; 0x63; 0xab; 0x1e; 0x58; 0xfa;
|
|
0xfd; 0x49; 0x88; 0xd0; 0xf6; 0x5d; 0x14; 0x67; 0x57; 0xda; 0x07; 0x1d; 0xf0; 0x45; 0xcf; 0xe1;
|
|
0x6b; 0x9b; 0x00; 0x01; 0x02; 0x00; 0x80; 0x73; 0x47; 0x2a; 0xde; 0x22; 0x94; 0x39; 0x77; 0x46;
|
|
0x25; 0xe2; 0x2d; 0x4f; 0x8d; 0x9e; 0x99; 0x10; 0xa2; 0x1a; 0xd6; 0xf1; 0xe6; 0x25; 0x7f; 0x76;
|
|
0xbe; 0x87; 0xf6; 0xff; 0xce; 0x7d; 0xd7; 0xd2; 0xee; 0xc5; 0x01; 0x0b; 0x14; 0xa1; 0xda; 0x0a;
|
|
0x56; 0x4f; 0xff; 0x8c; 0xdd; 0x84; 0x7c; 0xd8; 0xcc; 0xa8; 0xc1; 0xc3; 0xa1; 0xbf; 0x15; 0x38;
|
|
0xc9; 0x4f; 0xc3; 0x7b; 0xde; 0xf3; 0x37; 0xf3; 0x2f; 0x8e; 0x72; 0x4d; 0xfb; 0x69; 0xc6; 0x4d;
|
|
0xe4; 0x84; 0x46; 0x64; 0xe1; 0xb5; 0x02; 0xe8; 0xf9; 0xbd; 0x94; 0xbf; 0x40; 0x5e; 0x1f; 0xb6;
|
|
0x39; 0xb9; 0x0b; 0x1a; 0x79; 0xf1; 0xa6; 0x3d; 0xee; 0x7a; 0x02; 0xff; 0x62; 0x0d; 0xc6; 0x1e;
|
|
0xfb; 0x5a; 0xcd; 0x36; 0xee; 0x6d; 0x67; 0x5f; 0x81; 0xf4; 0xde; 0x62; 0x15; 0xb6; 0x9a; 0xf3;
|
|
0x24; 0xa2; 0xb3; 0x95; 0xdf; 0x6a; 0xa2
|
|
|
|
]
|
|
]
|
|
|
|
let good_dh_param_parser xs _ =
|
|
let buf = list_to_cstruct xs in
|
|
match Reader.parse_dh_parameters buf with
|
|
| Error _ -> assert_failure "dh params parser broken"
|
|
| Ok (_, _, rst) -> assert_equal 0 (String.length rst)
|
|
|
|
let good_dh_params_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse good dh_param " ^ string_of_int i >:: good_dh_param_parser f)
|
|
good_dhparams
|
|
|
|
let bad_dh_param_parser buf _ =
|
|
match Reader.parse_dh_parameters buf with
|
|
| Error _ -> ()
|
|
| Ok (_, _, rst) ->
|
|
if String.length rst = 0 then
|
|
assert_failure "dh params parser broken"
|
|
|
|
let bad_dh_params_tests =
|
|
let param = list_to_cstruct (List.hd good_dhparams) in
|
|
let l = String.length param in
|
|
let bad_params =
|
|
[
|
|
param ^ String.make 1 '\x00' ;
|
|
String.sub param 2 20 ;
|
|
String.sub param 0 20 ;
|
|
list_to_cstruct [2] ^ param ;
|
|
list_to_cstruct [0] ^ param ;
|
|
list_to_cstruct [0; 1] ^ param ;
|
|
list_to_cstruct [0; 0] ^ param ;
|
|
list_to_cstruct [0xff; 0xff] ^ param ;
|
|
list_to_cstruct [0; 0xff] ^ param ;
|
|
String.sub param 1 (String.length param - 1);
|
|
String.sub param 0 (pred l)
|
|
]
|
|
in
|
|
let lastparam = list_to_cstruct (List.nth good_dhparams 5) in
|
|
let l = String.length lastparam in
|
|
let more_bad =
|
|
[
|
|
String.sub lastparam 0 130 ^ list_to_cstruct [0 ; 5 ; 1] ^ String.sub lastparam 130 (l - 130) ;
|
|
String.sub lastparam 0 133 ^ list_to_cstruct [0 ; 5 ; 1] ^ String.sub lastparam 133 (l - 133)
|
|
]
|
|
in
|
|
List.mapi
|
|
(fun i f -> "Parse bad dh_param " ^ string_of_int i >:: bad_dh_param_parser f)
|
|
(bad_params @ more_bad)
|
|
|
|
let good_digitally_signed_1_2 = [
|
|
[
|
|
|
|
0x06; 0x01; 0x01; 0x00; 0x30; 0x92; 0xf4; 0x70; 0xb1; 0x02; 0x0a; 0x51; 0xb6; 0x0e; 0x49; 0x1e;
|
|
0x16; 0x6d; 0x9f; 0xb5; 0xfe; 0x73; 0x5e; 0x2f; 0x18; 0xbc; 0xf7; 0x87; 0xab; 0x2c; 0xad; 0x7e;
|
|
0x54; 0x40; 0x99; 0x30; 0xa2; 0x2e; 0x55; 0xe0; 0xf3; 0x05; 0xe1; 0x81; 0x67; 0x78; 0x49; 0x29;
|
|
0xe6; 0x5d; 0x2c; 0x64; 0x57; 0xeb; 0x8c; 0x68; 0x24; 0xe1; 0xba; 0x69; 0x50; 0xc7; 0xda; 0x73;
|
|
0x9a; 0x02; 0xe4; 0xbc; 0xc0; 0x76; 0x65; 0xaf; 0x31; 0x93; 0xbc; 0x2f; 0x5c; 0xdb; 0xa5; 0x1d;
|
|
0x4e; 0xb2; 0x75; 0x0d; 0xb4; 0x22; 0x23; 0x05; 0x5b; 0x8c; 0xa0; 0x14; 0x4c; 0x64; 0xb9; 0x91;
|
|
0xa6; 0x22; 0xc2; 0x49; 0xaa; 0x41; 0xb0; 0x42; 0x04; 0x2a; 0x03; 0x03; 0x1e; 0x62; 0x74; 0x64;
|
|
0x98; 0xaf; 0xcf; 0x9a; 0xd0; 0x22; 0xa8; 0xf3; 0xa5; 0x0a; 0x0d; 0xe9; 0xdc; 0xe2; 0x89; 0xe5;
|
|
0x54; 0xa2; 0x28; 0x25; 0x69; 0x4e; 0xe5; 0xc3; 0xa6; 0x23; 0xd2; 0xeb; 0x67; 0x8a; 0xb8; 0x4a;
|
|
0xac; 0x19; 0x1d; 0x00; 0xa9; 0xec; 0xca; 0xeb; 0xf9; 0x79; 0x2c; 0x7c; 0x6e; 0x31; 0x7f; 0x64;
|
|
0x64; 0xa2; 0xfb; 0x93; 0xc5; 0x91; 0xa2; 0xad; 0x8e; 0x36; 0x07; 0xe8; 0x51; 0x0b; 0x08; 0x36;
|
|
0xb7; 0x78; 0xac; 0x21; 0x3d; 0xc9; 0xfb; 0xae; 0xab; 0xe5; 0xd9; 0x9c; 0xa7; 0xee; 0x5e; 0xcb;
|
|
0xab; 0x57; 0x9d; 0x62; 0x6c; 0x2e; 0xbd; 0x6d; 0x4a; 0xd0; 0x36; 0xb1; 0xa8; 0xf1; 0x22; 0xd8;
|
|
0x97; 0x5c; 0x24; 0xb3; 0x72; 0x55; 0x20; 0x39; 0x29; 0x26; 0x51; 0x3b; 0x9c; 0x48; 0x80; 0x25;
|
|
0xa9; 0xf4; 0xc1; 0xb0; 0x57; 0xd8; 0x3f; 0x54; 0x5e; 0x99; 0x27; 0x36; 0x81; 0xcd; 0x23; 0xf6;
|
|
0xaa; 0x84; 0x98; 0xf8; 0x66; 0x79; 0xe1; 0x16; 0xb9; 0xeb; 0xc6; 0x9a; 0x86; 0x90; 0xa6; 0xa2;
|
|
0x9d; 0x0d; 0x86; 0x32
|
|
|
|
] ; [
|
|
|
|
0x06; 0x01; 0x01; 0x00; 0x8e; 0x02; 0x51; 0x93; 0x67; 0xe8; 0x68; 0xfe; 0x65; 0x61; 0xda; 0xf0;
|
|
0x25; 0x1a; 0x19; 0x5a; 0x36; 0x42; 0x11; 0xdd; 0x00; 0x2b; 0xf2; 0x38; 0x98; 0xef; 0x94; 0x42;
|
|
0xac; 0x3d; 0x82; 0xc7; 0x85; 0x72; 0xf3; 0xb7; 0x73; 0x4d; 0x6b; 0x64; 0x66; 0x6a; 0x89; 0x6d;
|
|
0x95; 0x67; 0xdb; 0xb7; 0x83; 0x1e; 0xb1; 0x7c; 0xf4; 0xb9; 0x60; 0xbd; 0x91; 0x26; 0xe0; 0x4c;
|
|
0x6c; 0x92; 0xc7; 0xc4; 0x8b; 0xb5; 0x8d; 0xaf; 0xfd; 0xaa; 0xd9; 0xcc; 0x2f; 0xaf; 0x6b; 0x18;
|
|
0xf7; 0x4f; 0xcd; 0x8d; 0x54; 0xe1; 0x70; 0x5c; 0xa9; 0xec; 0x85; 0xd9; 0x7b; 0x5b; 0xa2; 0x9a;
|
|
0x55; 0xc2; 0x5a; 0x87; 0xd4; 0xbe; 0x49; 0xf2; 0x03; 0x95; 0x50; 0x5f; 0x62; 0xa7; 0x4d; 0x13;
|
|
0x29; 0xae; 0x19; 0xcc; 0x2e; 0x21; 0x9b; 0x36; 0x60; 0xc4; 0xd7; 0x5a; 0x8f; 0xe2; 0x67; 0x73;
|
|
0x22; 0x85; 0x66; 0xbb; 0x00; 0x00; 0x97; 0x10; 0xbc; 0x19; 0x16; 0xce; 0x14; 0x8e; 0x27; 0x1e;
|
|
0x79; 0x3e; 0xbd; 0xc3; 0xc9; 0x5c; 0xc2; 0xbf; 0x7b; 0x83; 0xba; 0x00; 0x20; 0x18; 0x54; 0x0b;
|
|
0x09; 0x11; 0xb3; 0x0b; 0x75; 0x7d; 0xf6; 0xc7; 0x80; 0x76; 0x25; 0x3c; 0x3b; 0xdb; 0x67; 0xc5;
|
|
0xe7; 0x77; 0x0a; 0xe1; 0xbf; 0xd9; 0xc2; 0x6c; 0xc2; 0x3f; 0x37; 0x4b; 0xcf; 0x6c; 0x64; 0x53;
|
|
0x4a; 0xf3; 0x81; 0x6d; 0xd8; 0x13; 0xce; 0xb4; 0x84; 0x42; 0x7b; 0x73; 0x85; 0x11; 0xaa; 0x0e;
|
|
0x39; 0xd8; 0x99; 0x76; 0x5e; 0xe8; 0xe0; 0xbc; 0x08; 0xe6; 0x7b; 0xba; 0xc9; 0x6e; 0xdd; 0x63;
|
|
0x38; 0xca; 0x5b; 0x8b; 0x74; 0xed; 0x52; 0x04; 0xe3; 0x64; 0xe6; 0xdc; 0xfa; 0x1d; 0x46; 0xca;
|
|
0x5d; 0xf8; 0x18; 0x3e; 0xa7; 0x39; 0x7e; 0x19; 0xb9; 0x2f; 0x87; 0x5b; 0x2a; 0x55; 0x85; 0xe5;
|
|
0x9e; 0x92; 0x6b; 0x62
|
|
|
|
] ; [
|
|
|
|
0x06; 0x01; 0x01; 0x00; 0x2b; 0x5b; 0x89; 0xfa; 0x67; 0x4b; 0x58; 0x45; 0xd4; 0x8f; 0x22; 0x4b;
|
|
0x53; 0x3b; 0x92; 0x2b; 0x37; 0x18; 0xcd; 0x05; 0xda; 0xb5; 0x85; 0x11; 0x23; 0x12; 0xdc; 0x18;
|
|
0xb5; 0x9f; 0xb0; 0x45; 0x16; 0xf3; 0x1c; 0xf8; 0x93; 0xb8; 0x8c; 0x37; 0xd5; 0x60; 0x68; 0xee;
|
|
0x75; 0x53; 0xa9; 0x5f; 0x22; 0x4e; 0x01; 0x2b; 0xb3; 0xb6; 0x3e; 0x29; 0xba; 0x2c; 0xef; 0xa8;
|
|
0x3f; 0x07; 0xa3; 0xfb; 0x91; 0xf8; 0x2c; 0x8d; 0x23; 0xe3; 0x8d; 0x26; 0x26; 0x11; 0xa4; 0xd9;
|
|
0xa0; 0xa4; 0x10; 0x11; 0x40; 0x1a; 0xad; 0xc3; 0xa4; 0x99; 0x5a; 0xae; 0x97; 0xae; 0x9b; 0x39;
|
|
0xdc; 0x98; 0xb3; 0x34; 0xe7; 0x08; 0xb4; 0x5f; 0xae; 0xa1; 0xf7; 0x79; 0x92; 0xd3; 0x8d; 0x23;
|
|
0x47; 0xa4; 0x8d; 0xa8; 0x1a; 0x4a; 0xae; 0x10; 0xd7; 0xf8; 0xe0; 0x7a; 0xf4; 0x52; 0x5a; 0xb0;
|
|
0xc3; 0x6f; 0x5a; 0x8a; 0x94; 0x75; 0xbf; 0x27; 0xc1; 0xbb; 0xb0; 0x5c; 0x66; 0x66; 0x60; 0x0d;
|
|
0xdd; 0xa8; 0xcf; 0x1b; 0xee; 0x6f; 0x33; 0x63; 0xec; 0xaa; 0x16; 0x15; 0x3a; 0xcc; 0x72; 0x6f;
|
|
0x9e; 0xc1; 0x06; 0xf3; 0x45; 0xec; 0x7f; 0x6b; 0x17; 0xab; 0xce; 0x63; 0x15; 0x8c; 0x0e; 0x61;
|
|
0x98; 0xd9; 0xc4; 0x68; 0xba; 0x56; 0x88; 0x0a; 0x46; 0xcc; 0x0c; 0xd9; 0x09; 0xea; 0x8f; 0xdb;
|
|
0x28; 0x35; 0x16; 0xa2; 0x5d; 0xfb; 0xc2; 0x93; 0xf3; 0xa5; 0x53; 0xe4; 0x94; 0xda; 0x45; 0xa9;
|
|
0x81; 0x0c; 0x43; 0x45; 0x67; 0xef; 0x70; 0x4a; 0x06; 0x67; 0xb1; 0xb6; 0x30; 0x19; 0x16; 0xb1;
|
|
0xeb; 0x28; 0x3c; 0x8b; 0x13; 0x94; 0x1a; 0x79; 0x8c; 0x92; 0x7b; 0xe0; 0xfb; 0xea; 0xd1; 0xfc;
|
|
0x50; 0xf8; 0xb7; 0x86; 0x76; 0xa1; 0x69; 0x81; 0x3e; 0xb1; 0x88; 0xf5; 0xa7; 0x05; 0xe9; 0xe1;
|
|
0xd1; 0x9e; 0xbc; 0x15
|
|
|
|
] ; [
|
|
|
|
0x06; 0x01; 0x01; 0x00; 0x6c; 0x1b; 0xe8; 0x31; 0x7b; 0xab; 0x2b; 0x5f; 0xa0; 0x9f; 0x6d; 0x73;
|
|
0x43; 0x83; 0x67; 0xd2; 0x85; 0xae; 0x85; 0x56; 0x65; 0x6a; 0xf9; 0x82; 0xc0; 0x29; 0x48; 0x28;
|
|
0x9d; 0xd9; 0x2a; 0x23; 0xea; 0x8d; 0x0c; 0xc2; 0x9e; 0x8f; 0x84; 0xb6; 0x74; 0x5d; 0xaf; 0xdf;
|
|
0x0a; 0x39; 0x5f; 0x4a; 0x2c; 0xa0; 0xb8; 0x02; 0x20; 0xa6; 0x33; 0x3f; 0x22; 0x2b; 0x38; 0x49;
|
|
0x5f; 0x21; 0xea; 0x62; 0x1a; 0x73; 0xe4; 0x0a; 0x1f; 0xf5; 0xe0; 0x89; 0x8c; 0xb3; 0xdd; 0xf4;
|
|
0xef; 0xc8; 0x35; 0x8f; 0x60; 0xa2; 0x4c; 0x95; 0xf7; 0xcb; 0x8e; 0x1f; 0xf0; 0x15; 0xf4; 0x22;
|
|
0x01; 0x97; 0xb0; 0x59; 0x4e; 0x59; 0x40; 0x7c; 0x43; 0xdf; 0x1c; 0x35; 0x5f; 0x8d; 0xde; 0x26;
|
|
0x77; 0x0d; 0x47; 0xec; 0x84; 0x30; 0x7f; 0x0e; 0xf3; 0x17; 0x3b; 0x26; 0x8b; 0x35; 0x9d; 0xe2;
|
|
0x02; 0x49; 0x82; 0xa4; 0x4e; 0x0d; 0xb2; 0xd9; 0x5f; 0x83; 0x55; 0x8d; 0x56; 0xb2; 0x7e; 0x33;
|
|
0x11; 0x9f; 0x50; 0xfb; 0xf3; 0xaf; 0xa6; 0x96; 0x90; 0x52; 0x76; 0xea; 0xbd; 0x03; 0xde; 0x5c;
|
|
0x3a; 0xd7; 0x4f; 0x1c; 0x89; 0xe6; 0xb0; 0xa3; 0x39; 0x8a; 0xb1; 0x70; 0xb9; 0x1f; 0x2f; 0x25;
|
|
0x03; 0xe5; 0xd6; 0x87; 0x36; 0x62; 0xea; 0x4a; 0x8a; 0x60; 0xb5; 0x83; 0x20; 0x62; 0xd5; 0x58;
|
|
0x7e; 0x94; 0x19; 0x42; 0x4d; 0xc7; 0x48; 0xb2; 0xfb; 0xed; 0xfb; 0xd1; 0xc4; 0xfe; 0x7f; 0x48;
|
|
0xf9; 0xe2; 0xd4; 0x15; 0xd1; 0x2c; 0xe1; 0x73; 0x76; 0x77; 0xbf; 0x0c; 0x5a; 0xc3; 0x8b; 0xc2;
|
|
0x6a; 0xd7; 0x58; 0xce; 0xeb; 0x96; 0x58; 0x55; 0xfb; 0x35; 0x5a; 0x8d; 0x82; 0xaa; 0x2e; 0x7d;
|
|
0x0e; 0xd3; 0x8d; 0xb9; 0x6a; 0xfe; 0x02; 0xc3; 0xbc; 0xd2; 0x43; 0xe9; 0x4e; 0x72; 0xe6; 0xbd;
|
|
0xd2; 0x49; 0x63; 0xc5
|
|
|
|
] ; [
|
|
|
|
0x06; 0x01; 0x01; 0x00; 0x23; 0x8d; 0x01; 0xf7; 0xce; 0xe3; 0xe9; 0xf8; 0xb4; 0x43; 0x5a; 0x48;
|
|
0x4c; 0x98; 0x45; 0x57; 0x45; 0x7a; 0x70; 0x6f; 0x02; 0xf9; 0x3e; 0x18; 0x16; 0x32; 0xce; 0x48;
|
|
0x49; 0x3d; 0x1b; 0xed; 0xbd; 0x96; 0x73; 0xb7; 0xb1; 0x26; 0xdf; 0x07; 0x6c; 0x2a; 0xd0; 0xc4;
|
|
0xc9; 0x7d; 0x79; 0xcc; 0x06; 0xb4; 0x9a; 0x56; 0x17; 0x43; 0xe5; 0x0d; 0xe6; 0x69; 0xd1; 0xbb;
|
|
0xe5; 0xf5; 0xc7; 0x9a; 0x2e; 0xed; 0xec; 0x97; 0xc9; 0x53; 0xb0; 0xab; 0xc6; 0x37; 0x99; 0x2f;
|
|
0xbc; 0xe5; 0x9b; 0xd7; 0xa2; 0xeb; 0xd8; 0x88; 0x29; 0xcf; 0x6f; 0x35; 0x64; 0xd0; 0x40; 0xed;
|
|
0xdd; 0xcd; 0x12; 0x9a; 0x93; 0xb0; 0x6c; 0xde; 0x75; 0x89; 0x5b; 0x19; 0x7b; 0xbb; 0xe7; 0x4f;
|
|
0xcf; 0x6f; 0x87; 0x85; 0x8a; 0xb8; 0xb3; 0x1e; 0xd2; 0xc3; 0x60; 0x51; 0x2c; 0x5b; 0xeb; 0xe3;
|
|
0x77; 0x40; 0x84; 0x75; 0x4f; 0x97; 0x1a; 0x55; 0x67; 0xf6; 0x75; 0x5b; 0xec; 0x61; 0x96; 0x30;
|
|
0x0f; 0x41; 0xc4; 0x02; 0x63; 0x05; 0x52; 0xc8; 0x76; 0x2a; 0x0b; 0x23; 0x6e; 0x97; 0x1f; 0x16;
|
|
0xb6; 0x68; 0x92; 0xc6; 0x2f; 0x9b; 0x1c; 0xe2; 0x2f; 0xf6; 0x02; 0x90; 0x1a; 0x51; 0xa7; 0x49;
|
|
0x43; 0x41; 0x31; 0x22; 0x3f; 0x9a; 0xd1; 0xe7; 0xd0; 0x6b; 0xe4; 0x82; 0x1f; 0xbd; 0x93; 0xca;
|
|
0xaf; 0x5d; 0xf5; 0x05; 0xf3; 0x9a; 0xb8; 0x3d; 0x19; 0x21; 0x8d; 0x0b; 0x20; 0x00; 0x5a; 0x21;
|
|
0x5f; 0x8e; 0x1a; 0x77; 0xd0; 0x70; 0xfb; 0x8c; 0x98; 0x9d; 0x63; 0xb3; 0x9a; 0x6a; 0x3f; 0xc3;
|
|
0x89; 0x43; 0xfe; 0x1c; 0xa7; 0x6f; 0xb6; 0xd6; 0x1f; 0xa9; 0x3e; 0x6c; 0xe2; 0x7a; 0x8e; 0x31;
|
|
0xbc; 0x8f; 0x4e; 0xe4; 0xc0; 0x36; 0x8d; 0x72; 0x01; 0xf4; 0x65; 0x71; 0xff; 0x16; 0xa6; 0xc7;
|
|
0x0a; 0x59; 0xf1; 0x18
|
|
|
|
]
|
|
]
|
|
|
|
let good_digitally_signed_1_2_parser xs _ =
|
|
let buf = list_to_cstruct xs in
|
|
match Reader.parse_digitally_signed_1_2 buf with
|
|
| Error _ -> assert_failure "digitally signed 1.2 parser broken"
|
|
| Ok _ -> ()
|
|
|
|
let good_digitally_signed_1_2_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse good digitally signed 1_2 " ^ string_of_int i >:: good_digitally_signed_1_2_parser f)
|
|
good_digitally_signed_1_2
|
|
|
|
let bad_dss_1_2 =
|
|
let ds = list_to_cstruct (List.hd good_digitally_signed_1_2) in
|
|
let l = String.length ds in
|
|
[
|
|
String.sub ds 2 20 ;
|
|
String.sub ds 0 20 ;
|
|
list_to_cstruct [2] ^ ds ;
|
|
list_to_cstruct [0] ^ ds ;
|
|
list_to_cstruct [0; 1] ^ ds ;
|
|
list_to_cstruct [0; 0] ^ ds ;
|
|
list_to_cstruct [0xff; 0xff] ^ ds ;
|
|
list_to_cstruct [0; 0xff] ^ ds ;
|
|
String.sub ds 2 (String.length ds - 2) ;
|
|
String.sub ds 0 (pred l) ;
|
|
list_to_cstruct [7] ^ String.sub ds 1 (String.length ds - 1) ;
|
|
list_to_cstruct [8] ^ String.sub ds 1 (String.length ds - 1) ;
|
|
list_to_cstruct [1 ; 7] ^ String.sub ds 2 (String.length ds - 2) ;
|
|
list_to_cstruct [7 ; 2] ^ String.sub ds 2 (String.length ds - 2) ;
|
|
list_to_cstruct [1 ; 1 ; 1; 0xff] ^ String.sub ds 4 (String.length ds - 4) ;
|
|
list_to_cstruct [1 ; 1 ; 0xff ; 0] ^ String.sub ds 4 (String.length ds - 4) ;
|
|
ds ^ String.make 1 '\x00'
|
|
]
|
|
|
|
let bad_digitally_signed_1_2_parser buf _ =
|
|
match Reader.parse_digitally_signed_1_2 buf with
|
|
| Error _ -> ()
|
|
| Ok _ -> assert_failure "digitally signed 1.2 parser broken"
|
|
|
|
let bad_digitally_signed_1_2_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse bad digitally signed 1.2 " ^ string_of_int i >:: bad_digitally_signed_1_2_parser f)
|
|
bad_dss_1_2
|
|
|
|
let good_digitally_signed_parser xs _ =
|
|
let buf =
|
|
let b = list_to_cstruct xs in
|
|
String.sub b 2 (String.length b - 2)
|
|
in
|
|
match Reader.parse_digitally_signed buf with
|
|
| Error _ -> assert_failure "digitally signed parser broken"
|
|
| Ok _ -> ()
|
|
|
|
let good_digitally_signed_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse good digitally signed " ^ string_of_int i >:: good_digitally_signed_parser f)
|
|
good_digitally_signed_1_2
|
|
|
|
let bad_dss =
|
|
let ds =
|
|
let buf = list_to_cstruct (List.hd good_digitally_signed_1_2) in
|
|
String.sub buf 2 (String.length buf - 2) in
|
|
let l = String.length ds in
|
|
[
|
|
list_to_cstruct [0xff ; 0xff] ^ ds ;
|
|
list_to_cstruct [0xff ; 0xff] ^ String.sub ds 2 (String.length ds - 2);
|
|
String.sub ds 2 (String.length ds - 2) ;
|
|
String.sub ds 0 (pred l) ;
|
|
list_to_cstruct [1; 1] ^ String.sub ds 2 (String.length ds - 2);
|
|
ds ^ String.make 1 '\x00'
|
|
]
|
|
|
|
let bad_digitally_signed_parser buf _ =
|
|
match Reader.parse_digitally_signed buf with
|
|
| Error _ -> ()
|
|
| Ok _ -> assert_failure "digitally signed parser broken"
|
|
|
|
let bad_digitally_signed_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse bad digitally signed " ^ string_of_int i >:: bad_digitally_signed_parser f)
|
|
bad_dss
|
|
|
|
let good_handshake_hdrs =
|
|
let data = [ 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11 ] in
|
|
let empty = "" in
|
|
[
|
|
([0; 0; 0], (None, list_to_cstruct [0;0;0])) ;
|
|
([0; 0; 0; 0], (Some (list_to_cstruct [0;0;0;0]), empty)) ;
|
|
([0; 0; 0; 0xFF], (None, list_to_cstruct [0;0;0;255])) ;
|
|
([0; 0; 1; 0], (None, list_to_cstruct [0;0;1;0])) ;
|
|
([16; 0; 0; 12] @ data , (Some (list_to_cstruct ([16;0;0;12] @ data)), empty)) ;
|
|
([16; 0; 0; 14] @ data , (None, list_to_cstruct ([16;0;0;14] @ data)))
|
|
]
|
|
|
|
let good_handshake_hdr_parser (xs, (hs, rest)) _ =
|
|
let buf = list_to_cstruct xs in
|
|
match Reader.parse_handshake_frame buf, hs with
|
|
| (Some x, rest'), Some y ->
|
|
assert_cs_eq y x ;
|
|
assert_cs_eq rest rest' ;
|
|
| (None, rest'), None ->
|
|
assert_cs_eq rest rest' ;
|
|
| _ -> assert_failure "handshake_frame parser broken"
|
|
|
|
let good_handshake_hdr_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse good handshake header " ^ string_of_int i >:: good_handshake_hdr_parser f)
|
|
good_handshake_hdrs
|
|
|
|
(* 1byte type ; 3 byte length ; data *)
|
|
let good_handshakes_no_data = [
|
|
([0; 0; 0; 0] , Core.HelloRequest) ;
|
|
([14; 0; 0; 0] , Core.ServerHelloDone) ;
|
|
]
|
|
|
|
let good_handshake_no_data_parser (xs, res) _ =
|
|
let buf = list_to_cstruct xs in
|
|
match Reader.parse_handshake buf with
|
|
| Ok r -> assert_equal res r
|
|
| Error _ -> assert_failure "handshake no data parser failed"
|
|
|
|
let good_handshake_no_data_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse good handshake " ^ string_of_int i >:: good_handshake_no_data_parser f)
|
|
good_handshakes_no_data
|
|
|
|
let bad_handshakes_no_data = [
|
|
[0; 0; 0; 3] ;
|
|
[14; 0; 0; 5] ;
|
|
[245; 0; 0; 0] ;
|
|
[0; 0; 0; 3; 0; 0; 0] ;
|
|
[14; 0; 0; 5; 0; 0; 0; 0; 0]
|
|
]
|
|
|
|
let bad_handshake_no_data_parser xs _ =
|
|
let buf = list_to_cstruct xs in
|
|
match Reader.parse_handshake buf with
|
|
| Ok _ -> assert_failure "bad handshake no data parser failed"
|
|
| Error _ -> ()
|
|
|
|
let bad_handshake_no_data_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse bad handshake (no data) " ^ string_of_int i >:: bad_handshake_no_data_parser f)
|
|
bad_handshakes_no_data
|
|
|
|
let good_handshake_cstruct_data =
|
|
let data = [ 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11 ] in
|
|
let data_cs = list_to_cstruct data in
|
|
let gh1 = list_to_cstruct [
|
|
0x30; 0x82; 0x05; 0xe0; 0x30; 0x82;
|
|
0x04; 0xc8; 0xa0; 0x03; 0x02; 0x01; 0x02; 0x02; 0x10; 0x0c; 0x00; 0x93; 0x10; 0xd2; 0x06; 0xdb;
|
|
0xe3; 0x37; 0x55; 0x35; 0x80; 0x11; 0x8d; 0xdc; 0x87; 0x30; 0x0d; 0x06; 0x09; 0x2a; 0x86; 0x48;
|
|
0x86; 0xf7; 0x0d; 0x01; 0x01; 0x0b; 0x05; 0x00; 0x30; 0x75; 0x31; 0x0b; 0x30; 0x09; 0x06; 0x03;
|
|
0x55; 0x04; 0x06; 0x13; 0x02; 0x55; 0x53; 0x31; 0x15; 0x30; 0x13; 0x06; 0x03; 0x55; 0x04; 0x0a;
|
|
0x13; 0x0c; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72; 0x74; 0x20; 0x49; 0x6e; 0x63; 0x31; 0x19;
|
|
0x30; 0x17; 0x06; 0x03; 0x55; 0x04; 0x0b; 0x13; 0x10; 0x77; 0x77; 0x77; 0x2e; 0x64; 0x69; 0x67;
|
|
0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x31; 0x34; 0x30; 0x32; 0x06; 0x03; 0x55;
|
|
0x04; 0x03; 0x13; 0x2b; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72; 0x74; 0x20; 0x53; 0x48; 0x41;
|
|
0x32; 0x20; 0x45; 0x78; 0x74; 0x65; 0x6e; 0x64; 0x65; 0x64; 0x20; 0x56; 0x61; 0x6c; 0x69; 0x64;
|
|
0x61; 0x74; 0x69; 0x6f; 0x6e; 0x20; 0x53; 0x65; 0x72; 0x76; 0x65; 0x72; 0x20; 0x43; 0x41; 0x30;
|
|
0x1e; 0x17; 0x0d; 0x31; 0x34; 0x30; 0x34; 0x30; 0x38; 0x30; 0x30; 0x30; 0x30; 0x30; 0x30; 0x5a;
|
|
0x17; 0x0d; 0x31; 0x36; 0x30; 0x34; 0x31; 0x32; 0x31; 0x32; 0x30; 0x30; 0x30; 0x30; 0x5a; 0x30;
|
|
0x81; 0xf0; 0x31; 0x1d; 0x30; 0x1b; 0x06; 0x03; 0x55; 0x04; 0x0f; 0x0c; 0x14; 0x50; 0x72; 0x69;
|
|
0x76; 0x61; 0x74; 0x65; 0x20; 0x4f; 0x72; 0x67; 0x61; 0x6e; 0x69; 0x7a; 0x61; 0x74; 0x69; 0x6f;
|
|
0x6e; 0x31; 0x13; 0x30; 0x11; 0x06; 0x0b; 0x2b; 0x06; 0x01; 0x04; 0x01; 0x82; 0x37; 0x3c; 0x02;
|
|
0x01; 0x03; 0x13; 0x02; 0x55; 0x53; 0x31; 0x19; 0x30; 0x17; 0x06; 0x0b; 0x2b; 0x06; 0x01; 0x04;
|
|
0x01; 0x82; 0x37; 0x3c; 0x02; 0x01; 0x02; 0x13; 0x08; 0x44; 0x65; 0x6c; 0x61; 0x77; 0x61; 0x72;
|
|
0x65; 0x31; 0x10; 0x30; 0x0e; 0x06; 0x03; 0x55; 0x04; 0x05; 0x13; 0x07; 0x35; 0x31; 0x35; 0x37;
|
|
0x35; 0x35; 0x30; 0x31; 0x17; 0x30; 0x15; 0x06; 0x03; 0x55; 0x04; 0x09; 0x13; 0x0e; 0x35; 0x34;
|
|
0x38; 0x20; 0x34; 0x74; 0x68; 0x20; 0x53; 0x74; 0x72; 0x65; 0x65; 0x74; 0x31; 0x0e; 0x30; 0x0c;
|
|
0x06; 0x03; 0x55; 0x04; 0x11; 0x13; 0x05; 0x39; 0x34; 0x31; 0x30; 0x37; 0x31; 0x0b; 0x30; 0x09;
|
|
0x06; 0x03; 0x55; 0x04; 0x06; 0x13; 0x02; 0x55; 0x53; 0x31; 0x13; 0x30; 0x11; 0x06; 0x03; 0x55;
|
|
0x04; 0x08; 0x13; 0x0a; 0x43; 0x61; 0x6c; 0x69; 0x66; 0x6f; 0x72; 0x6e; 0x69; 0x61; 0x31; 0x16;
|
|
0x30; 0x14; 0x06; 0x03; 0x55; 0x04; 0x07; 0x13; 0x0d; 0x53; 0x61; 0x6e; 0x20; 0x46; 0x72; 0x61;
|
|
0x6e; 0x63; 0x69; 0x73; 0x63; 0x6f; 0x31; 0x15; 0x30; 0x13; 0x06; 0x03; 0x55; 0x04; 0x0a; 0x13;
|
|
0x0c; 0x47; 0x69; 0x74; 0x48; 0x75; 0x62; 0x2c; 0x20; 0x49; 0x6e; 0x63; 0x2e; 0x31; 0x13; 0x30;
|
|
0x11; 0x06; 0x03; 0x55; 0x04; 0x03; 0x13; 0x0a; 0x67; 0x69; 0x74; 0x68; 0x75; 0x62; 0x2e; 0x63;
|
|
0x6f; 0x6d; 0x30; 0x82; 0x01; 0x22; 0x30; 0x0d; 0x06; 0x09; 0x2a; 0x86; 0x48; 0x86; 0xf7; 0x0d;
|
|
0x01; 0x01; 0x01; 0x05; 0x00; 0x03; 0x82; 0x01; 0x0f; 0x00; 0x30; 0x82; 0x01; 0x0a; 0x02; 0x82;
|
|
0x01; 0x01; 0x00; 0xb1; 0xd4; 0xdc; 0x3c; 0xaf; 0xfd; 0xf3; 0x4e; 0xed; 0xc1; 0x67; 0xad; 0xe6;
|
|
0xcb; 0x22; 0xe8; 0xb7; 0xe2; 0xab; 0x28; 0xf2; 0xf7; 0xdc; 0x62; 0x70; 0x08; 0xd1; 0x0c; 0xaf;
|
|
0xd6; 0x16; 0x6a; 0x21; 0xb0; 0x36; 0x4b; 0x17; 0x0d; 0x36; 0x63; 0x04; 0xae; 0xbf; 0xea; 0x20;
|
|
0x51; 0x95; 0x65; 0x66; 0xf2; 0xbf; 0xb9; 0x4d; 0xa4; 0x0c; 0x29; 0xeb; 0xf5; 0x15; 0xb1; 0xe8;
|
|
0x35; 0xb3; 0x70; 0x10; 0x94; 0xd5; 0x1b; 0x59; 0xb4; 0x26; 0x0f; 0xd6; 0x83; 0x57; 0x59; 0x9d;
|
|
0xe1; 0x7c; 0x09; 0xdd; 0xe0; 0x13; 0xca; 0x4d; 0x6f; 0x43; 0x9b; 0xcd; 0xcf; 0x87; 0x3a; 0x15;
|
|
0xa7; 0x85; 0xdd; 0x66; 0x83; 0xed; 0x93; 0x0c; 0xfe; 0x2b; 0x6d; 0x38; 0x1c; 0x79; 0x88; 0x90;
|
|
0xcf; 0xad; 0x58; 0x18; 0x2d; 0x51; 0xd1; 0xc2; 0xa3; 0xf2; 0x47; 0x8c; 0x6f; 0x38; 0x09; 0xb9;
|
|
0xb8; 0xef; 0x4c; 0x93; 0x0b; 0xcb; 0x83; 0x94; 0x87; 0xea; 0xe0; 0xa3; 0xb5; 0xd9; 0x7b; 0x9b;
|
|
0x6b; 0x0f; 0x43; 0xf9; 0xca; 0xee; 0x80; 0x0d; 0x28; 0xa7; 0x76; 0xf1; 0x25; 0xf4; 0xc1; 0x35;
|
|
0x3c; 0xf6; 0x74; 0xad; 0xde; 0x6a; 0x33; 0x82; 0x7b; 0xdc; 0xfd; 0x4b; 0x76; 0xa7; 0xc2; 0xee;
|
|
0xf2; 0x6a; 0xbf; 0xa9; 0x24; 0xa6; 0x5f; 0xe7; 0x2e; 0x7c; 0x0e; 0xdb; 0xc3; 0x74; 0x73; 0xfa;
|
|
0x7e; 0xc6; 0xd8; 0xcf; 0x60; 0xeb; 0x36; 0x56; 0x21; 0xb6; 0xc1; 0x8a; 0xb8; 0x24; 0x82; 0x4d;
|
|
0x78; 0x24; 0xba; 0xe9; 0x1d; 0xa1; 0x8a; 0xa7; 0x87; 0xbe; 0x66; 0x25; 0x69; 0xbf; 0xbe; 0x3b;
|
|
0x72; 0x6e; 0x4f; 0xe0; 0xe4; 0x85; 0x25; 0x08; 0xb1; 0x91; 0x89; 0xb8; 0xd6; 0x74; 0x65; 0x76;
|
|
0x9b; 0x2c; 0x4f; 0x62; 0x1f; 0xa1; 0xfa; 0x3a; 0xbe; 0x9c; 0x24; 0xbf; 0x9f; 0xca; 0xb0; 0xc5;
|
|
0xc0; 0x67; 0x8d; 0x02; 0x03; 0x01; 0x00; 0x01; 0xa3; 0x82; 0x01; 0xee; 0x30; 0x82; 0x01; 0xea;
|
|
0x30; 0x1f; 0x06; 0x03; 0x55; 0x1d; 0x23; 0x04; 0x18; 0x30; 0x16; 0x80; 0x14; 0x3d; 0xd3; 0x50;
|
|
0xa5; 0xd6; 0xa0; 0xad; 0xee; 0xf3; 0x4a; 0x60; 0x0a; 0x65; 0xd3; 0x21; 0xd4; 0xf8; 0xf8; 0xd6;
|
|
0x0f; 0x30; 0x1d; 0x06; 0x03; 0x55; 0x1d; 0x0e; 0x04; 0x16; 0x04; 0x14; 0x6a; 0x43; 0x90; 0x7d;
|
|
0x3b; 0x98; 0x14; 0x72; 0x52; 0x95; 0x3a; 0xaa; 0x28; 0x0a; 0x43; 0xf8; 0x51; 0x7e; 0xd3; 0xa6;
|
|
0x30; 0x25; 0x06; 0x03; 0x55; 0x1d; 0x11; 0x04; 0x1e; 0x30; 0x1c; 0x82; 0x0a; 0x67; 0x69; 0x74;
|
|
0x68; 0x75; 0x62; 0x2e; 0x63; 0x6f; 0x6d; 0x82; 0x0e; 0x77; 0x77; 0x77; 0x2e; 0x67; 0x69; 0x74;
|
|
0x68; 0x75; 0x62; 0x2e; 0x63; 0x6f; 0x6d; 0x30; 0x0e; 0x06; 0x03; 0x55; 0x1d; 0x0f; 0x01; 0x01;
|
|
0xff; 0x04; 0x04; 0x03; 0x02; 0x05; 0xa0; 0x30; 0x1d; 0x06; 0x03; 0x55; 0x1d; 0x25; 0x04; 0x16;
|
|
0x30; 0x14; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x03; 0x01; 0x06; 0x08; 0x2b; 0x06;
|
|
0x01; 0x05; 0x05; 0x07; 0x03; 0x02; 0x30; 0x75; 0x06; 0x03; 0x55; 0x1d; 0x1f; 0x04; 0x6e; 0x30;
|
|
0x6c; 0x30; 0x34; 0xa0; 0x32; 0xa0; 0x30; 0x86; 0x2e; 0x68; 0x74; 0x74; 0x70; 0x3a; 0x2f; 0x2f;
|
|
0x63; 0x72; 0x6c; 0x33; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f;
|
|
0x6d; 0x2f; 0x73; 0x68; 0x61; 0x32; 0x2d; 0x65; 0x76; 0x2d; 0x73; 0x65; 0x72; 0x76; 0x65; 0x72;
|
|
0x2d; 0x67; 0x31; 0x2e; 0x63; 0x72; 0x6c; 0x30; 0x34; 0xa0; 0x32; 0xa0; 0x30; 0x86; 0x2e; 0x68;
|
|
0x74; 0x74; 0x70; 0x3a; 0x2f; 0x2f; 0x63; 0x72; 0x6c; 0x34; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63;
|
|
0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x2f; 0x73; 0x68; 0x61; 0x32; 0x2d; 0x65; 0x76; 0x2d;
|
|
0x73; 0x65; 0x72; 0x76; 0x65; 0x72; 0x2d; 0x67; 0x31; 0x2e; 0x63; 0x72; 0x6c; 0x30; 0x42; 0x06;
|
|
0x03; 0x55; 0x1d; 0x20; 0x04; 0x3b; 0x30; 0x39; 0x30; 0x37; 0x06; 0x09; 0x60; 0x86; 0x48; 0x01;
|
|
0x86; 0xfd; 0x6c; 0x02; 0x01; 0x30; 0x2a; 0x30; 0x28; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05;
|
|
0x07; 0x02; 0x01; 0x16; 0x1c; 0x68; 0x74; 0x74; 0x70; 0x73; 0x3a; 0x2f; 0x2f; 0x77; 0x77; 0x77;
|
|
0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x2f; 0x43; 0x50;
|
|
0x53; 0x30; 0x81; 0x88; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x01; 0x01; 0x04; 0x7c;
|
|
0x30; 0x7a; 0x30; 0x24; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x30; 0x01; 0x86; 0x18;
|
|
0x68; 0x74; 0x74; 0x70; 0x3a; 0x2f; 0x2f; 0x6f; 0x63; 0x73; 0x70; 0x2e; 0x64; 0x69; 0x67; 0x69;
|
|
0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x30; 0x52; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05;
|
|
0x05; 0x07; 0x30; 0x02; 0x86; 0x46; 0x68; 0x74; 0x74; 0x70; 0x3a; 0x2f; 0x2f; 0x63; 0x61; 0x63;
|
|
0x65; 0x72; 0x74; 0x73; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f;
|
|
0x6d; 0x2f; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72; 0x74; 0x53; 0x48; 0x41; 0x32; 0x45; 0x78;
|
|
0x74; 0x65; 0x6e; 0x64; 0x65; 0x64; 0x56; 0x61; 0x6c; 0x69; 0x64; 0x61; 0x74; 0x69; 0x6f; 0x6e;
|
|
0x53; 0x65; 0x72; 0x76; 0x65; 0x72; 0x43; 0x41; 0x2e; 0x63; 0x72; 0x74; 0x30; 0x0c; 0x06; 0x03;
|
|
0x55; 0x1d; 0x13; 0x01; 0x01; 0xff; 0x04; 0x02; 0x30; 0x00; 0x30; 0x0d; 0x06; 0x09; 0x2a; 0x86;
|
|
0x48; 0x86; 0xf7; 0x0d; 0x01; 0x01; 0x0b; 0x05; 0x00; 0x03; 0x82; 0x01; 0x01; 0x00; 0x6f; 0xe7;
|
|
0x6d; 0xcb; 0x82; 0xf3; 0xef; 0x90; 0x87; 0x09; 0xd7; 0x0f; 0x15; 0x22; 0x2c; 0x8c; 0xfe; 0xd3;
|
|
0xab; 0x1c; 0x8a; 0x96; 0xdb; 0x5d; 0x12; 0x5d; 0xd1; 0x78; 0xc0; 0x31; 0xb0; 0xff; 0x45; 0xc8;
|
|
0x89; 0xf7; 0x08; 0x98; 0x52; 0x17; 0x1f; 0x4c; 0x4b; 0x20; 0x64; 0x6a; 0x6d; 0xdb; 0x50; 0xd7;
|
|
0x10; 0xbe; 0x7e; 0xab; 0xfe; 0x2f; 0x80; 0xd8; 0xa9; 0x4a; 0x58; 0x41; 0x69; 0x81; 0x72; 0x19;
|
|
0x08; 0x83; 0x9b; 0x92; 0x10; 0x4e; 0x62; 0x2d; 0x7b; 0x46; 0x70; 0x43; 0x6e; 0xa3; 0x53; 0x13;
|
|
0x1f; 0xe2; 0x93; 0xa6; 0x23; 0x5b; 0xf7; 0x92; 0x3e; 0x37; 0x14; 0x75; 0x3b; 0xb9; 0x4b; 0x24;
|
|
0x41; 0x2e; 0xa5; 0x3d; 0x48; 0x0d; 0x0f; 0x99; 0xea; 0x1e; 0x42; 0x97; 0xc6; 0xfe; 0x95; 0xda;
|
|
0xab; 0x47; 0x9a; 0xcb; 0x2b; 0x03; 0xd6; 0x0d; 0x40; 0xc1; 0x0a; 0xf7; 0x78; 0x1a; 0xda; 0xb5;
|
|
0x83; 0xa4; 0xad; 0xb5; 0x99; 0x49; 0x20; 0x2e; 0xf8; 0x93; 0x3c; 0x1e; 0x6c; 0x3d; 0xd1; 0x3b;
|
|
0x23; 0x3a; 0x6b; 0x38; 0x2a; 0x7e; 0x62; 0x7a; 0x5f; 0xdd; 0x17; 0x05; 0x75; 0xd0; 0x24; 0x5d;
|
|
0xbe; 0x8d; 0xa8; 0x9a; 0x10; 0x44; 0xfa; 0xd2; 0xb4; 0xca; 0xef; 0xd7; 0xd0; 0xb5; 0x76; 0xa5;
|
|
0x26; 0x25; 0x1c; 0x08; 0x41; 0xd8; 0x64; 0x92; 0xa7; 0xaf; 0x7d; 0xfe; 0x88; 0x40; 0x39; 0x61;
|
|
0x0b; 0xc0; 0x48; 0x30; 0xa9; 0x82; 0x34; 0xad; 0xf7; 0x70; 0x46; 0x03; 0x7c; 0x35; 0x91; 0x3a;
|
|
0xd5; 0xbb; 0x24; 0xd8; 0x01; 0xbc; 0x14; 0xf0; 0xc3; 0x0f; 0x23; 0x3b; 0x58; 0x32; 0xba; 0x0f;
|
|
0x12; 0x6c; 0x66; 0x7a; 0x6d; 0x9d; 0xe4; 0xf0; 0xe5; 0x7c; 0x5d; 0x7e; 0x02; 0xd8; 0xd7; 0xac;
|
|
0x89; 0x97; 0x0b; 0x61; 0xb7; 0x36; 0x9f; 0xb0; 0x7d; 0x3b; 0xee; 0xb7; 0x33; 0x69;
|
|
] in
|
|
let gh2 = list_to_cstruct [ 0x30; 0x82; 0x04; 0xb6; 0x30; 0x82; 0x03; 0x9e; 0xa0; 0x03; 0x02; 0x01; 0x02; 0x02; 0x10;
|
|
0x0c; 0x79; 0xa9; 0x44; 0xb0; 0x8c; 0x11; 0x95; 0x20; 0x92; 0x61; 0x5f; 0xe2; 0x6b; 0x1d; 0x83;
|
|
0x30; 0x0d; 0x06; 0x09; 0x2a; 0x86; 0x48; 0x86; 0xf7; 0x0d; 0x01; 0x01; 0x0b; 0x05; 0x00; 0x30;
|
|
0x6c; 0x31; 0x0b; 0x30; 0x09; 0x06; 0x03; 0x55; 0x04; 0x06; 0x13; 0x02; 0x55; 0x53; 0x31; 0x15;
|
|
0x30; 0x13; 0x06; 0x03; 0x55; 0x04; 0x0a; 0x13; 0x0c; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72;
|
|
0x74; 0x20; 0x49; 0x6e; 0x63; 0x31; 0x19; 0x30; 0x17; 0x06; 0x03; 0x55; 0x04; 0x0b; 0x13; 0x10;
|
|
0x77; 0x77; 0x77; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d;
|
|
0x31; 0x2b; 0x30; 0x29; 0x06; 0x03; 0x55; 0x04; 0x03; 0x13; 0x22; 0x44; 0x69; 0x67; 0x69; 0x43;
|
|
0x65; 0x72; 0x74; 0x20; 0x48; 0x69; 0x67; 0x68; 0x20; 0x41; 0x73; 0x73; 0x75; 0x72; 0x61; 0x6e;
|
|
0x63; 0x65; 0x20; 0x45; 0x56; 0x20; 0x52; 0x6f; 0x6f; 0x74; 0x20; 0x43; 0x41; 0x30; 0x1e; 0x17;
|
|
0x0d; 0x31; 0x33; 0x31; 0x30; 0x32; 0x32; 0x31; 0x32; 0x30; 0x30; 0x30; 0x30; 0x5a; 0x17; 0x0d;
|
|
0x32; 0x38; 0x31; 0x30; 0x32; 0x32; 0x31; 0x32; 0x30; 0x30; 0x30; 0x30; 0x5a; 0x30; 0x75; 0x31;
|
|
0x0b; 0x30; 0x09; 0x06; 0x03; 0x55; 0x04; 0x06; 0x13; 0x02; 0x55; 0x53; 0x31; 0x15; 0x30; 0x13;
|
|
0x06; 0x03; 0x55; 0x04; 0x0a; 0x13; 0x0c; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72; 0x74; 0x20;
|
|
0x49; 0x6e; 0x63; 0x31; 0x19; 0x30; 0x17; 0x06; 0x03; 0x55; 0x04; 0x0b; 0x13; 0x10; 0x77; 0x77;
|
|
0x77; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x31; 0x34;
|
|
0x30; 0x32; 0x06; 0x03; 0x55; 0x04; 0x03; 0x13; 0x2b; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72;
|
|
0x74; 0x20; 0x53; 0x48; 0x41; 0x32; 0x20; 0x45; 0x78; 0x74; 0x65; 0x6e; 0x64; 0x65; 0x64; 0x20;
|
|
0x56; 0x61; 0x6c; 0x69; 0x64; 0x61; 0x74; 0x69; 0x6f; 0x6e; 0x20; 0x53; 0x65; 0x72; 0x76; 0x65;
|
|
0x72; 0x20; 0x43; 0x41; 0x30; 0x82; 0x01; 0x22; 0x30; 0x0d; 0x06; 0x09; 0x2a; 0x86; 0x48; 0x86;
|
|
0xf7; 0x0d; 0x01; 0x01; 0x01; 0x05; 0x00; 0x03; 0x82; 0x01; 0x0f; 0x00; 0x30; 0x82; 0x01; 0x0a;
|
|
0x02; 0x82; 0x01; 0x01; 0x00; 0xd7; 0x53; 0xa4; 0x04; 0x51; 0xf8; 0x99; 0xa6; 0x16; 0x48; 0x4b;
|
|
0x67; 0x27; 0xaa; 0x93; 0x49; 0xd0; 0x39; 0xed; 0x0c; 0xb0; 0xb0; 0x00; 0x87; 0xf1; 0x67; 0x28;
|
|
0x86; 0x85; 0x8c; 0x8e; 0x63; 0xda; 0xbc; 0xb1; 0x40; 0x38; 0xe2; 0xd3; 0xf5; 0xec; 0xa5; 0x05;
|
|
0x18; 0xb8; 0x3d; 0x3e; 0xc5; 0x99; 0x17; 0x32; 0xec; 0x18; 0x8c; 0xfa; 0xf1; 0x0c; 0xa6; 0x64;
|
|
0x21; 0x85; 0xcb; 0x07; 0x10; 0x34; 0xb0; 0x52; 0x88; 0x2b; 0x1f; 0x68; 0x9b; 0xd2; 0xb1; 0x8f;
|
|
0x12; 0xb0; 0xb3; 0xd2; 0xe7; 0x88; 0x1f; 0x1f; 0xef; 0x38; 0x77; 0x54; 0x53; 0x5f; 0x80; 0x79;
|
|
0x3f; 0x2e; 0x1a; 0xaa; 0xa8; 0x1e; 0x4b; 0x2b; 0x0d; 0xab; 0xb7; 0x63; 0xb9; 0x35; 0xb7; 0x7d;
|
|
0x14; 0xbc; 0x59; 0x4b; 0xdf; 0x51; 0x4a; 0xd2; 0xa1; 0xe2; 0x0c; 0xe2; 0x90; 0x82; 0x87; 0x6a;
|
|
0xae; 0xea; 0xd7; 0x64; 0xd6; 0x98; 0x55; 0xe8; 0xfd; 0xaf; 0x1a; 0x50; 0x6c; 0x54; 0xbc; 0x11;
|
|
0xf2; 0xfd; 0x4a; 0xf2; 0x9d; 0xbb; 0x7f; 0x0e; 0xf4; 0xd5; 0xbe; 0x8e; 0x16; 0x89; 0x12; 0x55;
|
|
0xd8; 0xc0; 0x71; 0x34; 0xee; 0xf6; 0xdc; 0x2d; 0xec; 0xc4; 0x87; 0x25; 0x86; 0x8d; 0xd8; 0x21;
|
|
0xe4; 0xb0; 0x4d; 0x0c; 0x89; 0xdc; 0x39; 0x26; 0x17; 0xdd; 0xf6; 0xd7; 0x94; 0x85; 0xd8; 0x04;
|
|
0x21; 0x70; 0x9d; 0x6f; 0x6f; 0xff; 0x5c; 0xba; 0x19; 0xe1; 0x45; 0xcb; 0x56; 0x57; 0x28; 0x7e;
|
|
0x1c; 0x0d; 0x41; 0x57; 0xaa; 0xb7; 0xb8; 0x27; 0xbb; 0xb1; 0xe4; 0xfa; 0x2a; 0xef; 0x21; 0x23;
|
|
0x75; 0x1a; 0xad; 0x2d; 0x9b; 0x86; 0x35; 0x8c; 0x9c; 0x77; 0xb5; 0x73; 0xad; 0xd8; 0x94; 0x2d;
|
|
0xe4; 0xf3; 0x0c; 0x9d; 0xee; 0xc1; 0x4e; 0x62; 0x7e; 0x17; 0xc0; 0x71; 0x9e; 0x2c; 0xde; 0xf1;
|
|
0xf9; 0x10; 0x28; 0x19; 0x33; 0x02; 0x03; 0x01; 0x00; 0x01; 0xa3; 0x82; 0x01; 0x49; 0x30; 0x82;
|
|
0x01; 0x45; 0x30; 0x12; 0x06; 0x03; 0x55; 0x1d; 0x13; 0x01; 0x01; 0xff; 0x04; 0x08; 0x30; 0x06;
|
|
0x01; 0x01; 0xff; 0x02; 0x01; 0x00; 0x30; 0x0e; 0x06; 0x03; 0x55; 0x1d; 0x0f; 0x01; 0x01; 0xff;
|
|
0x04; 0x04; 0x03; 0x02; 0x01; 0x86; 0x30; 0x1d; 0x06; 0x03; 0x55; 0x1d; 0x25; 0x04; 0x16; 0x30;
|
|
0x14; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x03; 0x01; 0x06; 0x08; 0x2b; 0x06; 0x01;
|
|
0x05; 0x05; 0x07; 0x03; 0x02; 0x30; 0x34; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x01;
|
|
0x01; 0x04; 0x28; 0x30; 0x26; 0x30; 0x24; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x30;
|
|
0x01; 0x86; 0x18; 0x68; 0x74; 0x74; 0x70; 0x3a; 0x2f; 0x2f; 0x6f; 0x63; 0x73; 0x70; 0x2e; 0x64;
|
|
0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x30; 0x4b; 0x06; 0x03; 0x55;
|
|
0x1d; 0x1f; 0x04; 0x44; 0x30; 0x42; 0x30; 0x40; 0xa0; 0x3e; 0xa0; 0x3c; 0x86; 0x3a; 0x68; 0x74;
|
|
0x74; 0x70; 0x3a; 0x2f; 0x2f; 0x63; 0x72; 0x6c; 0x34; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65;
|
|
0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x2f; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72; 0x74; 0x48;
|
|
0x69; 0x67; 0x68; 0x41; 0x73; 0x73; 0x75; 0x72; 0x61; 0x6e; 0x63; 0x65; 0x45; 0x56; 0x52; 0x6f;
|
|
0x6f; 0x74; 0x43; 0x41; 0x2e; 0x63; 0x72; 0x6c; 0x30; 0x3d; 0x06; 0x03; 0x55; 0x1d; 0x20; 0x04;
|
|
0x36; 0x30; 0x34; 0x30; 0x32; 0x06; 0x04; 0x55; 0x1d; 0x20; 0x00; 0x30; 0x2a; 0x30; 0x28; 0x06;
|
|
0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x02; 0x01; 0x16; 0x1c; 0x68; 0x74; 0x74; 0x70; 0x73;
|
|
0x3a; 0x2f; 0x2f; 0x77; 0x77; 0x77; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e;
|
|
0x63; 0x6f; 0x6d; 0x2f; 0x43; 0x50; 0x53; 0x30; 0x1d; 0x06; 0x03; 0x55; 0x1d; 0x0e; 0x04; 0x16;
|
|
0x04; 0x14; 0x3d; 0xd3; 0x50; 0xa5; 0xd6; 0xa0; 0xad; 0xee; 0xf3; 0x4a; 0x60; 0x0a; 0x65; 0xd3;
|
|
0x21; 0xd4; 0xf8; 0xf8; 0xd6; 0x0f; 0x30; 0x1f; 0x06; 0x03; 0x55; 0x1d; 0x23; 0x04; 0x18; 0x30;
|
|
0x16; 0x80; 0x14; 0xb1; 0x3e; 0xc3; 0x69; 0x03; 0xf8; 0xbf; 0x47; 0x01; 0xd4; 0x98; 0x26; 0x1a;
|
|
0x08; 0x02; 0xef; 0x63; 0x64; 0x2b; 0xc3; 0x30; 0x0d; 0x06; 0x09; 0x2a; 0x86; 0x48; 0x86; 0xf7;
|
|
0x0d; 0x01; 0x01; 0x0b; 0x05; 0x00; 0x03; 0x82; 0x01; 0x01; 0x00; 0x9d; 0xb6; 0xd0; 0x90; 0x86;
|
|
0xe1; 0x86; 0x02; 0xed; 0xc5; 0xa0; 0xf0; 0x34; 0x1c; 0x74; 0xc1; 0x8d; 0x76; 0xcc; 0x86; 0x0a;
|
|
0xa8; 0xf0; 0x4a; 0x8a; 0x42; 0xd6; 0x3f; 0xc8; 0xa9; 0x4d; 0xad; 0x7c; 0x08; 0xad; 0xe6; 0xb6;
|
|
0x50; 0xb8; 0xa2; 0x1a; 0x4d; 0x88; 0x07; 0xb1; 0x29; 0x21; 0xdc; 0xe7; 0xda; 0xc6; 0x3c; 0x21;
|
|
0xe0; 0xe3; 0x11; 0x49; 0x70; 0xac; 0x7a; 0x1d; 0x01; 0xa4; 0xca; 0x11; 0x3a; 0x57; 0xab; 0x7d;
|
|
0x57; 0x2a; 0x40; 0x74; 0xfd; 0xd3; 0x1d; 0x85; 0x18; 0x50; 0xdf; 0x57; 0x47; 0x75; 0xa1; 0x7d;
|
|
0x55; 0x20; 0x2e; 0x47; 0x37; 0x50; 0x72; 0x8c; 0x7f; 0x82; 0x1b; 0xd2; 0x62; 0x8f; 0x2d; 0x03;
|
|
0x5a; 0xda; 0xc3; 0xc8; 0xa1; 0xce; 0x2c; 0x52; 0xa2; 0x00; 0x63; 0xeb; 0x73; 0xba; 0x71; 0xc8;
|
|
0x49; 0x27; 0x23; 0x97; 0x64; 0x85; 0x9e; 0x38; 0x0e; 0xad; 0x63; 0x68; 0x3c; 0xba; 0x52; 0x81;
|
|
0x58; 0x79; 0xa3; 0x2c; 0x0c; 0xdf; 0xde; 0x6d; 0xeb; 0x31; 0xf2; 0xba; 0xa0; 0x7c; 0x6c; 0xf1;
|
|
0x2c; 0xd4; 0xe1; 0xbd; 0x77; 0x84; 0x37; 0x03; 0xce; 0x32; 0xb5; 0xc8; 0x9a; 0x81; 0x1a; 0x4a;
|
|
0x92; 0x4e; 0x3b; 0x46; 0x9a; 0x85; 0xfe; 0x83; 0xa2; 0xf9; 0x9e; 0x8c; 0xa3; 0xcc; 0x0d; 0x5e;
|
|
0xb3; 0x3d; 0xcf; 0x04; 0x78; 0x8f; 0x14; 0x14; 0x7b; 0x32; 0x9c; 0xc7; 0x00; 0xa6; 0x5c; 0xc4;
|
|
0xb5; 0xa1; 0x55; 0x8d; 0x5a; 0x56; 0x68; 0xa4; 0x22; 0x70; 0xaa; 0x3c; 0x81; 0x71; 0xd9; 0x9d;
|
|
0xa8; 0x45; 0x3b; 0xf4; 0xe5; 0xf6; 0xa2; 0x51; 0xdd; 0xc7; 0x7b; 0x62; 0xe8; 0x6f; 0x0c; 0x74;
|
|
0xeb; 0xb8; 0xda; 0xf8; 0xbf; 0x87; 0x0d; 0x79; 0x50; 0x91; 0x90; 0x9b; 0x18; 0x3b; 0x91; 0x59;
|
|
0x27; 0xf1; 0x35; 0x28; 0x13; 0xab; 0x26; 0x7e; 0xd5; 0xf7; 0x7a ] in
|
|
|
|
|
|
[ ([12; 0; 0; 12] @ data , (Core.ServerKeyExchange data_cs)) ;
|
|
([20; 0; 0; 12] @ data , (Core.Finished data_cs)) ;
|
|
([16; 0; 0; 12] @ data , (Core.ClientKeyExchange data_cs)) ;
|
|
|
|
([11; 0; 0; 3; 0; 0; 0] , (Core.Certificate (Writer.assemble_certificates []))) ;
|
|
([11; 0; 0; 18; 0; 0; 15; 0; 0; 12] @ data , (Core.Certificate (Writer.assemble_certificates [data_cs]))) ;
|
|
([11; 0; 0; 33; 0; 0; 30; 0; 0; 12] @ data @ [0; 0; 12] @ data ,
|
|
(Core.Certificate (Writer.assemble_certificates [data_cs ; data_cs]))) ;
|
|
|
|
([
|
|
0x0b; 0x00; 0x0a; 0xa7;
|
|
0x00; 0x0a; 0xa4;
|
|
0x00; 0x05; 0xe4;
|
|
0x30; 0x82; 0x05; 0xe0; 0x30; 0x82;
|
|
0x04; 0xc8; 0xa0; 0x03; 0x02; 0x01; 0x02; 0x02; 0x10; 0x0c; 0x00; 0x93; 0x10; 0xd2; 0x06; 0xdb;
|
|
0xe3; 0x37; 0x55; 0x35; 0x80; 0x11; 0x8d; 0xdc; 0x87; 0x30; 0x0d; 0x06; 0x09; 0x2a; 0x86; 0x48;
|
|
0x86; 0xf7; 0x0d; 0x01; 0x01; 0x0b; 0x05; 0x00; 0x30; 0x75; 0x31; 0x0b; 0x30; 0x09; 0x06; 0x03;
|
|
0x55; 0x04; 0x06; 0x13; 0x02; 0x55; 0x53; 0x31; 0x15; 0x30; 0x13; 0x06; 0x03; 0x55; 0x04; 0x0a;
|
|
0x13; 0x0c; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72; 0x74; 0x20; 0x49; 0x6e; 0x63; 0x31; 0x19;
|
|
0x30; 0x17; 0x06; 0x03; 0x55; 0x04; 0x0b; 0x13; 0x10; 0x77; 0x77; 0x77; 0x2e; 0x64; 0x69; 0x67;
|
|
0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x31; 0x34; 0x30; 0x32; 0x06; 0x03; 0x55;
|
|
0x04; 0x03; 0x13; 0x2b; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72; 0x74; 0x20; 0x53; 0x48; 0x41;
|
|
0x32; 0x20; 0x45; 0x78; 0x74; 0x65; 0x6e; 0x64; 0x65; 0x64; 0x20; 0x56; 0x61; 0x6c; 0x69; 0x64;
|
|
0x61; 0x74; 0x69; 0x6f; 0x6e; 0x20; 0x53; 0x65; 0x72; 0x76; 0x65; 0x72; 0x20; 0x43; 0x41; 0x30;
|
|
0x1e; 0x17; 0x0d; 0x31; 0x34; 0x30; 0x34; 0x30; 0x38; 0x30; 0x30; 0x30; 0x30; 0x30; 0x30; 0x5a;
|
|
0x17; 0x0d; 0x31; 0x36; 0x30; 0x34; 0x31; 0x32; 0x31; 0x32; 0x30; 0x30; 0x30; 0x30; 0x5a; 0x30;
|
|
0x81; 0xf0; 0x31; 0x1d; 0x30; 0x1b; 0x06; 0x03; 0x55; 0x04; 0x0f; 0x0c; 0x14; 0x50; 0x72; 0x69;
|
|
0x76; 0x61; 0x74; 0x65; 0x20; 0x4f; 0x72; 0x67; 0x61; 0x6e; 0x69; 0x7a; 0x61; 0x74; 0x69; 0x6f;
|
|
0x6e; 0x31; 0x13; 0x30; 0x11; 0x06; 0x0b; 0x2b; 0x06; 0x01; 0x04; 0x01; 0x82; 0x37; 0x3c; 0x02;
|
|
0x01; 0x03; 0x13; 0x02; 0x55; 0x53; 0x31; 0x19; 0x30; 0x17; 0x06; 0x0b; 0x2b; 0x06; 0x01; 0x04;
|
|
0x01; 0x82; 0x37; 0x3c; 0x02; 0x01; 0x02; 0x13; 0x08; 0x44; 0x65; 0x6c; 0x61; 0x77; 0x61; 0x72;
|
|
0x65; 0x31; 0x10; 0x30; 0x0e; 0x06; 0x03; 0x55; 0x04; 0x05; 0x13; 0x07; 0x35; 0x31; 0x35; 0x37;
|
|
0x35; 0x35; 0x30; 0x31; 0x17; 0x30; 0x15; 0x06; 0x03; 0x55; 0x04; 0x09; 0x13; 0x0e; 0x35; 0x34;
|
|
0x38; 0x20; 0x34; 0x74; 0x68; 0x20; 0x53; 0x74; 0x72; 0x65; 0x65; 0x74; 0x31; 0x0e; 0x30; 0x0c;
|
|
0x06; 0x03; 0x55; 0x04; 0x11; 0x13; 0x05; 0x39; 0x34; 0x31; 0x30; 0x37; 0x31; 0x0b; 0x30; 0x09;
|
|
0x06; 0x03; 0x55; 0x04; 0x06; 0x13; 0x02; 0x55; 0x53; 0x31; 0x13; 0x30; 0x11; 0x06; 0x03; 0x55;
|
|
0x04; 0x08; 0x13; 0x0a; 0x43; 0x61; 0x6c; 0x69; 0x66; 0x6f; 0x72; 0x6e; 0x69; 0x61; 0x31; 0x16;
|
|
0x30; 0x14; 0x06; 0x03; 0x55; 0x04; 0x07; 0x13; 0x0d; 0x53; 0x61; 0x6e; 0x20; 0x46; 0x72; 0x61;
|
|
0x6e; 0x63; 0x69; 0x73; 0x63; 0x6f; 0x31; 0x15; 0x30; 0x13; 0x06; 0x03; 0x55; 0x04; 0x0a; 0x13;
|
|
0x0c; 0x47; 0x69; 0x74; 0x48; 0x75; 0x62; 0x2c; 0x20; 0x49; 0x6e; 0x63; 0x2e; 0x31; 0x13; 0x30;
|
|
0x11; 0x06; 0x03; 0x55; 0x04; 0x03; 0x13; 0x0a; 0x67; 0x69; 0x74; 0x68; 0x75; 0x62; 0x2e; 0x63;
|
|
0x6f; 0x6d; 0x30; 0x82; 0x01; 0x22; 0x30; 0x0d; 0x06; 0x09; 0x2a; 0x86; 0x48; 0x86; 0xf7; 0x0d;
|
|
0x01; 0x01; 0x01; 0x05; 0x00; 0x03; 0x82; 0x01; 0x0f; 0x00; 0x30; 0x82; 0x01; 0x0a; 0x02; 0x82;
|
|
0x01; 0x01; 0x00; 0xb1; 0xd4; 0xdc; 0x3c; 0xaf; 0xfd; 0xf3; 0x4e; 0xed; 0xc1; 0x67; 0xad; 0xe6;
|
|
0xcb; 0x22; 0xe8; 0xb7; 0xe2; 0xab; 0x28; 0xf2; 0xf7; 0xdc; 0x62; 0x70; 0x08; 0xd1; 0x0c; 0xaf;
|
|
0xd6; 0x16; 0x6a; 0x21; 0xb0; 0x36; 0x4b; 0x17; 0x0d; 0x36; 0x63; 0x04; 0xae; 0xbf; 0xea; 0x20;
|
|
0x51; 0x95; 0x65; 0x66; 0xf2; 0xbf; 0xb9; 0x4d; 0xa4; 0x0c; 0x29; 0xeb; 0xf5; 0x15; 0xb1; 0xe8;
|
|
0x35; 0xb3; 0x70; 0x10; 0x94; 0xd5; 0x1b; 0x59; 0xb4; 0x26; 0x0f; 0xd6; 0x83; 0x57; 0x59; 0x9d;
|
|
0xe1; 0x7c; 0x09; 0xdd; 0xe0; 0x13; 0xca; 0x4d; 0x6f; 0x43; 0x9b; 0xcd; 0xcf; 0x87; 0x3a; 0x15;
|
|
0xa7; 0x85; 0xdd; 0x66; 0x83; 0xed; 0x93; 0x0c; 0xfe; 0x2b; 0x6d; 0x38; 0x1c; 0x79; 0x88; 0x90;
|
|
0xcf; 0xad; 0x58; 0x18; 0x2d; 0x51; 0xd1; 0xc2; 0xa3; 0xf2; 0x47; 0x8c; 0x6f; 0x38; 0x09; 0xb9;
|
|
0xb8; 0xef; 0x4c; 0x93; 0x0b; 0xcb; 0x83; 0x94; 0x87; 0xea; 0xe0; 0xa3; 0xb5; 0xd9; 0x7b; 0x9b;
|
|
0x6b; 0x0f; 0x43; 0xf9; 0xca; 0xee; 0x80; 0x0d; 0x28; 0xa7; 0x76; 0xf1; 0x25; 0xf4; 0xc1; 0x35;
|
|
0x3c; 0xf6; 0x74; 0xad; 0xde; 0x6a; 0x33; 0x82; 0x7b; 0xdc; 0xfd; 0x4b; 0x76; 0xa7; 0xc2; 0xee;
|
|
0xf2; 0x6a; 0xbf; 0xa9; 0x24; 0xa6; 0x5f; 0xe7; 0x2e; 0x7c; 0x0e; 0xdb; 0xc3; 0x74; 0x73; 0xfa;
|
|
0x7e; 0xc6; 0xd8; 0xcf; 0x60; 0xeb; 0x36; 0x56; 0x21; 0xb6; 0xc1; 0x8a; 0xb8; 0x24; 0x82; 0x4d;
|
|
0x78; 0x24; 0xba; 0xe9; 0x1d; 0xa1; 0x8a; 0xa7; 0x87; 0xbe; 0x66; 0x25; 0x69; 0xbf; 0xbe; 0x3b;
|
|
0x72; 0x6e; 0x4f; 0xe0; 0xe4; 0x85; 0x25; 0x08; 0xb1; 0x91; 0x89; 0xb8; 0xd6; 0x74; 0x65; 0x76;
|
|
0x9b; 0x2c; 0x4f; 0x62; 0x1f; 0xa1; 0xfa; 0x3a; 0xbe; 0x9c; 0x24; 0xbf; 0x9f; 0xca; 0xb0; 0xc5;
|
|
0xc0; 0x67; 0x8d; 0x02; 0x03; 0x01; 0x00; 0x01; 0xa3; 0x82; 0x01; 0xee; 0x30; 0x82; 0x01; 0xea;
|
|
0x30; 0x1f; 0x06; 0x03; 0x55; 0x1d; 0x23; 0x04; 0x18; 0x30; 0x16; 0x80; 0x14; 0x3d; 0xd3; 0x50;
|
|
0xa5; 0xd6; 0xa0; 0xad; 0xee; 0xf3; 0x4a; 0x60; 0x0a; 0x65; 0xd3; 0x21; 0xd4; 0xf8; 0xf8; 0xd6;
|
|
0x0f; 0x30; 0x1d; 0x06; 0x03; 0x55; 0x1d; 0x0e; 0x04; 0x16; 0x04; 0x14; 0x6a; 0x43; 0x90; 0x7d;
|
|
0x3b; 0x98; 0x14; 0x72; 0x52; 0x95; 0x3a; 0xaa; 0x28; 0x0a; 0x43; 0xf8; 0x51; 0x7e; 0xd3; 0xa6;
|
|
0x30; 0x25; 0x06; 0x03; 0x55; 0x1d; 0x11; 0x04; 0x1e; 0x30; 0x1c; 0x82; 0x0a; 0x67; 0x69; 0x74;
|
|
0x68; 0x75; 0x62; 0x2e; 0x63; 0x6f; 0x6d; 0x82; 0x0e; 0x77; 0x77; 0x77; 0x2e; 0x67; 0x69; 0x74;
|
|
0x68; 0x75; 0x62; 0x2e; 0x63; 0x6f; 0x6d; 0x30; 0x0e; 0x06; 0x03; 0x55; 0x1d; 0x0f; 0x01; 0x01;
|
|
0xff; 0x04; 0x04; 0x03; 0x02; 0x05; 0xa0; 0x30; 0x1d; 0x06; 0x03; 0x55; 0x1d; 0x25; 0x04; 0x16;
|
|
0x30; 0x14; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x03; 0x01; 0x06; 0x08; 0x2b; 0x06;
|
|
0x01; 0x05; 0x05; 0x07; 0x03; 0x02; 0x30; 0x75; 0x06; 0x03; 0x55; 0x1d; 0x1f; 0x04; 0x6e; 0x30;
|
|
0x6c; 0x30; 0x34; 0xa0; 0x32; 0xa0; 0x30; 0x86; 0x2e; 0x68; 0x74; 0x74; 0x70; 0x3a; 0x2f; 0x2f;
|
|
0x63; 0x72; 0x6c; 0x33; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f;
|
|
0x6d; 0x2f; 0x73; 0x68; 0x61; 0x32; 0x2d; 0x65; 0x76; 0x2d; 0x73; 0x65; 0x72; 0x76; 0x65; 0x72;
|
|
0x2d; 0x67; 0x31; 0x2e; 0x63; 0x72; 0x6c; 0x30; 0x34; 0xa0; 0x32; 0xa0; 0x30; 0x86; 0x2e; 0x68;
|
|
0x74; 0x74; 0x70; 0x3a; 0x2f; 0x2f; 0x63; 0x72; 0x6c; 0x34; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63;
|
|
0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x2f; 0x73; 0x68; 0x61; 0x32; 0x2d; 0x65; 0x76; 0x2d;
|
|
0x73; 0x65; 0x72; 0x76; 0x65; 0x72; 0x2d; 0x67; 0x31; 0x2e; 0x63; 0x72; 0x6c; 0x30; 0x42; 0x06;
|
|
0x03; 0x55; 0x1d; 0x20; 0x04; 0x3b; 0x30; 0x39; 0x30; 0x37; 0x06; 0x09; 0x60; 0x86; 0x48; 0x01;
|
|
0x86; 0xfd; 0x6c; 0x02; 0x01; 0x30; 0x2a; 0x30; 0x28; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05;
|
|
0x07; 0x02; 0x01; 0x16; 0x1c; 0x68; 0x74; 0x74; 0x70; 0x73; 0x3a; 0x2f; 0x2f; 0x77; 0x77; 0x77;
|
|
0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x2f; 0x43; 0x50;
|
|
0x53; 0x30; 0x81; 0x88; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x01; 0x01; 0x04; 0x7c;
|
|
0x30; 0x7a; 0x30; 0x24; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x30; 0x01; 0x86; 0x18;
|
|
0x68; 0x74; 0x74; 0x70; 0x3a; 0x2f; 0x2f; 0x6f; 0x63; 0x73; 0x70; 0x2e; 0x64; 0x69; 0x67; 0x69;
|
|
0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x30; 0x52; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05;
|
|
0x05; 0x07; 0x30; 0x02; 0x86; 0x46; 0x68; 0x74; 0x74; 0x70; 0x3a; 0x2f; 0x2f; 0x63; 0x61; 0x63;
|
|
0x65; 0x72; 0x74; 0x73; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f;
|
|
0x6d; 0x2f; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72; 0x74; 0x53; 0x48; 0x41; 0x32; 0x45; 0x78;
|
|
0x74; 0x65; 0x6e; 0x64; 0x65; 0x64; 0x56; 0x61; 0x6c; 0x69; 0x64; 0x61; 0x74; 0x69; 0x6f; 0x6e;
|
|
0x53; 0x65; 0x72; 0x76; 0x65; 0x72; 0x43; 0x41; 0x2e; 0x63; 0x72; 0x74; 0x30; 0x0c; 0x06; 0x03;
|
|
0x55; 0x1d; 0x13; 0x01; 0x01; 0xff; 0x04; 0x02; 0x30; 0x00; 0x30; 0x0d; 0x06; 0x09; 0x2a; 0x86;
|
|
0x48; 0x86; 0xf7; 0x0d; 0x01; 0x01; 0x0b; 0x05; 0x00; 0x03; 0x82; 0x01; 0x01; 0x00; 0x6f; 0xe7;
|
|
0x6d; 0xcb; 0x82; 0xf3; 0xef; 0x90; 0x87; 0x09; 0xd7; 0x0f; 0x15; 0x22; 0x2c; 0x8c; 0xfe; 0xd3;
|
|
0xab; 0x1c; 0x8a; 0x96; 0xdb; 0x5d; 0x12; 0x5d; 0xd1; 0x78; 0xc0; 0x31; 0xb0; 0xff; 0x45; 0xc8;
|
|
0x89; 0xf7; 0x08; 0x98; 0x52; 0x17; 0x1f; 0x4c; 0x4b; 0x20; 0x64; 0x6a; 0x6d; 0xdb; 0x50; 0xd7;
|
|
0x10; 0xbe; 0x7e; 0xab; 0xfe; 0x2f; 0x80; 0xd8; 0xa9; 0x4a; 0x58; 0x41; 0x69; 0x81; 0x72; 0x19;
|
|
0x08; 0x83; 0x9b; 0x92; 0x10; 0x4e; 0x62; 0x2d; 0x7b; 0x46; 0x70; 0x43; 0x6e; 0xa3; 0x53; 0x13;
|
|
0x1f; 0xe2; 0x93; 0xa6; 0x23; 0x5b; 0xf7; 0x92; 0x3e; 0x37; 0x14; 0x75; 0x3b; 0xb9; 0x4b; 0x24;
|
|
0x41; 0x2e; 0xa5; 0x3d; 0x48; 0x0d; 0x0f; 0x99; 0xea; 0x1e; 0x42; 0x97; 0xc6; 0xfe; 0x95; 0xda;
|
|
0xab; 0x47; 0x9a; 0xcb; 0x2b; 0x03; 0xd6; 0x0d; 0x40; 0xc1; 0x0a; 0xf7; 0x78; 0x1a; 0xda; 0xb5;
|
|
0x83; 0xa4; 0xad; 0xb5; 0x99; 0x49; 0x20; 0x2e; 0xf8; 0x93; 0x3c; 0x1e; 0x6c; 0x3d; 0xd1; 0x3b;
|
|
0x23; 0x3a; 0x6b; 0x38; 0x2a; 0x7e; 0x62; 0x7a; 0x5f; 0xdd; 0x17; 0x05; 0x75; 0xd0; 0x24; 0x5d;
|
|
0xbe; 0x8d; 0xa8; 0x9a; 0x10; 0x44; 0xfa; 0xd2; 0xb4; 0xca; 0xef; 0xd7; 0xd0; 0xb5; 0x76; 0xa5;
|
|
0x26; 0x25; 0x1c; 0x08; 0x41; 0xd8; 0x64; 0x92; 0xa7; 0xaf; 0x7d; 0xfe; 0x88; 0x40; 0x39; 0x61;
|
|
0x0b; 0xc0; 0x48; 0x30; 0xa9; 0x82; 0x34; 0xad; 0xf7; 0x70; 0x46; 0x03; 0x7c; 0x35; 0x91; 0x3a;
|
|
0xd5; 0xbb; 0x24; 0xd8; 0x01; 0xbc; 0x14; 0xf0; 0xc3; 0x0f; 0x23; 0x3b; 0x58; 0x32; 0xba; 0x0f;
|
|
0x12; 0x6c; 0x66; 0x7a; 0x6d; 0x9d; 0xe4; 0xf0; 0xe5; 0x7c; 0x5d; 0x7e; 0x02; 0xd8; 0xd7; 0xac;
|
|
0x89; 0x97; 0x0b; 0x61; 0xb7; 0x36; 0x9f; 0xb0; 0x7d; 0x3b; 0xee; 0xb7; 0x33; 0x69;
|
|
0x00; 0x04; 0xba;
|
|
0x30; 0x82; 0x04; 0xb6; 0x30; 0x82; 0x03; 0x9e; 0xa0; 0x03; 0x02; 0x01; 0x02; 0x02; 0x10;
|
|
0x0c; 0x79; 0xa9; 0x44; 0xb0; 0x8c; 0x11; 0x95; 0x20; 0x92; 0x61; 0x5f; 0xe2; 0x6b; 0x1d; 0x83;
|
|
0x30; 0x0d; 0x06; 0x09; 0x2a; 0x86; 0x48; 0x86; 0xf7; 0x0d; 0x01; 0x01; 0x0b; 0x05; 0x00; 0x30;
|
|
0x6c; 0x31; 0x0b; 0x30; 0x09; 0x06; 0x03; 0x55; 0x04; 0x06; 0x13; 0x02; 0x55; 0x53; 0x31; 0x15;
|
|
0x30; 0x13; 0x06; 0x03; 0x55; 0x04; 0x0a; 0x13; 0x0c; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72;
|
|
0x74; 0x20; 0x49; 0x6e; 0x63; 0x31; 0x19; 0x30; 0x17; 0x06; 0x03; 0x55; 0x04; 0x0b; 0x13; 0x10;
|
|
0x77; 0x77; 0x77; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d;
|
|
0x31; 0x2b; 0x30; 0x29; 0x06; 0x03; 0x55; 0x04; 0x03; 0x13; 0x22; 0x44; 0x69; 0x67; 0x69; 0x43;
|
|
0x65; 0x72; 0x74; 0x20; 0x48; 0x69; 0x67; 0x68; 0x20; 0x41; 0x73; 0x73; 0x75; 0x72; 0x61; 0x6e;
|
|
0x63; 0x65; 0x20; 0x45; 0x56; 0x20; 0x52; 0x6f; 0x6f; 0x74; 0x20; 0x43; 0x41; 0x30; 0x1e; 0x17;
|
|
0x0d; 0x31; 0x33; 0x31; 0x30; 0x32; 0x32; 0x31; 0x32; 0x30; 0x30; 0x30; 0x30; 0x5a; 0x17; 0x0d;
|
|
0x32; 0x38; 0x31; 0x30; 0x32; 0x32; 0x31; 0x32; 0x30; 0x30; 0x30; 0x30; 0x5a; 0x30; 0x75; 0x31;
|
|
0x0b; 0x30; 0x09; 0x06; 0x03; 0x55; 0x04; 0x06; 0x13; 0x02; 0x55; 0x53; 0x31; 0x15; 0x30; 0x13;
|
|
0x06; 0x03; 0x55; 0x04; 0x0a; 0x13; 0x0c; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72; 0x74; 0x20;
|
|
0x49; 0x6e; 0x63; 0x31; 0x19; 0x30; 0x17; 0x06; 0x03; 0x55; 0x04; 0x0b; 0x13; 0x10; 0x77; 0x77;
|
|
0x77; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x31; 0x34;
|
|
0x30; 0x32; 0x06; 0x03; 0x55; 0x04; 0x03; 0x13; 0x2b; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72;
|
|
0x74; 0x20; 0x53; 0x48; 0x41; 0x32; 0x20; 0x45; 0x78; 0x74; 0x65; 0x6e; 0x64; 0x65; 0x64; 0x20;
|
|
0x56; 0x61; 0x6c; 0x69; 0x64; 0x61; 0x74; 0x69; 0x6f; 0x6e; 0x20; 0x53; 0x65; 0x72; 0x76; 0x65;
|
|
0x72; 0x20; 0x43; 0x41; 0x30; 0x82; 0x01; 0x22; 0x30; 0x0d; 0x06; 0x09; 0x2a; 0x86; 0x48; 0x86;
|
|
0xf7; 0x0d; 0x01; 0x01; 0x01; 0x05; 0x00; 0x03; 0x82; 0x01; 0x0f; 0x00; 0x30; 0x82; 0x01; 0x0a;
|
|
0x02; 0x82; 0x01; 0x01; 0x00; 0xd7; 0x53; 0xa4; 0x04; 0x51; 0xf8; 0x99; 0xa6; 0x16; 0x48; 0x4b;
|
|
0x67; 0x27; 0xaa; 0x93; 0x49; 0xd0; 0x39; 0xed; 0x0c; 0xb0; 0xb0; 0x00; 0x87; 0xf1; 0x67; 0x28;
|
|
0x86; 0x85; 0x8c; 0x8e; 0x63; 0xda; 0xbc; 0xb1; 0x40; 0x38; 0xe2; 0xd3; 0xf5; 0xec; 0xa5; 0x05;
|
|
0x18; 0xb8; 0x3d; 0x3e; 0xc5; 0x99; 0x17; 0x32; 0xec; 0x18; 0x8c; 0xfa; 0xf1; 0x0c; 0xa6; 0x64;
|
|
0x21; 0x85; 0xcb; 0x07; 0x10; 0x34; 0xb0; 0x52; 0x88; 0x2b; 0x1f; 0x68; 0x9b; 0xd2; 0xb1; 0x8f;
|
|
0x12; 0xb0; 0xb3; 0xd2; 0xe7; 0x88; 0x1f; 0x1f; 0xef; 0x38; 0x77; 0x54; 0x53; 0x5f; 0x80; 0x79;
|
|
0x3f; 0x2e; 0x1a; 0xaa; 0xa8; 0x1e; 0x4b; 0x2b; 0x0d; 0xab; 0xb7; 0x63; 0xb9; 0x35; 0xb7; 0x7d;
|
|
0x14; 0xbc; 0x59; 0x4b; 0xdf; 0x51; 0x4a; 0xd2; 0xa1; 0xe2; 0x0c; 0xe2; 0x90; 0x82; 0x87; 0x6a;
|
|
0xae; 0xea; 0xd7; 0x64; 0xd6; 0x98; 0x55; 0xe8; 0xfd; 0xaf; 0x1a; 0x50; 0x6c; 0x54; 0xbc; 0x11;
|
|
0xf2; 0xfd; 0x4a; 0xf2; 0x9d; 0xbb; 0x7f; 0x0e; 0xf4; 0xd5; 0xbe; 0x8e; 0x16; 0x89; 0x12; 0x55;
|
|
0xd8; 0xc0; 0x71; 0x34; 0xee; 0xf6; 0xdc; 0x2d; 0xec; 0xc4; 0x87; 0x25; 0x86; 0x8d; 0xd8; 0x21;
|
|
0xe4; 0xb0; 0x4d; 0x0c; 0x89; 0xdc; 0x39; 0x26; 0x17; 0xdd; 0xf6; 0xd7; 0x94; 0x85; 0xd8; 0x04;
|
|
0x21; 0x70; 0x9d; 0x6f; 0x6f; 0xff; 0x5c; 0xba; 0x19; 0xe1; 0x45; 0xcb; 0x56; 0x57; 0x28; 0x7e;
|
|
0x1c; 0x0d; 0x41; 0x57; 0xaa; 0xb7; 0xb8; 0x27; 0xbb; 0xb1; 0xe4; 0xfa; 0x2a; 0xef; 0x21; 0x23;
|
|
0x75; 0x1a; 0xad; 0x2d; 0x9b; 0x86; 0x35; 0x8c; 0x9c; 0x77; 0xb5; 0x73; 0xad; 0xd8; 0x94; 0x2d;
|
|
0xe4; 0xf3; 0x0c; 0x9d; 0xee; 0xc1; 0x4e; 0x62; 0x7e; 0x17; 0xc0; 0x71; 0x9e; 0x2c; 0xde; 0xf1;
|
|
0xf9; 0x10; 0x28; 0x19; 0x33; 0x02; 0x03; 0x01; 0x00; 0x01; 0xa3; 0x82; 0x01; 0x49; 0x30; 0x82;
|
|
0x01; 0x45; 0x30; 0x12; 0x06; 0x03; 0x55; 0x1d; 0x13; 0x01; 0x01; 0xff; 0x04; 0x08; 0x30; 0x06;
|
|
0x01; 0x01; 0xff; 0x02; 0x01; 0x00; 0x30; 0x0e; 0x06; 0x03; 0x55; 0x1d; 0x0f; 0x01; 0x01; 0xff;
|
|
0x04; 0x04; 0x03; 0x02; 0x01; 0x86; 0x30; 0x1d; 0x06; 0x03; 0x55; 0x1d; 0x25; 0x04; 0x16; 0x30;
|
|
0x14; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x03; 0x01; 0x06; 0x08; 0x2b; 0x06; 0x01;
|
|
0x05; 0x05; 0x07; 0x03; 0x02; 0x30; 0x34; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x01;
|
|
0x01; 0x04; 0x28; 0x30; 0x26; 0x30; 0x24; 0x06; 0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x30;
|
|
0x01; 0x86; 0x18; 0x68; 0x74; 0x74; 0x70; 0x3a; 0x2f; 0x2f; 0x6f; 0x63; 0x73; 0x70; 0x2e; 0x64;
|
|
0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x30; 0x4b; 0x06; 0x03; 0x55;
|
|
0x1d; 0x1f; 0x04; 0x44; 0x30; 0x42; 0x30; 0x40; 0xa0; 0x3e; 0xa0; 0x3c; 0x86; 0x3a; 0x68; 0x74;
|
|
0x74; 0x70; 0x3a; 0x2f; 0x2f; 0x63; 0x72; 0x6c; 0x34; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65;
|
|
0x72; 0x74; 0x2e; 0x63; 0x6f; 0x6d; 0x2f; 0x44; 0x69; 0x67; 0x69; 0x43; 0x65; 0x72; 0x74; 0x48;
|
|
0x69; 0x67; 0x68; 0x41; 0x73; 0x73; 0x75; 0x72; 0x61; 0x6e; 0x63; 0x65; 0x45; 0x56; 0x52; 0x6f;
|
|
0x6f; 0x74; 0x43; 0x41; 0x2e; 0x63; 0x72; 0x6c; 0x30; 0x3d; 0x06; 0x03; 0x55; 0x1d; 0x20; 0x04;
|
|
0x36; 0x30; 0x34; 0x30; 0x32; 0x06; 0x04; 0x55; 0x1d; 0x20; 0x00; 0x30; 0x2a; 0x30; 0x28; 0x06;
|
|
0x08; 0x2b; 0x06; 0x01; 0x05; 0x05; 0x07; 0x02; 0x01; 0x16; 0x1c; 0x68; 0x74; 0x74; 0x70; 0x73;
|
|
0x3a; 0x2f; 0x2f; 0x77; 0x77; 0x77; 0x2e; 0x64; 0x69; 0x67; 0x69; 0x63; 0x65; 0x72; 0x74; 0x2e;
|
|
0x63; 0x6f; 0x6d; 0x2f; 0x43; 0x50; 0x53; 0x30; 0x1d; 0x06; 0x03; 0x55; 0x1d; 0x0e; 0x04; 0x16;
|
|
0x04; 0x14; 0x3d; 0xd3; 0x50; 0xa5; 0xd6; 0xa0; 0xad; 0xee; 0xf3; 0x4a; 0x60; 0x0a; 0x65; 0xd3;
|
|
0x21; 0xd4; 0xf8; 0xf8; 0xd6; 0x0f; 0x30; 0x1f; 0x06; 0x03; 0x55; 0x1d; 0x23; 0x04; 0x18; 0x30;
|
|
0x16; 0x80; 0x14; 0xb1; 0x3e; 0xc3; 0x69; 0x03; 0xf8; 0xbf; 0x47; 0x01; 0xd4; 0x98; 0x26; 0x1a;
|
|
0x08; 0x02; 0xef; 0x63; 0x64; 0x2b; 0xc3; 0x30; 0x0d; 0x06; 0x09; 0x2a; 0x86; 0x48; 0x86; 0xf7;
|
|
0x0d; 0x01; 0x01; 0x0b; 0x05; 0x00; 0x03; 0x82; 0x01; 0x01; 0x00; 0x9d; 0xb6; 0xd0; 0x90; 0x86;
|
|
0xe1; 0x86; 0x02; 0xed; 0xc5; 0xa0; 0xf0; 0x34; 0x1c; 0x74; 0xc1; 0x8d; 0x76; 0xcc; 0x86; 0x0a;
|
|
0xa8; 0xf0; 0x4a; 0x8a; 0x42; 0xd6; 0x3f; 0xc8; 0xa9; 0x4d; 0xad; 0x7c; 0x08; 0xad; 0xe6; 0xb6;
|
|
0x50; 0xb8; 0xa2; 0x1a; 0x4d; 0x88; 0x07; 0xb1; 0x29; 0x21; 0xdc; 0xe7; 0xda; 0xc6; 0x3c; 0x21;
|
|
0xe0; 0xe3; 0x11; 0x49; 0x70; 0xac; 0x7a; 0x1d; 0x01; 0xa4; 0xca; 0x11; 0x3a; 0x57; 0xab; 0x7d;
|
|
0x57; 0x2a; 0x40; 0x74; 0xfd; 0xd3; 0x1d; 0x85; 0x18; 0x50; 0xdf; 0x57; 0x47; 0x75; 0xa1; 0x7d;
|
|
0x55; 0x20; 0x2e; 0x47; 0x37; 0x50; 0x72; 0x8c; 0x7f; 0x82; 0x1b; 0xd2; 0x62; 0x8f; 0x2d; 0x03;
|
|
0x5a; 0xda; 0xc3; 0xc8; 0xa1; 0xce; 0x2c; 0x52; 0xa2; 0x00; 0x63; 0xeb; 0x73; 0xba; 0x71; 0xc8;
|
|
0x49; 0x27; 0x23; 0x97; 0x64; 0x85; 0x9e; 0x38; 0x0e; 0xad; 0x63; 0x68; 0x3c; 0xba; 0x52; 0x81;
|
|
0x58; 0x79; 0xa3; 0x2c; 0x0c; 0xdf; 0xde; 0x6d; 0xeb; 0x31; 0xf2; 0xba; 0xa0; 0x7c; 0x6c; 0xf1;
|
|
0x2c; 0xd4; 0xe1; 0xbd; 0x77; 0x84; 0x37; 0x03; 0xce; 0x32; 0xb5; 0xc8; 0x9a; 0x81; 0x1a; 0x4a;
|
|
0x92; 0x4e; 0x3b; 0x46; 0x9a; 0x85; 0xfe; 0x83; 0xa2; 0xf9; 0x9e; 0x8c; 0xa3; 0xcc; 0x0d; 0x5e;
|
|
0xb3; 0x3d; 0xcf; 0x04; 0x78; 0x8f; 0x14; 0x14; 0x7b; 0x32; 0x9c; 0xc7; 0x00; 0xa6; 0x5c; 0xc4;
|
|
0xb5; 0xa1; 0x55; 0x8d; 0x5a; 0x56; 0x68; 0xa4; 0x22; 0x70; 0xaa; 0x3c; 0x81; 0x71; 0xd9; 0x9d;
|
|
0xa8; 0x45; 0x3b; 0xf4; 0xe5; 0xf6; 0xa2; 0x51; 0xdd; 0xc7; 0x7b; 0x62; 0xe8; 0x6f; 0x0c; 0x74;
|
|
0xeb; 0xb8; 0xda; 0xf8; 0xbf; 0x87; 0x0d; 0x79; 0x50; 0x91; 0x90; 0x9b; 0x18; 0x3b; 0x91; 0x59;
|
|
0x27; 0xf1; 0x35; 0x28; 0x13; 0xab; 0x26; 0x7e; 0xd5; 0xf7; 0x7a ],
|
|
Core.Certificate (Writer.assemble_certificates [gh1 ; gh2]) )
|
|
|
|
|
|
]
|
|
|
|
let cmp_handshake_cstruct hs hs' =
|
|
Core.(match hs, hs' with
|
|
| Finished xs, Finished ys -> assert_cs_eq xs ys
|
|
| ServerKeyExchange xs, ServerKeyExchange ys -> assert_cs_eq xs ys
|
|
| Certificate xs, Certificate ys -> assert_cs_eq xs ys
|
|
| ClientKeyExchange xs, ClientKeyExchange ys -> assert_cs_eq xs ys
|
|
| _ -> assert_failure "handshake cstruct data parser broken")
|
|
|
|
let good_handshake_cstruct_data_parser (xs, res) _ =
|
|
let buf = list_to_cstruct xs in
|
|
match Reader.parse_handshake buf with
|
|
| Ok r -> cmp_handshake_cstruct r res
|
|
| Error _ -> assert_failure "handshake cstruct data parser failed"
|
|
|
|
let good_handshake_cstruct_data_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse good handshake " ^ string_of_int i >:: good_handshake_cstruct_data_parser f)
|
|
good_handshake_cstruct_data
|
|
|
|
let bad_handshake_cstruct_data =
|
|
let data = [ 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11 ] in
|
|
[ [12; 0; 0; 13] @ data ;
|
|
[12; 0; 0; 11] @ data ;
|
|
[20; 0; 1; 12] @ data ;
|
|
[20; 0; 0; 11] @ data ;
|
|
[16; 0; 0; 15; 0; 12] @ data ;
|
|
|
|
[25; 0; 0; 14; 0; 12] @ data ;
|
|
[255; 0; 0; 14; 0; 12] @ data ;
|
|
|
|
[11; 0; 0; 17; 0; 0; 15; 0; 0; 12] @ data ;
|
|
]
|
|
|
|
let bad_handshake_cstruct_data_parser xs _ =
|
|
let buf = list_to_cstruct xs in
|
|
match Reader.parse_handshake buf with
|
|
| Ok _ -> assert_failure "bad handshake cstruct parser won"
|
|
| Error _ -> ()
|
|
|
|
let bad_handshake_cstruct_data_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse bad handshake " ^ string_of_int i >:: bad_handshake_cstruct_data_parser f)
|
|
bad_handshake_cstruct_data
|
|
|
|
let bad_certificate_cstruct_data =
|
|
let data = [ 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11 ] in
|
|
[ [11; 0; 0; 3; 0; 0; 2] ;
|
|
[11; 0; 0; 4; 0; 0; 0; 0] ;
|
|
[11; 0; 0; 18; 0; 0; 15; 0; 0; 11] @ data ;
|
|
[11; 0; 0; 18; 0; 0; 14; 0; 0; 11] @ data ;
|
|
[11; 0; 0; 33; 0; 0; 29; 0; 0; 12] @ data @ [0; 0; 12] @ data ;
|
|
[11; 0; 0; 33; 0; 0; 31; 0; 0; 12] @ data @ [0; 0; 12] @ data ;
|
|
[11; 0; 0; 33; 0; 0; 30; 0; 0; 11] @ data @ [0; 0; 12] @ data
|
|
]
|
|
|
|
let bad_certificate_cstruct_data_parser xs _ =
|
|
let buf = list_to_cstruct xs in
|
|
Reader.(match parse_handshake buf with
|
|
| Ok (Core.Certificate cs) ->
|
|
(match Reader.parse_certificates cs with
|
|
| Ok _ -> assert_failure "bad certificate parser won"
|
|
| Error _ -> ())
|
|
| _ -> assert_failure "should've been a certificate")
|
|
|
|
let bad_certificate_cstruct_data_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse bad certificate " ^ string_of_int i >:: bad_certificate_cstruct_data_parser f)
|
|
bad_certificate_cstruct_data
|
|
|
|
let good_client_hellos =
|
|
(* I rolled the dice 16 times *)
|
|
let rnd = [ 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15 ] in
|
|
let rand = rnd @ rnd in
|
|
let client_random = list_to_cstruct rand in
|
|
Core.(let ch : client_hello =
|
|
{ client_version = `TLS_1_2 ;
|
|
client_random ;
|
|
sessionid = None ;
|
|
ciphersuites = [] ;
|
|
extensions = []}
|
|
in
|
|
[
|
|
(* versions *)
|
|
([1; 0; 0; 38; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] , ch ) ;
|
|
([1; 0; 0; 38; 3; 0] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] , { ch with client_version = `SSL_3 } ) ;
|
|
([1; 0; 0; 38; 3; 1] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] , { ch with client_version = `TLS_1_0 } ) ;
|
|
([1; 0; 0; 38; 3; 2] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] , { ch with client_version = `TLS_1_1 } ) ;
|
|
([1; 0; 0; 38; 3; 4] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] , { ch with client_version = `TLS_1_3 } ) ;
|
|
([1; 0; 0; 38; 3; 5] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] , { ch with client_version = `TLS_1_X 5 } ) ;
|
|
|
|
(* well-formed compression (not available in higher layer) *)
|
|
([1; 0; 0; 39; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 1; 0; (* exts *)] , ch ) ;
|
|
([1; 0; 0; 40; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 2; 0; 1; (* exts *)] , ch ) ;
|
|
|
|
(* ciphersuites *)
|
|
([1; 0; 0; 40; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 2; 0; 0x0A; (* comp *) 0; (* exts *)] , { ch with ciphersuites = [Packet.TLS_RSA_WITH_3DES_EDE_CBC_SHA] } ) ;
|
|
([1; 0; 0; 42; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 4; 0; 0x0A; 0; 0x16; (* comp *) 0; (* exts *)] , { ch with ciphersuites = Packet.([TLS_RSA_WITH_3DES_EDE_CBC_SHA ; TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA]) } ) ;
|
|
|
|
(* ignore unknown ciphersuite *)
|
|
([1; 0; 0; 42; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 4; 0; 0x0A; 0; 0x47; (* comp *) 0; (* exts *)] , { ch with ciphersuites = [Packet.TLS_RSA_WITH_3DES_EDE_CBC_SHA] } ) ;
|
|
|
|
(* ignore unknown compression method *)
|
|
([1; 0; 0; 40; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 2; 0; 42; (* exts *)] , ch ) ;
|
|
|
|
(* TODO: unknown extensions should be ignored (check again with rfc) *)
|
|
(* TODO: validate client_hello:
|
|
- non-empty ciphersuites
|
|
- no duplicated ciphersuites
|
|
- those required by protocol version should be in the list!
|
|
- no duplicated extensions
|
|
- no unsupported extensions (SignatureAlgorithms in TLS < 1.2)
|
|
- empty ServerName extension is useless
|
|
*)
|
|
|
|
(* combine ciphersuite + compression *)
|
|
([1; 0; 0; 44; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 4; 0; 0x0A; 0; 0x16; (* comp *) 2; 0; 1; (* exts *)] , { ch with ciphersuites = Packet.([TLS_RSA_WITH_3DES_EDE_CBC_SHA ; TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA]) }) ;
|
|
|
|
(* session id *)
|
|
([1; 0; 0; 41; 3; 3] @ rand @ [(* session id *) 3; 1; 2; 3; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] , { ch with sessionid = Some (list_to_cstruct [1; 2; 3] ) } ) ;
|
|
|
|
(* combine ciphersuite + compression + session id *)
|
|
([1; 0; 0; 47; 3; 3] @ rand @ [(* session id *) 3; 1; 2; 3; (* cipher *) 0; 4; 0; 0x0A; 0; 0x16; (* comp *) 2; 0; 1; (* exts *)] , { ch with ciphersuites = Packet.([TLS_RSA_WITH_3DES_EDE_CBC_SHA ; TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA]) ; sessionid = Some (list_to_cstruct [1; 2; 3]) }) ;
|
|
|
|
|
|
(* extensions *)
|
|
(* empty *)
|
|
([1; 0; 0; 40; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 0] , ch ) ;
|
|
|
|
(* some hostname *)
|
|
([1; 0; 0; 52; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 12; 0; 0; 0; 8; 0; 6; 0; 0; 3; 102; 111; 111] , { ch with extensions = [make_hostname_ext "foo"] } ) ;
|
|
(* some other hostname *)
|
|
([1; 0; 0; 59; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 19; 0; 0; 0; 15; 0; 13; 0; 0; 10; 102; 111; 111; 98; 97; 114; 46; 99; 111; 109] , { ch with extensions = [make_hostname_ext "foobar.com"] } ) ;
|
|
|
|
(* max fragment length *)
|
|
([1; 0; 0; 45; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 5; 0; 1; 0; 1; 3] , { ch with extensions = [`MaxFragmentLength Packet.TWO_11] } ) ;
|
|
|
|
(* empty SupportedGroups *)
|
|
([1; 0; 0; 46; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 6; 0; 0xA; 0; 2; 0; 0] , { ch with extensions = [`SupportedGroups []] } ) ;
|
|
(* one supported group *)
|
|
([1; 0; 0; 48; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 8; 0; 0xA; 0; 4; 0; 2; 0; 25] , { ch with extensions = [`SupportedGroups [Packet.SECP521R1]] } ) ;
|
|
(* two supported groups *)
|
|
([1; 0; 0; 50; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 10; 0; 0xA; 0; 6; 0; 4; 0; 25; 0; 24] , { ch with extensions = [`SupportedGroups Packet.([SECP521R1; SECP384R1])] } ) ;
|
|
(* three supported groups, one unknown *)
|
|
([1; 0; 0; 52; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 12; 0; 0xA; 0; 8; 0; 6; 0; 25; 0xFF; 0xFF; 0; 24] , { ch with extensions = [`SupportedGroups Packet.([SECP521R1; SECP384R1])] } ) ;
|
|
|
|
(* secure renegotiation *)
|
|
([1; 0; 0; 47; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 7; 0xFF; 1; 0; 3; 2; 1; 2] , { ch with extensions = [`SecureRenegotiation (list_to_cstruct [1;2])] } ) ;
|
|
|
|
(* Padding *)
|
|
([1; 0; 0; 47; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 7; 0; 21; 0; 3; 0; 0; 0] , { ch with extensions = [`Padding 3] } ) ;
|
|
|
|
(* signature algorithm *)
|
|
([1; 0; 0; 46; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 6; 0; 13; 0; 2; 0; 0] , { ch with extensions = [`SignatureAlgorithms []] } ) ;
|
|
([1; 0; 0; 48; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 8; 0; 13; 0; 4; 0; 2; 1; 1] , { ch with extensions = [`SignatureAlgorithms [`RSA_PKCS1_MD5]] } ) ;
|
|
([1; 0; 0; 50; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 10; 0; 13; 0; 6; 0; 4; 2; 1; 1; 1] , { ch with extensions = [`SignatureAlgorithms [`RSA_PKCS1_SHA1; `RSA_PKCS1_MD5]] }) ;
|
|
(* unknown one *)
|
|
([1; 0; 0; 52; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 12; 0; 13; 0; 8; 0; 6; 42; 42; 2; 1; 1; 1] , { ch with extensions = [`SignatureAlgorithms [`RSA_PKCS1_SHA1; `RSA_PKCS1_MD5]] } ) ;
|
|
|
|
(* ALPN *)
|
|
([1; 0; 0; 58; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 18; 0; 16; 0; 14; 0; 12; (* h2 *) 2; 104; 50; (* http/1.1*) 8; 104; 116; 116; 112; 47; 49; 46; 49] , { ch with extensions = [`ALPN ["h2"; "http/1.1"]] } ) ;
|
|
|
|
(* combinations from the real world *)
|
|
([0x01; (* hello *)
|
|
0x00; 0x00; 0xaf; (* length *)
|
|
0x03; 0x01; (* version *)
|
|
0x7c; 0x53; 0x05; 0x72; 0x7a; 0x1b; 0x84; 0x70; 0x30; 0x89; 0xef; 0xad; 0xfb; 0x56; 0xc1; 0x3d; 0x73; 0x4b; 0xc7; 0xcb; 0x8c; 0xc8; 0x75; 0x43; 0x01; 0x12; 0x32; 0xd6; 0x74; 0x87; 0xcb; 0x18; (* random *)
|
|
0x00; (* session id *)
|
|
0x00; 0x68; (* ciphersuites *)
|
|
0xc0; 0x14; 0xc0; 0x0a; 0xc0; 0x22; 0xc0; 0x21; 0x00; 0x39; 0x00; 0x38; 0x00; 0x88; 0x00; 0x87; 0xc0; 0x0f; 0xc0; 0x05; 0x00; 0x35; 0x00; 0x84; 0xc0; 0x12; 0xc0; 0x08; 0xc0; 0x1c; 0xc0; 0x1b; 0x00; 0x16; 0x00; 0x13; 0xc0; 0x0d; 0xc0; 0x03; 0x00; 0x0a; 0xc0; 0x13; 0xc0; 0x09; 0xc0; 0x1f; 0xc0; 0x1e; 0x00; 0x33; 0x00; 0x32; 0x00; 0x9a; 0x00; 0x99; 0x00; 0x45; 0x00; 0x44; 0xc0; 0x0e; 0xc0; 0x04; 0x00; 0x2f; 0x00; 0x96; 0x00; 0x41; 0x00; 0x07; 0xc0; 0x11; 0xc0; 0x07; 0xc0; 0x0c; 0xc0; 0x02; 0x00; 0x05; 0x00; 0x04; 0x00; 0x15; 0x00; 0x12; 0x00; 0x09; 0x00; 0x14; 0x00; 0x11; 0x00; 0x08; 0x00; 0x06; 0x00; 0x03; 0x00; 0xff;
|
|
0x01; 0x00; (* compression *)
|
|
0x00; 0x1e; (* extensions *)
|
|
0x00; 0x0a; 0x00; 0x08; (* elliptic curves *)
|
|
0x00; 0x06; 0x00; 0x19; 0x00; 0x18; 0x00; 0x17;
|
|
0x00; 0x10; 0x00; 0x0e; 0x00; 0x0c; (* ALPN *)
|
|
0x02; 0x68; 0x32;
|
|
0x08; 0x68; 0x74; 0x74; 0x70; 0x2f; 0x31; 0x2e; 0x31 ]
|
|
(* 0x00; 0x23; 0x00; 0x00; (* sessionticket_tls *)
|
|
0x00; 0x0f; 0x00; 0x01; 0x01 (* heartbeat *) *) ,
|
|
{ ch with
|
|
client_version = `TLS_1_0 ;
|
|
client_random = list_to_cstruct [0x7c; 0x53; 0x05; 0x72; 0x7a; 0x1b; 0x84; 0x70; 0x30; 0x89; 0xef; 0xad; 0xfb; 0x56; 0xc1; 0x3d; 0x73; 0x4b; 0xc7; 0xcb; 0x8c; 0xc8; 0x75; 0x43; 0x01; 0x12; 0x32; 0xd6; 0x74; 0x87; 0xcb; 0x18] ;
|
|
ciphersuites = Packet.([TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA; TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA; TLS_DHE_RSA_WITH_AES_256_CBC_SHA; TLS_RSA_WITH_AES_256_CBC_SHA; TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA; TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA; TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA; TLS_RSA_WITH_3DES_EDE_CBC_SHA; TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA; TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA; TLS_DHE_RSA_WITH_AES_128_CBC_SHA; TLS_RSA_WITH_AES_128_CBC_SHA; TLS_EMPTY_RENEGOTIATION_INFO_SCSV]);
|
|
extensions = [`SupportedGroups Packet.([SECP521R1; SECP384R1; SECP256R1]);
|
|
`ALPN ["h2"; "http/1.1"] ] } ) ;
|
|
|
|
(
|
|
[ 0x01; (* client hello *)
|
|
0x00; 0x01; 0xc6; (* length *)
|
|
0x03; 0x03; (* protocol version *)
|
|
0xb7; 0x36; 0xeb; 0x21; 0xec; 0x81; 0x4d; 0x01; 0xfc; 0xf4; 0xe2; 0x06; 0x9a; 0x34; 0xb7; 0x21; 0xe1; 0x23; 0x6f; 0xbe; 0x50; 0xbf; 0xfe; 0x33; 0x9b; 0xc9; 0x5b; 0x20; 0x0e; 0x15; 0x02; 0x27; (* random *)
|
|
0x00; (* session id *)
|
|
0x00; 0xa0; (* ciphersuites *)
|
|
0xc0; 0x30; 0xc0; 0x2c; 0xc0; 0x28; 0xc0; 0x24; 0xc0; 0x14; 0xc0; 0x0a; 0xc0; 0x22; 0xc0; 0x21; 0x00; 0xa3; 0x00; 0x9f; 0x00; 0x6b; 0x00; 0x6a; 0x00; 0x39; 0x00; 0x38; 0x00; 0x88; 0x00; 0x87; 0xc0; 0x32; 0xc0; 0x2e; 0xc0; 0x2a; 0xc0; 0x26; 0xc0; 0x0f; 0xc0; 0x05; 0x00; 0x9d; 0x00; 0x3d; 0x00; 0x35; 0x00; 0x84; 0xc0; 0x12; 0xc0; 0x08; 0xc0; 0x1c; 0xc0; 0x1b; 0x00; 0x16; 0x00; 0x13; 0xc0; 0x0d; 0xc0; 0x03; 0x00; 0x0a; 0xc0; 0x2f; 0xc0; 0x2b; 0xc0; 0x27; 0xc0; 0x23; 0xc0; 0x13; 0xc0; 0x09; 0xc0; 0x1f; 0xc0; 0x1e; 0x00; 0xa2; 0x00; 0x9e; 0x00; 0x67; 0x00; 0x40; 0x00; 0x33; 0x00; 0x32; 0x00; 0x9a; 0x00; 0x99; 0x00; 0x45; 0x00; 0x44; 0xc0; 0x31; 0xc0; 0x2d; 0xc0; 0x29; 0xc0; 0x25; 0xc0; 0x0e; 0xc0; 0x04; 0x00; 0x9c; 0x00; 0x3c; 0x00; 0x2f; 0x00; 0x96; 0x00; 0x41; 0x00; 0x07; 0xc0; 0x11; 0xc0; 0x07; 0xc0; 0x0c; 0xc0; 0x02; 0x00; 0x05; 0x00; 0x04; 0x00; 0x15; 0x00; 0x12; 0x00; 0x09; 0x00; 0x14; 0x00; 0x11; 0x00; 0x08; 0x00; 0x06; 0x00; 0x03; 0x00; 0xff;
|
|
0x01; 0x00; (* compression *)
|
|
0x00; 0xFD; (* extensions *)
|
|
0x00; 0x0a; 0x00; 0x08; (* ec curves *)
|
|
0x00; 0x06; 0x00; 0x19; 0x00; 0x18; 0x00; 0x17;
|
|
(* 0x00; 0x23; 0x00; 0x00; *)
|
|
0x00; 0x0d; 0x00; 0x0c; (* signature algorithms *)
|
|
0x00; 0x0a; 0x06; 0x01; 0x05; 0x01; 0x04; 0x01; 0x03; 0x01; 0x02; 0x01;
|
|
0x00; 0x15; 0x00; 0xcb; (* padding *)
|
|
0x00; 0x00;
|
|
0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00;
|
|
0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00;
|
|
0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00;
|
|
0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00;
|
|
0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00;
|
|
0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00;
|
|
0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00;
|
|
0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00;
|
|
0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00;
|
|
0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00;
|
|
0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00;
|
|
0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00;
|
|
0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00; 0x00;
|
|
0x00; 0x10; 0x00; 0x0e; 0x00; 0x0c; (* ALPN *)
|
|
0x02; 0x68; 0x32;
|
|
0x08; 0x68; 0x74; 0x74; 0x70; 0x2f; 0x31; 0x2e; 0x31 ],
|
|
{ ch with
|
|
client_version = `TLS_1_2 ;
|
|
client_random = list_to_cstruct [0xb7; 0x36; 0xeb; 0x21; 0xec; 0x81; 0x4d; 0x01; 0xfc; 0xf4; 0xe2; 0x06; 0x9a; 0x34; 0xb7; 0x21; 0xe1; 0x23; 0x6f; 0xbe; 0x50; 0xbf; 0xfe; 0x33; 0x9b; 0xc9; 0x5b; 0x20; 0x0e; 0x15; 0x02; 0x27] ;
|
|
ciphersuites = Packet.([TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384; TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384; TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384; TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384; TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA; TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA; TLS_DHE_RSA_WITH_AES_256_GCM_SHA384; TLS_DHE_RSA_WITH_AES_256_CBC_SHA256; TLS_DHE_RSA_WITH_AES_256_CBC_SHA; TLS_RSA_WITH_AES_256_GCM_SHA384; TLS_RSA_WITH_AES_256_CBC_SHA256; TLS_RSA_WITH_AES_256_CBC_SHA; TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA; TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA; TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA; TLS_RSA_WITH_3DES_EDE_CBC_SHA; TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256; TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256; TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256; TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256; TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA; TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA; TLS_DHE_RSA_WITH_AES_128_GCM_SHA256; TLS_DHE_RSA_WITH_AES_128_CBC_SHA256; TLS_DHE_RSA_WITH_AES_128_CBC_SHA; TLS_RSA_WITH_AES_128_GCM_SHA256; TLS_RSA_WITH_AES_128_CBC_SHA256; TLS_RSA_WITH_AES_128_CBC_SHA; TLS_EMPTY_RENEGOTIATION_INFO_SCSV]) ;
|
|
extensions = [`SupportedGroups Packet.([SECP521R1; SECP384R1; SECP256R1]);
|
|
`SignatureAlgorithms
|
|
[`RSA_PKCS1_SHA512 ;
|
|
`RSA_PKCS1_SHA384 ;
|
|
`RSA_PKCS1_SHA256 ;
|
|
`RSA_PKCS1_SHA224 ;
|
|
`RSA_PKCS1_SHA1 ] ;
|
|
`Padding 203 ;
|
|
`ALPN ["h2"; "http/1.1"] ] } );
|
|
|
|
|
|
( [ 0x01; (* client hello *)
|
|
0x00; 0x00; 0x74; (* length *)
|
|
0x03; 0x04; (* version *)
|
|
0xf1; 0xb2; 0x50; 0x16; 0x4b; 0x77; 0x50; 0xb3; 0xdc; 0xcb; 0x1c; 0x6a; 0xae; 0x1a; 0x94; 0x87;
|
|
0xc4; 0x17; 0xbb; 0xa4; 0xf7; 0x92; 0xf8; 0x16; 0x56; 0x12; 0x03; 0x38; 0x1e; 0xe5; 0xc1; 0xae; (* client random *)
|
|
0x00; (* session id *)
|
|
0x00; 0x10; 0x00; 0x35; 0x00; 0x39; 0x00; 0x2f; 0x00; 0x33; 0x00; 0x16; 0x00; 0x0a; 0x00; 0x05; 0x00; 0x04; (* ciphersuites *)
|
|
0x01; 0x00; (* compression *)
|
|
0x00; 0x3b; (* extensions *)
|
|
0xff; 0x01; 0x00; 0x01; 0x00; (* secure reneg *)
|
|
0x00; 0x00; 0x00; 0x10; 0x00; 0x0e; 0x00; 0x00; 0x0b; 0x65; 0x78; 0x61; 0x6d; 0x70; 0x6c; 0x65; 0x2e; 0x63; 0x6f; 0x6d; (* SNI example.com *)
|
|
0x00; 0x0d; 0x00; 0x0c; 0x00; 0x0a; 0x06; 0x01; 0x05; 0x01; 0x04; 0x01; 0x02; 0x01; 0x01; 0x01; (* SignatureAlgorithms *)
|
|
0x00; 0x10; 0x00; 0x0e; 0x00; 0x0c; (* ALPN *)
|
|
0x02; 0x68; 0x32;
|
|
0x08; 0x68; 0x74; 0x74; 0x70; 0x2f; 0x31; 0x2e; 0x31
|
|
],
|
|
{ ch with client_version = `TLS_1_3 ;
|
|
client_random = list_to_cstruct [ 0xf1; 0xb2; 0x50; 0x16; 0x4b; 0x77; 0x50; 0xb3; 0xdc; 0xcb; 0x1c; 0x6a; 0xae; 0x1a; 0x94; 0x87; 0xc4; 0x17; 0xbb; 0xa4; 0xf7; 0x92; 0xf8; 0x16; 0x56; 0x12; 0x03; 0x38; 0x1e; 0xe5; 0xc1; 0xae ] ;
|
|
ciphersuites = Packet.([TLS_RSA_WITH_AES_256_CBC_SHA ; TLS_DHE_RSA_WITH_AES_256_CBC_SHA ; TLS_RSA_WITH_AES_128_CBC_SHA ; TLS_DHE_RSA_WITH_AES_128_CBC_SHA ; TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA ; TLS_RSA_WITH_3DES_EDE_CBC_SHA]) ;
|
|
extensions = [ `SecureRenegotiation "" ;
|
|
make_hostname_ext "example.com" ;
|
|
`SignatureAlgorithms
|
|
[`RSA_PKCS1_SHA512 ;
|
|
`RSA_PKCS1_SHA384 ;
|
|
`RSA_PKCS1_SHA256 ;
|
|
`RSA_PKCS1_SHA1 ;
|
|
`RSA_PKCS1_MD5] ;
|
|
`ALPN ["h2"; "http/1.1"] ]
|
|
}
|
|
)
|
|
])
|
|
|
|
let cmp_client_hellos ch ch' =
|
|
let open Core in
|
|
assert_equal ch.client_version ch'.client_version ;
|
|
assert_cs_eq ch.client_random ch'.client_random ;
|
|
assert_sessionid_equal ch.sessionid ch'.sessionid ;
|
|
assert_lists_eq assert_equal ch.ciphersuites ch'.ciphersuites ;
|
|
assert_lists_eq assert_client_extension_equal ch.extensions ch'.extensions
|
|
|
|
let good_client_hellos_parser (xs, res) _ =
|
|
let buf = list_to_cstruct xs in
|
|
match Reader.parse_handshake buf with
|
|
| Ok (Core.ClientHello ch) -> cmp_client_hellos ch res
|
|
| _ -> assert_failure "handshake client hello parser failed"
|
|
|
|
let good_client_hellos_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse good client hello " ^ string_of_int i >:: good_client_hellos_parser f)
|
|
good_client_hellos
|
|
|
|
let bad_client_hellos =
|
|
(* I rolled the dice 16 times *)
|
|
let rnd = [ 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15 ] in
|
|
let rand = rnd @ rnd in
|
|
[
|
|
(* versions *)
|
|
[1; 0; 0; 38; 4; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] ;
|
|
(* invalid length *)
|
|
[1; 0; 0; 39; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] ;
|
|
(* should be broken as well due to missing compression_algos *)
|
|
[1; 0; 0; 38; 3; 3] @ rand @ [(* session id *) 1; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] ;
|
|
|
|
(* ciphersuites *)
|
|
[1; 0; 0; 40; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 1; 0; 0; (* comp *) 0; (* exts *)] ;
|
|
[1; 0; 0; 40; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 3; 0; 0; (* comp *) 0; (* exts *)] ;
|
|
[1; 0; 0; 40; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 1; 3; 0; 0; (* comp *) 0; (* exts *)] ;
|
|
|
|
(* extensions *)
|
|
(* empty *)
|
|
[1; 0; 0; 40; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 1] ;
|
|
|
|
(* some hostname *)
|
|
[1; 0; 0; 52; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 12; 0; 0; 0; 8; 0; 6; 0; 0; 4; 102; 111; 111] ;
|
|
[1; 0; 0; 52; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 12; 0; 0; 0; 8; 0; 6; 0; 0; 4; 102; 111; 111; 111] ;
|
|
[1; 0; 0; 52; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 12; 0; 0; 0; 8; 0; 7; 0; 0; 4; 102; 111; 111; 111] ;
|
|
[1; 0; 0; 52; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 12; 0; 0; 0; 9; 0; 7; 0; 0; 4; 102; 111; 111; 111] ;
|
|
[1; 0; 0; 52; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 13; 0; 0; 0; 9; 0; 7; 0; 0; 4; 102; 111; 111; 111] ;
|
|
[1; 0; 0; 52; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 12; 0; 0; 0; 8; 0; 5; 0; 0; 2; 102; 111; 111] ;
|
|
|
|
(* multiple hostnames - legal in RFC, not accepted by any implementation *)
|
|
[1; 0; 0; 58; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 18; 0; 0; 0; 14; 0; 12; 0; 0; 3; 102; 111; 111; 0; 0; 3; 98; 97; 114] ;
|
|
|
|
(* empty SupportedGroups *)
|
|
[1; 0; 0; 46; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 6; 0; 0xA; 0; 1; 0; 0] ;
|
|
[1; 0; 0; 46; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 5; 0; 0xA; 0; 2; 0; 0] ;
|
|
[1; 0; 0; 46; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 6; 0; 0xA; 0; 2; 0; 1] ;
|
|
[1; 0; 0; 47; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 7; 0; 0xA; 0; 3; 0; 1; 0] ;
|
|
[1; 0; 0; 50; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 10; 0; 0xA; 0; 6; 0; 2; 0; 25; 0; 20] ;
|
|
|
|
(* secure renegotiation *)
|
|
[1; 0; 0; 47; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 7; 0xFF; 1; 0; 5; 2; 1; 2] ;
|
|
[1; 0; 0; 49; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 7; 0xFF; 1; 0; 5; 2; 1; 2; 3; 4] ;
|
|
[1; 0; 0; 49; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 9; 0xFF; 1; 0; 3; 2; 1; 2; 3; 4] ;
|
|
[1; 0; 0; 49; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 9; 0xFF; 1; 0; 5; 10; 1; 2; 3; 4] ;
|
|
[1; 0; 0; 49; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 9; 0xFF; 1; 0; 5; 2; 1; 2; 3; 4] ;
|
|
|
|
(* max fragment length *)
|
|
[1; 0; 0; 46; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 6; 0; 1; 0; 2; 3; 4] ;
|
|
[1; 0; 0; 44; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 4; 0; 1; 0; 0] ;
|
|
[1; 0; 0; 45; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 5; 0; 1; 0; 1; 42] ;
|
|
|
|
(* Padding *)
|
|
[1; 0; 0; 47; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 7; 0; 21; 0; 3; 1; 2; 3] ;
|
|
[1; 0; 0; 47; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 7; 0; 21; 0; 5; 0; 0; 0] ;
|
|
[1; 0; 0; 47; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 9; 0; 21; 0; 5; 0; 0; 0] ;
|
|
[1; 0; 0; 49; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 9; 0; 21; 0; 5; 0; 0; 0] ;
|
|
[1; 0; 0; 46; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 7; 0; 21; 0; 3; 0; 0; 0] ;
|
|
[1; 0; 0; 47; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 7; 0; 21; 0; 2; 0; 0; 0] ;
|
|
|
|
(* sig hash *)
|
|
[1; 0; 0; 47; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 7; 0; 13; 0; 3; 0; 1; 0] ;
|
|
[1; 0; 0; 47; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 7; 0; 13; 0; 3; 0; 0; 0] ;
|
|
]
|
|
|
|
let bad_client_hello_parser xs _ =
|
|
let buf = list_to_cstruct xs in
|
|
match Reader.parse_handshake buf with
|
|
| Ok _ -> assert_failure "bad client hello parser won"
|
|
| Error _ -> ()
|
|
|
|
let bad_client_hello_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse bad client hello " ^ string_of_int i >:: bad_client_hello_parser f)
|
|
bad_client_hellos
|
|
|
|
let good_server_hellos =
|
|
(* I rolled the dice 16 times *)
|
|
let rnd = [ 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15 ] in
|
|
let rand = rnd @ rnd in
|
|
let server_random = list_to_cstruct rand in
|
|
Core.(let sh : server_hello =
|
|
{ server_version = `TLS_1_2 ;
|
|
server_random ;
|
|
sessionid = None ;
|
|
ciphersuite = `RSA_WITH_AES_128_CCM ;
|
|
extensions = []}
|
|
in
|
|
[
|
|
(* versions *)
|
|
([2; 0; 0; 38; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0xc0; 0x9c; (* comp *) 0; (* exts *)] , sh ) ;
|
|
([2; 0; 0; 38; 3; 1] @ rand @ [(* session id *) 0; (* cipher *) 0xc0; 0x9c; (* comp *) 0; (* exts *)] , { sh with server_version = `TLS_1_0 } ) ;
|
|
([2; 0; 0; 38; 3; 2] @ rand @ [(* session id *) 0; (* cipher *) 0xc0; 0x9c; (* comp *) 0; (* exts *)] , { sh with server_version = `TLS_1_1 } ) ;
|
|
|
|
(* session id *)
|
|
([2; 0; 0; 41; 3; 3] @ rand @ [(* session id *) 3; 1; 2; 3; (* cipher *) 0xc0; 0x9c; (* comp *) 0; (* exts *)] , { sh with sessionid = Some (list_to_cstruct [1; 2; 3]) } ) ;
|
|
|
|
(* ciphersuite *)
|
|
([2; 0; 0; 38; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0xc0; 0x9d; (* comp *) 0; (* exts *)] , { sh with ciphersuite = `RSA_WITH_AES_256_CCM } ) ;
|
|
|
|
(* extensions *)
|
|
(* empty *)
|
|
([2; 0; 0; 40; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0xc0; 0x9c; (* comp *) 0; (* exts *) 0; 0] , sh ) ;
|
|
|
|
(* empty hostname *)
|
|
([2; 0; 0; 44; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0xc0; 0x9c; (* comp *) 0; (* exts *) 0; 4; 0; 0; 0; 0] , { sh with extensions = [`Hostname] } ) ;
|
|
|
|
(* ALPN *)
|
|
([2; 0; 0; 49; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0xc0; 0x9c; (* comp *) 0; (* exts *) 0; 9; 0; 16; 0; 5; 0; 3; 2; 104; 50] , { sh with extensions = [`ALPN "h2"] } ) ;
|
|
|
|
(* TODO: chosen ciphersuite must not be renegotiation (0x00ff) *)
|
|
|
|
(* TODO: validation of extensions
|
|
- ServerName, if present, should be None
|
|
- Padding is not allowed
|
|
- EC stuff must be present if EC ciphersuite chosen
|
|
- protocol version dependencies (SignatureAlgorithm)
|
|
- no duplicates!
|
|
- only those which are in a client hello are allowed
|
|
- is there an ordering?
|
|
*)
|
|
( [
|
|
0x02; (* typ *)
|
|
0x00; 0x00; 0x5A; (* len *)
|
|
0x03; 0x03; (* version *)
|
|
0x53; 0x66; 0x2d; 0xf0; 0x1b; 0x61; 0x55; 0x8f; 0x74; 0x2a; 0xbf; 0xf4; 0x99; 0x86; 0x30; 0x99; 0x32; 0xe4; 0xd0; 0x1e; 0x2b; 0xa9; 0x2e; 0x86; 0x7b; 0xeb; 0x03; 0x00; 0xf9; 0x11; 0x3e; 0xc5; (* random *)
|
|
0x20; (* session ID *)
|
|
0xd1; 0x54; 0xd9; 0x05; 0x61; 0x41; 0x53; 0x33; 0xb2; 0xf0; 0x13; 0x78; 0x1a; 0x17; 0xb3; 0x1d; 0x09; 0xf6; 0x59; 0x70; 0xfe; 0x5d; 0x58; 0x22; 0xfa; 0x8c; 0x5c; 0x89; 0xe9; 0xa2; 0xb4; 0x70;
|
|
0x00; 0x2f; (* cipher *)
|
|
0x00; (* compression *)
|
|
0x00; 0x12; (* extensions *)
|
|
0x00; 0x00; 0x00; 0x00; (* servername *)
|
|
0xff; 0x01; 0x00; 0x01; 0x00; (* secure renegotiation *)
|
|
0x00; 0x10; 0x00; 0x05; 0x00; 0x03; (* ALPN *)
|
|
0x02; 0x68; 0x32
|
|
], { sh with
|
|
ciphersuite = `RSA_WITH_AES_128_CBC_SHA ;
|
|
server_random = list_to_cstruct [ 0x53; 0x66; 0x2d; 0xf0; 0x1b; 0x61; 0x55; 0x8f; 0x74; 0x2a; 0xbf; 0xf4; 0x99; 0x86; 0x30; 0x99; 0x32; 0xe4; 0xd0; 0x1e; 0x2b; 0xa9; 0x2e; 0x86; 0x7b; 0xeb; 0x03; 0x00; 0xf9; 0x11; 0x3e; 0xc5 ] ;
|
|
sessionid = Some (list_to_cstruct [ 0xd1; 0x54; 0xd9; 0x05; 0x61; 0x41; 0x53; 0x33; 0xb2; 0xf0; 0x13; 0x78; 0x1a; 0x17; 0xb3; 0x1d; 0x09; 0xf6; 0x59; 0x70; 0xfe; 0x5d; 0x58; 0x22; 0xfa; 0x8c; 0x5c; 0x89; 0xe9; 0xa2; 0xb4; 0x70 ]) ;
|
|
extensions = [`Hostname;
|
|
`SecureRenegotiation "";
|
|
`ALPN "h2"] }) ;
|
|
|
|
( [
|
|
0x02;
|
|
0x00; 0x00; 0x51;
|
|
0x03; 0x03;
|
|
0x53; 0x66; 0x2f; 0xb7; 0x35; 0x3a; 0x42; 0xee; 0x1c; 0xe6; 0xed; 0x63; 0x8a; 0x1d; 0x3d; 0xb3; 0x71; 0x9c; 0xf5; 0x64; 0x45; 0xc5; 0xe9; 0xf4; 0x11; 0x8b; 0x9f; 0x41; 0x5a; 0x5f; 0xf1; 0xf6;
|
|
0x20;
|
|
0xdf; 0xe1; 0x09; 0x8a; 0x42; 0xf0; 0x25; 0xc7; 0xbd; 0xe5; 0xe9; 0x02; 0x6a; 0x03; 0xaf; 0xb4; 0x70; 0x80; 0xe9; 0x2f; 0x07; 0x3f; 0x53; 0xd3; 0xc8; 0x97; 0x3f; 0xc4; 0x44; 0x23; 0xf5; 0x94;
|
|
0x00; 0x2f;
|
|
0x00;
|
|
0x00; 0x09;
|
|
0x00; 0x00; 0x00; 0x00;
|
|
0xff; 0x01; 0x00; 0x01; 0x00 ],
|
|
{ sh with
|
|
ciphersuite = `RSA_WITH_AES_128_CBC_SHA ;
|
|
server_random = list_to_cstruct [ 0x53; 0x66; 0x2f; 0xb7; 0x35; 0x3a; 0x42; 0xee; 0x1c; 0xe6; 0xed; 0x63; 0x8a; 0x1d; 0x3d; 0xb3; 0x71; 0x9c; 0xf5; 0x64; 0x45; 0xc5; 0xe9; 0xf4; 0x11; 0x8b; 0x9f; 0x41; 0x5a; 0x5f; 0xf1; 0xf6 ] ;
|
|
sessionid = Some (list_to_cstruct [ 0xdf; 0xe1; 0x09; 0x8a; 0x42; 0xf0; 0x25; 0xc7; 0xbd; 0xe5; 0xe9; 0x02; 0x6a; 0x03; 0xaf; 0xb4; 0x70; 0x80; 0xe9; 0x2f; 0x07; 0x3f; 0x53; 0xd3; 0xc8; 0x97; 0x3f; 0xc4; 0x44; 0x23; 0xf5; 0x94 ] ) ;
|
|
extensions = [`Hostname;
|
|
`SecureRenegotiation ""] }) ;
|
|
|
|
])
|
|
|
|
let cmp_server_hellos sh sh' =
|
|
let open Core in
|
|
assert_equal sh.server_version sh'.server_version ;
|
|
assert_cs_eq sh.server_random sh'.server_random ;
|
|
assert_sessionid_equal sh.sessionid sh'.sessionid ;
|
|
assert_equal sh.ciphersuite sh'.ciphersuite ;
|
|
assert_lists_eq assert_server_extension_equal sh.extensions sh'.extensions
|
|
|
|
let good_server_hellos_parser (xs, res) _ =
|
|
let buf = list_to_cstruct xs in
|
|
match Reader.parse_handshake buf with
|
|
| Ok (Core.ServerHello sh) -> cmp_server_hellos sh res
|
|
| _ -> assert_failure "handshake server hello parser failed"
|
|
|
|
let good_server_hellos_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse good server hello " ^ string_of_int i >:: good_server_hellos_parser f)
|
|
good_server_hellos
|
|
|
|
let bad_server_hellos =
|
|
(* I rolled the dice 16 times *)
|
|
let rnd = [ 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15 ] in
|
|
let rand = rnd @ rnd in
|
|
[
|
|
[2; 0; 0; 38; 3; 0] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] ;
|
|
[2; 0; 0; 38; 3; 4] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] ;
|
|
|
|
[2; 0; 0; 30; 4; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] ;
|
|
[2; 0; 0; 38; 4; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] ;
|
|
[2; 0; 0; 44; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] ;
|
|
|
|
[2; 0; 0; 38; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0xFF; 0xFF; (* comp *) 0; (* exts *)] ;
|
|
[2; 0; 0; 38; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 42; (* exts *)] ;
|
|
|
|
(* session id *)
|
|
[2; 0; 0; 40; 3; 3] @ rand @ [(* session id *) 3; 1; 2; (* cipher *) 0; 0; (* comp *) 0; (* exts *)] ;
|
|
|
|
(* extensions *)
|
|
(* empty *)
|
|
[2; 0; 0; 40; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 1] ;
|
|
[2; 0; 0; 41; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 1] ;
|
|
[2; 0; 0; 41; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 1; 0] ;
|
|
|
|
(* ALPN ext with a list of protocols *)
|
|
[2; 0; 0; 46; 3; 3] @ rand @ [(* session id *) 0; (* cipher *) 0; 0; (* comp *) 0; (* exts *) 0; 18; 0; 16; 0; 8; 0; 6; 3; 0x41; 0x41; 3; 0x42; 0x42] ;
|
|
]
|
|
|
|
let bad_server_hellos_parser xs _ =
|
|
let buf = list_to_cstruct xs in
|
|
match Reader.parse_handshake buf with
|
|
| Ok _ -> assert_failure "handshake server hello parser succeeded"
|
|
| Error _ -> ()
|
|
|
|
let bad_server_hellos_tests =
|
|
List.mapi
|
|
(fun i f -> "Parse bad server hello " ^ string_of_int i >:: bad_server_hellos_parser f)
|
|
bad_server_hellos
|
|
|
|
let reader_tests =
|
|
any_version_tests @ version_tests @
|
|
good_records_tests @
|
|
good_alert_tests @ bad_alerts_tests @
|
|
good_dh_params_tests @ bad_dh_params_tests @
|
|
good_digitally_signed_1_2_tests @ bad_digitally_signed_1_2_tests @
|
|
good_digitally_signed_tests @ bad_digitally_signed_tests @
|
|
good_handshake_hdr_tests @
|
|
good_handshake_no_data_tests @ bad_handshake_no_data_tests @
|
|
good_handshake_cstruct_data_tests @ bad_handshake_cstruct_data_tests @ bad_certificate_cstruct_data_tests @
|
|
good_client_hellos_tests @ bad_client_hello_tests @
|
|
good_server_hellos_tests @ bad_server_hellos_tests
|