ARM kriptografik në bazë të standardeve me çelës të hapur për platformën Android

ARM kriptografik në bazë të standardeve me çelës të hapur për platformën AndroidKa ardhur koha të demonstrohet se si funksionon ARM kriptografik i bazuar në standardet me çelës të hapur cryptoarmpkcs në një nga platformat mobile, konkretisht Android.

Koncepti që u vendos gjatë zhvillimit të utilitarit cryptoarmpkcs është që përdoruesi duhet të përjetojë sa më pak shqetësime në krijimin dhe verifikimin e nënshkrimit elektronik. Prandaj, ne sugjerojmë që si mbajtës kyç për certificatat personale të përdoren tokenët kriptografikë PKCS#11 dhe/ose kontejnerë të sigurt PKCS#12. Duhet thënë se përdorimi i PKCS#12 në shumë raste rezulton të jetë gati unik, për shembull, kur tokenët PKCS#11 nuk përkrahin disa platforma. Prandaj, ne vendosëm të fillojmë portimin e utilitarit cryptoarmpkcs në platformën Android me mbështetje për kontejnerët e sigurt PKCS#12.

Menjëherë duhet theksuar se, pasi projekti u realizua në platformën C dhe Tcl/Tk, portimi nuk shkaktoi ndonjë vështirësi thelbësore. Kjo u mundësua gjithashtu nga teknologjia Androwish. Me shpërndarjen dhe konfigurimin e ambientit nuk ka pasur probleme (mjedisi im punues është Linux — Mageia-7.0). Do të jap vetëm një skriptë për të instaluar 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"  

Ajo që është më e shkëlqyer është se në mjedisin Androwish ndodhen dy interpretuese undrowish-xxx dhe vanillawish-xxx që janë plotësisht identike në përbërjen e «balalaikëve» (paketave) që përbëjnë vetë Androwish. Dallimi midis undrowish dhe vanillawish është se në vanillawish backend-i bazohet në SDL / AGG / freetype:

ARM kriptografik në bazë të standardeve me çelës të hapur për platformën Android

Prania e këtyre dy mjeteve lejon zhvillimin e aplikacioneve pa përdorur Android-in dhe emulatorin e tij, me maksimal afrim ndaj një pajisjeje reale. Në radhë të parë, kjo është, sigurisht, undroidwish-xxx.

Pakoja përdoruese për Android ndërtohet në mjedisin AWSDK. Struktura e projektit tuaj duhet të transferohet në dosjen ~/AWSDK/assets/app. Në këtë rast, moduli kryesor i projektit tuaj duhet të rinomemohet si main.tcl. Nëse përdorni balalaika shtesë me biblioteka dinamike, bibliotekat duhet të vendosen në dosjet ~/AWSDK/libs/x86 për emulatorin dhe ~/AWSDK/libs/armeabi për pajisjen reale.

Pas kësaj, është e mjaftueshme të ekzekutoni komandën:

$wish ~/AWSDK/tools/bones

dhe të ndiqni udhëzimet e saj:

ARM kriptografik në bazë të standardeve me çelës të hapur për platformën Android

Paketa e mbledhur apk do të vendoset në dosjen ~/AWSDK/build/outputs/apk.

Nëse keni lidhur një pajisje reale ose emulator, atëherë paketa mund të instalohet menjëherë.
Në këtë rast, pajisja reale duhet të jetë në modalitetin e depërtimit.

Por le të kthehemi te aplikacioni. Çfarë duhej të ndryshohej në të?

Natyrisht, ndryshimet e para kanë të bëjnë me përmasat e ekranit. Duhej të ri-projektoshim dritaren kryesore (fillestare). Si rezultat, në vend të një dritareje në kompjuter të zakonshëm:

ARM kriptografik në bazë të standardeve me çelës të hapur për platformën Android

Shfaqen tre dritare në Android:

ARM kriptografik në bazë të standardeve me çelës të hapur për platformën Android

Dritarja e parë është informacioni. Ajo ndahen në disa pjesë. Pjesa e parë, që ndodhet lart, përmban emrin e utilitarit dhe logon e tij.

Pastaj vjen logoja e prodhuesit, informacioni ndihmues, dhe përfundon faqen me tre butona.
Faqja është shkruar duke përdorur komponentin canvas. Në faqen përdoren butona të dy llojeve: një në formën e një drejtkëndëshi të gjysmë-transparent (mesatar), ndërsa dy të tjera në formën e një drejtkëndëshi me qoshe të rrumbullakosura. Për të krijuar butonat me qoshe të rrumbullakosura është përdorur «balalaika» tkpath. Kjo balalaika më bëri një përshtypje shumë të mirë. Natyrisht, gjatë punës me kanavacën (canvas), pjesa më e madhe e kodit merret me gjeometrinë. Më poshtë jepet skripti create_titul_page.tcl për krijimin e faqes së parë të aplikacionit. Çdo dëshira mund ta rregullojë atë sipas vizionit të tij.

Skripti create_titul_page.tcl

paket kërko Tk
paket kërko tkpath 0.3.0

global mydir
set mydir [file dirname [info script]]
#Ngarko imazhe
#Logo e produktit
image create photo logo_product -file [file join $mydir "imageme" "validcertkey_51x24.png"] 
#Logo e prodhuesit
image create photo logo_orel -file [file join $mydir "imageme" "я_орел_425x200.png"] -format "png -alpha 1.0"
#Android me tcl/tk
image create photo logo_and -file [file join $mydir "imageme" "AndTk_inv_147x173.png"] -format "png -alpha 1.0"
#Dëngj me vul
image create photo svitok -file [file join $mydir "imageme" "blue_svitok.png"] -format "png -alpha 1.0"
#Plakë
image create photo tileand -file [file join $mydir "imageme" "tile_green_and_32x32.png"] -format "png -alpha 1.0"
#Zmadho/zhbëj (vlera negative - zvogëlim)
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
# Ndërtojmë kanavacën
 $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 ]
#Krijojmë një drejtkëndësh me ngjyrë
 $img put $fill -to 0 0 [expr {$x2 - $x1}] [expr {$y2 -$y1}]
#Ruajmë imazhin
 set dimg [$img data -format png]
#Krijojmë imazhin me llogaritjen e kanalit alpha
 image create photo $img -data $dimg -format "png -alpha $alfa"
# $img put [list $rgb1] -to 0 0 [expr {$x2 - $x1}] [expr {$y2 - $y1}]
#Paraqesim drejtkëndëshin me ngjyrë
 set imgr [$canv create image $x1 $y1 -image $img -anchor nw] 
 set cc [subst {butImg $img}]
 $canv bind $imgr  $cc
#Kornizat rreth drejtkëndëshit me ngjyrë
 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 "Butoni" -icon info -message "Klikuat butonin=$img" -detail "::screenwidth=$::scrwidthn::screenheight=$::scrheight" -parent .
 if {$img == "exit"} {
	set answer [tk_dialog .dialog2 "Mbarimi i punës" "A dëshiron vërtet të dalësh?" question 0 "Po" "Jo" ]
	if {$answer == 0} {
 	 exit
	}	
 }
}

proc page_titul {fr logo_manufacturer} {
 global mydir
#Krijojmë kanavacën për tërë ekranin
 tkp::canvas $fr.can -borderwidth 0 -height [winfo screenheight .] -width [winfo screenwidth .] -relief flat
#Ndërtojmë kanavacën me pllakë 
 createtile "$fr.can" "tileand"
 pack $fr.can -anchor center -expand 1 -fill both -side top -padx 0 -pady 0
#Llogarisim koordinatat për logon e prodhuesit
#update për të rifreskuar informacionin në DB për dritaret
 update
# set aa [winfo height $fr.labtitul]
 set aa $::padly
#Qendrojmë logon e zhvilluesit
 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 "Nënshtresa elektronike" -fill black -font {{Roboto Condensed Medium} 15 }
	$fr.can create text $dlx [expr {$wexit + $::padly}] -anchor nw -text "Nënshtresa elektronike" -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 "për platformën Android" -fill black -font {{Roboto Condensed Medium} 13}
	$fr.can create text $dlx [expr {$wexit + $::padly - 80}] -anchor nw -text "për platformën Android" -fill white -font {{Roboto Condensed Medium} 13} -tag id_text1
	set blogo [$fr.can bbox id_text1]
	set wexit [lindex $blogo 3]
	$fr.can create text [expr $dlx + 3] [expr {$wexit + $::padly + 3 - 50}] -anchor nw -text "№ 63 ФЗ "Për të drejtën e nënshkrimit elektronik" nga 6 prilli 2011" -fill black -font {{Roboto} 10}
	$fr.can create text $dlx [expr {$wexit + $::padly - 50}] -anchor nw -text "№ 63 ФЗ "Për të drejtën e nënshkrimit elektronik" nga 6 prilli 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 "Autori: 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 "Autori: 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 "Nënshtresa elektronike" -fill black -font {{Nimbus Sans Narrow} 20}
	$fr.can create text $::padlx [expr {$wexit + $::padly}] -anchor nw -text "Nënshtresa elektronike" -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 "për platformën Android" -fill black -font {{Nimbus Sans Narrow} 18}
	$fr.can create text $::padlx [expr {$wexit + $::padly - 20}] -anchor nw -text "për platformën Android" -fill white -font {{Nimbus Sans Narrow} 18} -tag id_text1
	set blogo [$fr.can bbox id_text1]
	set wexit [lindex $blogo 3]
	$fr.can create text [expr {$::padlx + 2}] [expr {$wexit + $::padly + 2}] -anchor nw -text "№ 63 ФЗ "Për të drejtën e nënshkrimit elektronik" nga 6 prilli 2011" -fill black -font {{Nimbus Sans Narrow} 14}
	$fr.can create text $::padlx [expr {$wexit + $::padly}] -anchor nw -text "№ 63 ФЗ "Për të drejtën e nënshkrimit elektronik" nga 6 prilli 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 "Autori: 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 "Autori: 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 {$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"}
#Printojmë tekstin
 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 "Faqja e zhvilluesit" -fill black -font {{Arial} 10 normal}] 
#Qendraimi i tekstin
 set btxt1 [$fr.can bbox $txt1]
#Zhvendosja në boshtin Y
 set ty2 [lindex $btxt1 3]
 set ty1 [lindex $btxt1 1]
 set tt [expr {$ty2 - $ty1}]
 set tt [expr {$tt / 2}]
 set offsy [expr {($by1 + $bb) - ($ty1 + $tt)}]
#Zhvendosja në boshtin X
 set tx2 [lindex $btxt1 2]
 set tx1 [lindex $btxt1 0]
 set ttx [expr {$tx2 - $tx1}]
 set ttx [expr {$ttx / 2}]
 set offsx [expr {($bx1 + $bbx) - ($tx1 + $ttx)}]
 $fr.can move $txt1 $offsx $offsy
 $fr.can bind $txt1  {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"]
#Printojmë tekstin
 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 "Kaloni në menun kryesore" -fill black -font {{Roboto Condensed Medium} 12}] 
#Qendraimi i tekstit
 set btxt1 [$fr.can bbox $txt1]
#Zhvendosja në boshtin Y
 set ty2 [lindex $btxt1 3]
 set ty1 [lindex $btxt1 1]
 set tt [expr {$ty2 - $ty1}]
 set tt [expr {$tt / 2}]
 set offsy [expr {($by1 + $bb) - ($ty1 + $tt)}]
#Zhvendosja në boshtin X
 set tx2 [lindex $btxt1 2]
 set tx1 [lindex $btxt1 0]
 set ttx [expr {$tx2 - $tx1}]
 set ttx [expr {$ttx / 2}]
 set offsx [expr {($bx1 + $bbx) - ($tx1 + $ttx)}]
 $fr.can move $txt1 $offsx $offsy
 $fr.can bind $txt1  {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 "Mbarimi i punës" -fill black -font {Arial 10 normal}]
 $fr.can bind $txt1  {butImg "exit"}
 set btxt1 [$fr.can bbox $txt1]
#Zhvendosja në boshtin Y
 set ty2 [lindex $btxt1 3]
 set ty1 [lindex $btxt1 1]
 set tt [expr {$ty2 - $ty1}]
 set tt [expr {$tt / 2}]
 set offsy [expr {($by1 + $bb) - ($ty1 + $tt)}]
#Zhvendosja në boshtin X
 set tx2 [lindex $btxt1 2]
 set tx1 [lindex $btxt1 0]
 set ttx [expr {$tx2 - $tx1}]
 set ttx [expr {$ttx / 2}]
 set offsx [expr {($bx1 + $bbx) - ($tx1 + $ttx)}]
 $fr.can move $txt1 $offsx $offsy
}
#Skripti i vërtetë
#Lexojmë përmasat e ekranit
set ::scrwidth [winfo screenwidth .]
set ::scrheight [winfo screenheight .]
set ::typetlf 0
#Kontrollojmë nëse është 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
#Logo e prodhuesit
	scaleImage logo_orel 2
#Logo e produktit
	scaleImage logo_product 2
#Android tcl/tk
	scaleImage logo_and 3
#Dëngj me vul
	scaleImage svitok 4
	set ::padls 50
	set ::padlx 75
	set ::padly 50
} else {
#Konfigurimi i widgetit për smartphone
 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
}
#Krijojmë emrin e produktit
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
#Krijojmë faqen e fillimit
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

Për të ekzekutuar këtë skript përdorim një nga utilitat undroidwish ose vanillawish:

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

ose

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

Shkëlqimi është paraqitur në screenshot-in e parë.

Në faqen e dytë listohen funksionalitetet e mbështetura nga utilitari cryptoarmpkcs-A. Çdo rresht është një buton, duke klikuar mbi të do të shfaqet faqja funksionale. Gjeometria e vendosjes së butonave në këtë faqe përcaktohet nga fonti që përdoret. Më poshtë jepet skripti create_page_functions.tcl për krijimin e faqes së dytë/funksionale të aplikacionit. Çdo i interesuar gjithashtu mund ta redaktojë atë sipas funksioneve të tij.

Skripti 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 

Ky skript gjithashtu përgatit seksione për secilin buton funksional:

ARM kriptografik në bazë të standardeve me çelës të hapur për platformën Android

Plotesimi i seksioneve bëhet me widgete klasike dhe tematike (labelframe, button etj.). Një nga këto seksione të plota mund të shihet në screenshot-in e parë në të djathtë. Duke qenë se në fazën e parë u përqendruam në punën me containerin PKCS#12, kodi u përdor praktikisht pa ndryshime edhe për cryptoarmpkcs-A. Në këtë fazë janë realizuar funksionet e mëposhtme:

  • nënshkruaj dokumentin (Cades-BES, CAdes-T, CAdes-XLT1);
  • punojmë me EP (PKCS7), duke përfshirë shtimin e nënshkruesit;
  • shikimi i certifikatave/ kërkesave për certifikata:

    ARM kriptografik në bazë të standardeve me çelës të hapur për platformën Android

  • punojmë me PKCS12/PFX;
  • rreth utilitarit/Distribuimeve:

    ARM kriptografik në bazë të standardeve me çelës të hapur për platformën Android

Funksionet e tjera lidhen më së shumti me tokenët PKCS#11. Portimi i tyre është shtyrë për Vitin e Ri. Planifikohet lidhja e tokenit të programit dhe lidhja me reklamën e tokenëve.

Nga këndvështrimi funksional, thuajse gjithçka është e ngjashme me utilitarin cryptoarmpkcs. Por ekzistojnë dallime të veçanta. P.sh., pas nënshkrimit të dokumentit, utilitari pyet nëse nënshkrimi do të verifikohet në faqen e shërbimeve shtetërore:

ARM kriptografik në bazë të standardeve me çelës të hapur për platformën Android
Kur të klikoni butonin "Po", do të hapet një shfletues me faqen e verifikimit të nënshkrimeve të dokumenteve dhe certifikatave. Të theksojmë se kjo faqe nuk është shumë e optimizuar për ekranin e smartfonëve. Kjo do të vihet re gjatë zgjedhjes së nënshkrimit dhe, nëse nënshkrimi është i ndarë, dosjes me dokumentin. Por nëse gjithçka është në rregull, ne do të marrim një rezultat pozitiv:

ARM kriptografik në bazë të standardeve me çelës të hapur për platformën Android

Duhet të kemi parasysh se verifikimi i nënshkrimit, si dhe i certifikatës në faqen e shërbimeve shtetërore ka kuptim vetëm nëse certifikata është marrë në një qendër akredituese (QAC). Në të kundërt, nënshkrimi gjithmonë do të jetë i pavlefshëm.

Për të thirrur shfletuesin, duhej të shtohej disa rreshta në procedurën openUrl:

proc openURL {url} {
  global typesys
  global macos
  #  global windowsOS
#kontrollo që utilita ekzekutohet në smartphone Android
  if {$::typetlf} {
#Startimi i shfletuesit
 	borg activity android.intent.action.VIEW $url text/html
 	return
  }
. . .
}

Shfletuesi në Android thirret si më poshtë:

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

Ka një veçori të vogël kur shtohet një nënshkrues i ri në një dokument të nënshkruar më parë. Certifikata e nënshkruesit të ri (madje edhe konteineri PKCS#12 me certifikatën dhe çelësin privat) duhet të jetë zgjedhur paraprakisht në faqen "Nënshkruaj dokumentin" ose "Puna me PKCS12/PFX", siç do të kujtojë utilita:

ARM kriptografik në bazë të standardeve me çelës të hapur për platformën Android
Në operacione të gjata, siç është e zakonshme, do të kalojnë orë:

ARM kriptografik në bazë të standardeve me çelës të hapur për platformën Android
Dhe tani mbetet të thuhet nga ku të shkarkohen shpërndarjet dhe më pas të përshëndetim Vitin e Ri dhe të urojmë të gjithëve më të mirat në vitin 2020!

ARM kriptografik në bazë të standardeve me çelës të hapur për platformën AndroidJa shpërndarjet për Linux, OS X, Windows dhe Android:

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster