-
Notifications
You must be signed in to change notification settings - Fork 0
/
gera_imagem_sb.py
117 lines (79 loc) · 4.05 KB
/
gera_imagem_sb.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
from daf_virtual_rasp.imagem import ImagemSB
from daf_virtual_rasp.utils.cripto_daf import ChaveCripto, CriptoDAF
import sys
import secrets
import argparse
def gera_imagem_atual():
nome_arquivo = 'imagem_atual.bin'
path_atual = 'daf_virtual_rasp/resources/imagem/sb'
print("Carregando informações da imagem atual armazenada em", path_atual)
imagem_atual = ImagemSB(path_arquivos=path_atual)
versao_sb = imagem_atual.get_versao_SB()
max_dfe_sef = imagem_atual.get_maxdfe()
sb = imagem_atual.get_codigo()
tam_sig_fab = imagem_atual.get_tam_assinatura_ateste()
sig_fab = imagem_atual.get_assinatura_ateste()
tam_sig_sef = imagem_atual.get_tam_assinatura_sef()
sig_sef = imagem_atual.get_assinatura()
firmware = versao_sb + max_dfe_sef + sb
imagem_bin = firmware + tam_sig_fab + sig_fab + tam_sig_sef + sig_sef
print("Salvando binário da imagem em", nome_arquivo)
with open(nome_arquivo, "wb") as arquivo:
arquivo.write(imagem_bin)
return imagem_atual
def gera_imagem_nova(vsb, mxd_sef, priv_key, sef_key):
nome_arquivo = 'imagem_nova.bin'
path_nova = 'daf_virtual_rasp/resources/imagem-nova/sb'
print("Gerando imagem com informações passadas como argumento")
versao_sb = vsb.to_bytes(2, byteorder='big')
max_dfe_sef = mxd_sef.to_bytes(2, byteorder='big')
sb = secrets.token_bytes(2048)
firmware = versao_sb + max_dfe_sef + sb
hash_firmware = CriptoDAF.gera_resumo_SHA256(firmware)
sig_fab = CriptoDAF.gera_assinatura_EC_p384(hash_firmware, priv_key)
tam_sig_fab = len(sig_fab)
hash_sig_fab= CriptoDAF.gera_resumo_SHA256(sig_fab)
sig_sef = CriptoDAF.gera_assinatura_EC_p384(hash_sig_fab, sef_key)
tam_sig_sef = len(sig_sef)
imagem_bin = firmware + tam_sig_fab.to_bytes(2, byteorder='big') + sig_fab + tam_sig_sef.to_bytes(2, byteorder='big') + sig_sef
if(args.debug):
print("Tamanho assinatura ateste =", tam_sig_fab)
print("Tamanho assinatura sef =", tam_sig_sef, '\n')
imagem_nova = ImagemSB(raw_binario=imagem_bin, path_arquivos=path_nova)
print("Salvando binário da imagem em", nome_arquivo)
with open(nome_arquivo, "wb") as arquivo:
arquivo.write(imagem_bin)
return imagem_nova
parser = argparse.ArgumentParser(description='Gerar arquivo binario com "imagem" do firmware do DAF-pi. Caso não seja passado nenhum argumento, gera imagem com firmware atual instalado no daf-pi.')
parser.add_argument('-n', '--novo',action="store_true",
help='Gerar imagem com firmware contendo informações passadas como argumento')
parser.add_argument('-d', '--debug', action="store_true",
help='Imprimir informações da geração de imagem')
parser.add_argument('-v', '--vsb', required='-n' in sys.argv, type=int,
help='Versão do SB')
parser.add_argument('-m','--mxd_sef', required='-n' in sys.argv, type=int,
help='Valor do Max Dfe SEF')
parser.add_argument('-a','--ateste_priv', required='-n' in sys.argv, type=str,
help='Chave de ateste (PEM) para assinatura do fabricante sobre o firmware')
parser.add_argument('-s','--sef_priv', required='-n' in sys.argv, type=str,
help='Chave privada SEF (PEM) para assinatura SEF do firmware')
args = parser.parse_args()
imagem = None
if(args.novo):
ateste_priv_file = args.ateste_priv
sef_priv_file = args.sef_priv
versao_sb = args.vsb
max_dfe_sef = args.mxd_sef
with open(ateste_priv_file) as file:
ateste_priv = ChaveCripto(file.read())
with open(sef_priv_file) as file:
sef_priv = ChaveCripto(file.read())
imagem = gera_imagem_nova(versao_sb, max_dfe_sef, ateste_priv, sef_priv)
else:
imagem = gera_imagem_atual()
if(args.debug):
print("------------------------------")
print("Informações da Imagem")
print("------------------------------")
print("vsb = ", int.from_bytes(imagem.get_versao_SB(),byteorder='big'))
print("mxd = ", int.from_bytes(imagem.get_maxdfe(),byteorder='big'))