encrypt.py
3.77 KB
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
117
118
119
120
121
122
123
124
125
126
127
128
129
import sys
import json
import logging.config
from datetime import datetime
from argparse import ArgumentParser
from base64 import b64encode
from pprint import pprint
from opensipkd.waktu import create_now
from winpay.encrypt import (
sign,
sign_without_salt,
verify,
verify_without_salt,
)
from winpay.signature import generator
from winpay.va import (
create,
HttpErr,
)
def encrypt(argv=sys.argv[1:]):
pars = ArgumentParser()
pars.add_argument('--private-file', required=True)
pars.add_argument('--data-file', required=True)
pars.add_argument('--without-salt', action='store_true')
pars.add_argument('--public-file')
option = pars.parse_args(argv)
with open(option.private_file, 'rb') as f:
private_key = f.read()
with open(option.data_file, 'rb') as f:
data = f.read()
sign_func = option.without_salt and sign_without_salt or sign
data_signed = sign_func(private_key, data)
data_b64 = b64encode(data_signed).decode('utf-8')
print(data_b64)
if not option.public_file:
return
with open(option.public_file, 'rb') as f:
public_key = f.read()
verify_func = option.without_salt and verify_without_salt or verify
verify_func(public_key, data_signed, data)
def signature(argv=sys.argv[1:]):
pars = ArgumentParser()
pars.add_argument('--private-file', required=True)
pars.add_argument('--json-file', required=True)
option = pars.parse_args(sys.argv[1:])
with open(option.private_file, 'rb') as f:
private_bytes = f.read()
with open(option.json_file) as f:
data = json.loads(f.read())
timestamp = create_now()
sign_bytes = generator(private_bytes, data, timestamp)
sign_b64 = b64encode(sign_bytes).decode('utf-8')
print(sign_b64)
def setup_logging():
logging.config.dictConfig({
'version': 1,
'formatters': {
'generic': {
'format': '%(asctime)s %(levelname)s %(name)s %(message)s',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout',
'formatter': 'generic'},
},
'loggers': {
'': {
'handlers': ['console'],
'level': 'DEBUG',
},
},
})
def create_va(argv=sys.argv[1:]):
url = 'https://sandbox-api.bmstaging.id/snap/v1.0/transfer-va/create-va'
help_url = f'default {url}'
expired_days = 1
help_expired = f'default {expired_days}'
channels = [
'BRI', 'BNI', 'MANDIRI', 'PERMATA', 'BSI', 'MUAMALAT', 'BCA', 'CIMB',
'SINARMAS', 'BNC', 'INDOMARET', 'ALFAMART']
pars = ArgumentParser()
pars.add_argument('--private-file', required=True)
pars.add_argument('--partner-id', required=True)
pars.add_argument('--customer-no', required=True)
pars.add_argument('--va-name', required=True)
pars.add_argument('--amount', type=int, required=True)
pars.add_argument('--channel', choices=channels)
pars.add_argument('--url', default=url, help=help_url)
pars.add_argument(
'--expired-days', type=int, default=expired_days, help=help_expired)
pars.add_argument('--trx-id')
option = pars.parse_args(sys.argv[1:])
with open(option.private_file, 'rb') as f:
private_key = f.read()
if option.trx_id:
trx_id = option.trx_id
else:
trx_id = datetime.now().strftime('%H%M%S')
setup_logging()
try:
r = create(
option.url, private_key, option.partner_id, option.customer_no,
option.va_name, option.amount, option.channel, trx_id,
option.expired_days)
pprint(r)
except HttpErr as e:
print('ERROR', e)