1
- extern crate phf_codegen;
2
-
1
+ use std:: collections:: HashMap ;
3
2
use std:: env;
4
3
use std:: fs:: File ;
5
- use std:: io:: BufRead ;
6
- use std:: io:: { BufReader , BufWriter , Write } ;
4
+ use std:: io:: { BufWriter , Write } ;
7
5
use std:: path:: Path ;
8
6
9
- fn titlecase_word ( word : & str ) -> String {
7
+ use csv:: Reader ;
8
+ use phf_codegen;
9
+
10
+ fn titlecase_word ( word : & String ) -> String {
10
11
word. chars ( )
11
12
. enumerate ( )
12
13
. map ( |( i, c) | {
@@ -21,54 +22,81 @@ fn titlecase_word(word: &str) -> String {
21
22
22
23
fn main ( ) {
23
24
let path_txt =
24
- Path :: new ( & env:: var ( "CARGO_MANIFEST_DIR" ) . unwrap ( ) ) . join ( "scripts/tls-ciphersuites.txt" ) ;
25
- let display = path_txt. display ( ) ;
26
- let file = match File :: open ( & path_txt) {
27
- // The `description` method of `io::Error` returns a string that
28
- // describes the error
29
- Err ( why) => panic ! ( "couldn't open {}: {}" , display, why) ,
30
- Ok ( file) => file,
31
- } ;
32
- let f = BufReader :: new ( file) ;
25
+ Path :: new ( & env:: var ( "CARGO_MANIFEST_DIR" ) . unwrap ( ) ) . join ( "scripts/all_ciphersuites.csv" ) ;
33
26
34
27
let path = Path :: new ( & env:: var ( "OUT_DIR" ) . unwrap ( ) ) . join ( "codegen.rs" ) ;
35
28
let mut file = BufWriter :: new ( File :: create ( & path) . unwrap ( ) ) ;
36
29
37
30
let mut map = phf_codegen:: Map :: new ( ) ;
38
- for line in f. lines ( ) {
39
- let l = line. unwrap ( ) ;
40
- let mut v: Vec < & str > = l. split ( ':' ) . collect ( ) ;
31
+ let mut csv_reader = Reader :: from_path ( path_txt) . unwrap ( ) ;
32
+ for record in csv_reader. deserialize ( ) {
33
+ let v: HashMap < String , String > = record. unwrap ( ) ;
34
+ println ! ( "{:?}" , v) ;
41
35
42
- if v[ 5 ] . is_empty ( ) {
43
- v[ 5 ] = "NULL"
36
+ if v[ "info.type" ] != "IANATLSCipherSuite"
37
+ || v[ "info.name" ] . contains ( "GOSTR" )
38
+ || v[ "info.name" ] . contains ( "TLS_SHA256_SHA256" )
39
+ || v[ "info.name" ] . contains ( "TLS_SHA384_SHA384" )
40
+ || v[ "info.name" ] . contains ( "_SCSV" )
41
+ || v[ "info.tls.parameters.encryption.algorithm" ] . contains ( "AEGIS" )
42
+ {
43
+ continue ;
44
44
}
45
45
46
- let au = match v[ 3 ] {
47
- "SRP+DSS" => String :: from ( "Srp_Dss" ) ,
48
- "SRP+RSA" => String :: from ( "Srp_Rsa" ) ,
49
- _ => titlecase_word ( v[ 3 ] ) . replace ( '+' , "_" ) ,
46
+ let au = match v[ "info.tls.parameters.authentication" ] . as_str ( ) {
47
+ "" => String :: from ( "Null" ) ,
48
+ _ => titlecase_word ( & v[ "info.tls.parameters.authentication" ] . replace ( "TLS 1.3" , "TLS13" ) ) ,
50
49
} ;
51
50
52
- let enc = match v[ 4 ] {
51
+ let enc = match v[ "info.tls.parameters.encryption.algorithm" ] . as_str ( ) {
52
+ "" => String :: from ( "Null" ) ,
53
+ "DES40" => String :: from ( "Des" ) ,
53
54
"3DES" => String :: from ( "TripleDes" ) ,
54
- "CHACHA20_POLY1305" => String :: from ( "Chacha20_Poly1305" ) ,
55
- _ => titlecase_word ( v[ 4 ] ) ,
55
+ "CHACHA20" => String :: from ( "Chacha20" ) ,
56
+ _ => titlecase_word ( & v[ "info.tls.parameters.encryption.algorithm" ] ) ,
57
+ } ;
58
+
59
+ let mac = String :: from (
60
+ match v[ "info.tls.parameters.integrity.message_authentication_code" ] . as_str ( ) {
61
+ "" => "Null" ,
62
+ "AEAD" => "Aead" ,
63
+ "HMAC" => match v[ "info.tls.parameters.integrity.pseudorandom_function" ] . as_str ( ) {
64
+ "MD5" => "HmacMd5" ,
65
+ "SHA1" => "HmacSha1" ,
66
+ "SHA256" => "HmacSha256" ,
67
+ "SHA384" => "HmacSha384" ,
68
+ "SHA512" => "HmacSha512" ,
69
+ _ => continue ,
70
+ } ,
71
+ _ => continue ,
72
+ } ,
73
+ ) ;
74
+ let mac_size = v[ "info.tls.parameters.integrity.message_authentication_code_size" ] . clone ( ) ;
75
+
76
+ let mode = match v[ "info.tls.parameters.encryption.mode" ] . as_str ( ) {
77
+ "" => String :: from ( "Null" ) ,
78
+ "L" => String :: from ( "Null" ) ,
79
+ _ => titlecase_word ( & v[ "info.tls.parameters.encryption.mode" ] ) ,
56
80
} ;
57
81
58
- let mac = String :: from ( match v[ 7 ] {
59
- "NULL" => "Null" ,
60
- "HMAC-MD5" => "HmacMd5" ,
61
- "HMAC-SHA1" => "HmacSha1" ,
62
- "HMAC-SHA256" => "HmacSha256" ,
63
- "HMAC-SHA384" => "HmacSha384" ,
64
- "HMAC-SHA512" => "HmacSha512" ,
65
- "AEAD" => "Aead" ,
66
- _ => panic ! ( "Unknown mac {}" , v[ 7 ] ) ,
67
- } ) ;
82
+ let key_exchange = match v[ "info.tls.parameters.key_exchange" ] . as_str ( ) {
83
+ "" => String :: from ( "Null" ) ,
84
+ _ => titlecase_word ( & v[ "info.tls.parameters.key_exchange" ] . replace ( "TLS 1.3" , "TLS13" ) ) ,
85
+ } ;
68
86
69
- let prf = titlecase_word ( v[ 9 ] ) ;
87
+ let prf = match v[ "info.tls.parameters.integrity.pseudorandom_function" ] . as_str ( ) {
88
+ "" => String :: from ( "Null" ) ,
89
+ _ => titlecase_word (
90
+ & v[ "info.tls.parameters.integrity.pseudorandom_function" ]
91
+ . replace ( " " , "" )
92
+ . replace ( "." , "" )
93
+ . replace ( "-" , "" )
94
+ )
95
+ } ;
96
+ let prf_size = v[ "info.tls.parameters.integrity.pseudorandom_function_size" ] . clone ( ) ;
70
97
71
- let key = u16:: from_str_radix ( v[ 0 ] , 16 ) . unwrap ( ) ;
98
+ let key_string = format ! ( "{}{}" , v[ "byte_1" ] , v[ "byte_2" ] ) ;
99
+ let key = u16:: from_str_radix ( key_string. as_str ( ) , 16 ) . unwrap ( ) ;
72
100
let val = format ! (
73
101
r#"TlsCipherSuite{{
74
102
name:"{}",
@@ -80,18 +108,18 @@ fn main() {
80
108
enc_size:{},
81
109
mac:TlsCipherMac::{},
82
110
mac_size:{},
83
- prf: TlsPRF::{},
111
+ prf:TlsPRF::{},
84
112
}}"# ,
85
- v[ 1 ] ,
86
- v [ 0 ] ,
87
- titlecase_word ( v [ 2 ] ) , // kx
88
- au, // au
89
- enc, // enc
90
- titlecase_word ( v [ 5 ] ) , // enc_mode
91
- v [ 6 ] , // enc_key_size
92
- mac, // mac
93
- v [ 8 ] , // mac_size
94
- prf, // prf
113
+ v[ "info.name" ] ,
114
+ key_string ,
115
+ key_exchange ,
116
+ au,
117
+ enc,
118
+ mode ,
119
+ if prf_size . is_empty ( ) { String :: from ( "0" ) } else { prf_size } ,
120
+ mac,
121
+ if mac_size . is_empty ( ) { String :: from ( "0" ) } else { mac_size} ,
122
+ prf, // prf
95
123
)
96
124
. clone ( ) ;
97
125
0 commit comments