Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformen

Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformenDet är dags att visa hur kryptografisk APM baserad på öppna nyckelstandarder cryptoarmpkcs 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. PKCS#11 och/eller skyddade containrar PKCS#12. 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 Androwish. Det fanns inga problem med att installera och konfigurera miljön . (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:

Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformen

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/bones

och följa dess instruktioner:

Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformen

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:

Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformen

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

Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformen

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" tkpath. 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 
update

Fö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:

Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformen

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:

    Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformen

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

    Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformen

De återstående funktionerna är mer relaterade till PKCS#11-token. Deras portering har skjutits upp till Nyår. En programvarutoken och anslutning till tokenmolnet.

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:

Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformen
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:

Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformen

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 (CC). 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:

Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformen
Vid längre operationer kommer timmarna att gå som tidigare:

Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformen
Å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!

Kryptografisk ARM baserad på öppna nyckelstandarder för Android-plattformenSå, distributionspaketen för Linux, OS X, Windows och Android:

Källa: habr.com

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster