att.h 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2010 Nokia Corporation
  7. * Copyright (C) 2010 Marcel Holtmann <marcel@holtmann.org>
  8. *
  9. *
  10. */
  11. #include "src/shared/crypto.h"
  12. /* Len of signature in write signed packet */
  13. #define ATT_SIGNATURE_LEN 12
  14. /* Attribute Protocol Opcodes */
  15. #define ATT_OP_ERROR 0x01
  16. #define ATT_OP_MTU_REQ 0x02
  17. #define ATT_OP_MTU_RESP 0x03
  18. #define ATT_OP_FIND_INFO_REQ 0x04
  19. #define ATT_OP_FIND_INFO_RESP 0x05
  20. #define ATT_OP_FIND_BY_TYPE_REQ 0x06
  21. #define ATT_OP_FIND_BY_TYPE_RESP 0x07
  22. #define ATT_OP_READ_BY_TYPE_REQ 0x08
  23. #define ATT_OP_READ_BY_TYPE_RESP 0x09
  24. #define ATT_OP_READ_REQ 0x0A
  25. #define ATT_OP_READ_RESP 0x0B
  26. #define ATT_OP_READ_BLOB_REQ 0x0C
  27. #define ATT_OP_READ_BLOB_RESP 0x0D
  28. #define ATT_OP_READ_MULTI_REQ 0x0E
  29. #define ATT_OP_READ_MULTI_RESP 0x0F
  30. #define ATT_OP_READ_BY_GROUP_REQ 0x10
  31. #define ATT_OP_READ_BY_GROUP_RESP 0x11
  32. #define ATT_OP_WRITE_REQ 0x12
  33. #define ATT_OP_WRITE_RESP 0x13
  34. #define ATT_OP_WRITE_CMD 0x52
  35. #define ATT_OP_PREP_WRITE_REQ 0x16
  36. #define ATT_OP_PREP_WRITE_RESP 0x17
  37. #define ATT_OP_EXEC_WRITE_REQ 0x18
  38. #define ATT_OP_EXEC_WRITE_RESP 0x19
  39. #define ATT_OP_HANDLE_NOTIFY 0x1B
  40. #define ATT_OP_HANDLE_IND 0x1D
  41. #define ATT_OP_HANDLE_CNF 0x1E
  42. #define ATT_OP_SIGNED_WRITE_CMD 0xD2
  43. /* Error codes for Error response PDU */
  44. #define ATT_ECODE_INVALID_HANDLE 0x01
  45. #define ATT_ECODE_READ_NOT_PERM 0x02
  46. #define ATT_ECODE_WRITE_NOT_PERM 0x03
  47. #define ATT_ECODE_INVALID_PDU 0x04
  48. #define ATT_ECODE_AUTHENTICATION 0x05
  49. #define ATT_ECODE_REQ_NOT_SUPP 0x06
  50. #define ATT_ECODE_INVALID_OFFSET 0x07
  51. #define ATT_ECODE_AUTHORIZATION 0x08
  52. #define ATT_ECODE_PREP_QUEUE_FULL 0x09
  53. #define ATT_ECODE_ATTR_NOT_FOUND 0x0A
  54. #define ATT_ECODE_ATTR_NOT_LONG 0x0B
  55. #define ATT_ECODE_INSUFF_ENCR_KEY_SIZE 0x0C
  56. #define ATT_ECODE_INVAL_ATTR_VALUE_LEN 0x0D
  57. #define ATT_ECODE_UNLIKELY 0x0E
  58. #define ATT_ECODE_INSUFF_ENC 0x0F
  59. #define ATT_ECODE_UNSUPP_GRP_TYPE 0x10
  60. #define ATT_ECODE_INSUFF_RESOURCES 0x11
  61. /* Application error */
  62. #define ATT_ECODE_IO 0x80
  63. #define ATT_ECODE_TIMEOUT 0x81
  64. #define ATT_ECODE_ABORTED 0x82
  65. #define ATT_MAX_VALUE_LEN 512
  66. #define ATT_DEFAULT_L2CAP_MTU 48
  67. #define ATT_DEFAULT_LE_MTU 23
  68. #define ATT_CID 4
  69. #define ATT_PSM 31
  70. /* Flags for Execute Write Request Operation */
  71. #define ATT_CANCEL_ALL_PREP_WRITES 0x00
  72. #define ATT_WRITE_ALL_PREP_WRITES 0x01
  73. /* Find Information Response Formats */
  74. #define ATT_FIND_INFO_RESP_FMT_16BIT 0x01
  75. #define ATT_FIND_INFO_RESP_FMT_128BIT 0x02
  76. struct att_data_list {
  77. uint16_t num;
  78. uint16_t len;
  79. uint8_t **data;
  80. };
  81. struct att_range {
  82. uint16_t start;
  83. uint16_t end;
  84. };
  85. struct att_data_list *att_data_list_alloc(uint16_t num, uint16_t len);
  86. void att_data_list_free(struct att_data_list *list);
  87. const char *att_ecode2str(uint8_t status);
  88. uint16_t enc_read_by_grp_req(uint16_t start, uint16_t end, bt_uuid_t *uuid,
  89. uint8_t *pdu, size_t len);
  90. uint16_t dec_read_by_grp_req(const uint8_t *pdu, size_t len, uint16_t *start,
  91. uint16_t *end, bt_uuid_t *uuid);
  92. uint16_t enc_read_by_grp_resp(struct att_data_list *list, uint8_t *pdu,
  93. size_t len);
  94. uint16_t enc_find_by_type_req(uint16_t start, uint16_t end, bt_uuid_t *uuid,
  95. const uint8_t *value, size_t vlen, uint8_t *pdu,
  96. size_t len);
  97. uint16_t dec_find_by_type_req(const uint8_t *pdu, size_t len, uint16_t *start,
  98. uint16_t *end, bt_uuid_t *uuid, uint8_t *value, size_t *vlen);
  99. uint16_t enc_find_by_type_resp(GSList *ranges, uint8_t *pdu, size_t len);
  100. GSList *dec_find_by_type_resp(const uint8_t *pdu, size_t len);
  101. struct att_data_list *dec_read_by_grp_resp(const uint8_t *pdu, size_t len);
  102. uint16_t enc_read_by_type_req(uint16_t start, uint16_t end, bt_uuid_t *uuid,
  103. uint8_t *pdu, size_t len);
  104. uint16_t dec_read_by_type_req(const uint8_t *pdu, size_t len, uint16_t *start,
  105. uint16_t *end, bt_uuid_t *uuid);
  106. uint16_t enc_read_by_type_resp(struct att_data_list *list, uint8_t *pdu,
  107. size_t len);
  108. uint16_t enc_write_cmd(uint16_t handle, const uint8_t *value, size_t vlen,
  109. uint8_t *pdu, size_t len);
  110. uint16_t dec_write_cmd(const uint8_t *pdu, size_t len, uint16_t *handle,
  111. uint8_t *value, size_t *vlen);
  112. uint16_t enc_signed_write_cmd(uint16_t handle,
  113. const uint8_t *value, size_t vlen,
  114. struct bt_crypto *crypto,
  115. const uint8_t csrk[16],
  116. uint32_t sign_cnt,
  117. uint8_t *pdu, size_t len);
  118. uint16_t dec_signed_write_cmd(const uint8_t *pdu, size_t len,
  119. uint16_t *handle,
  120. uint8_t *value, size_t *vlen,
  121. uint8_t signature[12]);
  122. struct att_data_list *dec_read_by_type_resp(const uint8_t *pdu, size_t len);
  123. uint16_t enc_write_req(uint16_t handle, const uint8_t *value, size_t vlen,
  124. uint8_t *pdu, size_t len);
  125. uint16_t dec_write_req(const uint8_t *pdu, size_t len, uint16_t *handle,
  126. uint8_t *value, size_t *vlen);
  127. uint16_t enc_write_resp(uint8_t *pdu);
  128. uint16_t dec_write_resp(const uint8_t *pdu, size_t len);
  129. uint16_t enc_read_req(uint16_t handle, uint8_t *pdu, size_t len);
  130. uint16_t enc_read_blob_req(uint16_t handle, uint16_t offset, uint8_t *pdu,
  131. size_t len);
  132. uint16_t dec_read_req(const uint8_t *pdu, size_t len, uint16_t *handle);
  133. uint16_t dec_read_blob_req(const uint8_t *pdu, size_t len, uint16_t *handle,
  134. uint16_t *offset);
  135. uint16_t enc_read_resp(uint8_t *value, size_t vlen, uint8_t *pdu, size_t len);
  136. uint16_t enc_read_blob_resp(uint8_t *value, size_t vlen, uint16_t offset,
  137. uint8_t *pdu, size_t len);
  138. ssize_t dec_read_resp(const uint8_t *pdu, size_t len, uint8_t *value,
  139. size_t vlen);
  140. uint16_t enc_error_resp(uint8_t opcode, uint16_t handle, uint8_t status,
  141. uint8_t *pdu, size_t len);
  142. uint16_t enc_find_info_req(uint16_t start, uint16_t end, uint8_t *pdu,
  143. size_t len);
  144. uint16_t dec_find_info_req(const uint8_t *pdu, size_t len, uint16_t *start,
  145. uint16_t *end);
  146. uint16_t enc_find_info_resp(uint8_t format, struct att_data_list *list,
  147. uint8_t *pdu, size_t len);
  148. struct att_data_list *dec_find_info_resp(const uint8_t *pdu, size_t len,
  149. uint8_t *format);
  150. uint16_t enc_notification(uint16_t handle, uint8_t *value, size_t vlen,
  151. uint8_t *pdu, size_t len);
  152. uint16_t enc_indication(uint16_t handle, uint8_t *value, size_t vlen,
  153. uint8_t *pdu, size_t len);
  154. uint16_t dec_indication(const uint8_t *pdu, size_t len, uint16_t *handle,
  155. uint8_t *value, size_t vlen);
  156. uint16_t enc_confirmation(uint8_t *pdu, size_t len);
  157. uint16_t enc_mtu_req(uint16_t mtu, uint8_t *pdu, size_t len);
  158. uint16_t dec_mtu_req(const uint8_t *pdu, size_t len, uint16_t *mtu);
  159. uint16_t enc_mtu_resp(uint16_t mtu, uint8_t *pdu, size_t len);
  160. uint16_t dec_mtu_resp(const uint8_t *pdu, size_t len, uint16_t *mtu);
  161. uint16_t enc_prep_write_req(uint16_t handle, uint16_t offset,
  162. const uint8_t *value, size_t vlen,
  163. uint8_t *pdu, size_t len);
  164. uint16_t dec_prep_write_req(const uint8_t *pdu, size_t len, uint16_t *handle,
  165. uint16_t *offset, uint8_t *value, size_t *vlen);
  166. uint16_t enc_prep_write_resp(uint16_t handle, uint16_t offset,
  167. const uint8_t *value, size_t vlen,
  168. uint8_t *pdu, size_t len);
  169. uint16_t dec_prep_write_resp(const uint8_t *pdu, size_t len, uint16_t *handle,
  170. uint16_t *offset, uint8_t *value,
  171. size_t *vlen);
  172. uint16_t enc_exec_write_req(uint8_t flags, uint8_t *pdu, size_t len);
  173. uint16_t dec_exec_write_req(const uint8_t *pdu, size_t len, uint8_t *flags);
  174. uint16_t enc_exec_write_resp(uint8_t *pdu);
  175. uint16_t dec_exec_write_resp(const uint8_t *pdu, size_t len);