package hci import ( "bytes" "encoding/binary" "fmt" ) const ( pairingRequest = 0x01 // Pairing Request LE-U, ACL-U pairingResponse = 0x02 // Pairing Response LE-U, ACL-U pairingConfirm = 0x03 // Pairing Confirm LE-U pairingRandom = 0x04 // Pairing Random LE-U pairingFailed = 0x05 // Pairing Failed LE-U, ACL-U encryptionInformation = 0x06 // Encryption Information LE-U masterIdentification = 0x07 // Master Identification LE-U identiInformation = 0x08 // Identity Information LE-U, ACL-U identityAddreInformation = 0x09 // Identity Address Information LE-U, ACL-U signingInformation = 0x0A // Signing Information LE-U, ACL-U securityRequest = 0x0B // Security Request LE-U pairingPublicKey = 0x0C // Pairing Public Key LE-U pairingDHKeyCheck = 0x0D // Pairing DHKey Check LE-U pairingKeypress = 0x0E // Pairing Keypress Notification LE-U ) func (c *Conn) sendSMP(p pdu) error { buf := bytes.NewBuffer(make([]byte, 0)) if err := binary.Write(buf, binary.LittleEndian, uint16(4+len(p))); err != nil { return err } if err := binary.Write(buf, binary.LittleEndian, cidSMP); err != nil { return err } if err := binary.Write(buf, binary.LittleEndian, p); err != nil { return err } _, err := c.writePDU(buf.Bytes()) logger.Debug("smp", "send", fmt.Sprintf("[%X]", buf.Bytes())) return err } func (c *Conn) handleSMP(p pdu) error { logger.Debug("smp", "recv", fmt.Sprintf("[%X]", p)) code := p[0] switch code { case pairingRequest: case pairingResponse: case pairingConfirm: case pairingRandom: case pairingFailed: case encryptionInformation: case masterIdentification: case identiInformation: case identityAddreInformation: case signingInformation: case securityRequest: case pairingPublicKey: case pairingDHKeyCheck: case pairingKeypress: default: // If a packet is received with a reserved Code it shall be ignored. [Vol 3, Part H, 3.3] return nil } // FIXME: work aound to the lack of SMP implementation - always return non-supported. // C.5.1 Pairing Not Supported by Slave return c.sendSMP([]byte{pairingFailed, 0x05}) }