Es ist an der Zeit zu demonstrieren, wie das kryptografische ARM auf Basis von Standard-Öffentlichen Schlüsseln funktioniert. läuft auf einer der mobilen Plattformen, nämlich Android.
Das Konzept, das bei der Entwicklung des Tools cryptoarmpkcs zugrunde gelegt wurde, besteht darin, dass der Benutzer beim Erstellen und Überprüfen einer elektronischen Signatur möglichst wenig Unannehmlichkeiten erfahren soll. Aus diesem Grund schlagen wir vor, kryptografische Token als Schlüsselträger für das persönliche Zertifikat zu verwenden. und/oder gesicherte Container . Es sei darauf hingewiesen, dass die Verwendung von PKCS#12 in vielen Fällen fast die einzige Möglichkeit darstellt, zum Beispiel wenn die gleichen PKCS#11-Token keine Unterstützung für bestimmte Plattformen bieten. Daher haben wir beschlossen, die Portierung des Tools cryptoarmpkcs auf die Android-Plattform mit Unterstützung für gesicherte PKCS#12-Container zu beginnen.
Wir möchten gleich anmerken, dass, da das Projekt auf der C- und Tcl/Tk-Plattform entwickelt wurde, die Portierung keine wesentlichen Schwierigkeiten bereitet hat. Dies wurde auch durch die Technologie ermöglicht, . Bei der Bereitstellung und gab es keine Probleme (meine Arbeitsumgebung ist Linux — Mageia-7.0). Ich werde nur ein Skript anführen, um die Android Command Line Tools (sdk-tools-linux-xxxx.zip) bereitzustellen:
#!/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" Das Erstaunlichste ist, dass die Androwish-Umgebung zwei Interpreter enthält, undrowish-xxx und vanillawish-xxx, die vollständig identisch hinsichtlich der "Balalaika"-Pakete sind, die Teil von Androwish sind. Der Unterschied zwischen undrowish und vanillawish besteht darin, dass vanillawish ein Backend auf Basis von SDL / AGG / freetype hat:

Das Vorhandensein dieser beiden Tools ermöglicht die Entwicklung von Anwendungen, ohne tatsächlich Android oder seinen Emulator zu verwenden, und zwar so nah wie möglich an einem echten Gerät. In erster Linie handelt es sich dabei um undroidwish-xxx.
Das eigentliche Benutzerpaket für Android wird in der AWSDK-Umgebung erstellt. Das Verzeichnis Ihres Projekts muss in den Ordner ~ / AWSDK / assets / app verschoben werden. Dabei muss das Hauptmodul Ihres Projekts in main.tcl umbenannt werden. Wenn Sie zusätzliche Balalaikas mit dynamischen Bibliotheken verwenden, müssen die Bibliotheken in die Ordner ~ / AWSDK / libs / x86 für den Emulator und ~ / AWSDK / libs / armeabi für das echte Gerät gelegt werden.
Danach genügt es, den Befehl auszuführen:
$wish ~ / AWSDK / tools / bonesund dessen Anweisungen zu folgen:

Das gebaute apk-Paket wird im Ordner ~ / AWSDK / build / outputs / apk liegen.
Wenn Sie ein echtes Gerät oder einen Emulator angeschlossen haben, kann das Paket sofort installiert werden.
Das echte Gerät muss sich dabei im Debugging-Modus befinden.
Kommen wir nun zum eigentlichen Anwendung. Was musste daran geändert werden?
Natürlich hängen die Änderungen in erster Linie mit der Bildschirmgröße zusammen. Es war notwendig, das Hauptfenster neu zu planen. Das Ergebnis ist, dass anstelle eines Fensters auf einem herkömmlichen Computer:

drei Fenster auf Android erschienen sind:

Das erste Fenster ist informativ. Es lässt sich grob in mehrere Teile unterteilen. Der obere Teil enthält den Namen des Tools und sein Logo.
Darunter folgt das Logo des Herstellers, eine Informationshilfe, und die Seite endet mit drei Schaltflächen.
Die Seite ist unter Verwendung des Komponenten canvas (Leinwand) geschrieben. Auf der Seite werden zwei Arten von Schaltflächen verwendet: Eine in Form eines halbtransparenten Rechtecks (mittel), die anderen beiden in Form eines Rechtecks mit abgerundeten Ecken. Zur Erstellung der Schaltflächen mit abgerundeten Ecken wurde eine „Balalaika“ verwendet. . Diese Balalaika hat persönlich einen sehr guten Eindruck auf mich gemacht. Natürlich nimmt der Großteil des Codes bei der Arbeit mit der Leinwand (canvas) die Geometrie ein. Unten finden Sie das Skript create_titul_page.tcl zur Erstellung der ersten Seite der Anwendung. Jeder, der möchte, kann es nach seiner Vision anpassen.
Das Skript create_titul_page.tcl
package require Tk
package require tkpath 0.3.0
global mydir
set mydir [file dirname [info script]]
#Laden der Bilder
#Produktlogo
image create photo logo_product -file [file join $mydir "imageme" "validcertkey_51x24.png"]
#Herstellerlogo
image create photo logo_orel -file [file join $mydir "imageme" "я_орел_425x200.png"] -format "png -alpha 1.0"
#Android mit tcl/tk
image create photo logo_and -file [file join $mydir "imageme" "AndTk_inv_147x173.png"] -format "png -alpha 1.0"
#Siegel
image create photo svitok -file [file join $mydir "imageme" "blue_svitok.png"] -format "png -alpha 1.0"
#Kachel
image create photo tileand -file [file join $mydir "imageme" "tile_green_and_32x32.png"] -format "png -alpha 1.0"
#Vergrößern / Verkleinern (negativer Wert - Verkleinerung)
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
# Lassen Sie die Leinwand entstehen
$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 ]
#Farbige Rechteck erzeugen
$img put $fill -to 0 0 [expr {$x2 - $x1}] [expr {$y2 -$y1}]
#Bild speichern
set dimg [$img data -format png]
#Bild mit Alpha-Kanal erstellen
image create photo $img -data $dimg -format "png -alpha $alfa"
# $img put [list $rgb1] -to 0 0 [expr {$x2 - $x1}] [expr {$y2 - $y1}]
#Farbige Rechteck anzeigen
set imgr [$canv create image $x1 $y1 -image $img -anchor nw]
set cc [subst {butImg $img}]
$canv bind $imgr $cc
#Rahmen um das farbige Rechteck
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 "Button" -icon info -message "Taste gedrückt: $img" -detail "::screenwidth=$::scrwidthn::screenheight=$::scrheight" -parent .
if {$img == "exit"} {
set answer [tk_dialog .dialog2 "Beenden" "Möchten Sie wirklich beenden?" question 0 "Ja" "Nein" ]
if {$answer == 0} {
exit
}
}
}
proc page_titul {fr logo_manufacturer} {
global mydir
#Erstellen Sie eine Leinwand für den gesamten Bildschirm
tkp::canvas $fr.can -borderwidth 0 -height [winfo screenheight .] -width [winfo screenwidth .] -relief flat
#Lassen Sie die Leinwand mit Kacheln entstehen
createtile "$fr.can" "tileand"
pack $fr.can -anchor center -expand 1 -fill both -side top -padx 0 -pady 0
#Berechnen Sie die Koordinaten für das Herstellerlogo
#update um die Informationen in der DB über die Fenster zu aktualisieren
update
# set aa [winfo height $fr.labtitul]
set aa $::padly
#Zentrierung des Entwicklers-Logos
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 "Elektronische Signatur" -fill black -font {{Roboto Condensed Medium} 15 }
$fr.can create text $dlx [expr {$wexit + $::padly}] -anchor nw -text "Elektronische 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 die Android-Plattform" -fill black -font {{Roboto Condensed Medium} 13}
$fr.can create text $dlx [expr {$wexit + $::padly - 80}] -anchor nw -text "für die Android-Plattform" -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 "Nr. 63 FZ "Über die elektronische Signatur" vom 6. April 2011" -fill black -font {{Roboto} 10}
$fr.can create text $dlx [expr {$wexit + $::padly - 50}] -anchor nw -text "Nr. 63 FZ "Über die elektronische Signatur" vom 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 "Autoren: V.N. Orlov http://soft.lissi.ru, http://www.lissi.run +7(495)589-99-53 E-Mail: support@lissi.run"
-anchor nw -fill black -font {{Roboto} 9}
$fr.can create text $dlx [expr {$wexit + $::padly - 40}] -text "Autoren: V.N. Orlov http://soft.lissi.ru, http://www.lissi.run +7(495)589-99-53 E-Mail: support@lissi.run"
-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 "Elektronische Signatur" -fill black -font {{Nimbus Sans Narrow} 20}
$fr.can create text $::padlx [expr {$wexit + $::padly}] -anchor nw -text "Elektronische 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 die Android-Plattform" -fill black -font {{Nimbus Sans Narrow} 18}
$fr.can create text $::padlx [expr {$wexit + $::padly - 20}] -anchor nw -text "für die Android-Plattform" -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 "Nr. 63 FZ "Über die elektronische Signatur" vom 6. April 2011" -fill black -font {{Nimbus Sans Narrow} 14}
$fr.can create text $::padlx [expr {$wexit + $::padly}] -anchor nw -text "Nr. 63 FZ "Über die elektronische Signatur" vom 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 "Autoren: V.N. Orlov http://soft.lissi.ru, http://www.lissi.run +7(495)589-99-53 E-Mail: support@lissi.run"
-anchor nw -fill black -font {{Nimbus Sans Narrow} 12}
$fr.can create text $::padlx [expr {$wexit + $::padly}] -text "Autoren: V.N. Orlov http://soft.lissi.ru, http://www.lissi.run +7(495)589-99-53 E-Mail: support@lissi.run"
-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 {butImg "img1"}
#Text drucken
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 "Website des Entwicklers" -fill black -font {{Arial} 10 normal}]
#Text zentrieren
set btxt1 [$fr.can bbox $txt1]
#Verschiebung entlang der Y-Achse
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)}]
#Verschiebung entlang der X-Achse
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"]
#Text drucken
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 "Wechsel zum Hauptmenü" -fill black -font {{Roboto Condensed Medium} 12}]
#Text zentrieren
set btxt1 [$fr.can bbox $txt1]
#Verschiebung entlang der Y-Achse
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)}]
#Verschiebung entlang der X-Achse
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 "Beenden" -fill black -font {Arial 10 normal}]
$fr.can bind $txt1 {butImg "exit"}
set btxt1 [$fr.can bbox $txt1]
#Verschiebung entlang der Y-Achse
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)}]
#Verschiebung entlang der X-Achse
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
}
#Tatsächlich das Skript
#Lese die Bildschirmgrößen
set ::scrwidth [winfo screenwidth .]
set ::scrheight [winfo screenheight .]
set ::typetlf 0
#Überprüfen, ob dies ein Telefon ist
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
#Herstellerlogo
scaleImage logo_orel 2
#Produktlogo
scaleImage logo_product 2
#Android tcl/tk
scaleImage logo_and 3
#Siegel
scaleImage svitok 4
set ::padls 50
set ::padlx 75
set ::padly 50
} else {
#Widget-Konfiguration 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
}
#Produktname erstellen
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
#Startseite erstellen
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
updateUm dieses Skript auszuführen, verwenden wir eines der Tools undroidwish oder vanillawish:
$ /usr/local/bin64/undroidwish-e5dc71ed9d-linux64 create_titul_page.tcl oder
$/usr/local/bin64/vanillawish-e5dc71ed9d-linux64 create_titul_page.tcl Das Ergebnis ist im ersten Screenshot dargestellt.
Auf der zweiten Seite wird die von der Utility cryptoarmpkcs-A unterstützte Funktionalität aufgelistet. Jede Zeile ist eine Schaltfläche, bei der Betätigung wird die Funktionsseite angezeigt. Die Geometrie der Schaltflächen auf dieser Seite wird durch die verwendete Schriftart bestimmt. Unten finden Sie das Skript create_page_functions.tcl zur Erstellung der zweiten/funktionalen Seite der Anwendung. Jeder Interessierte kann es auch an seine Funktionen anpassen.
Skript 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 Dieses Skript bereitet auch Vorlagen für jede funktionale Schaltfläche vor:

Die Vorlagen werden mit klassischen und thematischen Widgets (labelframe, button usw.) gefüllt. Eine dieser ausgefüllten Vorlagen ist im ersten Screenshot auf der rechten Seite zu sehen. Da wir uns in der ersten Phase auf die Arbeit mit dem Container PKCS#12 konzentriert haben, wurde der Code nahezu unverändert auch für cryptoarmpkcs-A verwendet. In dieser Phase wurden folgende Funktionen umgesetzt:
- Dokumente signieren (Cades-BES, CAdes-T, CAdes-XLT1);
- Arbeiten mit qualifizierten elektronischen Signaturen (PKCS7), einschließlich der Hinzufügung eines Unterzeichners;
- Zertifikate/Anfragen auf Zertifikate anzeigen:

- Arbeiten mit PKCS12/PFX;
- Über das Tool/Distributionen:

Die restlichen Funktionen sind mehr mit PKCS#11-Token verbunden. Ihre Portierung wurde auf das neue Jahr verschoben. Es ist geplant, einen softwarebasierten Token anzuschließen und eine Verbindung zu .
Hinsichtlich der Funktionalität ist praktisch alles analog zu dem Tool cryptoarmpkcs. Aber es gibt einige Unterschiede. Zum Beispiel fragt das Tool nach der Unterzeichnung eines Dokuments, ob die Signatur auf der Website der staatlichen Dienste überprüft werden soll:

Wenn Sie auf die Schaltfläche „Ja“ klicken, wird ein Browser mit der Seite zur Überprüfung von Dokumentensignaturen und -zertifikaten geöffnet. Es sei sofort erwähnt, dass diese Seite nicht gut für den Bildschirm eines Smartphones optimiert ist. Dies wird deutlich, wenn die Signatur und, falls die Signatur abgetrennt ist, die Datei mit dem Dokument ausgewählt werden. Aber wenn alles gut geht, erhalten wir ein positives Ergebnis:

Es ist zu beachten, dass die Überprüfung sowohl der Signatur als auch des Zertifikats auf der Website der staatlichen Dienste nur sinnvoll ist, wenn das Zertifikat von einem akkreditierten Zertifizierungszentrum erhalten wurde (). Andernfalls wird die Signatur immer ungültig sein.
Um den Browser aufzurufen, musste ich ein paar Zeilen in die openUrl-Prozedur hinzufügen:
proc openURL {url} {
global typesys
global macos
# global windowsOS
#Überprüfung, ob das Tool auf einem Android-Smartphone ausgeführt wird
if {$::typetlf} {
#Browser starten
borg activity android.intent.action.VIEW $url text/html
return
}
. . .
}Der Browser auf Android wird wie folgt aufgerufen:
borg activity android.intent.action.VIEW text/html
Es gibt eine kleine Besonderheit beim Hinzufügen eines neuen Unterzeichners zu einem zuvor unterzeichneten Dokument. Das Zertifikat des neuen Unterzeichners (genauer gesagt der PKCS#12-Container mit dem Zertifikat und dem privaten Schlüssel) muss im Voraus auf der Seite „Dokument signieren“ oder „Arbeiten mit PKCS12/PFX“ ausgewählt werden, woran das Tool erinnern wird:

Bei langen Operationen wird wie gewohnt die Uhr ticken:

Es bleibt nur zu sagen, wo die Distributiven heruntergeladen werden können, und allen ein frohes neues Jahr zu wünschen und alles Gute für das Jahr 2020!
Also, die Distributiven für Linux, OS X, Windows und Android:
Quelle: habr.com


