X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=tcl_tests%2Fwcli.try;fp=tcl_tests%2Fwcli.try;h=35ed5780fea719e1821fd3327002a3acf5f1af26;hb=3b8ddfe2f303b8931842e52bdb5c07c97042f651;hp=0000000000000000000000000000000000000000;hpb=e09d5a86fe1cb876b3c7cf5eb0d890f557b466d0;p=openssl-gost%2Fengine.git diff --git a/tcl_tests/wcli.try b/tcl_tests/wcli.try new file mode 100644 index 0000000..35ed578 --- /dev/null +++ b/tcl_tests/wcli.try @@ -0,0 +1,150 @@ +#!/usr/bin/tclsh +# -*- coding: cp1251 -*- +lappend auto_path [file dirname [info script]] +package require ossltest + +#Первый параметр задает используемый сайферсьют. +#Вариант p0 не предназначена для использования в автоматических тестах, так как +#мы не можем программно оценить корректность результата. При использовании +#этого варианта тесты будут гарантированно фейлиться, поэтому использовать +#его следует только для ручного запуска и внимательно читать логи. +array set cipher_name { + p8k GOST2012-KUZNYECHIK-KUZNYECHIKOMAC + p8m GOST2012-MAGMA-MAGMAOMAC + p2 GOST2012-GOST8912-GOST8912 + p1 GOST2001-GOST89-GOST89 + p20 GOST2012-NULL-GOST12 + p10 GOST2001-NULL-GOST94 + p0 {} +} +proc cipher_openssl {sn} {return $::cipher_name($sn)} +proc cipher_command_line_option {sn} { + if {$sn == "p0"} { + return $::cipher_name($sn) + } else { + return "-cipher $::cipher_name($sn)" + } +} + +proc ciphers_usage {} { + global cipher_name + set res {} + foreach name [array names cipher_name] { + append res [format "\t%-3s - %s\n" $name $cipher_name($name)] + } + return $res +} + +# Второй параметр задает четвёрку значений: +#- алгоритм ключа сервера +#- параметры ключа сервера +#- список имен клиентских сертификатов +#- алгоритм ключа УЦ +array set alg_name { + 5xa {gost2012_512 A {Xchg512A Sign512A} gost2012_512} + 2xa {gost2012_256 XA {Xchg256A Sign256A} gost2012_256} + 1xa {gost2001 XA {XchgA SignA} gost2001} +} +proc alg_alg {sn} {return [lindex $::alg_name($sn) 0]} +proc alg_crtdir {sn} {return [format "srv_%s_%s" [lindex $::alg_name($sn) 0] [lindex $::alg_name($sn) 1]]} +proc alg_openssl {sn} {return [format "%s:%s" [lindex $::alg_name($sn) 0] [lindex $::alg_name($sn) 1]]} +proc alg_certid_list {sn} {return [lindex $::alg_name($sn) 2]} +proc alg_ca {sn} {return [lindex $::alg_name($sn) 3]} +proc algs_usage {} { + global alg_name + set res {} + foreach name [array names alg_name] { + append res [format "\t%-3s - %s:%s\n" $name [lindex $alg_name($name) 0] [lindex $alg_name($name) 1]] + } + return $res +} + +if {$argc < 1 || ![regexp {^([^-]+)-([^-]+)-([^-]+)-(.+)$} [lindex $argv 0] -> cipher alg tls host]} { + puts stderr "Usage $argv0 cipher-alg-tlsver-hostname \[s_server-option\]" + puts stderr "cipher:\n[ciphers_usage]" + puts stderr "alg:\n[algs_usage]" + puts stderr "tlsver: -tls* s_server option" + exit 1 +} +set test::suffix "-$cipher-$alg-$tls-$host[lindex $argv 1]" +if {![regexp @ $host]} { + set host build@$host +} + +set CAhost lynx.lan.cryptocom.ru +set CAprefix /cgi-bin/autoca +set mydir [file normalize [file dirname [info script]]] + +cd $::test::dir +set http_tcl http.[info hostname].[clock seconds].[pid].tcl + +start_tests "CSP клиент ($cipher, $alg, $host) [lindex $argv 1]" + +test "Делаем копию http.tcl на $host" { + save_env2 {LD_LIBRARY_PATH OPENSSL_CONF} + catch {unset env(LD_LIBRARY_PATH)} + catch {unset env(OPENSSL_CONF)} + exec $env(CVS_RSH) $host "cat >$http_tcl" < $mydir/http.tcl + restore_env2 {LD_LIBRARY_PATH OPENSSL_CONF} + set copied 1 +} 0 1 + +set crtdir [alg_crtdir $alg] + +test -platformex {![file exists $crtdir/cert.pem]} "Получаем сертификат HTTPS-сервера" { + if {![makeUser $crtdir [alg_openssl $alg] CN [info hostname]]} { + error "Request generation failed" + } + registerUserAtCA $crtdir $CAhost $CAprefix [alg_ca $alg] + file exists $crtdir/cert.pem +} 0 1 + + +test -platformex {![file exists ca_[alg_ca $alg].pem]} "Получаем сертификат CA" { + getCAcert $CAhost $CAprefix [alg_ca $alg] + file exists ca_[alg_ca $alg].pem +} 0 1 + + +custom_client "$env(CVS_RSH) $host tclsh $http_tcl" \ + {LD_LIBRARY_PATH OPENSSL_CONF} + +set server_args [concat [cipher_command_line_option $cipher] \ + [list -bugs -msg -cert $crtdir/cert.pem -key $crtdir/seckey.pem \ + -CAfile ca_[alg_ca $alg].pem -www] -$tls [lindex $argv 1]] + + +test -skip {![info exists copied]} "Сервер не требует сертификата" { + set list [client_server https://[info hostname]:4433 $server_args {}] + grep New, [lindex $list 0] +} 0 "New, TLSv1/SSLv3, Cipher is [cipher_openssl $cipher]\n" + + +test -skip {![info exists copied]} "Сервер требует сертификат, сертификата нет" { + set list [client_server \ + [list https://[info hostname]:4433 no-such-cert-at-all] \ + [concat $server_args {-Verify 2}] {}] + list [lindex $list 2] [lindex [split [lindex $list 1] " "] 0] +} 0 [list 1 "0x80072f0c"] + + +foreach alg_certid [alg_certid_list $alg] { + test -skip {![info exists copied]} \ + "Сервер требует сертификат, клиент $alg_certid" { + set list [client_server \ + [list https://[info hostname]:4433 $alg_certid] \ + [ concat $server_args {-Verify 2}] {}] + grep New, [lindex $list 0] + } 0 "New, TLSv1/SSLv3, Cipher is [cipher_openssl $cipher]\n" +} + +test "Удаляем копию http.tcl на $host" { + save_env2 {LD_LIBRARY_PATH OPENSSL_CONF} + catch {unset env(LD_LIBRARY_PATH)} + catch {unset env(OPENSSL_CONF)} + set rc [exec $env(CVS_RSH) $host rm -f $http_tcl] + restore_env2 {LD_LIBRARY_PATH OPENSSL_CONF} + set rc +} 0 "" + +end_tests