def test_recinto1(self): """Cria chave para recinto, manda chave """ # login # manda recinto, senha # recebe chaveprivada, assina recinto recinto = '00001' private_key_pem, assinado = UseCases.gera_chaves_recinto( self.db_session, recinto) private_key = assinador.load_private_key(private_key_pem) assinado = assinador.sign(recinto.encode('utf-8'), private_key) assinado = b85encode(assinado).decode('utf-8') # manda recinto encriptado com chave # recebe OK com chave correta payload = {'assinado': assinado, 'recinto': recinto} token = authentication.generate_token(payload) request = Request({'Authorization': 'Bearer %s' % token}, payload) assert authentication.valida_assinatura(request, self.db_session)[0] is True # manda recinto sem encriptar, recebe erro payload = {'assinado': recinto, 'recinto': recinto} token = authentication.generate_token(payload) request = Request({'Authorization': 'Bearer %s' % token}, payload) assert authentication.valida_assinatura(request, self.db_session)[0] is False # manda assinado com outra chave, recebe erro private_key2, _ = assinador.generate_keys() assinado2 = assinador.sign(recinto.encode('utf-8'), private_key2) payload2 = {'assinado': assinado2, 'recinto': recinto} token2 = authentication.generate_token(payload2) request2 = Request({'Authorization': 'Bearer %s' % token2}, payload2) assert authentication.valida_assinatura(request2, self.db_session)[0] is False
def test_gerachaverecinto_and_sign(self): recinto = '00001' private_key_pem, assinado = UseCases.gera_chaves_recinto( self.db_session, recinto) public_key_pem = UseCases.get_public_key(self.db_session, recinto) private_key = assinador.load_private_key(private_key_pem) public_key = assinador.load_public_key(public_key_pem) message = b'TESTE' signed = assinador.sign(message, private_key) assinador.verify(signed, message, public_key)
def gera_chaves_recinto(cls, db_session, recinto: str) -> (bytes, bytes): """Chama gerador de chaves, armazena chave publica, retorna chave privada. :param db_session: Conexão ao BD :param recinto: codigo do recinto :return: chave privada gerada em bytes, recinto assinado em bytes """ private_key, public_key = assinador.generate_keys() assinado = assinador.sign(recinto.encode('utf-8'), private_key) public_pem = assinador.public_bytes(public_key) orm.ChavePublicaRecinto.set_public_key(db_session, recinto, public_pem) private_pem = assinador.private_bytes(private_key) return private_pem, assinado
def test_signed_payload(self): # TODO: Este é um exemplo da sequência de TWO WAY authentication # Em outra aplicação ou nesta, o Representante Legal deve efetuar # logon para definir a senha do recinto, gerar as chaves e baixar # a chave privada recinto = '00001' recinto_senha = {'recinto': recinto, 'senha': 'senha'} posicaolote = { "IDEvento": 42, "dataevento": "2019-06-14T11:18:43.287Z", "dataregistro": "2019-06-14T11:18:43.287Z", "operadorevento": "string", "operadorregistro": "string", "retificador": False, "numerolote": 0, "posicao": "string", "qtdevolumes": "string" } # 1. Faz dowload da chave privada, assina codigo recinto com ela # Este endpoint deverá ser acessado pelo Representante Legal com e-CPF, # preferencialmente rv = self.client.post('/privatekey', json={'recinto': recinto}) assert rv.json pem = rv.json.get('pem') private_key = assinador.load_private_key(pem.encode('utf-8')) assinado = assinador.sign(recinto.encode('utf-8'), private_key) # 2. Faz autenticação na aplicação local e pega token rv = self.client.post('/auth', json=recinto_senha) token = rv.data headers = {'Authorization': 'Bearer %s' % token.decode('utf8')} # 3. Manda recinto encriptado com chave junto com Evento. Codigo recinto vai no token # Assim, a validação é pelo token e pelo certificado digital(chave privada) posicaolote['assinado'] = b85encode(assinado).decode('utf-8') rv = self.client.post('/posicaolote', json=posicaolote, headers=headers) assert rv.status_code == 201
# manda assinado com outra chave, recebe erro private_key2, _ = assinador.generate_keys() assinado2 = assinador.sign(recinto.encode('utf-8'), private_key2) payload2 = {'assinado': assinado2, 'recinto': recinto} token2 = authentication.generate_token(payload2) request2 = Request({'Authorization': 'Bearer %s' % token2}, payload2) assert authentication.valida_token_e_assinatura(request2, self.db_session)[0] is False if __name__ == '__main__': private_key_pem = assinador.read_private_key() recinto = '00001' private_key = assinador.load_private_key(private_key_pem) assinado = assinador.sign(recinto.encode('utf8'), private_key) print('recinto: %s' % recinto) print('assinado: %s' % assinado) # manda recinto encriptado com chave # recebe OK com chave correta payload = {'assinado': assinado, 'recinto': recinto} token = authentication.generate_token(payload) request = Request({'Authorization': 'Bearer %s' % token}, payload) authentication.valida_assinatura(request) # manda recinto sem encriptar, recebe erro payload = {'assinado': recinto, 'recinto': recinto} token = authentication.generate_token(payload) request = Request({'Authorization': 'Bearer %s' % token}, payload) try: