Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformen

Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformenDet er tid til at demonstrere, hvordan en kryptografisk arbejdsstation baseret på offentlige nøglestandarder kryptoarmpkcs fungerer på en af ​​de mobile platforme, nemlig Android.

Konceptet, der blev fastlagt under udviklingen af ​​cryptoarmpkcs-værktøjet, er, at brugeren skal opleve et minimum af ulejlighed ved oprettelse og verificering af en elektronisk signatur. Derfor foreslår vi at bruge kryptografiske tokens som nøglebærer til et personligt certifikat. PKCS # 11 og/eller beskyttede beholdere PKCS # 12. Det skal siges, at brugen af ​​PKCS#12 i mange tilfælde viser sig at være næsten den eneste mulige mulighed, for eksempel når de samme PKCS#11-tokens ikke understøttes af bestemte platforme. Så vi besluttede at begynde at portere cryptoarmpkcs-værktøjet til Android-platformen med understøttelse af beskyttede PKCS#12-containere.

Lad os straks bemærke, at da projektet blev lavet på C- og Tcl/Tk-platformene, forårsagede porteringen ingen grundlæggende vanskeligheder. Dette blev muligt takket være teknologi. Androwish. Med udfoldelse og miljøindstillinger der opstod ingen problemer (mit arbejdsmiljø er Linux - Mageia-7.0). Jeg vil kun give ét script til implementering af Android Command Line Tools (sdk-tools-linux-xxxx.zip):

#!/bin/sh
if [ $# -ne 1   ]
    then 
	echo "./InstallAndroidSDK.sh <sdk-tools-linux-xxxxxxxx.zip>"
	echo "Не указан архив или число параметров больше 1"
	exit 1
fi
if [ ! -f $1 ]
    then 
	echo "./InstallAndroidSDK.sh <sdk-tools-linux-xxxxxxxx.zip>"
	echo "архив $1 отсутствует"
	exit 1
fi
#Распаковываем SDK-TOOLS в папку tools
#unzip sdk-tools-linux-4333796.zip
unzip $1
#Создаем папку android-sdk-linux
mkdir android-sdk-linux
#Перемещвем папку tools в android-sdk-linux
mv tools android-sdk-linux
cd android-sdk-linux/tools/bin
./sdkmanager "platform-tools" "platforms;android-29"  

Det mest bemærkelsesværdige er, at Androwish-miljøet inkluderer to fortolkere, undrowish-xxx og vanillawish-xxx, som er fuldstændig identiske i sammensætning med de "balalaikaer" (pakker), der faktisk er en del af Androwish. Forskellen mellem undrowish og vanillawish er, at vanillawish har en SDL/AGG/freetype-baseret backend:

Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformen

Tilstedeværelsen af ​​disse to værktøjer giver dig mulighed for at udvikle en applikation uden at bruge Android selv og dens emulator med maksimal nærhed til en rigtig enhed. Først og fremmest er det selvfølgelig undroidwish-xxx.

Selve brugerpakken til Android er bygget i AWSDK-miljøet. Dit projekttræ skal flyttes til mappen ~/AWSDK/assets/app. I dette tilfælde skal hovedmodulet i dit projekt omdøbes til main.tcl. Hvis du bruger yderligere balalaikaer med dynamiske biblioteker, skal bibliotekerne placeres i mapperne ~/AWSDK/libs/x86 for emulatoren og ~/AWSDK/libs/armeabi for den rigtige enhed.

Efter dette skal du blot udføre kommandoen:

$wish ~/AWSDK/tools/bones

og følg hendes instruktioner:

Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformen

Den kompilerede apk-pakke vil være placeret i mappen ~/AWSDK/build/outputs/apk.

Hvis du har en rigtig enhed eller emulator tilsluttet, kan du installere pakken med det samme.
I dette tilfælde skal den rigtige enhed være i fejlfindingstilstand.

Men lad os vende tilbage til selve ansøgningen. Hvad måtte ændres i den?

Ændringerne er naturligvis primært relateret til skærmstørrelsen. Måtte redesigne hovedvinduet (startvinduet). Som følge heraf, i stedet for ét vindue på en almindelig computer:

Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformen

Tre vinduer dukkede op på Android:

Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformen

Det første vindue er informativt. Konventionelt er det opdelt i flere dele. Den første del, der er placeret øverst, indeholder forsyningsvirksomhedens navn og logo.

Dernæst kommer producentens logo, informationsreference og tre knapper, der fuldender siden.
Siden er skrevet ved hjælp af canvas-komponenten. Siden bruger to typer knapper: én i form af et gennemskinneligt rektangel (den midterste), og de to andre i form af et rektangel med afrundede hjørner. En balalaika blev brugt til at lave knapper med afrundede hjørner tkpath. Personligt gjorde denne balalaika et rigtig godt indtryk på mig. Naturligvis, når man arbejder med lærred, optages størstedelen af ​​koden af ​​geometri. Nedenfor er scriptet create_titul_page.tcl til at oprette den første side i applikationen. Enhver kan redigere det, så det passer til deres egen vision.

Script create_titel_page.tcl

package require Tk
package require tkpath 0.3.0

global mydir
set mydir [file dirname [info script]]
#Грузим картинки
#Логотип продукта
image create photo logo_product -file [file join $mydir "imageme" "validcertkey_51x24.png"] 
#Логотип производителя
image create photo logo_orel -file [file join $mydir "imageme" "я_орел_425x200.png"] -format "png -alpha 1.0"
#Андроида с tcl/tk
image create photo logo_and -file [file join $mydir "imageme" "AndTk_inv_147x173.png"] -format "png -alpha 1.0"
#Свиток опечатанный
image create photo svitok -file [file join $mydir "imageme" "blue_svitok.png"] -format "png -alpha 1.0"
#Плитка
image create photo tileand -file [file join $mydir "imageme" "tile_green_and_32x32.png"] -format "png -alpha 1.0"
#Увеличить/уменьшить (отрицательное значение - уменьшение)
proc scaleImage {im xfactor {yfactor 0}} {
   set mode -subsample
   if {$xfactor>=0 && $yfactor>=0} {
       set mode -zoom
   } else {
	set xfactor [expr $xfactor * -1]
   }
   if {$yfactor == 0} {set yfactor $xfactor}
   set t [image create photo]
   $t copy $im
   $im blank
   $im copy $t -shrink $mode $xfactor $yfactor
   image delete $t
}

proc createtile {w  backg} {
    image create photo tiled
    tiled copy $backg -to 0 0 $::scrwidth $::scrheight -shrink
    $backg copy tiled
    image delete tiled
# Мостим холст
    $w create image 0 0  
      -image $backg  
      -anchor nw
}

proc create_rectangle  {canv img x1 y1 x2 y2 color alfa {wbd 0} {colorline black} } {
    image create photo $img -format "default -colorformat  rgb"
    set rgb1 [winfo rgb $canv $color]
    set cr  [lindex $rgb1 0]
    set cg  [lindex $rgb1 1]
    set cb  [lindex $rgb1 2]
    set fill [format "#%04x%04x%04x" $cr $cg $cb ]
#Создаем цветной праямоугольник
    $img put $fill -to 0 0 [expr {$x2 - $x1}] [expr {$y2 -$y1}]
#Сохраняем картинку
    set dimg [$img data -format png]
#Создаем image с учетом alpha канала
    image create photo $img -data $dimg -format "png -alpha $alfa"
#    $img put [list $rgb1] -to 0 0 [expr {$x2 - $x1}] [expr {$y2 -$y1}]
#Отображаем цветной прямоугольник
    set imgr [$canv create image $x1 $y1 -image $img -anchor nw] 
    set cc [subst {butImg $img}]
    $canv bind $imgr <ButtonPress-1> $cc
#Оконтовка вокруг цветного прямоугольника
    if {$wbd > 0 } {
	set item [$canv create rect $x1 $y1 $x2 $y2 -outline $colorline -width $wbd ]
	$canv bind $item <ButtonPress-1> $cc
    }
   return $imgr
}

proc butImg {img} {
    tk_messageBox -title "Кнопка" -icon info -message "Нажали кнопку=$img" -detail "::screenwidth=$::scrwidthn::screenheight=$::scrheight" -parent .
    if {$img == "exit"} {
	set answer [tk_dialog .dialog2 "Конец работы" "Вы действительноnхотите выйти?" question 0 "Да" "Нет" ]
	if {$answer == 0} {
    	    exit
	}	
    }
}

proc page_titul {fr  logo_manufacturer} {
    global mydir
#Создаем холст на весь экран
    tkp::canvas $fr.can -borderwidth 0 -height [winfo screenheight .] -width [winfo screenwidth .] -relief flat
#Мостим холст плиткой 
    createtile "$fr.can"  "tileand"
    pack $fr.can  -anchor center -expand 1 -fill both -side top  -padx 0 -pady 0
#Вычисляем координаты для логотипа производителя
#update чтобы обновилась информация в БД об окнах
    update
#    set aa [winfo height $fr.labtitul]
    set aa $::padly
#Центрируем логотип разработчика
    set ha [image width $logo_manufacturer]
    set xman [expr {($::scrwidth - $ha) / 2 }]
    $fr.can create image $xman $aa -image $logo_manufacturer -anchor nw -tag tag_logo

    set blogo [$fr.can bbox tag_logo]
    set wexit [lindex $blogo 3]
    if {$::typetlf } {
	set dlx [expr {$::padlx / 1}]
	$fr.can create text [expr $dlx + 6] [expr {$wexit + $::padly + 6}] -anchor nw -text "Электронная подпись" -fill black -font {{Roboto Condensed Medium} 15 }
	$fr.can create text $dlx [expr {$wexit + $::padly}] -anchor nw -text "Электронная подпись" -fill white -font {{Roboto Condensed Medium} 15 } -tag id_text0
	update
	set blogo [$fr.can bbox id_text0]
	set wexit [lindex $blogo 3]
	$fr.can create text [expr $dlx + 4] [expr {$wexit + $::padly + 4 - 80}] -anchor nw -text "для платформы Android" -fill black -font {{Roboto Condensed Medium} 13}
	$fr.can create text $dlx [expr {$wexit + $::padly - 80}] -anchor nw -text "для платформы Android" -fill white -font {{Roboto Condensed Medium} 13} -tag id_text1
	set blogo [$fr.can bbox id_text1]
	set wexit [lindex $blogo 3]
	$fr.can create text [expr $dlx + 3] [expr {$wexit + $::padly + 3 - 50}] -anchor nw -text "№ 63 ФЗ "Об электроннойnподписи от 6 апреля 2011 года"" -fill black -font {{Roboto} 10}
	$fr.can create text $dlx [expr {$wexit + $::padly - 50}] -anchor nw -text "№ 63 ФЗ "Об электроннойnподписи от 6 апреля 2011 года"" -fill white -font {{Roboto} 10} -tag id_text2
	set blogo [$fr.can bbox id_text2]
	set wexit [lindex $blogo 3]
	$fr.can create text [expr $dlx + 2] [expr {$wexit + $::padly + 2 - 40}] -text "Авторы: В.Н. Орловnhttp://soft.lissi.ru, http://www.lissi.run+7(495)589-99-53ne-mail: support@lissi.runn" 
	-anchor nw -fill black  -font {{Roboto} 9}
	$fr.can create text $dlx [expr {$wexit + $::padly - 40}] -text "Авторы: В.Н. Орловnhttp://soft.lissi.ru, http://www.lissi.run+7(495)589-99-53ne-mail: support@lissi.runn" 
	-anchor nw -fill white -tag id_text3  -font {{Roboto} 9}
    } else {
	$fr.can create text [expr $::padlx + 2] [expr {$wexit + $::padly + 2}] -anchor nw -text "Электронная подпись" -fill black -font {{Nimbus Sans Narrow} 20}
	$fr.can create text $::padlx [expr {$wexit + $::padly}] -anchor nw -text "Электронная подпись" -fill white -font {{Nimbus Sans Narrow} 20} -tag id_text0
	set blogo [$fr.can bbox id_text0]
	set wexit [lindex $blogo 3]
	$fr.can create text [expr $::padlx + 2] [expr {$wexit + $::padly + 2 - 20}] -anchor nw -text "для платформы Android" -fill black -font {{Nimbus Sans Narrow} 18}
	$fr.can create text $::padlx [expr {$wexit + $::padly - 20}] -anchor nw -text "для платформы Android" -fill white -font {{Nimbus Sans Narrow} 18} -tag id_text1
	set blogo [$fr.can bbox id_text1]
	set wexit [lindex $blogo 3]
	$fr.can create text [expr $::padlx + 2] [expr {$wexit + $::padly + 2}] -anchor nw -text "№ 63 ФЗ "Об электроннойnподписи от 6 апреля 2011 года"" -fill black -font {{Nimbus Sans Narrow} 14}
	$fr.can create text $::padlx [expr {$wexit + $::padly}] -anchor nw -text "№ 63 ФЗ "Об электроннойnподписи от 6 апреля 2011 года"" -fill white -font {{Nimbus Sans Narrow} 14} -tag id_text2
	set blogo [$fr.can bbox id_text2]
	set wexit [lindex $blogo 3]
	$fr.can create text [expr $::padlx + 1] [expr {$wexit + $::padly + 1}] -text "Авторы: В.Н. Орловnhttp://soft.lissi.ru, http://www.lissi.run+7(495)589-99-53ne-mail: support@lissi.runn" 
	-anchor nw -fill black  -font {{Nimbus Sans Narrow} 12}
	$fr.can create text $::padlx [expr {$wexit + $::padly}] -text "Авторы: В.Н. Орловnhttp://soft.lissi.ru, http://www.lissi.run+7(495)589-99-53ne-mail: support@lissi.runn" 
	-anchor nw -fill white -tag id_text3  -font {{Nimbus Sans Narrow} 12} -tag id_text3
	set blogo [$fr.can bbox id_text2]
    }
    set blogo [$fr.can bbox id_text3]
    set wland [lindex $blogo 3]
    $fr.can create image $::padlx $wland -image logo_and -anchor nw -tag tag_land
    set ha [image height logo_and]
    set wa [image width logo_and]
    set ha1 [expr {$ha - ($ha / 2 ) }]
    $fr.can create image [expr {$wa - 80 }] [expr {$wland + $ha1}] -image svitok -anchor nw -tag tag_land
    if {$::typetlf} {
	set x1 [expr {$::padlx / 2}]
	set y1 [expr {$wland + 120}]
	set x2 [expr {$::::scrwidth - $x1}]
	set y2 [expr {$y1 + 120}]
	set wd 8
	set rr 18
    } else {
	set x1 [expr {$::padlx / 2}]
	set y1 [expr {$wland + 40}]
	set x2 [expr {$::::scrwidth - $x1}]
	set y2 [expr {$y1 + 40}]
	set wd 4
	set rr 6
    }

    set g5 [$fr.can gradient create linear -stops {{0 lightgreen} {1 green}}] 
    set S3 [$fr.can style create -stroke "skyblue" -fill  $g5 -strokewidth $wd  -fillopacity 0.6]
    set im1 [$fr.can create prect $x1 $y1 $x2 $y2 -rx $rr -style $S3]
    $fr.can bind $im1 <ButtonPress-1> {butImg "img1"}
#Печатаем техт
    set blogo [$fr.can bbox $im1]
    set by2 [lindex $blogo 3]
    set by1 [lindex $blogo 1]
    set bb [expr {($by2 - $by1) / 2}]
    set bx2 [lindex $blogo 2]
    set bx1 [lindex $blogo 0]
    set bbx [expr {($bx2 - $bx1) / 2}]
    set txt1 [$fr.can create text [expr {$x1 + $::padlx * 2}] [expr {$y1 + 1 }] -anchor nw -text "Сайт разработчика" -fill black -font {{Arial} 10 normal}] 
#Центрируем техт
    set btxt1 [$fr.can bbox $txt1]
#Смещение по оси Y
    set ty2 [lindex $btxt1 3]
    set ty1 [lindex $btxt1 1]
    set tt [expr {$ty2 - $ty1}]
    set tt [expr {$tt / 2}]
    set offsy [expr {($by1 + $bb) - ($ty1 + $tt)}]
#Смещение по оси X
    set tx2 [lindex $btxt1 2]
    set tx1 [lindex $btxt1 0]
    set ttx [expr {$tx2 - $tx1}]
    set ttx [expr {$ttx / 2}]
    set offsx [expr {($bx1 + $bbx) - ($tx1 + $ttx)}]
    $fr.can move $txt1 $offsx $offsy
    $fr.can bind $txt1 <ButtonPress-1> {butImg "img1"}

    if {$::typetlf} {
	set y1 [expr $y2 + 40]
	set x2 [expr {$::::scrwidth - $x1}]
	set y2 [expr {$y1 + 120}]
    } else {
	set y1 [expr {$y1 + 60}]
	set x2 [expr {$::::scrwidth - $x1}]
	set y2 [expr {$y1 + 40}]
    }
    set im1 [create_rectangle $fr.can "but2" $x1 $y1 $x2 $y2 "#2b972d" 0.6 $wd "skyblue"]
#Печатаем техт
    set blogo [$fr.can bbox $im1]
    set by2 [lindex $blogo 3]
    set by1 [lindex $blogo 1]
    set bb [expr {($by2 - $by1) / 2}]
    set bx2 [lindex $blogo 2]
    set bx1 [lindex $blogo 0]
    set bbx [expr {($bx2 - $bx1) / 2}]
    set txt1 [$fr.can create text [expr {$x1 + $::padlx * 2}] [expr {$y1 + 1 }] -anchor nw -text "Переход в основное меню" -fill black -font {{Roboto Condensed Medium} 12}] 
#Центрируем текст
    set btxt1 [$fr.can bbox $txt1]
#Смещение по оси Y
    set ty2 [lindex $btxt1 3]
    set ty1 [lindex $btxt1 1]
    set tt [expr {$ty2 - $ty1}]
    set tt [expr {$tt / 2}]
    set offsy [expr {($by1 + $bb) - ($ty1 + $tt)}]
#Смещение по оси X
    set tx2 [lindex $btxt1 2]
    set tx1 [lindex $btxt1 0]
    set ttx [expr {$tx2 - $tx1}]
    set ttx [expr {$ttx / 2}]
    set offsx [expr {($bx1 + $bbx) - ($tx1 + $ttx)}]
    $fr.can move $txt1 $offsx $offsy
    $fr.can bind $txt1 <ButtonPress-1> {butImg "but2"}
    if {$::typetlf} {
	set x1 [expr {$::padlx / 2}]
	set y1 [expr $y2 + 40]
	set x2 [expr {$::::scrwidth - $x1}]
	set y2 [expr {$y1 + 120}]
    } else {
	set x1 [expr {$::padlx / 2}]
	set y1 [expr {$y1 + 60}]
	set x2 [expr {$::::scrwidth - $x1}]
	set y2 [expr {$y1 + 40}]
    }
    set S3 [$fr.can style create -stroke skyblue -fill  $g5 -strokewidth $wd  -fillopacity 0.6]
    set im1 [$fr.can create prect $x1 $y1 $x2 $y2 -rx $rr -style $S3]
    set blogo [$fr.can bbox $im1]
    $fr.can bind $im1 <ButtonPress-1> {butImg "exit"}
    set by2 [lindex $blogo 3]
    set by1 [lindex $blogo 1]
    set bb [expr {($by2 - $by1) / 2}]
    set bx2 [lindex $blogo 2]
    set bx1 [lindex $blogo 0]
    set bbx [expr {($bx2 - $bx1) / 2}]
    set txt1 [$fr.can create text [expr {$x1 + $::padlx * 2}] [expr {$y1 + 1 }] -anchor nw -text "Конец работы" -fill black  -font {Arial 10 normal}]
    $fr.can bind $txt1 <ButtonPress-1> {butImg "exit"}
    set btxt1 [$fr.can bbox $txt1]
#Смещение по оси Y
    set ty2 [lindex $btxt1 3]
    set ty1 [lindex $btxt1 1]
    set tt [expr {$ty2 - $ty1}]
    set tt [expr {$tt / 2}]
    set offsy [expr {($by1 + $bb) - ($ty1 + $tt)}]
#Смещение по оси X
    set tx2 [lindex $btxt1 2]
    set tx1 [lindex $btxt1 0]
    set ttx [expr {$tx2 - $tx1}]
    set ttx [expr {$ttx / 2}]
    set offsx [expr {($bx1 + $bbx) - ($tx1 + $ttx)}]
    $fr.can move $txt1 $offsx $offsy
}
#Собственно скрипт
#Считываем размеры экрана
set ::scrwidth [winfo screenwidth .]
set ::scrheight [winfo screenheight .]
set ::typetlf 0
#Проверяем, что это телефон
if {$::scrwidth < $::scrheight} {
    set ::typetlf 1
}
set ::padls 20
set ::padlx 15
set ::padly 15
if {$::typetlf} {
	wm attributes . -fullscreen 1
	scaleImage icon_openfile_18x16 3
	scaleImage ::img::view_18x16 3
#Логотип производителя
	scaleImage logo_orel 2
#Логотип продуктв
	scaleImage logo_product 2
#Андроида tcl/tk
	scaleImage logo_and 3
#Свиток опечатанный
	scaleImage svitok 4
	set ::padls 50
	set ::padlx 75
	set ::padly 50
} else {
#Конфигурирование виджета под смартфон
    scaleImage logo_orel -2
    set ::scrwidth 370
    set ::scrheight 700
    wm minsize . $::scrwidth $::scrheight
    set geometr $::scrwidth
    append geometr "x"
    append geometr $::scrheight
    append geometr "+0+0"
    wm geometry . $geometr
}
#Создаем название продукта
set name_product "CryptoArmPKCS-A" 
label .labtitul -image logo_product -compound left -fg snow -text $name_product -font {Arial 10 bold} -anchor w  -width [winfo screenwidth .] -pady $::padls -padx 10 -bg #222222 
pack .labtitul -anchor nw -expand 0 -fill x -side top  -padx 1 -pady 0
#Создаем стартовую страницу
set i 0
ttk::frame .fr$i -pad 0 -padding 0
page_titul ".fr$i"  "logo_orel"
pack .fr$i -side top -anchor center -expand 1 -fill both -side top  -padx 0 -pady 0 
update

For at udføre dette script skal du bruge et af værktøjerne undroidwish eller vanillawish:

$ /usr/local/bin64/undroidwish-e5dc71ed9d-linux64   create_titul_page.tcl 

eller

$/usr/local/bin64/vanillawish-e5dc71ed9d-linux64  create_titul_page.tcl 

Resultatet vises på det første skærmbillede.

Den anden side viser den funktionalitet, der understøttes af cryptoarmpkcs-A-værktøjet. Hver linje er en knap, der, når den klikkes, viser en funktionel side. Geometrien for placeringen af ​​knapper på denne side bestemmes af den anvendte skrifttype. Nedenfor er scriptet create_page_functions.tcl til at oprette den anden/funktionelle side i applikationen. Enhver kan også redigere den, så den passer til deres egne behov.

Script create_page_functions.tcl

package require Tk
package require tkpath 0.3.0
global mydir
set mydir [file dirname [info script]]
#Увеличить/уменьшить (отрицательное значение - уменьшение)
proc scaleImage {im xfactor {yfactor 0}} {
   set mode -subsample
   if {$xfactor>=0 && $yfactor>=0} {
       set mode -zoom
   } else {
	set xfactor [expr $xfactor * -1]
   }

   if {$yfactor == 0} {set yfactor $xfactor}
   set t [image create photo]
   $t copy $im
   $im blank
   $im copy $t -shrink $mode $xfactor $yfactor
   image delete $t
}

proc createtile {w  backg} {
    image create photo tiled
    tiled copy $backg -to 0 0 $::scrwidth $::scrheight -shrink
    $backg copy tiled
    image delete tiled
# Мостим холст
    $w create image 0 0  
      -image $backg  
      -anchor nw
}

proc butCliked {num fr} {
    pack forget  .fr1
    set ::tekFrfunc $fr
    pack $fr -side top -anchor center -expand 1 -fill both -side top  -padx 0 -pady 0 
    tk_dialog .dialog1 "Dear user:" "Button $num was clickednFr=$fr" info 0 OK 
}

proc butImg {img} {
    tk_messageBox -title "Кнопка" -icon info -message "Нажали кнопку=$img" -detail "::screenwidth=$::scrwidthn::screenheight=$::scrheight" -parent .
    if {$img == "exit"} {
	set answer [tk_dialog .dialog2 "Конец работы" "Вы действительноnхотите выйти?" question 0 "Да" "Нет" ]
	if {$answer == 0} {
    	    exit
	}	
    }
}

proc butReturn {} {
    pack forget  $::tekFrfunc
    pack .fr1 -side top -anchor center -expand 1 -fill both -side top  -padx 0 -pady 0 
#    tk_dialog .dialog1 "Dear user:" "Button $num was clickednFr=$fr" info 0 OK 
}

proc page_func {fr tile titul functions} {
#Кнопки  меню
    upvar $functions but
#Создаем шрифт для кнопок
    if {$::typetlf} {
	set feFONT_button "-family {Roboto} -size 9 -weight bold -slant roman"
	set widl 10
    } else {
	set feFONT_button "-family {Arial} -size 12 -weight bold -slant roman"
	set widl 5
    }
    catch {font delete fontTEMP_drawer}
    eval font create fontTEMP_drawer  $feFONT_button
#Вычисляем максимальныю длину текста
    set drawerCNT 0
    set strMaxWidthPx 15
    set Ndrawers [expr {[array size but] - 1}]
    while { $drawerCNT <= $Ndrawers } {
	set strWidthPx [font measure fontTEMP_drawer "$but($drawerCNT)"]
	if { $strWidthPx > $strMaxWidthPx } {
    	    set strMaxWidthPx $strWidthPx
	}
	incr drawerCNT
    }
    set drawerWidthPx [expr $strMaxWidthPx + 10]
    set xxx [expr {($::::scrwidth - $drawerWidthPx) / 2}]

    if {$fr != ".fr1"} {
	set hret [expr $::scrheight / 4]
    } else {
	set hret $::scrheight
    }
	set hret [expr $::scrheight / 4]
    tkp::canvas $fr.can -borderwidth 0 -height $hret -width $::scrwidth -relief flat
#Мостим холст плиткой 
    createtile "$fr.can"  $tile
    pack $fr.can  -anchor center -expand 1 -fill both -side top  -padx 0 -pady 0
    if {$titul != "" } {
	set allfunc $titul
	catch {font delete fontTEMP_titul}
	set font_titul "-family {Roboto Condensed Medium} -size 15"
        eval font create fontTEMP_titul  $font_titul
	set funcWidthPx [font measure fontTEMP_titul "$allfunc"]
	set dlx [expr {($::::scrwidth - $funcWidthPx) / 2}]

	$fr.can create text [expr $dlx + 6] [expr {6 + 6}] -anchor nw -text "$allfunc" -fill black -font fontTEMP_titul
	$fr.can create text $dlx 6 -anchor nw -text "$allfunc" -fill white -font fontTEMP_titul -tag id_text0
	set blogo [$fr.can bbox id_text0]
	set boxbut [expr ([lindex $blogo 3] + 6 + 6)]
    } else {
	set boxbut [expr 6 + 6]
    }
#Вычисляем самый широкий текст у кнопок
#См. выше
#Размещаем кнопки
    set BDwidth_canvas 0

    set maxTextHeightPx [font metrics fontTEMP_drawer -linespace] 

    set maxTextHeightPx [expr {$maxTextHeightPx + ( $maxTextHeightPx / 2)}]

    set drawerHeightPx $maxTextHeightPx

    set xLocTextPx [expr {($::::scrwidth - $drawerWidthPx) / 2}]

    set yLocTextPx [expr $BDwidth_canvas + ($drawerHeightPx / 2) + $boxbut]
    set canvasHeightPx [expr $Ndrawers * $drawerHeightPx]

    set drawerCNT 0
    set Ndrawers [expr {[array size but] - 1}]
    while { $drawerCNT <= $Ndrawers } {
      set yLineLocPx [ expr (( $drawerCNT ) * $drawerHeightPx + $boxbut)]
#Линия перед текстом
      $fr.can create line 
         $xLocTextPx $yLineLocPx 
         [expr $drawerWidthPx + $xLocTextPx] $yLineLocPx 
         -fill "#a0a0a0" -width $widl

      $fr.can create text [expr $xLocTextPx + 5] $yLocTextPx 
	-anchor w 
        -font fontTEMP_drawer 
        -text "$but($drawerCNT)" 
        -tag textlineTag($drawerCNT)

      if {$drawerCNT == 0} {
	    if {$fr == ".fr1"} {
		$fr.can bind textlineTag($drawerCNT)  <ButtonRelease-1>   {butImg "but1"}
	    } else {
		$fr.can bind textlineTag($drawerCNT)  <ButtonRelease-1>   {butReturn}
	    }
	} else {
	    frame .fn$drawerCNT -background white -relief flat -pady 0 -padx 0
	    set titul $but($drawerCNT)
	    set cmd "$fr.can bind textlineTag($drawerCNT)  <ButtonRelease-1>   {butCliked $drawerCNT .fn$drawerCNT}"
	    set cmd [subst "$cmd"]
	    eval $cmd 
	    set but1(0) "Возврат в основное меню"
	    page_func ".fn$drawerCNT" voda "$titul" "but1"
	}

	incr drawerCNT

	set yLocTextPx [ expr $yLocTextPx + $drawerHeightPx]
#Завершаюшая линия
	if { $drawerCNT > $Ndrawers } {
    	    set yLineLocPx [ expr (( $drawerCNT ) * $drawerHeightPx + $boxbut)]
    	    $fr.can create line $xLocTextPx $yLineLocPx 
            [expr $drawerWidthPx + $xLocTextPx] $yLineLocPx 
            -fill "#a0a0a0" -width $widl
	}
    }
}
#Собственно скрипт
#Считываем размеры экрана
set ::scrwidth [winfo screenwidth .]
set ::scrheight [winfo screenheight .]
set ::typetlf 0
#Проверяем, что это телефон
if {$::scrwidth < $::scrheight} {
    set ::typetlf 1
}
set ::padls 20
set ::padlx 15
set ::padly 15
if {$::typetlf} {
	wm attributes . -fullscreen 1
#Логотип продуктв
	scaleImage logo_product 2
	set ::padls 50
	set ::padlx 75
	set ::padly 50
} else {
#Конфигурирование виджета под смартфон
    set ::scrwidth 370
    set ::scrheight 700
    wm minsize . $::scrwidth $::scrheight
    set geometr $::scrwidth
    append geometr "x"
    append geometr $::scrheight
    append geometr "+0+0"
    wm geometry . $geometr
}

#Грузим картинки
image create photo voda -file [file join $mydir "imageme" "voda_400x800.png"]
#Логотип продукта
image create photo logo_product -file [file join $mydir "imageme" "validcertkey_51x24.png"] 
#Создаем название продукта
set name_product "CryptoArmPKCS-A" 
label .labtitul -image logo_product -compound left -fg snow -text $name_product -font {Arial 10 bold} -anchor w  -width [winfo screenwidth .] -pady $::padls -padx 10 -bg #222222 
pack .labtitul -anchor nw -expand 0 -fill x -side top  -padx 1 -pady 0
#Создаем страницы с функционалом
set i 1
ttk::frame .fr$i -pad 0 -padding 0
#Кнопки основного меню
set but(0) "Стартовая страница" 
set but(1) "Подписать документ"
set but(2) "Работаем с ЭП (PKCS7)" 
set but(3) "Запрос на сертификат" 
set but(4) "Просмотр запроса/сертификата" 
set but(5) "Список криптомеханизмов"
set but(6) "Просмотр ASN1-структуры" 
set but(7) "Объекты токена" 
set but(8) "Работаем с PKCS12/PFX" 
set but(9) "Самоподписанный сертификат"
set but(10) "Об Утилите/Дистрибутивы" 
set but(11) "Создать Токены"
set but(12) "Конфигурировние токена"
if {$::typetlf} {
    scaleImage voda 3 2
}
#Создаем страницу с функционалом
page_func ".fr$i" voda "Функционал" "but"
#Отображаем страницу с функционалом
pack .fr$i -side top -anchor center -expand 1 -fill both -side top  -padx 0 -pady 0 

Dette script forbereder også blanke felter til hver funktionsknap:

Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformen

Skabelonerne er fyldt med klassiske og tematiske widgets (labelframe, knap osv.). Et af disse udfyldte felter kan ses på det første skærmbillede til højre. Da vi fokuserede på at arbejde med PKCS#12-containeren i første fase, blev koden brugt næsten uden ændringer til cryptoarmpkcs-A. På dette stadie er følgende funktioner implementeret:

  • underskrive dokumentet (Cades-BES, CAdes-T, CAdes-XLT1);
  • Vi arbejder med elektronisk signatur (PKCS7), herunder tilføjelse af en underskriver;
  • Se certifikater/certifikatanmodninger:

    Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformen

  • Vi arbejder med PKCS12/PFX;
  • om forsyningsselskabet/distributionerne:

    Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformen

De resterende funktioner er mere relaterede til PKCS#11-tokens. Deres portering er blevet udskudt til nytår. Det er planlagt at forbinde en softwaretoken og oprette forbindelse til sky af tokens.

Med hensyn til funktionalitet ligner næsten alt cryptoarmpkcs-værktøjet. Men der er nogle forskelle. For eksempel, efter at have underskrevet et dokument, spørger forsyningsselskabet, om underskriften vil blive verificeret på statens hjemmeside:

Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformen
Når du klikker på knappen "Ja", åbnes en browser med en side til kontrol af underskrifter på dokumenter og certifikater. Lad os med det samme slå fast, at denne side ikke rigtig er designet til en smartphone-skærm. Dette vil være mærkbart, når du vælger en signatur, og hvis signaturen er afmonteret, filen med dokumentet. Men hvis alt går godt, så får vi et positivt resultat:

Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformen

Det skal bemærkes, at det kun giver mening at kontrollere både underskriften og certifikatet på statens hjemmeside, hvis certifikatet er indhentet fra et akkrediteret certificeringscenter (УЦ). Ellers vil signaturen altid være ugyldig.

For at kalde browseren, måtte jeg tilføje et par linjer til openUrl-proceduren:

proc openURL {url} {
  global typesys
  global macos
  #  global windowsOS
#проверка, что утилита выполняется на смартфоне Android
  if {$::typetlf} {
#Запуск браузера
 	borg activity android.intent.action.VIEW $url text/html
 	return
  }
. . .
}

Browseren på Android hedder som følger:

borg activity android.intent.action.VIEW <URL> text/html

Der er en lille ejendommelighed, når man tilføjer en ny underskriver til et tidligere underskrevet dokument. Den nye underskrivers certifikat (eller rettere sagt PKCS#12-containeren med certifikatet og den private nøgle) skal vælges på forhånd på siden "Underskriv et dokument" eller "Arbejde med PKCS12/PFX", hvilket værktøjet vil minde dig om:

Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformen
Under længerevarende drift vil uret fortsætte med at gå som før:

Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformen
Alt, der er tilbage, er at sige, hvor distributionerne kan downloades fra, og at lykønske jer med det kommende nytår og ønske alle alt det bedste i 2020!

Kryptografisk arbejdsstation baseret på offentlige nøglestandarder til Android-platformenSå distributioner til Linux, OS X, Windows og Android:

Kilde: www.habr.com

Tilføj en kommentar