ARM crittografico basato su standard di chiave pubblica per la piattaforma Android

ARM crittografico basato su standard di chiave pubblica per la piattaforma AndroidÈ giunto il momento di dimostrare come il cryptoarmpkcs basato su standard a chiave pubblica cryptoarmpkcs funzioni su una delle piattaforme mobili, ovvero Android.

Il concetto alla base dello sviluppo dell'utilità cryptoarmpkcs è che l'utente deve affrontare il minor numero possibile di inconvenienti nella creazione e verifica della firma elettronica. Per questo motivo, proponiamo di utilizzare i token crittografici come supporto principale per il certificato personale. PKCS#11 e/o contenitori protetti PKCS#12. Va detto che l'uso di PKCS#12 risulta spesso essere quasi l'unica possibilità, ad esempio, quando i token PKCS#11 non sono supportati su alcune piattaforme. E così abbiamo deciso di iniziare il porting dell'utilità cryptoarmpkcs sulla piattaforma Android partendo dal supporto per i contenitori protetti PKCS#12.

Segnaliamo subito che poiché il progetto è stato sviluppato sulle piattaforme C e Tcl/Tk, il porting non ha presentato difficoltà significative. Questo è stato possibile anche grazie alla tecnologia Androwish. Con il dispiegamento e la configurazione dell'ambiente non ci sono stati problemi (il mio ambiente di lavoro è Linux — Mageia-7.0). Ecco solo uno script per l'installazione degli 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"  

La cosa più interessante è che nell'ambiente Androwish ci sono due interpreti undrowish-xxx e vanillawish-xxx, completamente identici per quanto riguarda i "Balalaika" (pacchetti) che compongono, appunto, Androwish. La differenza tra undrowish e vanillawish sta nel fatto che vanillawish ha un backend basato su SDL / AGG / freetype:

ARM crittografico basato su standard di chiave pubblica per la piattaforma Android

La presenza di questi due strumenti consente di sviluppare applicazioni senza utilizzare Android e il suo emulatore, avvicinandosi il più possibile a un dispositivo reale. In primo luogo, questo è ovviamente undroidwish-xxx.

Il pacchetto utente per Android viene creato nell'ambiente AWSDK. L'albero del tuo progetto deve essere spostato nella cartella ~/AWSDK/assets/app. In questo caso, il modulo principale del tuo progetto deve essere rinominato in main.tcl. Se utilizzi ulteriori Balalaika con librerie dinamiche, dovrai posizionare le librerie nelle cartelle ~/AWSDK/libs/x86 per l'emulatore e ~/AWSDK/libs/armeabi per il dispositivo reale.

Dopo di che, basta eseguire il comando:

$wish ~/AWSDK/tools/bones

e seguire le istruzioni:

ARM crittografico basato su standard di chiave pubblica per la piattaforma Android

Il pacchetto apk generato sarà salvato nella cartella ~/AWSDK/build/outputs/apk.

Se hai connesso un dispositivo reale o un emulatore, il pacchetto può essere installato immediatamente.
Tuttavia, il dispositivo reale deve essere in modalità debug.

Torniamo all'applicazione. Cosa è cambiato al suo interno?

Ovviamente, in primo luogo le modifiche riguardano le dimensioni dello schermo. È stato necessario riprogettare la finestra principale (schermata di avvio). Così, invece di una finestra su un computer normale:

ARM crittografico basato su standard di chiave pubblica per la piattaforma Android

Sono apparse tre finestre su Android:

ARM crittografico basato su standard di chiave pubblica per la piattaforma Android

La prima finestra è informativa. Condizionalmente è suddivisa in più parti. La parte superiore contiene il nome dell'utilità e il suo logo.

Segue il logo del produttore, le informazioni di supporto e si conclude la pagina con tre pulsanti.
La pagina è scritta utilizzando il componente canvas. Sulla pagina vengono utilizzati due tipi di pulsanti: uno a forma di rettangolo semitrasparente (centrale) e gli altri due a forma di rettangolo con angoli arrotondati. Per creare pulsanti con angoli arrotondati è stato utilizzato il "balalaika" tkpath. Personalmente, questo strumento mi ha fatto una ottima impressione. Naturalmente, durante il lavoro con il canvas, la maggior parte del codice è dedicata alla geometria. Di seguito viene fornito lo script create_titul_page.tcl per creare la prima pagina dell'applicazione. Chiunque può modificarlo secondo la propria visione.

Lo script create_titul_page.tcl

package require Tk
package require tkpath 0.3.0

global mydir
set mydir [file dirname [info script]]
# Carichiamo le immagini
# Logo del prodotto
image create photo logo_product -file [file join $mydir "imageme" "validcertkey_51x24.png"] 
# Logo del produttore
image create photo logo_orel -file [file join $mydir "imageme" "я_орел_425x200.png"] -format "png -alpha 1.0"
# Android con tcl/tk
image create photo logo_and -file [file join $mydir "imageme" "AndTk_inv_147x173.png"] -format "png -alpha 1.0"
# Rotolo sigillato
image create photo svitok -file [file join $mydir "imageme" "blue_svitok.png"] -format "png -alpha 1.0"
# Piastrelle
image create photo tileand -file [file join $mydir "imageme" "tile_green_and_32x32.png"] -format "png -alpha 1.0"
# Ingrandire / ridurre (valore negativo - riduzione)
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
# Creiamo la tela
 $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 ]
# Creiamo un rettangolo colorato
 $img put $fill -to 0 0 [expr {$x2 - $x1}] [expr {$y2 -$y1}]
# Salviamo l'immagine
 set dimg [$img data -format png]
# Creiamo l'immagine tenendo conto del canale alpha
 image create photo $img -data $dimg -format "png -alpha $alfa"
# $img put [list $rgb1] -to 0 0 [expr {$x2 - $x1}] [expr {$y2 - $y1}]
# Visualizziamo il rettangolo colorato
 set imgr [$canv create image $x1 $y1 -image $img -anchor nw] 
 set cc [subst {butImg $img}]
 $canv bind $imgr  $cc
# Cornice attorno al rettangolo colorato
 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 "Pulsante" -icon info -message "Hai premuto il pulsante=$img" -detail "::screenwidth=$::scrwidthn::screenheight=$::scrheight" -parent .
 if {$img == "exit"} {
	set answer [tk_dialog .dialog2 "Fine del lavoro" "Vuoi davvero uscire?" question 0 "Sì" "No" ]
	if {$answer == 0} {
 	 exit
	}	
 }
}

proc page_titul {fr logo_manufacturer} {
 global mydir
# Creiamo una tela a schermo intero
 tkp::canvas $fr.can -borderwidth 0 -height [winfo screenheight .] -width [winfo screenwidth .] -relief flat
# Creiamo la tela con piastrelle 
 createtile "$fr.can" "tileand"
 pack $fr.can -anchor center -expand 1 -fill both -side top -padx 0 -pady 0
# Calcoliamo le coordinate per il logo del produttore
#update per aggiornare le informazioni nel DB sulle finestre
 update
# set aa [winfo height $fr.labtitul]
 set aa $::padly
# Centriamo il logo dello sviluppatore
 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 "Firma elettronica" -fill black -font {{Roboto Condensed Medium} 15 }
	$fr.can create text $dlx [expr {$wexit + $::padly}] -anchor nw -text "Firma elettronica" -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 "per la piattaforma Android" -fill black -font {{Roboto Condensed Medium} 13}
	$fr.can create text $dlx [expr {$wexit + $::padly - 80}] -anchor nw -text "per la piattaforma 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 FZ "Sulla firma elettronica del 6 aprile 2011"" -fill black -font {{Roboto} 10}
	$fr.can create text $dlx [expr {$wexit + $::padly - 50}] -anchor nw -text "№ 63 FZ "Sulla firma elettronica del 6 aprile 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. 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 "Autori: 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 "Firma elettronica" -fill black -font {{Nimbus Sans Narrow} 20}
	$fr.can create text $::padlx [expr {$wexit + $::padly}] -anchor nw -text "Firma elettronica" -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 "per la piattaforma Android" -fill black -font {{Nimbus Sans Narrow} 18}
	$fr.can create text $::padlx [expr {$wexit + $::padly - 20}] -anchor nw -text "per la piattaforma 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 FZ "Sulla firma elettronica del 6 aprile 2011"" -fill black -font {{Nimbus Sans Narrow} 14}
	$fr.can create text $::padlx [expr {$wexit + $::padly}] -anchor nw -text "№ 63 FZ "Sulla firma elettronica del 6 aprile 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. 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 "Autori: 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"}
# Stampiamo il testo
 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 "Sito dello sviluppatore" -fill black -font {{Arial} 10 normal}] 
# Centriamo il testo
 set btxt1 [$fr.can bbox $txt1]
# Spostamento lungo l'asse 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)}]
# Spostamento lungo l'asse 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"]
# Stampiamo il testo
 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 "Passa al menu principale" -fill black -font {{Roboto Condensed Medium} 12}] 
# Centriamo il testo
 set btxt1 [$fr.can bbox $txt1]
# Spostamento lungo l'asse 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)}]
# Spostamento lungo l'asse 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 "Fine del lavoro" -fill black -font {Arial 10 normal}]
 $fr.can bind $txt1  {butImg "exit"}
 set btxt1 [$fr.can bbox $txt1]
# Spostamento lungo l'asse 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)}]
# Spostamento lungo l'asse 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
}
# Script principale
# Leggiamo le dimensioni dello schermo
set ::scrwidth [winfo screenwidth .]
set ::scrheight [winfo screenheight .]
set ::typetlf 0
# Verifichiamo se si tratta di un telefono
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 del produttore
	scaleImage logo_orel 2
# Logo del prodotto
	scaleImage logo_product 2
# Android tcl/tk
	scaleImage logo_and 3
# Rotolo sigillato
	scaleImage svitok 4
	set ::padls 50
	set ::padlx 75
	set ::padly 50
} else {
# Configurazione del widget per 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
}
# Creiamo il nome del prodotto
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
# Creiamo la pagina di avvio
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

Per eseguire questo script, utilizziamo uno degli strumenti undroidwish o vanillawish:

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

o

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

Il risultato è presentato nella prima schermata.

Nella seconda pagina sono elencate le funzionalità supportate dallo strumento cryptoarmpkcs-A. Ogni riga è un pulsante, che, se premuto, mostrerà la pagina delle funzionalità. La geometria della disposizione dei pulsanti su questa pagina è determinata dal font utilizzato. Di seguito è riportato lo script create_page_functions.tcl per creare la seconda pagina/funzionale dell'applicazione. Chiunque può anche modificarlo per le proprie funzioni.

Lo script 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 

Questo script prepara anche dei template per ogni pulsante funzionale:

ARM crittografico basato su standard di chiave pubblica per la piattaforma Android

Il riempimento dei template avviene tramite widget classici e tematici (labelframe, button, ecc.). Uno di questi template riempiti può essere visto nella prima schermata a destra. Poiché nella prima fase ci siamo concentrati sul lavoro con il contenitore PKCS#12, il codice è stato utilizzato praticamente senza modifiche anche per cryptoarmpkcs-A. In questa fase sono state implementate le seguenti funzionalità:

  • firmare il documento (Cades-BES, CAdes-T, CAdes-XLT1);
  • lavoriamo con la firma elettronica (PKCS7), inclusa l'aggiunta di firmatari;
  • visualizzazione dei certificati/ richiesta dei certificati:

    ARM crittografico basato su standard di chiave pubblica per la piattaforma Android

  • lavoriamo con PKCS12/PFX;
  • sull'utility/Distribuzioni:

    ARM crittografico basato su standard di chiave pubblica per la piattaforma Android

Le altre funzioni sono più correlate ai token PKCS#11. Il loro porting è rimandato al Nuovo Anno. È previsto il collegamento del token software e la connessione a cloud dei token.

Dal punto di vista funzionale è praticamente tutto analogo all'utility cryptoarmpkcs. Ma ci sono alcune differenze. Ad esempio, dopo aver firmato il documento, l'utility chiede se la firma sarà verificata sul sito dei servizi pubblici:

ARM crittografico basato su standard di chiave pubblica per la piattaforma Android
Facendo clic sul pulsante «Sì», si aprirà il browser con la pagina di verifica delle firme dei documenti e dei certificati. Precisiamo subito che questa pagina non è molto ottimizzata per la visualizzazione su smartphone. Questo sarà evidente quando si seleziona la firma e, se la firma è staccata, il file con il documento. Ma se tutto va bene, otterremo un risultato positivo:

ARM crittografico basato su standard di chiave pubblica per la piattaforma Android

Si deve tenere presente che la verifica sia della firma che del certificato sul sito dei servizi pubblici ha senso solo se il certificato è stato ottenuto in un centro di certificazione accreditato (CC). In caso contrario, la firma sarà sempre non valida.

Per richiamare il browser, è stato necessario aggiungere alcune righe nella procedura openUrl:

proc openURL {url} {
  global typesys
  global macos
  #  global windowsOS
#controlla che l'utilità venga eseguita su uno smartphone Android
  if {$::typetlf} {
#Avvio del browser
 	borg activity android.intent.action.VIEW $url text/html
 	return
  }
. . .
}

Il browser su Android viene richiamato nel seguente modo:

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

C'è una piccola particolarità nell'aggiungere un nuovo firmatario a un documento già firmato. Il certificato del nuovo firmatario (o meglio, il contenitore PKCS#12 con il certificato e la chiave privata) deve essere selezionato in anticipo nella pagina "Firma documento" o "Lavorare con PKCS12/PFX", come ricorderà l'utilità:

ARM crittografico basato su standard di chiave pubblica per la piattaforma Android
Durante operazioni prolungate, come in precedenza, scorreranno le ore:

ARM crittografico basato su standard di chiave pubblica per la piattaforma Android
Rimane da dire da dove scaricare i distributivi e augurare Buon Anno Nuovo e tutto il meglio per il 2020!

ARM crittografico basato su standard di chiave pubblica per la piattaforma AndroidQuindi, i distributivi per Linux, OS X, Windows e Android:

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster