]> www.wagner.pp.ru Git - openssl-gost/engine.git/blob - tcl_tests/wcli.try
35ed5780fea719e1821fd3327002a3acf5f1af26
[openssl-gost/engine.git] / tcl_tests / wcli.try
1 #!/usr/bin/tclsh
2 # -*- coding: cp1251 -*-
3 lappend auto_path [file dirname [info script]]
4 package require ossltest
5
6 #Первый параметр задает используемый сайферсьют.
7 #Вариант p0 не предназначена для использования в автоматических тестах, так как
8 #мы не можем программно оценить корректность результата. При использовании
9 #этого варианта тесты будут гарантированно фейлиться, поэтому использовать 
10 #его следует только для ручного запуска и внимательно читать логи.
11 array set cipher_name {
12         p8k GOST2012-KUZNYECHIK-KUZNYECHIKOMAC 
13         p8m GOST2012-MAGMA-MAGMAOMAC 
14         p2 GOST2012-GOST8912-GOST8912
15         p1 GOST2001-GOST89-GOST89
16         p20 GOST2012-NULL-GOST12
17         p10 GOST2001-NULL-GOST94
18         p0 {}  
19 }
20 proc cipher_openssl {sn} {return $::cipher_name($sn)}
21 proc cipher_command_line_option {sn} {
22         if {$sn == "p0"} {
23                 return $::cipher_name($sn)
24         } else {
25                 return "-cipher $::cipher_name($sn)"
26         }
27 }
28         
29 proc ciphers_usage {} {
30         global cipher_name
31         set res {}
32         foreach name [array names cipher_name] {
33                 append res [format "\t%-3s - %s\n" $name $cipher_name($name)]
34         }
35         return $res
36 }
37
38 # Второй параметр задает четвёрку значений:
39 #- алгоритм ключа сервера
40 #- параметры ключа сервера
41 #- список имен клиентских сертификатов
42 #- алгоритм ключа УЦ 
43 array set alg_name {
44         5xa {gost2012_512 A {Xchg512A Sign512A} gost2012_512}
45         2xa {gost2012_256 XA {Xchg256A Sign256A} gost2012_256} 
46         1xa {gost2001 XA {XchgA SignA} gost2001}
47 }
48 proc alg_alg {sn} {return [lindex $::alg_name($sn) 0]}
49 proc alg_crtdir {sn} {return [format "srv_%s_%s" [lindex $::alg_name($sn) 0] [lindex $::alg_name($sn) 1]]}
50 proc alg_openssl {sn} {return [format "%s:%s" [lindex $::alg_name($sn) 0] [lindex $::alg_name($sn) 1]]}
51 proc alg_certid_list {sn} {return [lindex $::alg_name($sn) 2]}
52 proc alg_ca {sn} {return [lindex $::alg_name($sn) 3]}
53 proc algs_usage {} {
54         global alg_name
55         set res {}
56         foreach name [array names alg_name] {
57                 append res [format "\t%-3s - %s:%s\n" $name [lindex $alg_name($name) 0] [lindex $alg_name($name) 1]]
58         }
59         return $res
60 }
61
62 if {$argc < 1 || ![regexp {^([^-]+)-([^-]+)-([^-]+)-(.+)$} [lindex $argv 0] -> cipher alg tls host]} {
63         puts stderr "Usage $argv0 cipher-alg-tlsver-hostname \[s_server-option\]"
64         puts stderr "cipher:\n[ciphers_usage]"
65         puts stderr "alg:\n[algs_usage]"
66         puts stderr "tlsver: -tls* s_server option"
67         exit 1
68 }
69 set test::suffix "-$cipher-$alg-$tls-$host[lindex $argv 1]" 
70 if {![regexp @ $host]} {
71         set host build@$host
72 }       
73
74 set CAhost lynx.lan.cryptocom.ru
75 set CAprefix /cgi-bin/autoca 
76 set mydir [file normalize [file dirname [info script]]]
77
78 cd $::test::dir
79 set http_tcl http.[info hostname].[clock seconds].[pid].tcl
80
81 start_tests "CSP клиент ($cipher, $alg, $host) [lindex $argv 1]" 
82
83 test  "Делаем копию http.tcl на $host" {
84         save_env2 {LD_LIBRARY_PATH OPENSSL_CONF}
85         catch {unset env(LD_LIBRARY_PATH)}
86         catch {unset env(OPENSSL_CONF)}
87         exec $env(CVS_RSH) $host "cat >$http_tcl" < $mydir/http.tcl
88         restore_env2 {LD_LIBRARY_PATH OPENSSL_CONF}
89         set copied 1
90 } 0 1
91
92 set crtdir [alg_crtdir $alg]
93
94 test -platformex {![file exists $crtdir/cert.pem]} "Получаем сертификат HTTPS-сервера" {
95         if {![makeUser $crtdir [alg_openssl $alg] CN [info hostname]]} {
96                 error "Request generation failed"
97         }
98         registerUserAtCA $crtdir $CAhost $CAprefix [alg_ca $alg]
99         file exists $crtdir/cert.pem
100 } 0 1
101
102
103 test -platformex {![file exists ca_[alg_ca $alg].pem]} "Получаем сертификат CA" {
104         getCAcert $CAhost $CAprefix [alg_ca $alg]
105         file exists ca_[alg_ca $alg].pem
106 } 0 1
107
108
109 custom_client "$env(CVS_RSH) $host tclsh $http_tcl" \
110         {LD_LIBRARY_PATH OPENSSL_CONF}
111
112 set server_args [concat [cipher_command_line_option $cipher] \
113         [list -bugs -msg -cert $crtdir/cert.pem -key $crtdir/seckey.pem \
114         -CAfile ca_[alg_ca $alg].pem -www] -$tls [lindex $argv 1]]
115
116
117 test -skip {![info exists copied]} "Сервер не требует сертификата" {
118         set list [client_server https://[info hostname]:4433 $server_args {}]
119         grep New, [lindex $list 0]
120 } 0 "New, TLSv1/SSLv3, Cipher is [cipher_openssl $cipher]\n"
121
122
123 test -skip {![info exists copied]} "Сервер требует сертификат, сертификата нет" {
124         set list [client_server \
125                 [list https://[info hostname]:4433 no-such-cert-at-all] \
126                 [concat $server_args {-Verify 2}] {}]
127         list [lindex $list 2] [lindex [split [lindex $list 1] " "] 0]
128 } 0 [list 1 "0x80072f0c"]
129
130
131 foreach alg_certid [alg_certid_list $alg] {
132         test -skip {![info exists copied]} \
133         "Сервер требует сертификат, клиент $alg_certid" {
134                 set list [client_server \
135                         [list https://[info hostname]:4433 $alg_certid] \
136                 [       concat $server_args {-Verify 2}]  {}]
137                 grep New, [lindex $list 0]
138         } 0 "New, TLSv1/SSLv3, Cipher is [cipher_openssl $cipher]\n"
139 }
140
141 test "Удаляем копию http.tcl на $host" {
142         save_env2 {LD_LIBRARY_PATH OPENSSL_CONF}
143         catch {unset env(LD_LIBRARY_PATH)}
144         catch {unset env(OPENSSL_CONF)}
145         set rc [exec $env(CVS_RSH) $host rm -f $http_tcl]
146         restore_env2 {LD_LIBRARY_PATH OPENSSL_CONF}
147         set rc
148 } 0 ""
149
150 end_tests