def test_authentication_detail(identificacion, url=LISTEN_URL): authdata = test_authentication(identificacion, url=LISTEN_URL) data = { 'institution': INSTITUTION, 'notification_url': url, 'identification': identificacion, 'request_datetime': timezone.now().isoformat(), } algorithm = ALGORITHM str_data = json.dumps(data) # print(str_data) edata = encrypt(SERVER_PUBLIC_KEY, str_data) hashsum = get_hash_sum(edata, ALGORITHM) edata = edata.decode() params = { "data_hash": hashsum, "algorithm": algorithm, "public_certificate": PUBLIC_CERTIFICATE, 'institution': INSTITUTION, "data": edata, } result = requests.post( SERVER_URL + "/authenticate/%s/institution_show/" % (authdata['code']), json=params) # print(params) data = result.json() return data
def test_validate_document(url=LISTEN_URL): data = { 'institution': INSTITUTION, 'notification_url': url, 'document': CERTIFICATE_FILE, 'request_datetime': timezone.now().strftime("%Y-%m-%d %H:%M:%S"), } algorithm = ALGORITHM str_data = json.dumps(data) # print(str_data) edata = encrypt(SERVER_PUBLIC_KEY, str_data) hashsum = get_hash_sum(edata, ALGORITHM) edata = edata.decode() params = { "data_hash": hashsum, "algorithm": algorithm, "public_certificate": PUBLIC_CERTIFICATE, 'institution': INSTITUTION, "data": edata, } result = requests.post(SERVER_URL + '/validate/institution_document/', json=params) # print(params) data = result.json() print(data)
def test_msoffice_signer(identificacion, url=LISTEN_URL): data = { 'institution': INSTITUTION, 'notification_url': url, 'document': DOCXFILE, 'format': 'msoffice', 'algorithm_hash': 'sha512', 'document_hash': HASHDOCX, 'identification': identificacion, 'resumen': 'Documento de prueba odf', 'request_datetime': timezone.now().strftime("%Y-%m-%d %H:%M:%S"), } algorithm = ALGORITHM str_data = json.dumps(data) # print(str_data) edata = encrypt(SERVER_PUBLIC_KEY, str_data) hashsum = get_hash_sum(edata, ALGORITHM) edata = edata.decode() params = { "data_hash": hashsum, "algorithm": algorithm, "public_certificate": PUBLIC_CERTIFICATE, 'institution': INSTITUTION, "data": edata, } result = requests.post(SERVER_URL + '/sign/institution/', json=params) data = result.json() print(data) return data
def test_signer_show(identificacion, url=LISTEN_URL): signdata = test_xml_signer(identificacion, url=LISTEN_URL) print(signdata) data = { 'institution': INSTITUTION, 'notification_url': url, 'identification': identificacion, 'request_datetime': timezone.now().strftime("%Y-%m-%d %H:%M:%S"), } algorithm = ALGORITHM str_data = json.dumps(data) # print(str_data) edata = encrypt(SERVER_PUBLIC_KEY, str_data) hashsum = get_hash_sum(edata, ALGORITHM) edata = edata.decode() params = { "data_hash": hashsum, "algorithm": algorithm, "public_certificate": PUBLIC_CERTIFICATE, 'institution': INSTITUTION, "data": edata, } result = requests.post(SERVER_URL + '/sign/%s/institution_show/' % (signdata['code'], ), json=params) data = result.json() return data
def send_notification(data, serializer=None, request=None, encrypt_method='aes_eax'): """ Envia notificación a la institución, cuando se recibe una respuesta por parte del BCCR, este método reenvía la respuesta a la URL especificada en la petición. La estructura de envío es: :params id_transaction: Id de transacción del BCCR :params data: Es un diccionario con los siguientes atributos * **code:** Código de identificación de la transacción (no es el mismo que el que se muestra en al usuario en firma) * **identification:** Identificador del suscriptor * **id_transaction:** Id de trasnacción en el FVA del BCCR * **request_datetime:** Hora de recepción de la solicitud * **sign_document:** Almacena el documento, pero no se garantiza que venga el documento firmado, puede ser None * **expiration_datetime:** Hora de recepción de la solicitud * **received_notification:** True si la autenticación ha sido procesada, False si está esperando al usuario * **duration:** tiempo que duró entre que fue enviada y fue recibida * **status:** Código de error de la transacción * **status_text:** Descripción en texto del estado :params hashsum: Suma hash realizada a data :params algorithm: Algoritmo con el que se realizó la suma hash Por defecto se utiliza el método de encripción seleccionado al realizar la petición por parte de la institución, pero en caso de no lograrse identificar el método se utiliza por defecto 'aes_eax' """ if data.notification_url == 'N/D': return if serializer is None: serializer, req = get_datarequest_serializer(data) ars = serializer(data) datajson = JSONRenderer().render(ars.data) edata = encrypt(data.institution.public_key, datajson, method=encrypt_method) hashsum = get_hash_sum(edata, req.algorithm) error = None try: response = requests.post(data.notification_url, data={ 'id_transaction': data.id_transaction, 'data': edata.decode(), 'hashsum': hashsum, 'algorithm': req.algorithm }) response.raise_for_status() except Exception as e: error = e logger.error('Receptor: notificando a %s lanza %s' % (data.notification_url, e)) return error
def get_request_params(self, data, **kwargs): algorithm = kwargs.get('algorithm', self.ALGORITHM) server_public_key = kwargs.get('server_public_key', self.institution.server_public_key) str_data = json.dumps(data) edata = encrypt(server_public_key, str_data) hashsum = kwargs.get('hashsum', get_hash_sum(edata, algorithm)) institution = kwargs.get('institution', str(self.institution.code)) edata = edata.decode() certificate = kwargs.get('public_certificate', self.institution.public_certificate) params = { "data_hash": hashsum, "algorithm": algorithm, "public_certificate": certificate, 'institution': institution, "data": edata, } return params
def dummy_encrypt(self, data, public_key): return encrypt(public_key, data)