Rem Autor: @@Jan Klečka@@
Rem ------------------------------------------------------------------
'~ Terminálový program, sloužící k testování realizovaného protokolu.
'~ Z tohoto terminálového programu jsou volané všechny funkce, které vykonává jak karta tak i terminál.
'~ Nad každým blokem kódu, vykonávající určitou část protokolu je krátký popis.
'~ V Bc práci najdeme tento princip pod obr 6.2.
Rem ------------------------------------------------------------------
Option Explicit

#include Card.def
#include Funkce.def
#include Componnt.def
#include SHA.def
#include TLV.DEF
#include COMMERR.DEF
#Include ECTERM.DEF
#INCLUDE commands.def


ResetCard : Call CheckSW1SW2()
Private PublicKarta$
Private PrivateKeyTerminalu$
Private R1$
Private R2$

Public PublicKeyTerminalu$

private K_R1vyzva$
private ID_R1$
EEPROM K_R1$

Private Zacatek As DateTime, Konec As DateTime, Interval As Long

call GetDateTime(Zacatek)
Static Curve As Integer
Rem Nastaveni EC
call GetCurveIndex (Curve) : Call CheckSW1SW2()
call ECpSetCurve (Curve) : call CheckSW1SW2()

Rem Generovani klicu Terminalu
Call GetDateTime(Zacatek)
call GenerujObaKlice(PrivateKeyTerminalu$,PublicKeyTerminalu$)
call GetDateTime(Konec)
Interval = TimeInterval (Zacatek, Konec)
Print "Generuji Soukromy a verejny klic terminalu";:Print 0.001 * Interval ;: Print "vterin"

Rem Ziskani Verejneho Klice karty
call DostanVerejnyKlic(PublicKarta$)
Call GetDateTime(Zacatek)

 If PublicKarta$ ="" then 
 print "Neni mozno dostat verejny klic karty, musi byt spusteno term.zct pro inicializaci karty"
 exit
 end if

Rem Vypocitani AES klice
call EcpMultiplyPoint(PublicKarta$,PrivateKeyTerminalu$)
call GetDateTime(Konec)
Interval = TimeInterval(Zacatek,Konec)
Print "Doba pro EcpMultiplyPoint na vypocitani AES klice terminalu" ;:Print 0.001 * Interval ;: Print "vterin"
Rem Vezme se prvnich 256 bitu z retezce a pouzije jako AES klic.
Key(1) = Mid$(PublicKarta$,1,32)

Call GetDateTime (Zacatek)
call VytVorKlicProSifru (PublicKeyTerminalu$)
call GetDateTime(Konec)
Interval = TimeInterval (Zacatek, Konec)
Print "Vytvareni AES klice na karte za cas:" ;:Print 0.001 * Interval ;: Print "vterin"

Rem "Pocitam Hodnotu KR1 pro terminal"
Private K_CS$ 
ID_R1$ = GenerujID_R1 ()
K_CS$ = GenerujK_CS () 

call Sha256Start ()
call Sha256Append (ID_R1$)
call Sha256Append (K_CS$)
K_R1$ = Sha256End ()
private e$
e$ = Vyzva ()
K_R1vyzva$ = K_R1$+  e$


 
Rem "Pocitam hodnotu KR1_ID_G1 na karte"
Call GetDateTime (Zacatek)
call ProEncryption (P2=1,Rnd,Rnd)
call GetDateTime (Zacatek)
call VypocitejKR1_ID_G1 (K_R1vyzva$)
call GetDateTime (Konec)
Interval = TimeInterval (Zacatek, Konec)
Print "Doba vypocitani hodnoty R na karte" ; :  Print 0.001 * Interval ; : Print "vterin"
Call PredejR(R1$)



 Call EndEncryption() : Call CheckSW1SW2()
 call GetDateTime(Konec)
 Interval = TimeInterval (Zacatek, Konec)
Print "AES OK"; :Print "prenos dat a vypocet KR1_ID_G1 trval:" ; :  Print 0.001 * Interval ; : Print "vterin"



Rem vypocet zda sedi R1 a R2
Private IDg1$
call GetDateTime (Zacatek)
IDg1$= Right$(R1$,8)
R1$ = Left$(R1$,32)

private meziHash$
call Sha256Start()
call Sha256Append (K_R1$)
call Sha256Append (IDg1$)

 meziHash$ = Sha256End()
call Sha256Start()
call Sha256Append(meziHash$)
call Sha256Append(e$)
R2$ = Sha256End()
call GetDateTime (Konec)
 Interval = TimeInterval (Zacatek, Konec)


If R1$ <> R2$  Then
  Print "Hodnoty R1 a R2 se neshoduji"
   Exit
  else 
    
  print "-----------------------------------------------------"
  Print "----------Hash Terminalu a karty se shoduje----------"
  print "-----------------------------------------------------"

End If

Rem Cteni ze souboru, nastaveni prav aby prave jeden program mohl mit otevreny soubor pro cteni.
private Soubor$
Open "C:\Users\Gaming\Desktop\ZaznamTagu.txt" For Input Access Read Lock Read As #1 

Line Input #1,Soubor$

If Soubor$ = IDg1$ then
call Beep(10,500)
Print "-----------------------------------------------------"
Print "------------Autentizace probehla uspesne-------------"
Print "-----------------------------------------------------"
else 
Print "-----------------------------------------------------"
Print "-----------Autentizace probehla neuspesne------------"
Print "-----------------------------------------------------"
exit
end if

call GetDateTime(Konec)
Interval = TimeInterval(Zacatek,Konec)
Print "Celkova doba programu v terminalu je:" ; :  Print 0.001 * Interval ; : Print "vterin"








