Rem Autor: @@Jan Klečka@@
Rem ------------------------------------------------------------------
'~ Terminál zde představuje roli klienta, který se ověřuje vůči kartě.
'~ V Bc práci reprezentováno pod obr 6.3.
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$
Public PublicKeyTerminalu$
private e$
private Kr1$
private IDg1$ ="88-00-29"


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

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


Call GetDateTime(Zacatek)

Rem Generovani klice terminalu
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$)

 If PublicKarta$ ="" then 
 print "Neni mozne dostat verejny klic karty, musi byt spusteno term.zct pro inicializaci karty"
 exit
 end if
Rem Vypocitani Klice pro AES pro terminal
Call GetDateTime(Zacatek)
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"

Key(1) = Mid$(PublicKarta$,1,32)

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

call Vypocitej_Kr1 ()
Private Kre$

Rem Ziskani hodnot e,Kr1 z karty
Call GetDateTime (Zacatek)
call ProEncryption (P2=1,Rnd,Rnd)
call PredejKr(Kre$)
Call EndEncryption() : Call CheckSW1SW2()
call GetDateTime(Konec)
Interval = TimeInterval (Zacatek, Konec)
Print "AES OK, prenos e,Kr1" ;:  Print 0.001 * Interval ; : Print "vterin"

Kr1$= Left$(Kre$,32)
e$ = Right$(Kre$,32)
Rem Serie hashovani až po hodnotu R1
private R1_ID_G1$

Call GetDateTime (Zacatek)
call Sha256Start()
call Sha256Append (Kr1$)
call Sha256Append (IDg1$)
R1_ID_G1$ = Sha256End()


call Sha256Start()
call Sha256Append(R1_ID_G1$)
call Sha256Append(e$)
R1$ = Sha256End()
R1$ = R1$ + IDg1$
call GetDateTime(Konec)
Interval = TimeInterval (Zacatek, Konec)


Rem Predani hodnot R1,IDg1 karte, kdyby bylo ruzne R1 a R2 tak by neprisel SW1SW2 od karty ve forme 90 00
call GetDateTime(Zacatek)
call ProEncryption (P2=1,Rnd,Rnd)

Call GetDateTime (Zacatek)
 VypocitejR2(R1$)

if SW1 <> 90 AND SW2 <> 00 then
Print "-----------------------------------------------------" 
Print "----Hodnoty R1 a R2 na karte nejsou totozne----------"
Print "-----------------------------------------------------"
Print "-------------Zastavuji Program-----------------------"
Print "-----------------------------------------------------"
 exit 
end if

call GetDateTime(Konec)
Interval = TimeInterval (Zacatek, Konec)
Print "Hodnota R2 vypocitana na karte za" ;:  Print 0.001 * Interval ; : Print "vterin"

Call EndEncryption() : Call CheckSW1SW2()
call GetDateTime(Konec)
Interval = TimeInterval (Zacatek, Konec)
Print "AES OK, Druhe Sifrovani pro prenos dat ke karte" ;:  Print 0.001 * Interval ; : Print "vterin"

Rem Prohledavani souboru
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 "-----------------------------------------------------"
Print "--------------------IDG1 nenalezeno------------------"
Print "-----------------------------------------------------"
exit
end if

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








