Ejemplo n.º 1
0
Archivo: ldgr.py Proyecto: RipaEx/dpos
def buildTxApdu(dongle_path, data):
    """
	Generate apdu from data. This apdu is to be sent into the ledger key.

	Argument:
	dongle_path -- value returned by parseBip32Path
	data -- bytes value returned by dposlib.core.crypto.getBytes

	Return bytes
	"""

    path_len = len(dongle_path)

    if len(data) > 255 - (path_len + 1):
        data1 = data[:255 - (path_len + 1)]
        data2 = data[255 - (path_len + 1):]
        p1 = util.unhexlify("e0040040")
    else:
        data1 = data
        data2 = util.unhexlify("")
        p1 = util.unhexlify("e0048040")

    return [
        p1 + util.intasb(1 + path_len + len(data1)) +
        util.intasb(path_len // 4) + dongle_path + data1,
        util.unhexlify("e0048140") + util.intasb(len(data2)) +
        data2 if len(data2) else None
    ]
Ejemplo n.º 2
0
def buildSignatureApdu(data, dongle_path, what="tx", schnorr=True):
    apdu = []
    path_len = len(dongle_path)
    payload = len(data) + len(dongle_path) + 1

    if payload > payloadMax:
        raise CommException('Payload size:', payload, 'exceeds max length:',
                            payloadMax)

    data = splitData(data, dongle_path)
    if len(data) == 1:
        first, body, last = data[0], [], None
    else:
        first, body, last = data[0], data[1:-1], data[-1]

    p2 = p2_schnorr_leg if schnorr else p2_ecdsa
    p1 = p1_single if last is None else p1_first
    op = getattr(sys.modules[__name__], "op_sign_" + what)

    apdu.append(
        unhexlify(cla + op + p1 + p2) + intasb(path_len + 1 + len(first)) +
        intasb(path_len // 4) + dongle_path + first)

    for b in body:
        apdu.append(unhexlify(cla + op + p1_more + p2) + intasb(len(b)) + b)

    if last is not None:
        apdu.append(
            unhexlify(cla + op + p1_last + p2) + intasb(len(last)) + last)

    return apdu
Ejemplo n.º 3
0
def buildPukApdu(dongle_path):
    path_len = len(dongle_path)
    return \
        unhexlify(cla + op_puk + p1_non_confirm + p2_no_chaincode) + \
        intasb(path_len + 1) + \
        intasb(path_len // 4) + \
        dongle_path
Ejemplo n.º 4
0
Archivo: ldgr.py Proyecto: RipaEx/dpos
def buildPkeyApdu(dongle_path):
    """
	Generate apdu to get public key from ledger key.

	Argument:
	dongle_path -- value returned by parseBip32Path

	Return bytes
	"""

    path_len = len(dongle_path)
    return util.unhexlify("e0020040") + util.intasb(1 + path_len) + \
           util.intasb(path_len//4) + dongle_path
Ejemplo n.º 5
0
def buildPukApdu(dongle_path):
    """
    Generate apdu to get public key from ledger key.

    Args:
        dongle_path (bytes): value returned by
                             [`dposlib.ark.ldgr.parseBip44Path`](
                                 crypto.md#parsebip44path
                             )
    Returns:
        public key apdu data as bytes
    """
    path_len = len(dongle_path)
    return \
        unhexlify(cla + op_puk + p1_non_confirm + p2_no_chaincode) + \
        intasb(path_len + 1) + \
        intasb(path_len // 4) + \
        dongle_path
Ejemplo n.º 6
0
Archivo: ldgr.py Proyecto: RipaEx/dpos
def getSignature(data, dongle_path, debug=False):
    """
	Get ledger Nano S signature of given transaction.

	Argument:
	data -- transaction as bytes data returned by dposlib.core.crypto.getBytes
	dongle_path -- value returned by parseBip32Path

	Keyword argument:
	debug -- flag to activate debug messages from ledger key [default: False]

	Return str (hex)
	"""

    apdu1, apdu2 = buildTxApdu(dongle_path, data)
    dongle = getDongle(debug)
    result = dongle.exchange(bytes(apdu1), timeout=30)
    if apdu2:
        apdu = util.unhexlify("e0048140") + util.intasb(len(apdu2)) + apdu2
        result = dongle.exchange(bytes(apdu), timeout=30)
    dongle.close()
    return util.hexlify(result)