Rem @@Autor: Jan Klečka@@
Rem ------------------------------------------------------------------
Rem Soubor Card.Bas je zdrojový soubor který byl implementován na kartu.
Rem Obsahuje jednotlivé příkazy, které jsou volané z terminálu a na kartě jsou zpracované a počítány.
Rem pomocí těchto příkazu, jsou generovány hodnoty na kartě potřebné potřebné pro běh protokolu.
Rem Karta zde představuje stranu klienta, který se ověřuje vůči terminálu.

Rem Jsou zde příkazy na:
Rem   Generování klíčů: Command &H88 &H01 GenerujKlice()
Rem   Ziskej Veřejný klíč terminálu: Command &H88 &H03 DostanVerejnyKlic (PublicKey$) 
Rem   Vytváření AES klíče: Command &H88 &H06 VytVorKlicProSifru(PublicTerminalu$)
Rem   Výpočet hodnoty KR1_ID_G1: Command &H88 &H08 VypocitejKR1_ID_G1(HashTerminalu$)

Rem ------------------------------------------------------------------
Option Explicit

#Include COMMANDS.DEF
#Include ECCARD.DEF
#include MISC.DEF
#include SHA.DEF
#include TLV.DEF
#Include Card.def
#include EC-p.def
#include Funkce.def

Declare Key 1(16) 


EEPROM Kr1_ID_G1$
EEPROM R$

EEPROM prk$
EEPROM pubk$

EEPROM pubkTerm$
Private e$

Const UsedCurveIndex=7
call ECpSetCurve (UsedCurveIndex)

Command &H20 &H00 GetCurveIndex (CurveIndex As Integer)
  CurveIndex = UsedCurveIndex
End command


Command &H88 &H01 GenerujKlice()
call GenerujObaKlice(prk$,pubk$)
If LibError <> 0 Then SW1SW2 = LibError : LibError = 0 : exit command
end command

Command &H88 &H03 DostanVerejnyKlic (PublicKey$) 
PublicKey$ = pubk$
If LibError <> 0 Then SW1SW2 = LibError : LibError = 0 : exit command
end command

Command &H88 &H06 VytVorKlicProSifru(PublicTerminalu$)
private temp$
private klicKarta$
private KlicTerminal$
klicKarta$ = prk$
KlicTerminal$ = PublicTerminalu$
call EcpMultiplyPoint(KlicTerminal$,klicKarta$)
temp$  = Mid$(KlicTerminal$,1,32)
Key(1) = temp$
If LibError <> 0 Then SW1SW2 = LibError : LibError = 0 : exit command
end command

Command &H88 &H07 ZiskejPublicTerminalu (PublicTerminalu2$)
 PublicTerminalu2$= pubkTerm$
 If LibError <> 0 Then SW1SW2 = LibError : LibError = 0 : exit command
end command

Command &H88 &H08 VypocitejKR1_ID_G1(HashTerminalu$)

Private vyzva$
private temp$
private ID_G1$
ID_G1$ = "88-00-29"

temp$ = HashTerminalu$
HashTerminalu$ = Left$(HashTerminalu$,32)
vyzva$ = Right$(temp$,32)

Private Hash$
Call Sha256Start(Hash$)
call Sha256Append (Hash$,HashTerminalu$)
call Sha256Append (Hash$,ID_G1$)
Kr1_ID_G1$ = Sha256End (Hash$)

Private HashBuff$
call Sha256Start(HashBuff$)
call Sha256Append(HashBuff$,Kr1_ID_G1$)
call Sha256Append (HashBuff$,vyzva$)
R$ = Sha256End(HashBuff$) 
R$ = R$ + ID_G1$
end command



Command &H88 &H10 PredejR (Data$)
Data$ =  R$
If LibError <> 0 Then SW1SW2 = LibError : LibError = 0 : exit command
End Command







