/go-trezor

Direct port of official Python Trezor library

Primary LanguageGo

Trezor

In Go

This is a direct port of python-trezor with minimal source code changes for language differences.

The Client class has been omitted - you'll have to marshal and loop on the responses yourself.

As an example, this is from go-trezor-encrypt:

t := true
err := device.Write(&messages.CipherKeyValue{
    AddressN:     []uint32{10, 0},
    Key:          &key,
    Value:        padded[:],
    Encrypt:      &encrypt,
    AskOnEncrypt: &t,
    AskOnDecrypt: &t,
    Iv:           []byte{},
})
if err != nil {
    return nil, err
}
for {
    messageType, message, err := device.Read()
    if err != nil {
        return nil, err
    }
    if false {

    } else if messageType == messages.MessageType_MessageType_Failure {
        var failure messages.Failure
        proto.Unmarshal(message, &failure)
        return nil, fmt.Errorf("[%d] %s", failure.Code, *failure.Message)
    } else if messageType == messages.MessageType_MessageType_PinMatrixRequest {
        done, value, err := DoPin(prompt)
        if err != nil {
            return nil, err
        }
        if done {
            device.Write(&messages.PinMatrixAck{Pin: &value})
        } else {
            device.Write(&messages.Cancel{})
            return nil, nil
        }
    } else if messageType == messages.MessageType_MessageType_ButtonRequest {
        device.Write(&messages.ButtonAck{})
    } else if messageType == messages.MessageType_MessageType_CipheredKeyValue {
        var ciphered messages.CipheredKeyValue
        proto.Unmarshal(message, &ciphered)
        var clipped []byte
        if encrypt {
            clipped = ciphered.Value
        } else {
            length := binary.BigEndian.Uint32(ciphered.Value[0:4])
            clipped = ciphered.Value[4 : 4+length]
        }
        return clipped, nil
    } else {
        return nil, fmt.Errorf("Unexpected response from trezor [%d]", messageType)
    }
}

Currently only protocol V1 and HID V2 have been tested.