Advertisement
Guest User

DptClient

a guest
Mar 12th, 2019
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.96 KB | None | 0 0
  1. # Embedded file name: .\build\pyi.win32\dpt_main\out00-PYZ.pyz\dpt_client
  2. import sys
  3. import os
  4. path = os.path.dirname(os.path.realpath(__file__))
  5. sys.path.append(path)
  6. from ctypes import *
  7. import json
  8. import random
  9. import binascii
  10. import string
  11. import base64
  12. import time
  13. from PyQt4.QtCore import *
  14. from PyQt4.QtGui import *
  15. from ui_dpt import _translate
  16. from restful_lib import Connection
  17. DEGEST_SIZE = 32
  18. RSC_ORDER_INFO = '/order_info'
  19. RSC_PRODUCTION = '/chip_with_sn_production'
  20. BURN_HDCP_PROTECT_KEY_SUCCESS = 0
  21. BURN_HDCP_PROTECT_KEY_FAILED = 1
  22. BURN_PVR_SECRET_KEY_SUCCESS = 2
  23. BURN_PVR_SECRET_KEY_FAILED = 3
  24. BURN_EJTAG_KEY_SUCCESS = 4
  25. BURN_EJTAG_KEY_FAILED = 5
  26. BURN_HDCP_CHUNK_SUCCESS = 6
  27. BURN_HDCP_CHUNK_ALREADY_BURNED = 7
  28. BURN_HDCP_CHUNK_FAILED = 8
  29. BURN_CIPLUS_CHUNK_SUCCESS = 9
  30. BURN_CIPLUS_CHUNK_ALREADY_BURNED = 10
  31. BURN_CIPLUS_CHUNK_FAILED = 11
  32. BURN_CHIPSN_SUCCESS = 12
  33. BURN_CHIPSN_FAILED = 13
  34.  
  35. def tr(msg):
  36.     return QCoreApplication.translate('@default', msg)
  37.  
  38.  
  39. BURN_MSG_TR = [tr('burn hdcp protect key success'),
  40.  tr('burn hdcp protect key failed'),
  41.  tr('burn pvr secret key success'),
  42.  tr('burn pvr secret key failed'),
  43.  tr('burn ejtag key success'),
  44.  tr('burn ejtag key failed'),
  45.  tr('burn hdcp chunk success'),
  46.  tr('burn hdcp chunk already burned'),
  47.  tr('burn hdcp chunk failed'),
  48.  tr('burn ciplus chunk success'),
  49.  tr('burn ciplus chunk already burned'),
  50.  tr('burn ciplus chunk failed'),
  51.  tr('burn chip sn success'),
  52.  tr('burn chip sn failed')]
  53. BURN_MSG = ['burn hdcp protect key success',
  54.  'burn hdcp protect key failed',
  55.  'burn pvr secret key success',
  56.  'burn pvr secret key failed',
  57.  'burn ejtag key success',
  58.  'burn ejtag key failed',
  59.  'burn hdcp chunk success',
  60.  'burn hdcp chunk already burned',
  61.  'burn hdcp chunk failed',
  62.  'burn ciplus chunk success',
  63.  'burn ciplus chunk already burned',
  64.  'burn ciplus chunk failed',
  65.  'burn chip sn success',
  66.  'burn chip sn failed']
  67.  
  68. class ProductionParam(Structure):
  69.     _fields_ = [('e_chip_sn', c_char_p),
  70.      ('hdcp_protect_key', c_char_p),
  71.      ('pvr_secret_key', c_char_p),
  72.      ('ejtag_key', c_char_p),
  73.      ('hdcp_chunk', c_char_p),
  74.      ('ciplus_chunk', c_char_p),
  75.      ('digest_len', c_uint32),
  76.      ('len_chip_sn', c_uint32),
  77.      ('len_e_chip_sn', c_uint32),
  78.      ('len_hdcp_protect_key', c_uint32),
  79.      ('len_pvr_secret_key', c_uint32),
  80.      ('len_ejtag_key', c_uint32),
  81.      ('len_hdcp_chunk', c_uint32),
  82.      ('len_ciplus_chunk', c_uint32)]
  83.  
  84.  
  85. class DptClient:
  86.  
  87.     def __init__(self, worker):
  88.         if not isinstance(worker, DptClientWorker):
  89.             return
  90.         self.worker = worker
  91.         self.api = worker.api
  92.         self.server = Connection(base_url=self.api, disable_ssl_certificate_validation=True)
  93.         libfile = os.getcwd() + '/Mp_Serial.dll'
  94.         self.serial = CDLL(libfile)
  95.         self.serial.production_init.argtypes = [c_uint32, c_void_p]
  96.         self.serial.production_read_chip_sn.argtypes = [c_char_p, c_uint32]
  97.         self.serial.production_burn_process.argtypes = [c_void_p]
  98.         self.serial.sign_chip_sn.argtypes = [c_char_p,
  99.          c_char_p,
  100.          c_uint32,
  101.          c_void_p]
  102.  
  103.         def lib_msg_callback(msg_code, param):
  104.             if msg_code >= 0 and msg_code <= BURN_CHIPSN_FAILED:
  105.                 txt = self.worker.tr(BURN_MSG[msg_code])
  106.                 self.worker.emit(SIGNAL('msg_out'), 0, txt)
  107.  
  108.         pdispatch_callback = CFUNCTYPE(c_void_p, c_uint32, c_uint32)
  109.         self.pshow_msg_handle = pdispatch_callback(lib_msg_callback)
  110.         self.serial_inited = False
  111.  
  112.     def request_production_info(self, key = ''):
  113.         if key == '':
  114.             self.error = self.worker.tr('Error: request_production_info empty Production Key')
  115.             return
  116.         args = {}
  117.         args['key'] = key
  118.         try:
  119.             resp = self.server.request_get(resource=RSC_ORDER_INFO, args=args, headers={'content-type': 'application/json',
  120.              'accept': 'application/json'})
  121.         except Exception as e:
  122.             self.error = self.worker.tr('Error: request_production_info Connect to Server Failed!')
  123.             return
  124.  
  125.         status = resp[u'headers']['status']
  126.         if status != '200':
  127.             self.error = resp[u'headers']['reason']
  128.             return
  129.         self.key = key
  130.         self.order_info = json.loads(resp[u'body'])
  131.         return self.order_info
  132.  
  133.     def request_key_data(self, chipsn = '', successed = 0):
  134.         if chipsn == '':
  135.             self.error = self.worker.tr('Error: request_key_data empty chipsn')
  136.             return
  137.         elif self.key == '':
  138.             self.error = self.worker.tr('Error: request_key_data empty production key')
  139.             return
  140.         else:
  141.             server = self.server
  142.             chipsn_sign = ''
  143.             data_in = c_char_p(chipsn)
  144.             in_size = c_uint32(len(chipsn))
  145.             out_size = c_uint32(in_size.value + DEGEST_SIZE)
  146.             data_out = create_string_buffer(out_size.value)
  147.             if 0 == self.serial.sign_chip_sn(data_in, data_out, in_size, byref(out_size)):
  148.                 chipsn_sign = string_at(data_out, out_size.value)
  149.             else:
  150.                 self.error = self.worker.tr('Error: request_key_data sign chip sn failed!')
  151.                 return
  152.             chipsn_sign = base64.b64encode(chipsn_sign)
  153.             args = {}
  154.             args['key'] = self.key
  155.             args['chip_sn'] = chipsn_sign
  156.             if successed != 0:
  157.                 args['successed'] = 1
  158.             try:
  159.                 resp = server.request_get(resource=RSC_PRODUCTION, args=args, headers={'content-type': 'application/json',
  160.                  'accept': 'application/json'})
  161.             except (IOError, OSError):
  162.                 self.error = self.worker.tr('Error: request_key_data Connect to Server Failed!')
  163.                 return
  164.  
  165.             status = resp[u'headers']['status']
  166.             if status != '200' and status != '201':
  167.                 self.error = resp[u'headers']['reason']
  168.                 return
  169.             data = dict(json.loads(resp[u'body']))
  170.             if successed == 1:
  171.                 return data
  172.             if self.order_info['chipsn'] != 0:
  173.                 if not data.has_key('echipsn') or data['echipsn'] == None or data['echipsn'] == '':
  174.                     self.error = self.worker.tr('Error: request_key_data Model need echipsn, but server not return echipsn data')
  175.                     return
  176.             if self.order_info['hdcp'] != 0:
  177.                 if not data.has_key('hdcp_protect') or not data.has_key('hdcp_chunk') or data['hdcp_protect'] == None or data['hdcp_protect'] == '' or data['hdcp_chunk'] == None or data['hdcp_chunk'] == '':
  178.                     self.error = self.worker.tr('Error: request_key_data Model need hdcp key, but server not return hdcp data')
  179.                     return
  180.             if self.order_info['ciplus'] != 0:
  181.                 if not data.has_key('pvr_secret') or not data.has_key('ejtag') or not data.has_key('ciplus_chunk') or data['pvr_secret'] == None or data['pvr_secret'] == '' or data['ejtag'] == None or data['ejtag'] == '' or data['ciplus_chunk'] == None or data['ciplus_chunk'] == '':
  182.                     self.error = self.worker.tr('Error: request_key_data Model need ciplus key, but server not return ciplus data')
  183.                     return
  184.             return data
  185.  
  186.     def serial_burn_key_data(self, chip_sn = '', data = {}):
  187.         if chip_sn == '' or data == {}:
  188.             self.error = self.worker.tr('Error: serial_burn_key_data empty chipsn or data')
  189.             return False
  190.         if not self.serial_inited:
  191.             self.error = self.worker.tr('Error: serial_burn_key_data serial not inited')
  192.             return False
  193.         param = ProductionParam()
  194.         param.digest_len = c_uint32(DEGEST_SIZE)
  195.         param.len_chip_sn = c_uint32(self.order_info['chipsn_len'])
  196.         if data.has_key('echipsn') and len(data['echipsn']) > 0:
  197.             e_chip_sn = base64.b64decode(data['echipsn'])
  198.             param.e_chip_sn = c_char_p(e_chip_sn)
  199.             param.len_e_chip_sn = c_uint32(len(e_chip_sn) - self.order_info['chipsn_len'] - DEGEST_SIZE)
  200.         else:
  201.             param.e_chip_sn = c_char_p(0)
  202.             param.len_e_chip_sn = c_uint32(0)
  203.         if data.has_key('hdcp_protect') and len(data['hdcp_protect']) > 0:
  204.             hdcp_protect = base64.b64decode(data['hdcp_protect'])
  205.             param.hdcp_protect_key = c_char_p(hdcp_protect)
  206.             param.len_hdcp_protect_key = c_uint32(len(hdcp_protect))
  207.         else:
  208.             param.hdcp_protect_key = c_char_p(0)
  209.             param.len_hdcp_protect_key = c_uint32(0)
  210.         if data.has_key('pvr_secret') and len(data['pvr_secret']) > 0:
  211.             pvr_secret = base64.b64decode(data['pvr_secret'])
  212.             param.pvr_secret_key = c_char_p(pvr_secret)
  213.             param.len_pvr_secret_key = c_uint32(len(pvr_secret))
  214.         else:
  215.             param.pvr_secret_key = c_char_p(0)
  216.             param.len_pvr_secret_key = c_uint32(0)
  217.         if data.has_key('ejtag') and len(data['ejtag']) > 0:
  218.             ejtag = base64.b64decode(data['ejtag'])
  219.             param.ejtag_key = c_char_p(ejtag)
  220.             param.len_ejtag_key = c_uint32(len(ejtag))
  221.         else:
  222.             param.ejtag_key = c_char_p(0)
  223.             param.len_ejtag_key = c_uint32(0)
  224.         if data.has_key('hdcp_chunk') and len(data['hdcp_chunk']) > 0:
  225.             hdcp_chunk = base64.b64decode(data['hdcp_chunk'])
  226.             param.hdcp_chunk = c_char_p(hdcp_chunk)
  227.             param.len_hdcp_chunk = c_uint32(len(hdcp_chunk))
  228.         else:
  229.             param.hdcp_chunk = c_char_p(0)
  230.             param.len_hdcp_chunk = c_uint32(0)
  231.         if data.has_key('ciplus_chunk') and len(data['ciplus_chunk']) > 0:
  232.             ciplus_chunk = base64.b64decode(data['ciplus_chunk'])
  233.             param.ciplus_chunk = c_char_p(ciplus_chunk)
  234.             param.len_ciplus_chunk = c_uint32(len(ciplus_chunk))
  235.         ret = self.serial.production_burn_process(byref(param))
  236.         if ret == 0:
  237.             return True
  238.         self.error = self.worker.tr('Error: serial_burn_key_data Failed, ') + str(ret)
  239.         return False
  240.  
  241.     def serial_read_chipsn(self, chip_sn_len = 0):
  242.         if chip_sn_len == 0:
  243.             self.error = self.worker.tr('Error: serial_read_chipsn chip_sn_len == 0')
  244.             return
  245.         if not self.serial_inited:
  246.             self.error = self.worker.tr('Error: serial_read_chipsn serial not inited')
  247.             return
  248.         chip_sn_size = c_uint32(chip_sn_len)
  249.         chip_sn_buff = create_string_buffer(chip_sn_size.value)
  250.         ret = self.serial.production_read_chip_sn(chip_sn_buff, chip_sn_size)
  251.         if ret == 0:
  252.             chip_sn = string_at(chip_sn_buff, chip_sn_size.value)
  253.             return chip_sn
  254.  
  255.     def serial_init(self, port = 0):
  256.         self.port = port
  257.         p = c_ulong()
  258.         p.value = port
  259.         ret = self.serial.production_init(p, self.pshow_msg_handle)
  260.         if ret != 0:
  261.             self.error = self.worker.tr('Error: serial_init Open serial port COM') + str(self.port) + self.worker.tr('Failed!')
  262.             return False
  263.         self.serial_inited = True
  264.         return True
  265.  
  266.     def serial_deinit(self):
  267.         if not self.serial_inited:
  268.             return True
  269.         ret = self.serial.production_deinit()
  270.         if ret != 0:
  271.             self.error = self.worker.tr('Error: serial_deinit Close COM') + str(self.port) + self.worker.tr('Failed!')
  272.             return False
  273.         self.serial_inited = False
  274.         return True
  275.  
  276.  
  277. class DptClientWorker(QThread):
  278.  
  279.     def __init__(self, parent = None):
  280.         super(DptClientWorker, self).__init__(parent)
  281.         self.stoped = False
  282.  
  283.     def __del__(self):
  284.         self.port = 0
  285.         self.key = ''
  286.         self.stoped = True
  287.         self.wait()
  288.  
  289.     def set_param(self, api = '', port = 0, key = ''):
  290.         self.api = api
  291.         self.port = port
  292.         self.key = key
  293.  
  294.     def stop(self):
  295.         self.stoped = True
  296.  
  297.     def isStoped(self):
  298.         return self.stoped
  299.  
  300.     def run(self):
  301.         self.stoped = False
  302.         if self.port == 0 or self.key == '':
  303.             self.emit(SIGNAL('msg_out'), 0, self.tr('Error: DptClientWorker wrong port or production key!'))
  304.             return
  305.         else:
  306.             self.client = DptClient(self)
  307.             c = self.client
  308.             if not c.serial_init(self.port):
  309.                 self.emit(SIGNAL('msg_out'), 0, c.error)
  310.                 return
  311.             self.emit(SIGNAL('msg_out'), 0, self.tr('Serial init success!'))
  312.             if None == c.request_production_info(self.key):
  313.                 self.emit(SIGNAL('msg_out'), 0, c.error)
  314.                 if not c.serial_deinit():
  315.                     self.emit(SIGNAL('msg_out'), 0, c.error)
  316.                 return
  317.             self.emit(SIGNAL('msg_out'), 0, self.tr('Connect to server success!'))
  318.             self.emit(SIGNAL('update_info'), c.order_info)
  319.             self.emit(SIGNAL('msg_out'), 0, self.tr('Listening on serial port') + str(self.port))
  320.             clean = 0
  321.             trycnt = 0
  322.             pre_chipsn = 0
  323.             pre_successed = 0
  324.             while not self.stoped:
  325.                 chipsn = c.serial_read_chipsn(c.order_info['chipsn_len'])
  326.                 if chipsn == None:
  327.                     continue
  328.                 if pre_chipsn == chipsn and pre_successed == 1:
  329.                     continue
  330.                 if pre_chipsn != chipsn:
  331.                     self.emit(SIGNAL('update_result'), 0)
  332.                     pre_chipsn = chipsn
  333.                     pre_successed = 0
  334.                 start_time = time.time()
  335.                 if clean == 1:
  336.                     self.emit(SIGNAL('msg_out'), clean, '')
  337.                 clean = 1
  338.                 self.emit(SIGNAL('msg_out'), 0, self.tr('Receive new chipsn from serial port!'))
  339.                 result = c.request_key_data(chipsn, 0)
  340.                 if result == None:
  341.                     self.emit(SIGNAL('msg_out'), 0, c.error)
  342.                     if c.error == 'Error: This chip sn already producted':
  343.                         pre_successed = 1
  344.                         self.emit(SIGNAL('update_result'), 9999)
  345.                     continue
  346.                 if not result.has_key('successed'):
  347.                     self.emit(SIGNAL('msg_out'), 0, self.tr('Get encrypted data from server success!'))
  348.                     trycnt = trycnt + 1
  349.                     if not c.serial_burn_key_data(chipsn, result):
  350.                         self.emit(SIGNAL('msg_out'), 0, c.error)
  351.                         if trycnt < 2:
  352.                             continue
  353.                     trycnt = 0
  354.                     ret = c.request_key_data(chipsn, 1)
  355.                     if ret == None:
  356.                         self.emit(SIGNAL('msg_out'), 0, c.error)
  357.                         continue
  358.                     if not dict(ret).has_key('successed') or dict(ret)['successed'] != 1:
  359.                         self.emit(SIGNAL('msg_out'), 0, self.tr('Error: server return wrong data!'))
  360.                         continue
  361.                     number = dict(ret)['number']
  362.                     producted = dict(ret)['producted']
  363.                     self.emit(SIGNAL('update_num'), number, producted)
  364.                     self.emit(SIGNAL('update_result'), 9999)
  365.                     self.emit(SIGNAL('msg_out'), 0, self.tr('Burn Success!'))
  366.                     pre_successed = 1
  367.                     end_time = time.time()
  368.                     timeused = int(end_time - start_time)
  369.                     timemsg = 'used time: %d seconds' % timeused
  370.                     if producted == number:
  371.                         self.emit(SIGNAL('msg_out'), 0, self.tr('This order already finished!'))
  372.                         break
  373.  
  374.             if not c.serial_deinit():
  375.                 self.emit(SIGNAL('msg_out'), 0, c.error)
  376.             return
  377.  
  378.  
  379. def update_order_info(info):
  380.     print info
  381.  
  382.  
  383. def msg_out(x, msg):
  384.     print str(x) + ': ' + msg
  385.  
  386.  
  387. def update_num(total, producted):
  388.     print str(total) + ', ' + str(producted)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement