Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormil

Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormilOn aeg näidata, kuidas krüptograafiline APM, mis põhineb avalike võtmete standarditel, töötab. cryptoarmpkcs töötada ühel mobiilplatvormidest, nimelt Androidil.

Kontseptsioon, mis loodi utiliidi cryptoarmpkcs väljatöötamisel, seisneb selles, et kasutaja peaks allkirja loomisel ja kontrollimisel kogema võimalikult vähe ebamugavusi. Seetõttu soovitame isikliku sertifikaadi võtme kandjana kasutada krüptograafilisi tokeneid. PKCS#11 ja/või kaitstud konteidereid PKCS#12. Tuleb märkida, et PKCS#12 kasutamine on paljudel juhtudel peaaegu ainus võimalik variant, näiteks siis, kui PKCS#11 tokenitel ei ole erinevatele platvormidele tuge. Otsustasime alustada utiliidi cryptoarmpkcs portimist Androidi platvormile, toetades PKCS#12 kaitstud konteinereid.

Märgin kohe, et kuna projekt tehti platvormil C ja Tcl/Tk, ei põhjustanud portimine mingeid põhimõttelisi raskusi. See oli võimalik ka tehnoloogia tõttu Androwish. Keskkonna paigaldamise ja konfigureerimisega ei olnud probleeme (minu töökeskkond on Linux — Mageia-7.0). Toodud on ainult üks skript Android Command Line Tools'i (sdk-tools-linux-xxxx.zip) paigaldamiseks:

#!/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"  

Kõige imelisem on see, et Androwishi keskkonda kuulub kaks tõlgendajat undrowish-xxx ja vanillawish-xxx, mis on koostiselt täiesti identsed Androwishi kuuluvate „balalaikade” (paketid) poolest. Erinevus undrowishi ja vanillawishi vahel on see, et vanillawishi on tagaplaneeritud SDL / AGG / freetype:

Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormil

Nende kahe utiliidi olemasolu võimaldab arendada rakendust ilma Androidi ja selle emulaatorita, maksimaalselt lähenedes reaalsele seadmele. Eelkõige on see muidugi undroidwish-xxx.

Kasutajakogemuse pakett Androidile kogutakse AWSDK keskkonnas. Teie projekti puu peab olema kantud kausta ~/AWSDK/assets/app. Samuti peab teie projekti peamine moodul olema ümber nimetatud main.tcl-iks. Kui kasutate täiendavaid balalaikasid koos dünaamiliste raamatukogudega, tuleb raamatukogud paigutada kaustadesse ~/AWSDK/libs/x86 emulaatori jaoks ja ~/AWSDK/libs/armeabi reaalse seadme jaoks.

Pärast seda piisab, kui täita käsk:

$wish ~/AWSDK/tools/bones

ja järgida selle juhiseid:

Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormil

Kogutud apk-pakett asub kaustas ~/AWSDK/build/outputs/apk.

Kui teil on ühendatud reaalne seade või emulaator, siis saab paketti kohe installida.
Reaalne seade peab olema silumisrežiimis.

Aga naaseme tegeliku rakenduse juurde. Milliseid muudatusi tuli seal teha?

Muidugi, esmajoones on muudatused seotud ekraanisuurustega. Pidi ümber projekteerima peaakna. Lõpuks, ühe akna asemel tavalises arvutis:

Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormil

Ilmus kolm akent Androidis:

Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormil

Esimene aken on informatiivne. Tinglikult jaguneb see mitmeks osaks. Ülemises osas on utiliidi nimi ja logo.

Edasi tuleb tootja logo, informatiivne teave ja lehe lõpetavad kolm nuppu.
Leht on kirjutatud kasutades canvas komponenti. Lehel kasutatakse kahte tüüpi nuppe: üks poolläbipaistva ristkülikuna (keskmine) ja kaks teist ristkülikuna ümarate nurkadega. Ümarate nurkadega nuppude loomiseks kasutati "balalaika" tkpath. Isiklikult jättis see balalaika mulle väga hea mulje. Loomulikult, kui töötate kanvasega, võtab suur osa koodist geomeetria. Allpool on toodud skript create_titul_page.tcl, et luua rakenduse esimene leht. Igaüks, kes soovib, saab seda oma nägemuse järgi redigeerida.

Skript create_titul_page.tcl

package require Tk
package require tkpath 0.3.0

global mydir
set mydir [file dirname [info script]]
# Laadige pildid
# Toote logo
image create photo logo_product -file [file join $mydir "imageme" "validcertkey_51x24.png"] 
# Tootja logo
image create photo logo_orel -file [file join $mydir "imageme" "я_орел_425x200.png"] -format "png -alpha 1.0"
# Androidi tcl/tk
image create photo logo_and -file [file join $mydir "imageme" "AndTk_inv_147x173.png"] -format "png -alpha 1.0"
# Sulgemine pitseeritud
image create photo svitok -file [file join $mydir "imageme" "blue_svitok.png"] -format "png -alpha 1.0"
# Plaadid
image create photo tileand -file [file join $mydir "imageme" "tile_green_and_32x32.png"] -format "png -alpha 1.0"
# Suurenda/vähenda (negatiivne väärtus - vähendamine)
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
# Palet
 $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 ]
# Loome värvilise ristküliku
 $img put $fill -to 0 0 [expr {$x2 - $x1}] [expr {$y2 -$y1}]
# Salvestame pildi
 set dimg [$img data -format png]
# Loome image koos alpha kanali arvesse võtmisega
 image create photo $img -data $dimg -format "png -alpha $alfa"
# $img put [list $rgb1] -to 0 0 [expr {$x2 - $x1}] [expr {$y2 - $y1}]
# Kuvame värvilise ristküliku
 set imgr [$canv create image $x1 $y1 -image $img -anchor nw] 
 set cc [subst {butImg $img}]
 $canv bind $imgr  $cc
# Raam värvilise ristküliku ümber
 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 "Nupp" -icon info -message "Nupp=" -detail "::screenwidth=$::scrwidthn::screenheight=$::scrheight" -parent .
 if {$img == "exit"} {
	set answer [tk_dialog .dialog2 "Töö lõpetamine" "Kas soovite tõesti lahkuda?" question 0 "Jah" "Ei" ]
	if {$answer == 0} {
 	 exit
	}	
 }
}

proc page_titul {fr logo_manufacturer} {
 global mydir
# Loome kanga kogu ekraanile
 tkp::canvas $fr.can -borderwidth 0 -height [winfo screenheight .] -width [winfo screenwidth .] -relief flat
# Laadime kanga plaadiga 
 createtile "$fr.can" "tileand"
 pack $fr.can -anchor center -expand 1 -fill both -side top -padx 0 -pady 0
# Arvutame koordinaadid tootja logole
#update, et värskendaks andmeid andmebaasis akende kohta
 update
# set aa [winfo height $fr.labtitul]
 set aa $::padly
# Keskendame arendaja logo
 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 "Elektrooniline allkiri" -fill black -font {{Roboto Condensed Medium} 15 }
	$fr.can create text $dlx [expr {$wexit + $::padly}] -anchor nw -text "Elektrooniline allkiri" -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 "Androidi platvormile" -fill black -font {{Roboto Condensed Medium} 13}
	$fr.can create text $dlx [expr {$wexit + $::padly - 80}] -anchor nw -text "Androidi platvormile" -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 "Elektroonilise allkirja seadus 6. aprillist 2011"" -fill black -font {{Roboto} 10}
	$fr.can create text $dlx [expr {$wexit + $::padly - 50}] -anchor nw -text "№ 63 FZ "Elektroonilise allkirja seadus 6. aprillist 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 "Autorid: 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 "Autorid: 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 "Elektrooniline allkiri" -fill black -font {{Nimbus Sans Narrow} 20}
	$fr.can create text $::padlx [expr {$wexit + $::padly}] -anchor nw -text "Elektrooniline allkiri" -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 "Androidi platvormile" -fill black -font {{Nimbus Sans Narrow} 18}
	$fr.can create text $::padlx [expr {$wexit + $::padly - 20}] -anchor nw -text "Androidi platvormile" -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 "Elektroonilise allkirja seadus 6. aprillist 2011"" -fill black -font {{Nimbus Sans Narrow} 14}
	$fr.can create text $::padlx [expr {$wexit + $::padly}] -anchor nw -text "№ 63 FZ "Elektroonilise allkirja seadus 6. aprillist 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 "Autorid: 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 "Autorid: 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"}
# Prindime tekst
 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 "Arendaja veebisait" -fill black -font {{Arial} 10 normal}] 
# Keskendame teksti
 set btxt1 [$fr.can bbox $txt1]
# Y-teljel nihke määramine
 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-teljel nihke määramine
 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"]
# Prindime tekst
 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 "Ülemine menüü" -fill black -font {{Roboto Condensed Medium} 12}] 
# Keskendame teksti
 set btxt1 [$fr.can bbox $txt1]
# Y-teljel nihke määramine
 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-teljel nihke määramine
 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 "Töö lõpetamine" -fill black -font {Arial 10 normal}]
 $fr.can bind $txt1  {butImg "exit"}
 set btxt1 [$fr.can bbox $txt1]
# Y-teljel nihke määramine
 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-teljel nihke määramine
 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
}
# Tegelik skript
# Loeme ekraani suurused
set ::scrwidth [winfo screenwidth .]
set ::scrheight [winfo screenheight .]
set ::typetlf 0
# Kontrollime, kas see on 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
# Tootja logo
	scaleImage logo_orel 2
# Toote logo
	scaleImage logo_product 2
# Android tcl/tk
	scaleImage logo_and 3
# Sulgemine pitseeritud
	scaleImage svitok 4
	set ::padls 50
	set ::padlx 75
	set ::padly 50
} else {
# Konfigureerimine nutitelefoni jaoks
 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
}
# Loome toote nime
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
# Loome stardilehe
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

Käesoleva skripti täitmiseks kasutame ühte utiliidist undroidwish või vanillawish:

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

või

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

Tulemus on esitatud esimesel ekraanipildil.

Teisel lehel loetletakse utiliidi cryptoarmpkcs-A toetatud funktsionaalsus. Iga rida on nupp, millele klõpsamine kuvab funktsionaalse lehe. Nuppude geomeetria sellel lehel määratakse kasutatava fondiga. Allpool on esitatud skript create_page_functions.tcl, et luua teine/funktsionaalne rakenduse leht. Igaüks võib seda ka oma funktsioonide jaoks redigeerida.

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 

See skript valmistab samuti ette šabloonid iga funktsionaalse nupu jaoks:

Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormil

Šabloonide täitmine toimub klassikaliste ja teemade widget'ide (labelframe, nupp jne). Üht sellist täidetud šablooni võib näha esimesel ekraanipildil paremal. Kuna esimesel etapil keskendusime PKCS#12 konteineriga töötamisele, siis koodi kasutati sisuliselt muutumatuna ka cryptoarmpkcs-A jaoks. Sellel etapil on rakendatud järgmised funktsioonid:

  • dokumendi allkirjastamine (Cades-BES, CAdes-T, CAdes-XLT1);
  • töötame EAllkirjadega (PKCS7), sealhulgas allkirjastaja lisamine;
  • sertifikaatide/sertifikaaditaotluste vaatamine:

    Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormil

  • töötame PKCS12/PFX-ga;
  • utiliidi/jaotiste kohta:

    Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormil

Ülejäänud funktsioonid seondub rohkem PKCS#11 tokenitega. Nende portimine on edasi lükatud uue aasta peale. Plaanis on tarkvara tokeni ja ühendamine tokenite pilvega.

Funktsionaalsuse poolest on praktiliselt kõik võrreldav utiliidiga cryptoarmpkcs. Kuid on ka teatud erinevusi. Näiteks, pärast dokumendi allkirjastamist küsib utiliit, kas allkirja kontrollitakse e-teenuste lehelt:

Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormil
Nupu "Jah" vajutamisel avatakse brauseriaken dokumendi ja sertifikaatide allkirja kontrollimise lehega. Tuleb kohe märkida, et see leht pole mobiilse ekraani jaoks kuigi sobiv. Seda on selgelt märgata allkirja valimisel ja juhul, kui allkiri on lahutatud, siis dokumendi failiga. Kui kõik on hästi, siis saame positiivse tulemuse:

Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormil

Tuleb meeles pidada, et allkirjade ja sertifikaatide kontrollimine e-teenuste lehelt on mõttekas ainult siis, kui sertifikaat on saadud akrediteeritud tunnustamiscentrumis (UC). Kui ei, jääb allkiri alati kehtetuks.

Brauseri väljakutsumiseks pidin avatud URL protseduurile lisama paar rida:

proc openURL {url} {
  global typesys
  global macos
  #  global windowsOS
#kontroll, et utiliit töötab Androidi nutitelefonil
  if {$::typetlf} {
#Brauseri käivitamine
 	borg activity android.intent.action.VIEW $url text/html
 	return
  }
. . .
}

Brauser Androidis käivitatakse järgmiselt:

borg activity android.intent.action.VIEW  text/html

Uue allkirjastaja lisamisel varakult allkirjastatud dokumendile on väike eripära. Toetava allkirjastaja sertifikaat (täpsemalt PKCS#12 konteiner sertifikaadi ja privaatvõtmega) peab olema eelnevalt valitud lehelt «Dokumendi allkirjastamine» või «Töötame PKCS12/PFX»; utiliit tuletab seda meelde:

Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormil
Pikemate operatsioonide ajal käivad nagu varem tunnid:

Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormil
Jääb veel öelda, kust allalaadida distributsioonid ja soovida kõigile head uut aastat ning kõike paremat 2020. aastaks!

Krüptograafiline ARM avatud võtme standardite alusel Androidi platvormilNii et distributsioonid Linuxile, OS X-ile, Windowsile ja Androidile:

Allikas: habr.com

Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid 🔥 Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster