예제 #1
0
    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
예제 #2
0
 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)
예제 #3
0
    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
예제 #4
0
 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
예제 #5
0
            # 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: