/
xades.py
79 lines (67 loc) · 1.91 KB
/
xades.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
# -*- coding: utf-8 -*-
import base64
import os
import subprocess
class CheckDigit(object):
# Definicion modulo 11
_MODULO_11 = {
'BASE': 11,
'FACTOR': 2,
'RETORNO11': 0,
'RETORNO10': 1,
'PESO': 2,
'MAX_WEIGHT': 7
}
@classmethod
def _eval_mod11(self, modulo):
if modulo == self._MODULO_11['BASE']:
return self._MODULO_11['RETORNO11']
elif modulo == self._MODULO_11['BASE'] - 1:
return self._MODULO_11['RETORNO10']
else:
return modulo
@classmethod
def compute_mod11(self, dato):
"""
Calculo mod 11
return int
"""
total = 0
weight = self._MODULO_11['PESO']
for item in reversed(dato):
total += int(item) * weight
weight += 1
if weight > self._MODULO_11['MAX_WEIGHT']:
weight = self._MODULO_11['PESO']
mod = 11 - total % self._MODULO_11['BASE']
mod = self._eval_mod11(mod)
return mod
class Xades(object):
def sign(self, xml_document, file_pk12, password):
"""
Metodo que aplica la firma digital al XML
TODO: Revisar return
"""
xml_str = xml_document.encode('utf-8')
JAR_PATH = 'firma/firmaXadesBes.jar'
JAVA_CMD = 'java'
firma_path = os.path.join(os.path.dirname(__file__), JAR_PATH)
command = [
JAVA_CMD,
'-jar',
firma_path,
xml_str,
base64.b64encode(file_pk12),
base64.b64encode(password)
]
try:
subprocess.check_output(command)
except subprocess.CalledProcessError as e:
raise e.returncode
p = subprocess.Popen(
command,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT
)
res = p.communicate()
return res[0]