Det är dags att visa hur kryptografisk APM baserad på öppna nyckelstandarder fungerar på en av mobila plattformar, nämligen Android.
Konceptet som lagts till grund för utformningen av verktyget cryptoarmpkcs är att användaren ska uppleva minimi oönskade situationer vid skapandet och verifieringen av elektroniska signaturer. Just därför föreslår vi att använda kryptografiska token som den viktigaste bäraren för det personliga certifikatet. och/eller skyddade containrar . Det bör nämnas att användningen av PKCS#12 i många fall är nästan den enda möjliga lösningen, till exempel när det inte finns något stöd för vissa plattformar med PKCS#11-token. Därför beslutade vi att börja portera verktyget cryptoarmpkcs till Android-plattformen med stöd för skyddade containrar PKCS#12.
Vi bör notera att eftersom projektet gjordes på plattformen C och Tcl/Tk, så väckte portningen inga principiella svårigheter. Detta blev möjligt tack vare teknologin . Det fanns inga problem med att installera och . (Min arbetsmiljö är Linux — Mageia-7.0). Jag kommer att ge ett skript för att installera 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 fantastiska är att Androwish-miljön innehåller två tolkare, undrowish-xxx och vanillawish-xxx, som är helt identiska vad gäller de 'balalaika'-paket som ingår i Androwish. Skillnaden mellan undrowish och vanillawish är att vanillawish har en backend baserad på SDL / AGG / freetype:

Existensen av dessa två verktyg gör det möjligt att utveckla applikationen utan att använda Android själv och dess emulator med maximal närhet till en verklig enhet. Först och främst handlar det om undroidwish-xxx.
Själva användarpaketet för Android byggs i AWSDK-miljön. Trädet för ditt projekt bör flyttas till mappen ~/AWSDK/assets/app. Huvudmodulen för ditt projekt bör döpas om till main.tcl. Om du använder ytterligare balalaikas med dynamiska bibliotek, bör biblioteken placeras i mapparna ~/AWSDK/libs/x86 för emulatorn och ~/AWSDK/libs/armeabi för enheten.
Efter detta räcker det med att köra kommandot:
$wish ~/AWSDK/tools/bonesoch följa dess instruktioner:

Den sammansatta apk-paketet kommer att ligga i mappen ~/AWSDK/build/outputs/apk.
Om du har en verklig enhet eller emulator ansluten kan paketet installeras direkt.
Den verkliga enheten måste vara i debug-läge.
Men låt oss återgå till själva applikationen. Vad fick vi ändra på?
Självklart är förändringarna i första hand kopplade till skärmstorlekar. Huvudfönstret behövde omdesignas. Istället för ett fönster på en vanlig dator:

Så dök det upp tre fönster på Android:

Det första fönstret är informativt. Det är uppdelat i flera delar. Den första delen, som ligger högst upp, innehåller namnet på verktyget och dess logotyp.
Därefter kommer tillverkarens logotyp, informationsavsnittet och tre knappar avslutar sidan.
Sidan är skriven med hjälp av komponenten canvas. Det används två typer av knappar: en i form av en halvtransparent rektangel (den mittersta), och två andra i form av rektanglar med rundade hörn. För att skapa knappar med rundade hörn användes "balalaika" . Personligen gjorde denna balalaika ett mycket bra intryck på mig. Självklart tar geometrin en stor del av koden när man arbetar med canvas. Nedan visas skriptet create_titul_page.tcl för att skapa applikationens första sida. Alla intresserade kan redigera det efter sitt eget behov.
Skriptet create_titul_page.tcl
paket kräver Tk
paket kräver tkpath 0.3.0
global mydir
set mydir [file dirname [info script]]
#Laddar bilder
#Produktlogotyp
image create photo logo_product -file [file join $mydir "imageme" "validcertkey_51x24.png"]
#Tillverkarens logotyp
image create photo logo_orel -file [file join $mydir "imageme" "я_орел_425x200.png"] -format "png -alpha 1.0"
#Android med tcl/tk
image create photo logo_and -file [file join $mydir "imageme" "AndTk_inv_147x173.png"] -format "png -alpha 1.0"
#Förseglad rulle
image create photo svitok -file [file join $mydir "imageme" "blue_svitok.png"] -format "png -alpha 1.0"
#Kakla
image create photo tileand -file [file join $mydir "imageme" "tile_green_and_32x32.png"] -format "png -alpha 1.0"
#Öka/minska (negativt värde - minskning)
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
# Lägger ut duk
$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 "#xxx" $cr $cg $cb ]
#Skapa en färgad rektangel
$img put $fill -to 0 0 [expr {$x2 - $x1}] [expr {$y2 -$y1}]
#Spara bilden
set dimg [$img data -format png]
#Skapa image med alpha-kanal
image create photo $img -data $dimg -format "png -alpha $alfa"
# $img put [list $rgb1] -to 0 0 [expr {$x2 - $x1}] [expr {$y2 - $y1}]
#Visa färgad rektangel
set imgr [$canv create image $x1 $y1 -image $img -anchor nw]
set cc [subst {butImg $img}]
$canv bind $imgr $cc
#Ram runt den färgade rektangeln
if {$wbd > 0 } {
set item [$canv create rect $x1 $y1 $x2 $y2 -outline $colorline -width $wbd ]
$canv bind $item $cc
}
return $imgr
}
proc butImg {img} {
tk_messageBox -title "Knapp" -icon info -message "Tryckte på knappen=$img" -detail "::screenwidth=$::scrwidthn::screenheight=$::scrheight" -parent .
if {$img == "exit"} {
set answer [tk_dialog .dialog2 "Avsluta programmet" "Vill du verkligen avsluta?" question 0 "Ja" "Nej" ]
if {$answer == 0} {
exit
}
}
}
proc page_titul {fr logo_manufacturer} {
global mydir
#Skapa duken på hela skärmen
tkp::canvas $fr.can -borderwidth 0 -height [winfo screenheight .] -width [winfo screenwidth .] -relief flat
#Lägger ut duken med kakel
createtile "$fr.can" "tileand"
pack $fr.can -anchor center -expand 1 -fill both -side top -padx 0 -pady 0
#Beräkna koordinater för tillverkarens logotyp
#uppdatera så att informationen i databasen om fönstren uppdateras
update
# set aa [winfo height $fr.labtitul]
set aa $::padly
#Centrera utvecklarens logotyp
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 "Digital signatur" -fill black -font {{Roboto Condensed Medium} 15 }
$fr.can create text $dlx [expr {$wexit + $::padly}] -anchor nw -text "Digital signatur" -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 "för Android-plattformen" -fill black -font {{Roboto Condensed Medium} 13}
$fr.can create text $dlx [expr {$wexit + $::padly - 80}] -anchor nw -text "för Android-plattformen" -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 FZ "Om den digitala signaturen den 6 april 2011" -fill black -font {{Roboto} 10}
$fr.can create text $dlx [expr {$wexit + $::padly - 50}] -anchor nw -text "№ 63 FZ "Om den digitala signaturen den 6 april 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 "Författare: V.N. Orlovnhttp://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 "Författare: V.N. Orlovnhttp://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 "Digital signatur" -fill black -font {{Nimbus Sans Narrow} 20}
$fr.can create text $::padlx [expr {$wexit + $::padly}] -anchor nw -text "Digital signatur" -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 "för Android-plattformen" -fill black -font {{Nimbus Sans Narrow} 18}
$fr.can create text $::padlx [expr {$wexit + $::padly - 20}] -anchor nw -text "för Android-plattformen" -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 FZ "Om den digitala signaturen den 6 april 2011" -fill black -font {{Nimbus Sans Narrow} 14}
$fr.can create text $::padlx [expr {$wexit + $::padly}] -anchor nw -text "№ 63 FZ "Om den digitala signaturen den 6 april 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 "Författare: V.N. Orlovnhttp://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 "Författare: V.N. Orlovnhttp://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 $yland + 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 {$yland + 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 {butImg "img1"}
#Skriver text
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 "Utvecklarens webbsida" -fill black -font {{Arial} 10 normal}]
#Centrera text
set btxt1 [$fr.can bbox $txt1]
#Offset längs Y-axeln
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)}]
#Offset längs X-axeln
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 {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"]
#Skriver text
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 "Gå till huvudmenyn" -fill black -font {{Roboto Condensed Medium} 12}]
#Centrera text
set btxt1 [$fr.can bbox $txt1]
#Offset längs Y-axeln
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)}]
#Offset längs X-axeln
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 {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 {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 "Avsluta programmet" -fill black -font {Arial 10 normal}]
$fr.can bind $txt1 {butImg "exit"}
set btxt1 [$fr.can bbox $txt1]
#Offset längs Y-axeln
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)}]
#Offset längs X-axeln
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
}
#Egentligen skriptet
#Läsa skärmstorlekar
set ::scrwidth [winfo screenwidth .]
set ::scrheight [winfo screenheight .]
set ::typetlf 0
#Kolla att det här är en telefon
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
#Tillverkarens logotyp
scaleImage logo_orel 2
#Produktlogotyp
scaleImage logo_product 2
#Android tcl/tk
scaleImage logo_and 3
#Förseglad rulle
scaleImage svitok 4
set ::padls 50
set ::padlx 75
set ::padly 50
} else {
#Konfigurera widgeten för smartphones
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
}
#Skapa produktnamn
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
#Skapa startskärm
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
updateFör att köra detta skript använder vi ett av verktygen 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 presenteras på den första skärmbilden.
På den andra sidan beskrivs de funktioner som stöds av verktyget cryptoarmpkcs-A. Varje rad är en knapp, och när man trycker på den visas en funktionell sida. Geometrin för knappernas placering på denna sida bestäms av teckensnittet som används. Nedan anges skriptet create_page_functions.tcl för att skapa den andra/funktionella sidan av applikationen. Alla intresserade kan också redigera det för sina egna funktioner.
Skriptet 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 Detta skript förbereder också mallar för varje funktionell knapp:

Fyllningen av mallarna sker med klassiska och tematiska widgetar (labelframe, button och så vidare). En av dessa ifyllda mallar kan ses på den första skärmbilden till höger. Eftersom vi under det första steget fokuserade på att arbeta med behållaren PKCS#12, användes koden praktiskt taget utan ändringar även för cryptoarmpkcs-A. Vid detta stadium har följande funktioner implementerats:
- signera dokument (Cades-BES, CAdes-T, CAdes-XLT1);
- arbeta med E-signaturer (PKCS7), inklusive att lägga till en signatär;
- visa certifikat/förfrågningar om certifikat:

- arbeta med PKCS12/PFX;
- om verktyget/distributioner:

De återstående funktionerna är mer relaterade till PKCS#11-token. Deras portering har skjutits upp till Nyår. En programvarutoken och anslutning till .
När det gäller funktionerna är det praktiskt taget allt likadant som verktyget cryptoarmpkcs. Men det finns vissa skillnader. Till exempel, efter att ha signerat ett dokument, frågar verktyget om signaturen kommer att verifieras på myndighetens webbplats:

Vid tryck på knappen "Ja" kommer en webbläsare att laddas med sidan för att kontrollera signaturen av dokument och certifikat. Vi bör omedelbart notera att denna sida inte är särskilt anpassad för smartphones. Detta blir uppenbart när man väljer signaturen och, om signaturen är separat, filen med dokumentet. Men om allt är bra, kommer vi att få ett positivt resultat:

Det bör beaktas att kontrollen av såväl signaturen som certifikatet på myndighetens webbplats endast är meningsfull om certifikatet har utfärdats av ett ackrediterat certifieringscenter (). Annars kommer signaturen alltid att vara ogiltig.
För att kalla på webbläsaren var jag tvungen att lägga till ett par rader i proceduren openUrl:
proc openURL {url} {
global typesys
global macos
# global windowsOS
#kontrollera att verktyget körs på en Android-smartphone
if {$::typetlf} {
#Starta webbläsaren
borg activity android.intent.action.VIEW $url text/html
return
}
. . .
}Webbläsaren på Android kallas på följande sätt:
borg activity android.intent.action.VIEW text/html
Det finns en liten detalj vid tillägg av en ny signatär till ett tidigare signerad dokument. Certifikatet för den nya signatären (eller snarare containern PKCS#12 med certifikat och privat nyckel) måste väljas i förväg på sidan "Signera dokument" eller "Arbeta med PKCS12/PFX", vilket verktyget kommer att påminna om:

Vid längre operationer kommer timmarna att gå som tidigare:

Återstår att säga var man kan ladda ner distributionspaketen och gratulera med det kommande nyåret och önska alla allt gott under 2020!
Så, distributionspaketen för Linux, OS X, Windows och Android:
Källa: habr.com


