react-native-queue-player 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1218) hide show
  1. package/LICENSE +201 -0
  2. package/QueuePlayer.podspec +114 -0
  3. package/README.md +194 -0
  4. package/android/CMakeLists.txt +41 -0
  5. package/android/build.gradle +257 -0
  6. package/android/src/androidTest/java/com/margelo/nitro/queueplayer/SignalsmithStretchNativeTest.kt +136 -0
  7. package/android/src/main/AndroidManifest.xml +173 -0
  8. package/android/src/main/cpp/CMakeLists.txt +221 -0
  9. package/android/src/main/cpp/THIRD_PARTY_LICENSES +128 -0
  10. package/android/src/main/cpp/THIRD_PARTY_VERSIONS.txt +32 -0
  11. package/android/src/main/cpp/airplay2_audio.c +537 -0
  12. package/android/src/main/cpp/airplay2_audio.h +66 -0
  13. package/android/src/main/cpp/airplay2_control.c +680 -0
  14. package/android/src/main/cpp/airplay2_control.h +101 -0
  15. package/android/src/main/cpp/airplay2_crypto.c +548 -0
  16. package/android/src/main/cpp/airplay2_crypto.h +213 -0
  17. package/android/src/main/cpp/airplay2_dmap.c +81 -0
  18. package/android/src/main/cpp/airplay2_dmap.h +53 -0
  19. package/android/src/main/cpp/airplay2_filelog.h +100 -0
  20. package/android/src/main/cpp/airplay2_jni.cpp +579 -0
  21. package/android/src/main/cpp/airplay2_ntp.c +203 -0
  22. package/android/src/main/cpp/airplay2_ntp.h +39 -0
  23. package/android/src/main/cpp/airplay2_pair.c +653 -0
  24. package/android/src/main/cpp/airplay2_pair.h +114 -0
  25. package/android/src/main/cpp/airplay2_plist.c +840 -0
  26. package/android/src/main/cpp/airplay2_plist.h +184 -0
  27. package/android/src/main/cpp/airplay2_ptp.c +509 -0
  28. package/android/src/main/cpp/airplay2_ptp.h +40 -0
  29. package/android/src/main/cpp/airplay2_rtsp.c +693 -0
  30. package/android/src/main/cpp/airplay2_rtsp.h +90 -0
  31. package/android/src/main/cpp/airplay2_session.c +196 -0
  32. package/android/src/main/cpp/airplay2_session.h +197 -0
  33. package/android/src/main/cpp/airplay2_tlv.c +135 -0
  34. package/android/src/main/cpp/airplay2_tlv.h +87 -0
  35. package/android/src/main/cpp/airplay_jni.cpp +589 -0
  36. package/android/src/main/cpp/build-openssl-android.sh +94 -0
  37. package/android/src/main/cpp/cpp-adapter.cpp +11 -0
  38. package/android/src/main/cpp/prebuilt/libsodium/arm64-v8a/lib/libsodium.a +0 -0
  39. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/core.h +28 -0
  40. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_aead_aegis128l.h +92 -0
  41. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_aead_aegis256.h +92 -0
  42. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_aead_aes256gcm.h +179 -0
  43. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_aead_chacha20poly1305.h +180 -0
  44. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_aead_xchacha20poly1305.h +100 -0
  45. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_auth.h +46 -0
  46. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_auth_hmacsha256.h +70 -0
  47. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_auth_hmacsha512.h +68 -0
  48. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_auth_hmacsha512256.h +65 -0
  49. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_box.h +177 -0
  50. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_box_curve25519xchacha20poly1305.h +164 -0
  51. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_box_curve25519xsalsa20poly1305.h +112 -0
  52. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_ed25519.h +104 -0
  53. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_hchacha20.h +36 -0
  54. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_hsalsa20.h +36 -0
  55. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_ristretto255.h +100 -0
  56. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_salsa20.h +36 -0
  57. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_salsa2012.h +36 -0
  58. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_core_salsa208.h +40 -0
  59. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_generichash.h +84 -0
  60. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_generichash_blake2b.h +122 -0
  61. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_hash.h +40 -0
  62. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_hash_sha256.h +60 -0
  63. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_hash_sha512.h +60 -0
  64. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_kdf.h +53 -0
  65. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_kdf_blake2b.h +44 -0
  66. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_kdf_hkdf_sha256.h +74 -0
  67. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_kdf_hkdf_sha512.h +75 -0
  68. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_kx.h +66 -0
  69. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_onetimeauth.h +65 -0
  70. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_onetimeauth_poly1305.h +72 -0
  71. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_pwhash.h +147 -0
  72. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_pwhash_argon2i.h +122 -0
  73. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_pwhash_argon2id.h +122 -0
  74. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_pwhash_scryptsalsa208sha256.h +120 -0
  75. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_scalarmult.h +46 -0
  76. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_scalarmult_curve25519.h +42 -0
  77. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_scalarmult_ed25519.h +51 -0
  78. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_scalarmult_ristretto255.h +43 -0
  79. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_secretbox.h +93 -0
  80. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_secretbox_xchacha20poly1305.h +70 -0
  81. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_secretbox_xsalsa20poly1305.h +69 -0
  82. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_secretstream_xchacha20poly1305.h +108 -0
  83. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_shorthash.h +41 -0
  84. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_shorthash_siphash24.h +50 -0
  85. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_sign.h +107 -0
  86. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_sign_ed25519.h +124 -0
  87. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_sign_edwards25519sha512batch.h +55 -0
  88. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream.h +59 -0
  89. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream_chacha20.h +106 -0
  90. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream_salsa20.h +61 -0
  91. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream_salsa2012.h +53 -0
  92. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream_salsa208.h +56 -0
  93. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream_xchacha20.h +61 -0
  94. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_stream_xsalsa20.h +61 -0
  95. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_verify_16.h +23 -0
  96. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_verify_32.h +23 -0
  97. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/crypto_verify_64.h +23 -0
  98. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/export.h +57 -0
  99. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/randombytes.h +72 -0
  100. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/randombytes_internal_random.h +22 -0
  101. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/randombytes_sysrandom.h +19 -0
  102. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/runtime.h +55 -0
  103. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/utils.h +179 -0
  104. package/android/src/main/cpp/prebuilt/libsodium/include/sodium/version.h +33 -0
  105. package/android/src/main/cpp/prebuilt/libsodium/include/sodium.h +75 -0
  106. package/android/src/main/cpp/prebuilt/libsodium/x86_64/lib/libsodium.a +0 -0
  107. package/android/src/main/cpp/prebuilt/openssl/arm64-v8a/lib/libcrypto.a +0 -0
  108. package/android/src/main/cpp/prebuilt/openssl/arm64-v8a/lib/libssl.a +0 -0
  109. package/android/src/main/cpp/prebuilt/openssl/x86_64/lib/libcrypto.a +0 -0
  110. package/android/src/main/cpp/prebuilt/openssl/x86_64/lib/libssl.a +0 -0
  111. package/android/src/main/cpp/stretch_jni.cpp +171 -0
  112. package/android/src/main/cpp/third_party/alac/addons/alac_wrapper.cpp +198 -0
  113. package/android/src/main/cpp/third_party/alac/addons/alac_wrapper.h +46 -0
  114. package/android/src/main/cpp/third_party/alac/codec/ALACAudioTypes.h +197 -0
  115. package/android/src/main/cpp/third_party/alac/codec/ALACBitUtilities.c +260 -0
  116. package/android/src/main/cpp/third_party/alac/codec/ALACBitUtilities.h +104 -0
  117. package/android/src/main/cpp/third_party/alac/codec/ALACDecoder.cpp +730 -0
  118. package/android/src/main/cpp/third_party/alac/codec/ALACDecoder.h +65 -0
  119. package/android/src/main/cpp/third_party/alac/codec/ALACEncoder.cpp +1425 -0
  120. package/android/src/main/cpp/third_party/alac/codec/ALACEncoder.h +92 -0
  121. package/android/src/main/cpp/third_party/alac/codec/EndianPortable.c +181 -0
  122. package/android/src/main/cpp/third_party/alac/codec/EndianPortable.h +59 -0
  123. package/android/src/main/cpp/third_party/alac/codec/ag_dec.c +362 -0
  124. package/android/src/main/cpp/third_party/alac/codec/ag_enc.c +370 -0
  125. package/android/src/main/cpp/third_party/alac/codec/aglib.h +81 -0
  126. package/android/src/main/cpp/third_party/alac/codec/dp_dec.c +381 -0
  127. package/android/src/main/cpp/third_party/alac/codec/dp_enc.c +386 -0
  128. package/android/src/main/cpp/third_party/alac/codec/dplib.h +61 -0
  129. package/android/src/main/cpp/third_party/alac/codec/matrix_dec.c +390 -0
  130. package/android/src/main/cpp/third_party/alac/codec/matrix_enc.c +342 -0
  131. package/android/src/main/cpp/third_party/alac/codec/matrixlib.h +80 -0
  132. package/android/src/main/cpp/third_party/crosstools/cross_log.c +95 -0
  133. package/android/src/main/cpp/third_party/crosstools/cross_log.h +25 -0
  134. package/android/src/main/cpp/third_party/crosstools/cross_net.c +1139 -0
  135. package/android/src/main/cpp/third_party/crosstools/cross_net.h +51 -0
  136. package/android/src/main/cpp/third_party/crosstools/cross_ssl.c +371 -0
  137. package/android/src/main/cpp/third_party/crosstools/cross_ssl.h +15 -0
  138. package/android/src/main/cpp/third_party/crosstools/cross_thread.c +134 -0
  139. package/android/src/main/cpp/third_party/crosstools/cross_thread.h +20 -0
  140. package/android/src/main/cpp/third_party/crosstools/cross_util.c +753 -0
  141. package/android/src/main/cpp/third_party/crosstools/cross_util.h +125 -0
  142. package/android/src/main/cpp/third_party/crosstools/platform.c +227 -0
  143. package/android/src/main/cpp/third_party/crosstools/platform.h +127 -0
  144. package/android/src/main/cpp/third_party/curve25519/include/curve25519_dh.h +53 -0
  145. package/android/src/main/cpp/third_party/curve25519/include/ed25519_signature.h +98 -0
  146. package/android/src/main/cpp/third_party/curve25519/include/external_calls.h +36 -0
  147. package/android/src/main/cpp/third_party/curve25519/source/BaseTypes.h +125 -0
  148. package/android/src/main/cpp/third_party/curve25519/source/base_folding8.h +1288 -0
  149. package/android/src/main/cpp/third_party/curve25519/source/curve25519_dh.c +208 -0
  150. package/android/src/main/cpp/third_party/curve25519/source/curve25519_mehdi.c +410 -0
  151. package/android/src/main/cpp/third_party/curve25519/source/curve25519_mehdi.h +175 -0
  152. package/android/src/main/cpp/third_party/curve25519/source/curve25519_order.c +155 -0
  153. package/android/src/main/cpp/third_party/curve25519/source/curve25519_utils.c +153 -0
  154. package/android/src/main/cpp/third_party/curve25519/source/custom_blind.c +27 -0
  155. package/android/src/main/cpp/third_party/curve25519/source/custom_blind.h +11 -0
  156. package/android/src/main/cpp/third_party/curve25519/source/ed25519_sign.c +419 -0
  157. package/android/src/main/cpp/third_party/curve25519/source/ed25519_signature.h +98 -0
  158. package/android/src/main/cpp/third_party/curve25519/source/ed25519_verify.c +313 -0
  159. package/android/src/main/cpp/third_party/curve25519/source/sha512.c +294 -0
  160. package/android/src/main/cpp/third_party/curve25519/source/sha512.h +93 -0
  161. package/android/src/main/cpp/third_party/dmap-parser/dmap_parser.c +545 -0
  162. package/android/src/main/cpp/third_party/dmap-parser/dmap_parser.h +90 -0
  163. package/android/src/main/cpp/third_party/libraop/aes.c +863 -0
  164. package/android/src/main/cpp/third_party/libraop/aes.h +18 -0
  165. package/android/src/main/cpp/third_party/libraop/aes_ctr.c +89 -0
  166. package/android/src/main/cpp/third_party/libraop/aes_ctr.h +59 -0
  167. package/android/src/main/cpp/third_party/libraop/alac.c +1135 -0
  168. package/android/src/main/cpp/third_party/libraop/alac.h +55 -0
  169. package/android/src/main/cpp/third_party/libraop/raop_client.c +1500 -0
  170. package/android/src/main/cpp/third_party/libraop/raop_client.h +178 -0
  171. package/android/src/main/cpp/third_party/libraop/rtsp_client.c +743 -0
  172. package/android/src/main/cpp/third_party/libraop/rtsp_client.h +50 -0
  173. package/android/src/main/cpp/third_party/openssl/include/openssl/__DECC_INCLUDE_EPILOGUE.H +22 -0
  174. package/android/src/main/cpp/third_party/openssl/include/openssl/__DECC_INCLUDE_PROLOGUE.H +26 -0
  175. package/android/src/main/cpp/third_party/openssl/include/openssl/aes.h +111 -0
  176. package/android/src/main/cpp/third_party/openssl/include/openssl/asn1.h +1134 -0
  177. package/android/src/main/cpp/third_party/openssl/include/openssl/asn1.h.in +967 -0
  178. package/android/src/main/cpp/third_party/openssl/include/openssl/asn1err.h +142 -0
  179. package/android/src/main/cpp/third_party/openssl/include/openssl/asn1t.h +946 -0
  180. package/android/src/main/cpp/third_party/openssl/include/openssl/asn1t.h.in +923 -0
  181. package/android/src/main/cpp/third_party/openssl/include/openssl/async.h +104 -0
  182. package/android/src/main/cpp/third_party/openssl/include/openssl/asyncerr.h +29 -0
  183. package/android/src/main/cpp/third_party/openssl/include/openssl/bio.h +1022 -0
  184. package/android/src/main/cpp/third_party/openssl/include/openssl/bio.h.in +999 -0
  185. package/android/src/main/cpp/third_party/openssl/include/openssl/bioerr.h +72 -0
  186. package/android/src/main/cpp/third_party/openssl/include/openssl/blowfish.h +78 -0
  187. package/android/src/main/cpp/third_party/openssl/include/openssl/bn.h +590 -0
  188. package/android/src/main/cpp/third_party/openssl/include/openssl/bnerr.h +47 -0
  189. package/android/src/main/cpp/third_party/openssl/include/openssl/buffer.h +62 -0
  190. package/android/src/main/cpp/third_party/openssl/include/openssl/buffererr.h +25 -0
  191. package/android/src/main/cpp/third_party/openssl/include/openssl/byteorder.h +339 -0
  192. package/android/src/main/cpp/third_party/openssl/include/openssl/camellia.h +117 -0
  193. package/android/src/main/cpp/third_party/openssl/include/openssl/cast.h +71 -0
  194. package/android/src/main/cpp/third_party/openssl/include/openssl/cmac.h +52 -0
  195. package/android/src/main/cpp/third_party/openssl/include/openssl/cmp.h +727 -0
  196. package/android/src/main/cpp/third_party/openssl/include/openssl/cmp.h.in +584 -0
  197. package/android/src/main/cpp/third_party/openssl/include/openssl/cmp_util.h +56 -0
  198. package/android/src/main/cpp/third_party/openssl/include/openssl/cmperr.h +134 -0
  199. package/android/src/main/cpp/third_party/openssl/include/openssl/cms.h +511 -0
  200. package/android/src/main/cpp/third_party/openssl/include/openssl/cms.h.in +413 -0
  201. package/android/src/main/cpp/third_party/openssl/include/openssl/cmserr.h +126 -0
  202. package/android/src/main/cpp/third_party/openssl/include/openssl/comp.h +98 -0
  203. package/android/src/main/cpp/third_party/openssl/include/openssl/comp.h.in +76 -0
  204. package/android/src/main/cpp/third_party/openssl/include/openssl/comperr.h +38 -0
  205. package/android/src/main/cpp/third_party/openssl/include/openssl/conf.h +214 -0
  206. package/android/src/main/cpp/third_party/openssl/include/openssl/conf.h.in +177 -0
  207. package/android/src/main/cpp/third_party/openssl/include/openssl/conf_api.h +46 -0
  208. package/android/src/main/cpp/third_party/openssl/include/openssl/conferr.h +52 -0
  209. package/android/src/main/cpp/third_party/openssl/include/openssl/configuration.h +212 -0
  210. package/android/src/main/cpp/third_party/openssl/include/openssl/configuration.h.in +75 -0
  211. package/android/src/main/cpp/third_party/openssl/include/openssl/conftypes.h +44 -0
  212. package/android/src/main/cpp/third_party/openssl/include/openssl/core.h +236 -0
  213. package/android/src/main/cpp/third_party/openssl/include/openssl/core_dispatch.h +1141 -0
  214. package/android/src/main/cpp/third_party/openssl/include/openssl/core_names.h +575 -0
  215. package/android/src/main/cpp/third_party/openssl/include/openssl/core_names.h.in +126 -0
  216. package/android/src/main/cpp/third_party/openssl/include/openssl/core_object.h +41 -0
  217. package/android/src/main/cpp/third_party/openssl/include/openssl/crmf.h +278 -0
  218. package/android/src/main/cpp/third_party/openssl/include/openssl/crmf.h.in +207 -0
  219. package/android/src/main/cpp/third_party/openssl/include/openssl/crmferr.h +57 -0
  220. package/android/src/main/cpp/third_party/openssl/include/openssl/crypto.h +583 -0
  221. package/android/src/main/cpp/third_party/openssl/include/openssl/crypto.h.in +560 -0
  222. package/android/src/main/cpp/third_party/openssl/include/openssl/cryptoerr.h +56 -0
  223. package/android/src/main/cpp/third_party/openssl/include/openssl/cryptoerr_legacy.h +1466 -0
  224. package/android/src/main/cpp/third_party/openssl/include/openssl/ct.h +573 -0
  225. package/android/src/main/cpp/third_party/openssl/include/openssl/ct.h.in +525 -0
  226. package/android/src/main/cpp/third_party/openssl/include/openssl/cterr.h +45 -0
  227. package/android/src/main/cpp/third_party/openssl/include/openssl/decoder.h +133 -0
  228. package/android/src/main/cpp/third_party/openssl/include/openssl/decodererr.h +28 -0
  229. package/android/src/main/cpp/third_party/openssl/include/openssl/des.h +211 -0
  230. package/android/src/main/cpp/third_party/openssl/include/openssl/dh.h +339 -0
  231. package/android/src/main/cpp/third_party/openssl/include/openssl/dherr.h +59 -0
  232. package/android/src/main/cpp/third_party/openssl/include/openssl/dsa.h +280 -0
  233. package/android/src/main/cpp/third_party/openssl/include/openssl/dsaerr.h +44 -0
  234. package/android/src/main/cpp/third_party/openssl/include/openssl/dtls1.h +57 -0
  235. package/android/src/main/cpp/third_party/openssl/include/openssl/e_os2.h +310 -0
  236. package/android/src/main/cpp/third_party/openssl/include/openssl/e_ostime.h +38 -0
  237. package/android/src/main/cpp/third_party/openssl/include/openssl/ebcdic.h +39 -0
  238. package/android/src/main/cpp/third_party/openssl/include/openssl/ec.h +1588 -0
  239. package/android/src/main/cpp/third_party/openssl/include/openssl/ecdh.h +10 -0
  240. package/android/src/main/cpp/third_party/openssl/include/openssl/ecdsa.h +10 -0
  241. package/android/src/main/cpp/third_party/openssl/include/openssl/ecerr.h +104 -0
  242. package/android/src/main/cpp/third_party/openssl/include/openssl/encoder.h +124 -0
  243. package/android/src/main/cpp/third_party/openssl/include/openssl/encodererr.h +28 -0
  244. package/android/src/main/cpp/third_party/openssl/include/openssl/engine.h +833 -0
  245. package/android/src/main/cpp/third_party/openssl/include/openssl/engineerr.h +63 -0
  246. package/android/src/main/cpp/third_party/openssl/include/openssl/err.h +512 -0
  247. package/android/src/main/cpp/third_party/openssl/include/openssl/err.h.in +501 -0
  248. package/android/src/main/cpp/third_party/openssl/include/openssl/ess.h +128 -0
  249. package/android/src/main/cpp/third_party/openssl/include/openssl/ess.h.in +81 -0
  250. package/android/src/main/cpp/third_party/openssl/include/openssl/esserr.h +32 -0
  251. package/android/src/main/cpp/third_party/openssl/include/openssl/evp.h +2310 -0
  252. package/android/src/main/cpp/third_party/openssl/include/openssl/evperr.h +142 -0
  253. package/android/src/main/cpp/third_party/openssl/include/openssl/fips_names.h +50 -0
  254. package/android/src/main/cpp/third_party/openssl/include/openssl/fipskey.h +41 -0
  255. package/android/src/main/cpp/third_party/openssl/include/openssl/fipskey.h.in +40 -0
  256. package/android/src/main/cpp/third_party/openssl/include/openssl/hmac.h +62 -0
  257. package/android/src/main/cpp/third_party/openssl/include/openssl/hpke.h +169 -0
  258. package/android/src/main/cpp/third_party/openssl/include/openssl/http.h +119 -0
  259. package/android/src/main/cpp/third_party/openssl/include/openssl/httperr.h +56 -0
  260. package/android/src/main/cpp/third_party/openssl/include/openssl/idea.h +82 -0
  261. package/android/src/main/cpp/third_party/openssl/include/openssl/indicator.h +31 -0
  262. package/android/src/main/cpp/third_party/openssl/include/openssl/kdf.h +138 -0
  263. package/android/src/main/cpp/third_party/openssl/include/openssl/kdferr.h +16 -0
  264. package/android/src/main/cpp/third_party/openssl/include/openssl/lhash.h +398 -0
  265. package/android/src/main/cpp/third_party/openssl/include/openssl/lhash.h.in +373 -0
  266. package/android/src/main/cpp/third_party/openssl/include/openssl/macros.h +349 -0
  267. package/android/src/main/cpp/third_party/openssl/include/openssl/md2.h +56 -0
  268. package/android/src/main/cpp/third_party/openssl/include/openssl/md4.h +63 -0
  269. package/android/src/main/cpp/third_party/openssl/include/openssl/md5.h +62 -0
  270. package/android/src/main/cpp/third_party/openssl/include/openssl/mdc2.h +55 -0
  271. package/android/src/main/cpp/third_party/openssl/include/openssl/ml_kem.h +31 -0
  272. package/android/src/main/cpp/third_party/openssl/include/openssl/modes.h +219 -0
  273. package/android/src/main/cpp/third_party/openssl/include/openssl/obj_mac.h +6636 -0
  274. package/android/src/main/cpp/third_party/openssl/include/openssl/objects.h +184 -0
  275. package/android/src/main/cpp/third_party/openssl/include/openssl/objectserr.h +28 -0
  276. package/android/src/main/cpp/third_party/openssl/include/openssl/ocsp.h +483 -0
  277. package/android/src/main/cpp/third_party/openssl/include/openssl/ocsp.h.in +387 -0
  278. package/android/src/main/cpp/third_party/openssl/include/openssl/ocsperr.h +53 -0
  279. package/android/src/main/cpp/third_party/openssl/include/openssl/opensslconf.h +17 -0
  280. package/android/src/main/cpp/third_party/openssl/include/openssl/opensslv.h +114 -0
  281. package/android/src/main/cpp/third_party/openssl/include/openssl/opensslv.h.in +113 -0
  282. package/android/src/main/cpp/third_party/openssl/include/openssl/ossl_typ.h +16 -0
  283. package/android/src/main/cpp/third_party/openssl/include/openssl/param_build.h +63 -0
  284. package/android/src/main/cpp/third_party/openssl/include/openssl/params.h +163 -0
  285. package/android/src/main/cpp/third_party/openssl/include/openssl/pem.h +547 -0
  286. package/android/src/main/cpp/third_party/openssl/include/openssl/pem2.h +19 -0
  287. package/android/src/main/cpp/third_party/openssl/include/openssl/pemerr.h +59 -0
  288. package/android/src/main/cpp/third_party/openssl/include/openssl/pkcs12.h +366 -0
  289. package/android/src/main/cpp/third_party/openssl/include/openssl/pkcs12.h.in +343 -0
  290. package/android/src/main/cpp/third_party/openssl/include/openssl/pkcs12err.h +46 -0
  291. package/android/src/main/cpp/third_party/openssl/include/openssl/pkcs7.h +430 -0
  292. package/android/src/main/cpp/third_party/openssl/include/openssl/pkcs7.h.in +359 -0
  293. package/android/src/main/cpp/third_party/openssl/include/openssl/pkcs7err.h +63 -0
  294. package/android/src/main/cpp/third_party/openssl/include/openssl/prov_ssl.h +38 -0
  295. package/android/src/main/cpp/third_party/openssl/include/openssl/proverr.h +169 -0
  296. package/android/src/main/cpp/third_party/openssl/include/openssl/provider.h +94 -0
  297. package/android/src/main/cpp/third_party/openssl/include/openssl/quic.h +75 -0
  298. package/android/src/main/cpp/third_party/openssl/include/openssl/rand.h +131 -0
  299. package/android/src/main/cpp/third_party/openssl/include/openssl/randerr.h +70 -0
  300. package/android/src/main/cpp/third_party/openssl/include/openssl/rc2.h +68 -0
  301. package/android/src/main/cpp/third_party/openssl/include/openssl/rc4.h +47 -0
  302. package/android/src/main/cpp/third_party/openssl/include/openssl/rc5.h +79 -0
  303. package/android/src/main/cpp/third_party/openssl/include/openssl/ripemd.h +59 -0
  304. package/android/src/main/cpp/third_party/openssl/include/openssl/rsa.h +615 -0
  305. package/android/src/main/cpp/third_party/openssl/include/openssl/rsaerr.h +107 -0
  306. package/android/src/main/cpp/third_party/openssl/include/openssl/safestack.h +297 -0
  307. package/android/src/main/cpp/third_party/openssl/include/openssl/safestack.h.in +227 -0
  308. package/android/src/main/cpp/third_party/openssl/include/openssl/seed.h +113 -0
  309. package/android/src/main/cpp/third_party/openssl/include/openssl/self_test.h +112 -0
  310. package/android/src/main/cpp/third_party/openssl/include/openssl/sha.h +139 -0
  311. package/android/src/main/cpp/third_party/openssl/include/openssl/srp.h +285 -0
  312. package/android/src/main/cpp/third_party/openssl/include/openssl/srp.h.in +214 -0
  313. package/android/src/main/cpp/third_party/openssl/include/openssl/srtp.h +68 -0
  314. package/android/src/main/cpp/third_party/openssl/include/openssl/ssl.h +2933 -0
  315. package/android/src/main/cpp/third_party/openssl/include/openssl/ssl.h.in +2886 -0
  316. package/android/src/main/cpp/third_party/openssl/include/openssl/ssl2.h +30 -0
  317. package/android/src/main/cpp/third_party/openssl/include/openssl/ssl3.h +358 -0
  318. package/android/src/main/cpp/third_party/openssl/include/openssl/sslerr.h +382 -0
  319. package/android/src/main/cpp/third_party/openssl/include/openssl/sslerr_legacy.h +467 -0
  320. package/android/src/main/cpp/third_party/openssl/include/openssl/stack.h +90 -0
  321. package/android/src/main/cpp/third_party/openssl/include/openssl/store.h +377 -0
  322. package/android/src/main/cpp/third_party/openssl/include/openssl/storeerr.h +49 -0
  323. package/android/src/main/cpp/third_party/openssl/include/openssl/symhacks.h +39 -0
  324. package/android/src/main/cpp/third_party/openssl/include/openssl/thread.h +31 -0
  325. package/android/src/main/cpp/third_party/openssl/include/openssl/tls1.h +1220 -0
  326. package/android/src/main/cpp/third_party/openssl/include/openssl/trace.h +321 -0
  327. package/android/src/main/cpp/third_party/openssl/include/openssl/ts.h +522 -0
  328. package/android/src/main/cpp/third_party/openssl/include/openssl/tserr.h +67 -0
  329. package/android/src/main/cpp/third_party/openssl/include/openssl/txt_db.h +63 -0
  330. package/android/src/main/cpp/third_party/openssl/include/openssl/types.h +248 -0
  331. package/android/src/main/cpp/third_party/openssl/include/openssl/ui.h +407 -0
  332. package/android/src/main/cpp/third_party/openssl/include/openssl/ui.h.in +384 -0
  333. package/android/src/main/cpp/third_party/openssl/include/openssl/uierr.h +38 -0
  334. package/android/src/main/cpp/third_party/openssl/include/openssl/whrlpool.h +62 -0
  335. package/android/src/main/cpp/third_party/openssl/include/openssl/x509.h +1303 -0
  336. package/android/src/main/cpp/third_party/openssl/include/openssl/x509.h.in +1109 -0
  337. package/android/src/main/cpp/third_party/openssl/include/openssl/x509_acert.h +294 -0
  338. package/android/src/main/cpp/third_party/openssl/include/openssl/x509_acert.h.in +199 -0
  339. package/android/src/main/cpp/third_party/openssl/include/openssl/x509_vfy.h +903 -0
  340. package/android/src/main/cpp/third_party/openssl/include/openssl/x509_vfy.h.in +806 -0
  341. package/android/src/main/cpp/third_party/openssl/include/openssl/x509err.h +70 -0
  342. package/android/src/main/cpp/third_party/openssl/include/openssl/x509v3.h +1968 -0
  343. package/android/src/main/cpp/third_party/openssl/include/openssl/x509v3.h.in +1367 -0
  344. package/android/src/main/cpp/third_party/openssl/include/openssl/x509v3err.h +97 -0
  345. package/android/src/main/cpp/third_party/pair_ap/pair-internal.h +390 -0
  346. package/android/src/main/cpp/third_party/pair_ap/pair-tlv.c +221 -0
  347. package/android/src/main/cpp/third_party/pair_ap/pair-tlv.h +77 -0
  348. package/android/src/main/cpp/third_party/pair_ap/pair.c +806 -0
  349. package/android/src/main/cpp/third_party/pair_ap/pair.h +266 -0
  350. package/android/src/main/cpp/third_party/pair_ap/pair_fruit_stub.c +36 -0
  351. package/android/src/main/cpp/third_party/pair_ap/pair_homekit.c +3190 -0
  352. package/android/src/main/cpp/third_party/signalsmith/LICENSE-signalsmith-linear.txt +21 -0
  353. package/android/src/main/cpp/third_party/signalsmith/LICENSE-signalsmith-stretch.txt +21 -0
  354. package/android/src/main/cpp/third_party/signalsmith/THIRD_PARTY_VERSIONS.txt +9 -0
  355. package/android/src/main/cpp/third_party/signalsmith/include/signalsmith-linear/fft.h +1380 -0
  356. package/android/src/main/cpp/third_party/signalsmith/include/signalsmith-linear/linear.h +1075 -0
  357. package/android/src/main/cpp/third_party/signalsmith/include/signalsmith-linear/stft.h +643 -0
  358. package/android/src/main/cpp/third_party/signalsmith/include/signalsmith-stretch.h +1060 -0
  359. package/android/src/main/java/com/margelo/nitro/queueplayer/AirPlayEngine.kt +314 -0
  360. package/android/src/main/java/com/margelo/nitro/queueplayer/ArtworkContentProvider.kt +124 -0
  361. package/android/src/main/java/com/margelo/nitro/queueplayer/AudioFocusErrorMapping.kt +89 -0
  362. package/android/src/main/java/com/margelo/nitro/queueplayer/AudioPipelineRenderersFactory.kt +60 -0
  363. package/android/src/main/java/com/margelo/nitro/queueplayer/BrowseCallbackRegistry.kt +136 -0
  364. package/android/src/main/java/com/margelo/nitro/queueplayer/BrowseDataProvider.kt +128 -0
  365. package/android/src/main/java/com/margelo/nitro/queueplayer/BufferStateTranslator.kt +35 -0
  366. package/android/src/main/java/com/margelo/nitro/queueplayer/CacheMimeTypes.kt +79 -0
  367. package/android/src/main/java/com/margelo/nitro/queueplayer/CastManager.kt +629 -0
  368. package/android/src/main/java/com/margelo/nitro/queueplayer/CrossfadeEngine.kt +1350 -0
  369. package/android/src/main/java/com/margelo/nitro/queueplayer/CrossfadeForwardingPlayer.kt +66 -0
  370. package/android/src/main/java/com/margelo/nitro/queueplayer/CustomPresetStore.kt +100 -0
  371. package/android/src/main/java/com/margelo/nitro/queueplayer/Equalizer.kt +348 -0
  372. package/android/src/main/java/com/margelo/nitro/queueplayer/EqualizerEngine.kt +222 -0
  373. package/android/src/main/java/com/margelo/nitro/queueplayer/EqualizerLegacyEngine.kt +213 -0
  374. package/android/src/main/java/com/margelo/nitro/queueplayer/EqualizerPresets.kt +45 -0
  375. package/android/src/main/java/com/margelo/nitro/queueplayer/FFTProcessorTee.kt +173 -0
  376. package/android/src/main/java/com/margelo/nitro/queueplayer/FifoCacheEvictor.kt +96 -0
  377. package/android/src/main/java/com/margelo/nitro/queueplayer/GaplessEngine.kt +587 -0
  378. package/android/src/main/java/com/margelo/nitro/queueplayer/HeadlessJsMediaService.kt +220 -0
  379. package/android/src/main/java/com/margelo/nitro/queueplayer/IEqualizerEngine.kt +97 -0
  380. package/android/src/main/java/com/margelo/nitro/queueplayer/ListenerRegistry.kt +59 -0
  381. package/android/src/main/java/com/margelo/nitro/queueplayer/LookaheadCache.kt +343 -0
  382. package/android/src/main/java/com/margelo/nitro/queueplayer/LookaheadCacheWriter.kt +533 -0
  383. package/android/src/main/java/com/margelo/nitro/queueplayer/MediaButtonDispatch.kt +88 -0
  384. package/android/src/main/java/com/margelo/nitro/queueplayer/MediaItemBuilder.kt +281 -0
  385. package/android/src/main/java/com/margelo/nitro/queueplayer/MediaItemMapper.kt +76 -0
  386. package/android/src/main/java/com/margelo/nitro/queueplayer/MilestoneTracker.kt +66 -0
  387. package/android/src/main/java/com/margelo/nitro/queueplayer/MimeCapturingDataSource.kt +64 -0
  388. package/android/src/main/java/com/margelo/nitro/queueplayer/MultiplexingAudioBufferSink.kt +92 -0
  389. package/android/src/main/java/com/margelo/nitro/queueplayer/NotificationProvider.kt +37 -0
  390. package/android/src/main/java/com/margelo/nitro/queueplayer/NowPlayingFormatExtractor.kt +166 -0
  391. package/android/src/main/java/com/margelo/nitro/queueplayer/PendingBrowseRequests.kt +70 -0
  392. package/android/src/main/java/com/margelo/nitro/queueplayer/PendingIntentBuffer.kt +82 -0
  393. package/android/src/main/java/com/margelo/nitro/queueplayer/PitchAwareAudioProcessorChain.kt +69 -0
  394. package/android/src/main/java/com/margelo/nitro/queueplayer/PitchCorrection.kt +27 -0
  395. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaceholderArtwork.kt +65 -0
  396. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaceholderFallbackBitmapLoader.kt +75 -0
  397. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaybackEngine.kt +336 -0
  398. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaybackErrorMapping.kt +175 -0
  399. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaybackModeStateMachine.kt +127 -0
  400. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaybackService.kt +1716 -0
  401. package/android/src/main/java/com/margelo/nitro/queueplayer/PlaybackServiceCallback.kt +755 -0
  402. package/android/src/main/java/com/margelo/nitro/queueplayer/ProgressEmissionGate.kt +70 -0
  403. package/android/src/main/java/com/margelo/nitro/queueplayer/QueueMutationArithmetic.kt +131 -0
  404. package/android/src/main/java/com/margelo/nitro/queueplayer/QueuePlayerPackage.kt +22 -0
  405. package/android/src/main/java/com/margelo/nitro/queueplayer/QueueSkipArithmetic.kt +113 -0
  406. package/android/src/main/java/com/margelo/nitro/queueplayer/RadixTwoFFT.kt +176 -0
  407. package/android/src/main/java/com/margelo/nitro/queueplayer/RemoteCommandDeduper.kt +81 -0
  408. package/android/src/main/java/com/margelo/nitro/queueplayer/ReplayGainAudioProcessor.kt +84 -0
  409. package/android/src/main/java/com/margelo/nitro/queueplayer/ReplayGainConfig.kt +34 -0
  410. package/android/src/main/java/com/margelo/nitro/queueplayer/ReplayGainData.kt +44 -0
  411. package/android/src/main/java/com/margelo/nitro/queueplayer/ReplayGainExtractor.kt +209 -0
  412. package/android/src/main/java/com/margelo/nitro/queueplayer/ReplayGainGain.kt +34 -0
  413. package/android/src/main/java/com/margelo/nitro/queueplayer/SearchResultCache.kt +72 -0
  414. package/android/src/main/java/com/margelo/nitro/queueplayer/SessionCommandForwardingPlayer.kt +167 -0
  415. package/android/src/main/java/com/margelo/nitro/queueplayer/SignalsmithStretchAudioProcessor.kt +225 -0
  416. package/android/src/main/java/com/margelo/nitro/queueplayer/SignalsmithStretchNative.kt +93 -0
  417. package/android/src/main/java/com/margelo/nitro/queueplayer/SleepTimerCore.kt +125 -0
  418. package/android/src/main/java/com/margelo/nitro/queueplayer/TrackPlayer.kt +4242 -0
  419. package/android/src/main/java/com/margelo/nitro/queueplayer/TransportStateTranslator.kt +70 -0
  420. package/android/src/main/java/com/margelo/nitro/queueplayer/UrlSchemes.kt +9 -0
  421. package/android/src/main/java/com/margelo/nitro/queueplayer/VisualizationGate.kt +35 -0
  422. package/android/src/main/java/com/margelo/nitro/queueplayer/Visualizer.kt +240 -0
  423. package/android/src/main/java/com/margelo/nitro/queueplayer/VisualizerTeeBuilder.kt +63 -0
  424. package/android/src/main/java/com/margelo/nitro/queueplayer/VoiceSearchExtrasParser.kt +103 -0
  425. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/AudioRouteState.kt +202 -0
  426. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/AuthRequiredException.kt +14 -0
  427. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastBackend.kt +41 -0
  428. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastBackends.kt +56 -0
  429. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastEventBridge.kt +122 -0
  430. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastMediaItem.kt +20 -0
  431. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastSession.kt +193 -0
  432. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastSinkRouter.kt +95 -0
  433. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/CastTransportRouter.kt +151 -0
  434. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/DiscoveryState.kt +53 -0
  435. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/MetadataAwareSession.kt +17 -0
  436. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/PlaybackStateRouter.kt +65 -0
  437. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/Receiver.kt +35 -0
  438. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlay2JNI.kt +129 -0
  439. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlay2MetadataSync.kt +189 -0
  440. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlay2Session.kt +123 -0
  441. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlay2Sink.kt +205 -0
  442. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayBackend.kt +585 -0
  443. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayBackendInitializer.kt +43 -0
  444. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayDiscovery.kt +511 -0
  445. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayDiscoveryLifecycleObserver.kt +57 -0
  446. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayMetadataSync.kt +199 -0
  447. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayReceiverMapper.kt +42 -0
  448. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayRenderersFactory.kt +43 -0
  449. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlaySession.kt +101 -0
  450. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlaySink.kt +265 -0
  451. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayTxtParser.kt +203 -0
  452. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/AirplayJNI.kt +106 -0
  453. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/airplay/MulticastLockHolder.kt +75 -0
  454. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/CastMediaItemConverter.kt +67 -0
  455. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/CastVolumeForwardingPlayer.kt +156 -0
  456. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/ChromecastBackend.kt +171 -0
  457. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/ChromecastOptionsProvider.kt +51 -0
  458. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/ChromecastReceiverMapper.kt +44 -0
  459. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/ChromecastSession.kt +544 -0
  460. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/MediaInfoBuilder.kt +92 -0
  461. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/chromecast/RemoteMediaCallbacks.kt +113 -0
  462. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/http/LocalMediaServer.kt +160 -0
  463. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/http/LocalMediaServerLifecycle.kt +15 -0
  464. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/http/MediaServerHandle.kt +44 -0
  465. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/http/MediaTokenRegistry.kt +37 -0
  466. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/http/MimeTypes.kt +27 -0
  467. package/android/src/main/java/com/margelo/nitro/queueplayer/cast/net/LocalAddressMonitor.kt +86 -0
  468. package/android/src/main/res/raw/rnqp_placeholder.jpg +0 -0
  469. package/android/src/main/res/values/cast_strings.xml +15 -0
  470. package/android/src/main/res/values/strings.xml +24 -0
  471. package/android/src/main/res/xml/automotive_app_desc.xml +15 -0
  472. package/android/src/test/java/androidx/media3/session/MediaSessionControllerRequestTestSeam.kt +27 -0
  473. package/android/src/test/java/com/margelo/nitro/queueplayer/ArtworkContentProviderTest.kt +124 -0
  474. package/android/src/test/java/com/margelo/nitro/queueplayer/AudioFocusErrorMappingTest.kt +122 -0
  475. package/android/src/test/java/com/margelo/nitro/queueplayer/AudioPipelineRenderersFactoryTest.kt +57 -0
  476. package/android/src/test/java/com/margelo/nitro/queueplayer/AvrcpMetadataTest.kt +264 -0
  477. package/android/src/test/java/com/margelo/nitro/queueplayer/BrowseCallbackRegistryTest.kt +104 -0
  478. package/android/src/test/java/com/margelo/nitro/queueplayer/BrowseDataProviderTest.kt +276 -0
  479. package/android/src/test/java/com/margelo/nitro/queueplayer/BufferStateTranslatorTest.kt +58 -0
  480. package/android/src/test/java/com/margelo/nitro/queueplayer/CacheMimeTypesTest.kt +116 -0
  481. package/android/src/test/java/com/margelo/nitro/queueplayer/CrossfadeEngineLifecycleTest.kt +214 -0
  482. package/android/src/test/java/com/margelo/nitro/queueplayer/CrossfadeEngineReplayGainTest.kt +180 -0
  483. package/android/src/test/java/com/margelo/nitro/queueplayer/CustomPresetStoreTest.kt +128 -0
  484. package/android/src/test/java/com/margelo/nitro/queueplayer/EqualizerEngineTest.kt +223 -0
  485. package/android/src/test/java/com/margelo/nitro/queueplayer/EqualizerKtTest.kt +274 -0
  486. package/android/src/test/java/com/margelo/nitro/queueplayer/EqualizerLegacyEngineTest.kt +214 -0
  487. package/android/src/test/java/com/margelo/nitro/queueplayer/EqualizerPresetsTest.kt +89 -0
  488. package/android/src/test/java/com/margelo/nitro/queueplayer/FFTProcessorTeeTest.kt +185 -0
  489. package/android/src/test/java/com/margelo/nitro/queueplayer/FifoCacheEvictorTest.kt +112 -0
  490. package/android/src/test/java/com/margelo/nitro/queueplayer/ForwardingPlayerTestAccess.kt +21 -0
  491. package/android/src/test/java/com/margelo/nitro/queueplayer/GaplessEngineLifecycleTest.kt +65 -0
  492. package/android/src/test/java/com/margelo/nitro/queueplayer/GaplessEngineReplayGainTest.kt +154 -0
  493. package/android/src/test/java/com/margelo/nitro/queueplayer/HeadlessJsMediaServiceTest.kt +106 -0
  494. package/android/src/test/java/com/margelo/nitro/queueplayer/LookaheadCacheTest.kt +183 -0
  495. package/android/src/test/java/com/margelo/nitro/queueplayer/LookaheadCacheWriterTest.kt +649 -0
  496. package/android/src/test/java/com/margelo/nitro/queueplayer/MediaButtonDispatchTest.kt +192 -0
  497. package/android/src/test/java/com/margelo/nitro/queueplayer/MediaItemBuilderTest.kt +389 -0
  498. package/android/src/test/java/com/margelo/nitro/queueplayer/MediaItemMapperTest.kt +145 -0
  499. package/android/src/test/java/com/margelo/nitro/queueplayer/MilestoneTrackerTest.kt +81 -0
  500. package/android/src/test/java/com/margelo/nitro/queueplayer/MultiplexingAudioBufferSinkTest.kt +112 -0
  501. package/android/src/test/java/com/margelo/nitro/queueplayer/NotificationProviderTest.kt +86 -0
  502. package/android/src/test/java/com/margelo/nitro/queueplayer/NowPlayingFormatExtractorTest.kt +106 -0
  503. package/android/src/test/java/com/margelo/nitro/queueplayer/PendingBrowseRequestsTest.kt +82 -0
  504. package/android/src/test/java/com/margelo/nitro/queueplayer/PendingIntentBufferTest.kt +192 -0
  505. package/android/src/test/java/com/margelo/nitro/queueplayer/PitchAwareAudioProcessorChainTest.kt +147 -0
  506. package/android/src/test/java/com/margelo/nitro/queueplayer/PitchCorrectionTest.kt +55 -0
  507. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaceholderFallbackBitmapLoaderTest.kt +187 -0
  508. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackEngineInterfaceTest.kt +134 -0
  509. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackModeStateMachineTest.kt +157 -0
  510. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceArtworkLoaderTest.kt +95 -0
  511. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceCallbackBrowseTest.kt +480 -0
  512. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceCallbackSearchTest.kt +171 -0
  513. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceCallbackTest.kt +773 -0
  514. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceCastBindTest.kt +100 -0
  515. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceLifecycleTest.kt +315 -0
  516. package/android/src/test/java/com/margelo/nitro/queueplayer/PlaybackServiceSessionActivityTest.kt +121 -0
  517. package/android/src/test/java/com/margelo/nitro/queueplayer/PlayerCommandsForTest.kt +246 -0
  518. package/android/src/test/java/com/margelo/nitro/queueplayer/ProgressEmissionGateTest.kt +113 -0
  519. package/android/src/test/java/com/margelo/nitro/queueplayer/QueueMutationArithmeticTest.kt +252 -0
  520. package/android/src/test/java/com/margelo/nitro/queueplayer/QueueSkipArithmeticTest.kt +343 -0
  521. package/android/src/test/java/com/margelo/nitro/queueplayer/RadixTwoFFTTest.kt +109 -0
  522. package/android/src/test/java/com/margelo/nitro/queueplayer/RemoteCommandDeduperTest.kt +106 -0
  523. package/android/src/test/java/com/margelo/nitro/queueplayer/ReplayGainAudioProcessorTest.kt +141 -0
  524. package/android/src/test/java/com/margelo/nitro/queueplayer/ReplayGainConfigTest.kt +103 -0
  525. package/android/src/test/java/com/margelo/nitro/queueplayer/ReplayGainExtractorTest.kt +469 -0
  526. package/android/src/test/java/com/margelo/nitro/queueplayer/ReplayGainGainTest.kt +129 -0
  527. package/android/src/test/java/com/margelo/nitro/queueplayer/RobolectricServiceBindHelper.kt +83 -0
  528. package/android/src/test/java/com/margelo/nitro/queueplayer/SearchResultCacheTest.kt +128 -0
  529. package/android/src/test/java/com/margelo/nitro/queueplayer/ServiceReadyReasonTest.kt +42 -0
  530. package/android/src/test/java/com/margelo/nitro/queueplayer/SessionCommandForwardingPlayerTest.kt +521 -0
  531. package/android/src/test/java/com/margelo/nitro/queueplayer/SleepTimerCoreTest.kt +125 -0
  532. package/android/src/test/java/com/margelo/nitro/queueplayer/SmokeTest.kt +27 -0
  533. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerAirPlayMetadataWiringTest.kt +305 -0
  534. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerAudioFocusTest.kt +179 -0
  535. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerEventsTest.kt +497 -0
  536. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerLifecycleTest.kt +209 -0
  537. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerLookaheadConfigTest.kt +417 -0
  538. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerMutationTest.kt +473 -0
  539. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerPitchCorrectionTest.kt +61 -0
  540. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerPlaybackModeTest.kt +28 -0
  541. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerProgressThrottleTest.kt +89 -0
  542. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerQueueTest.kt +290 -0
  543. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerReadersTest.kt +151 -0
  544. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerReplayGainTest.kt +69 -0
  545. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerSkipCapabilityTest.kt +324 -0
  546. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerSkipTest.kt +287 -0
  547. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerSourceClassifierTest.kt +82 -0
  548. package/android/src/test/java/com/margelo/nitro/queueplayer/TrackPlayerTransportTest.kt +222 -0
  549. package/android/src/test/java/com/margelo/nitro/queueplayer/TransportStateTranslatorTest.kt +287 -0
  550. package/android/src/test/java/com/margelo/nitro/queueplayer/VisualizationGateTest.kt +96 -0
  551. package/android/src/test/java/com/margelo/nitro/queueplayer/VisualizerKtTest.kt +202 -0
  552. package/android/src/test/java/com/margelo/nitro/queueplayer/VoiceSearchExtrasParserTest.kt +211 -0
  553. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/CastSinkRouterTest.kt +120 -0
  554. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/FakeRemotePlayer.kt +62 -0
  555. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/PlaybackStateRouterTest.kt +43 -0
  556. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayDiscoveryFilterTest.kt +86 -0
  557. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/airplay/AirPlayTxtParserClassificationTest.kt +34 -0
  558. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/chromecast/CastMediaItemConverterTest.kt +78 -0
  559. package/android/src/test/java/com/margelo/nitro/queueplayer/cast/chromecast/CastVolumeForwardingPlayerTest.kt +176 -0
  560. package/app.plugin.js +466 -0
  561. package/ios/AVPlayerItemQueueItemId.swift +61 -0
  562. package/ios/AVQueueBuilder.swift +200 -0
  563. package/ios/Array+SafeSubscript.swift +6 -0
  564. package/ios/ArtworkLoader.swift +136 -0
  565. package/ios/ArtworkResolver.swift +87 -0
  566. package/ios/AudioCategoryMapping.swift +48 -0
  567. package/ios/AudioSession.swift +220 -0
  568. package/ios/AudioSessionError.swift +44 -0
  569. package/ios/AudioTapProvider.swift +647 -0
  570. package/ios/BiquadCoefficients.swift +80 -0
  571. package/ios/CarPlayBridge.swift +178 -0
  572. package/ios/CarPlayBrowseBuilder.swift +368 -0
  573. package/ios/CarPlayBrowseDataProvider.swift +162 -0
  574. package/ios/CarPlayCoordinator.swift +42 -0
  575. package/ios/CarPlaySceneDelegate.swift +199 -0
  576. package/ios/Cast/AirPlayRouteState.swift +281 -0
  577. package/ios/Cast/Chromecast/ChromecastDiscoveryAdapter.swift +27 -0
  578. package/ios/Cast/Chromecast/ChromecastReceiverMapper.swift +48 -0
  579. package/ios/Cast/Chromecast/ChromecastSession.swift +740 -0
  580. package/ios/Cast/Chromecast/ChromecastSessionAdapter.swift +114 -0
  581. package/ios/Cast/Chromecast/ChromecastSupport.swift +63 -0
  582. package/ios/Cast/Chromecast/MediaInfoBuilder.swift +104 -0
  583. package/ios/Cast/Chromecast/RemoteMediaObserver.swift +147 -0
  584. package/ios/Cast/Core/CastEventBridge.swift +210 -0
  585. package/ios/Cast/Core/CastMediaItem.swift +41 -0
  586. package/ios/Cast/Core/CastNowPlayingController.swift +310 -0
  587. package/ios/Cast/Core/CastReceiverState.swift +22 -0
  588. package/ios/Cast/Core/CastSession.swift +147 -0
  589. package/ios/Cast/Core/CastTransportRouter.swift +162 -0
  590. package/ios/Cast/Core/ChromecastBackend.swift +259 -0
  591. package/ios/Cast/Core/LocalAddressMonitor.swift +110 -0
  592. package/ios/Cast/Core/LocalMediaServer.swift +270 -0
  593. package/ios/Cast/Core/LocalNetworkPermissionProbe.swift +265 -0
  594. package/ios/Cast/Core/MediaHTTPConnection.swift +349 -0
  595. package/ios/Cast/Core/MediaServerHandle.swift +49 -0
  596. package/ios/Cast/Core/MediaTokenRegistry.swift +51 -0
  597. package/ios/Cast/Core/MimeTypes.swift +26 -0
  598. package/ios/Cast/Core/PlaybackStateRouter.swift +123 -0
  599. package/ios/CastManager.swift +493 -0
  600. package/ios/CrossfadeEngine.swift +1343 -0
  601. package/ios/CustomPresetStore.swift +78 -0
  602. package/ios/EQProcessor.swift +321 -0
  603. package/ios/EQTap.swift +241 -0
  604. package/ios/Equalizer.swift +321 -0
  605. package/ios/EqualizerPresets.swift +48 -0
  606. package/ios/FFTProcessor.swift +237 -0
  607. package/ios/GaplessEngine.swift +385 -0
  608. package/ios/InputGuards.swift +63 -0
  609. package/ios/InterruptionEventMapping.swift +51 -0
  610. package/ios/ListenerRegistry.swift +73 -0
  611. package/ios/LookaheadCache.swift +833 -0
  612. package/ios/LookaheadCacheEviction.swift +83 -0
  613. package/ios/LookaheadCachePrefetcher.swift +503 -0
  614. package/ios/MetadataReader.swift +555 -0
  615. package/ios/MilestoneTracker.swift +63 -0
  616. package/ios/NowPlayingFormatExtractor.swift +362 -0
  617. package/ios/NowPlayingInfo.swift +190 -0
  618. package/ios/OutputRouteMonitor.swift +125 -0
  619. package/ios/PendingBrowseRequests.swift +62 -0
  620. package/ios/PitchAlgorithm.swift +24 -0
  621. package/ios/PlaceholderArtwork.swift +46 -0
  622. package/ios/PlaybackEngine.swift +319 -0
  623. package/ios/PlaybackErrorMapping.swift +195 -0
  624. package/ios/PlaybackModeStateMachine.swift +159 -0
  625. package/ios/PlayerStateDerivation.swift +45 -0
  626. package/ios/ProgressEmissionGate.swift +54 -0
  627. package/ios/QueueMutationArithmetic.swift +129 -0
  628. package/ios/QueueSkipArithmetic.swift +109 -0
  629. package/ios/QueueState.swift +49 -0
  630. package/ios/RemoteCommands.swift +229 -0
  631. package/ios/ReplayGainData.swift +58 -0
  632. package/ios/ReplayGainExtractor.swift +82 -0
  633. package/ios/ReplayGainProcessor.swift +46 -0
  634. package/ios/Resources/RNQP-placeholder.jpg +0 -0
  635. package/ios/Resources/silence.m4a +0 -0
  636. package/ios/Siri/PendingIntentBuffer.swift +100 -0
  637. package/ios/Siri/PlayMediaIntentHandler.swift +283 -0
  638. package/ios/Siri/QueuePlayerMediaIntents.swift +45 -0
  639. package/ios/Siri/VoiceDonation.swift +50 -0
  640. package/ios/SleepTimerCore.swift +128 -0
  641. package/ios/StreamingBitrateProbe.swift +318 -0
  642. package/ios/Tests/AVQueueBuilderTests.swift +430 -0
  643. package/ios/Tests/ArtworkResolverTests.swift +540 -0
  644. package/ios/Tests/AudioSessionTests.swift +222 -0
  645. package/ios/Tests/AudioTapProviderReplayGainTests.swift +136 -0
  646. package/ios/Tests/AudioTapProviderVisualizationFlagTests.swift +104 -0
  647. package/ios/Tests/BiquadCoefficientsTests.swift +84 -0
  648. package/ios/Tests/CarPlayBridgeTests.swift +91 -0
  649. package/ios/Tests/CarPlayBrowseBuilderTests.swift +221 -0
  650. package/ios/Tests/CarPlayBrowseDataProviderTests.swift +218 -0
  651. package/ios/Tests/CastNowPlayingControllerTests.swift +204 -0
  652. package/ios/Tests/CrossfadeEngineStubTests.swift +43 -0
  653. package/ios/Tests/EQProcessorTests.swift +302 -0
  654. package/ios/Tests/EQTapTests.swift +49 -0
  655. package/ios/Tests/EqualizerAudioMixProviderTests.swift +110 -0
  656. package/ios/Tests/EqualizerHybridTests.swift +303 -0
  657. package/ios/Tests/EqualizerPresetsTests.swift +69 -0
  658. package/ios/Tests/FFTProcessorTests.swift +303 -0
  659. package/ios/Tests/Fixtures/silence-aac-128.m4a +0 -0
  660. package/ios/Tests/Fixtures/silence-cbr-128.mp3 +0 -0
  661. package/ios/Tests/Fixtures/silence-vbr.mp3 +0 -0
  662. package/ios/Tests/GaplessEngineLifecycleTests.swift +160 -0
  663. package/ios/Tests/InputGuardsTests.swift +75 -0
  664. package/ios/Tests/InterruptionEventMappingTests.swift +91 -0
  665. package/ios/Tests/LookaheadCacheEvictionTests.swift +217 -0
  666. package/ios/Tests/LookaheadCachePrefetcherTests.swift +630 -0
  667. package/ios/Tests/LookaheadCacheRuntimeConfigTests.swift +247 -0
  668. package/ios/Tests/LookaheadCacheTests.swift +717 -0
  669. package/ios/Tests/MediaHTTPConnectionTests.swift +163 -0
  670. package/ios/Tests/MetadataReaderTests.swift +605 -0
  671. package/ios/Tests/MilestoneTrackerTests.swift +76 -0
  672. package/ios/Tests/NowPlayingFormatExtractorTests.swift +158 -0
  673. package/ios/Tests/NowPlayingInfoTests.swift +292 -0
  674. package/ios/Tests/PendingBrowseRequestsTests.swift +69 -0
  675. package/ios/Tests/PendingIntentBufferTests.swift +164 -0
  676. package/ios/Tests/PlaybackEngineProtocolTests.swift +92 -0
  677. package/ios/Tests/PlaybackErrorMappingTests.swift +179 -0
  678. package/ios/Tests/PlaybackModeStateMachineTests.swift +40 -0
  679. package/ios/Tests/PlaybackStateRouterTests.swift +178 -0
  680. package/ios/Tests/PlayerStateDerivationTests.swift +69 -0
  681. package/ios/Tests/ProgressEmissionGateTests.swift +113 -0
  682. package/ios/Tests/QueueMutationArithmeticTests.swift +245 -0
  683. package/ios/Tests/RemoteCommandsTests.swift +147 -0
  684. package/ios/Tests/ReplayGainExtractorTests.swift +197 -0
  685. package/ios/Tests/ReplayGainProcessorTests.swift +90 -0
  686. package/ios/Tests/SkipCapabilityTests.swift +98 -0
  687. package/ios/Tests/SkipIndexTests.swift +259 -0
  688. package/ios/Tests/SleepTimerCoreTests.swift +98 -0
  689. package/ios/Tests/StreamingBitrateProbeTests.swift +29 -0
  690. package/ios/Tests/TrackSourceClassifierTests.swift +50 -0
  691. package/ios/Tests/VoiceDonationTests.swift +26 -0
  692. package/ios/TrackPlayer.swift +4766 -0
  693. package/ios/Visualizer.swift +274 -0
  694. package/ios/WindowApplicationSceneDelegate.swift +59 -0
  695. package/ios/tests-harness/Podfile +56 -0
  696. package/ios/tests-harness/TestHost/App.swift +12 -0
  697. package/ios/tests-harness/TestHost/Info.plist +37 -0
  698. package/ios/tests-harness/TestHost.xcodeproj/project.pbxproj +472 -0
  699. package/ios/tests-harness/TestHost.xcodeproj/xcshareddata/xcschemes/TestHost.xcscheme +68 -0
  700. package/ios/tests-harness/package.json +10 -0
  701. package/ios/tests-harness/scripts/seed-xcodeproj.rb +118 -0
  702. package/lib/module/CastManager.nitro.js +4 -0
  703. package/lib/module/CastManager.nitro.js.map +1 -0
  704. package/lib/module/Equalizer.nitro.js +4 -0
  705. package/lib/module/Equalizer.nitro.js.map +1 -0
  706. package/lib/module/TrackPlayer.nitro.js +4 -0
  707. package/lib/module/TrackPlayer.nitro.js.map +1 -0
  708. package/lib/module/Visualizer.nitro.js +4 -0
  709. package/lib/module/Visualizer.nitro.js.map +1 -0
  710. package/lib/module/cast/index.js +156 -0
  711. package/lib/module/cast/index.js.map +1 -0
  712. package/lib/module/clients.js +43 -0
  713. package/lib/module/clients.js.map +1 -0
  714. package/lib/module/equalizer.js +85 -0
  715. package/lib/module/equalizer.js.map +1 -0
  716. package/lib/module/hooks/index.js +16 -0
  717. package/lib/module/hooks/index.js.map +1 -0
  718. package/lib/module/hooks/useActiveTrack.js +50 -0
  719. package/lib/module/hooks/useActiveTrack.js.map +1 -0
  720. package/lib/module/hooks/useAudioRoute.js +60 -0
  721. package/lib/module/hooks/useAudioRoute.js.map +1 -0
  722. package/lib/module/hooks/useBufferState.js +34 -0
  723. package/lib/module/hooks/useBufferState.js.map +1 -0
  724. package/lib/module/hooks/useCanSkip.js +67 -0
  725. package/lib/module/hooks/useCanSkip.js.map +1 -0
  726. package/lib/module/hooks/useCast.js +107 -0
  727. package/lib/module/hooks/useCast.js.map +1 -0
  728. package/lib/module/hooks/useEqualizer.js +91 -0
  729. package/lib/module/hooks/useEqualizer.js.map +1 -0
  730. package/lib/module/hooks/useFullyBuffered.js +33 -0
  731. package/lib/module/hooks/useFullyBuffered.js.map +1 -0
  732. package/lib/module/hooks/useLookaheadCache.js +49 -0
  733. package/lib/module/hooks/useLookaheadCache.js.map +1 -0
  734. package/lib/module/hooks/useNowPlayingFormat.js +42 -0
  735. package/lib/module/hooks/useNowPlayingFormat.js.map +1 -0
  736. package/lib/module/hooks/usePlaybackState.js +36 -0
  737. package/lib/module/hooks/usePlaybackState.js.map +1 -0
  738. package/lib/module/hooks/useProgress.js +31 -0
  739. package/lib/module/hooks/useProgress.js.map +1 -0
  740. package/lib/module/hooks/useSleepTimer.js +65 -0
  741. package/lib/module/hooks/useSleepTimer.js.map +1 -0
  742. package/lib/module/hooks/useVisualizerState.js +99 -0
  743. package/lib/module/hooks/useVisualizerState.js.map +1 -0
  744. package/lib/module/index.js +37 -0
  745. package/lib/module/index.js.map +1 -0
  746. package/lib/module/package.json +1 -0
  747. package/lib/module/playbackService.js +174 -0
  748. package/lib/module/playbackService.js.map +1 -0
  749. package/lib/module/types.js +592 -0
  750. package/lib/module/types.js.map +1 -0
  751. package/lib/typescript/CastManager.nitro.d.ts +154 -0
  752. package/lib/typescript/CastManager.nitro.d.ts.map +1 -0
  753. package/lib/typescript/Equalizer.nitro.d.ts +30 -0
  754. package/lib/typescript/Equalizer.nitro.d.ts.map +1 -0
  755. package/lib/typescript/TrackPlayer.nitro.d.ts +584 -0
  756. package/lib/typescript/TrackPlayer.nitro.d.ts.map +1 -0
  757. package/lib/typescript/Visualizer.nitro.d.ts +36 -0
  758. package/lib/typescript/Visualizer.nitro.d.ts.map +1 -0
  759. package/lib/typescript/cast/index.d.ts +65 -0
  760. package/lib/typescript/cast/index.d.ts.map +1 -0
  761. package/lib/typescript/clients.d.ts +9 -0
  762. package/lib/typescript/clients.d.ts.map +1 -0
  763. package/lib/typescript/equalizer.d.ts +45 -0
  764. package/lib/typescript/equalizer.d.ts.map +1 -0
  765. package/lib/typescript/hooks/index.d.ts +22 -0
  766. package/lib/typescript/hooks/index.d.ts.map +1 -0
  767. package/lib/typescript/hooks/useActiveTrack.d.ts +21 -0
  768. package/lib/typescript/hooks/useActiveTrack.d.ts.map +1 -0
  769. package/lib/typescript/hooks/useAudioRoute.d.ts +13 -0
  770. package/lib/typescript/hooks/useAudioRoute.d.ts.map +1 -0
  771. package/lib/typescript/hooks/useBufferState.d.ts +18 -0
  772. package/lib/typescript/hooks/useBufferState.d.ts.map +1 -0
  773. package/lib/typescript/hooks/useCanSkip.d.ts +43 -0
  774. package/lib/typescript/hooks/useCanSkip.d.ts.map +1 -0
  775. package/lib/typescript/hooks/useCast.d.ts +32 -0
  776. package/lib/typescript/hooks/useCast.d.ts.map +1 -0
  777. package/lib/typescript/hooks/useEqualizer.d.ts +20 -0
  778. package/lib/typescript/hooks/useEqualizer.d.ts.map +1 -0
  779. package/lib/typescript/hooks/useFullyBuffered.d.ts +15 -0
  780. package/lib/typescript/hooks/useFullyBuffered.d.ts.map +1 -0
  781. package/lib/typescript/hooks/useLookaheadCache.d.ts +13 -0
  782. package/lib/typescript/hooks/useLookaheadCache.d.ts.map +1 -0
  783. package/lib/typescript/hooks/useNowPlayingFormat.d.ts +18 -0
  784. package/lib/typescript/hooks/useNowPlayingFormat.d.ts.map +1 -0
  785. package/lib/typescript/hooks/usePlaybackState.d.ts +9 -0
  786. package/lib/typescript/hooks/usePlaybackState.d.ts.map +1 -0
  787. package/lib/typescript/hooks/useProgress.d.ts +15 -0
  788. package/lib/typescript/hooks/useProgress.d.ts.map +1 -0
  789. package/lib/typescript/hooks/useSleepTimer.d.ts +26 -0
  790. package/lib/typescript/hooks/useSleepTimer.d.ts.map +1 -0
  791. package/lib/typescript/hooks/useVisualizerState.d.ts +40 -0
  792. package/lib/typescript/hooks/useVisualizerState.d.ts.map +1 -0
  793. package/lib/typescript/index.d.ts +14 -0
  794. package/lib/typescript/index.d.ts.map +1 -0
  795. package/lib/typescript/package.json +1 -0
  796. package/lib/typescript/playbackService.d.ts +140 -0
  797. package/lib/typescript/playbackService.d.ts.map +1 -0
  798. package/lib/typescript/types.d.ts +1215 -0
  799. package/lib/typescript/types.d.ts.map +1 -0
  800. package/nitro.json +53 -0
  801. package/nitrogen/generated/android/c++/JAudioCategoryOptions.hpp +65 -0
  802. package/nitrogen/generated/android/c++/JAudioCodec.hpp +73 -0
  803. package/nitrogen/generated/android/c++/JAudioContainer.hpp +76 -0
  804. package/nitrogen/generated/android/c++/JAudioContentType.hpp +58 -0
  805. package/nitrogen/generated/android/c++/JAudioRoute.hpp +75 -0
  806. package/nitrogen/generated/android/c++/JAudioRouteKind.hpp +91 -0
  807. package/nitrogen/generated/android/c++/JBrowseItem.hpp +78 -0
  808. package/nitrogen/generated/android/c++/JBrowseSection.hpp +97 -0
  809. package/nitrogen/generated/android/c++/JBrowseSnapshot.hpp +87 -0
  810. package/nitrogen/generated/android/c++/JBufferState.hpp +64 -0
  811. package/nitrogen/generated/android/c++/JCacheStatus.hpp +92 -0
  812. package/nitrogen/generated/android/c++/JCastConfigureOptions.hpp +62 -0
  813. package/nitrogen/generated/android/c++/JCastConnectOptions.hpp +57 -0
  814. package/nitrogen/generated/android/c++/JCastDeviceKind.hpp +70 -0
  815. package/nitrogen/generated/android/c++/JCastDiscoveryState.hpp +57 -0
  816. package/nitrogen/generated/android/c++/JCastLocalNetworkPermission.hpp +61 -0
  817. package/nitrogen/generated/android/c++/JCastLocalNetworkPermissionEvent.hpp +58 -0
  818. package/nitrogen/generated/android/c++/JCastProtocol.hpp +67 -0
  819. package/nitrogen/generated/android/c++/JCastReceiver.hpp +89 -0
  820. package/nitrogen/generated/android/c++/JCastReceiverCapabilities.hpp +66 -0
  821. package/nitrogen/generated/android/c++/JCastRoute.hpp +85 -0
  822. package/nitrogen/generated/android/c++/JCastSessionDiedEvent.hpp +63 -0
  823. package/nitrogen/generated/android/c++/JCastSessionEndReason.hpp +76 -0
  824. package/nitrogen/generated/android/c++/JCastStreamingModel.hpp +58 -0
  825. package/nitrogen/generated/android/c++/JEqualizerBand.hpp +61 -0
  826. package/nitrogen/generated/android/c++/JEqualizerPreset.hpp +76 -0
  827. package/nitrogen/generated/android/c++/JEvictionPolicy.hpp +58 -0
  828. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_BrowseItem______std__string.hpp +146 -0
  829. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_TrackItem______MediaSearchRequest.hpp +161 -0
  830. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_TrackItem______std__string.hpp +147 -0
  831. package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
  832. package/nitrogen/generated/android/c++/JFunc_void_AudioRoute.hpp +80 -0
  833. package/nitrogen/generated/android/c++/JFunc_void_BufferState.hpp +77 -0
  834. package/nitrogen/generated/android/c++/JFunc_void_CacheStatus.hpp +79 -0
  835. package/nitrogen/generated/android/c++/JFunc_void_CastDiscoveryState.hpp +77 -0
  836. package/nitrogen/generated/android/c++/JFunc_void_CastLocalNetworkPermissionEvent.hpp +79 -0
  837. package/nitrogen/generated/android/c++/JFunc_void_CastRoute.hpp +86 -0
  838. package/nitrogen/generated/android/c++/JFunc_void_CastSessionDiedEvent.hpp +80 -0
  839. package/nitrogen/generated/android/c++/JFunc_void_PlaybackError.hpp +80 -0
  840. package/nitrogen/generated/android/c++/JFunc_void_PlayerProgress.hpp +77 -0
  841. package/nitrogen/generated/android/c++/JFunc_void_PlayerState_StateChangeReason.hpp +79 -0
  842. package/nitrogen/generated/android/c++/JFunc_void_ServiceReadyReason.hpp +77 -0
  843. package/nitrogen/generated/android/c++/JFunc_void_SkipCapability.hpp +77 -0
  844. package/nitrogen/generated/android/c++/JFunc_void_SleepTimerState.hpp +78 -0
  845. package/nitrogen/generated/android/c++/JFunc_void_VisualizerErrorReason.hpp +77 -0
  846. package/nitrogen/generated/android/c++/JFunc_void_VisualizerFrame.hpp +80 -0
  847. package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +75 -0
  848. package/nitrogen/generated/android/c++/JFunc_void_double_double.hpp +75 -0
  849. package/nitrogen/generated/android/c++/JFunc_void_std__optional_TrackItem__double_TrackChangeReason_std__optional_double_.hpp +82 -0
  850. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__NowPlayingFormat__.hpp +93 -0
  851. package/nitrogen/generated/android/c++/JFunc_void_std__vector_CastReceiver_.hpp +105 -0
  852. package/nitrogen/generated/android/c++/JFunc_void_std__vector_EqualizerBand_.hpp +96 -0
  853. package/nitrogen/generated/android/c++/JHybridCastManagerSpec.cpp +388 -0
  854. package/nitrogen/generated/android/c++/JHybridCastManagerSpec.hpp +84 -0
  855. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.cpp +233 -0
  856. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.hpp +74 -0
  857. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +1052 -0
  858. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +130 -0
  859. package/nitrogen/generated/android/c++/JHybridVisualizerSpec.cpp +84 -0
  860. package/nitrogen/generated/android/c++/JHybridVisualizerSpec.hpp +64 -0
  861. package/nitrogen/generated/android/c++/JLookaheadCacheConfig.hpp +61 -0
  862. package/nitrogen/generated/android/c++/JMediaSearchOrigin.hpp +58 -0
  863. package/nitrogen/generated/android/c++/JMediaSearchQueueLocation.hpp +61 -0
  864. package/nitrogen/generated/android/c++/JMediaSearchReference.hpp +58 -0
  865. package/nitrogen/generated/android/c++/JMediaSearchReleaseDateRange.hpp +61 -0
  866. package/nitrogen/generated/android/c++/JMediaSearchRepeatMode.hpp +61 -0
  867. package/nitrogen/generated/android/c++/JMediaSearchRequest.hpp +126 -0
  868. package/nitrogen/generated/android/c++/JMediaSearchType.hpp +67 -0
  869. package/nitrogen/generated/android/c++/JNowPlayingFormat.hpp +123 -0
  870. package/nitrogen/generated/android/c++/JNowPlayingFormatAndroidExtras.hpp +71 -0
  871. package/nitrogen/generated/android/c++/JNowPlayingFormatIosExtras.hpp +61 -0
  872. package/nitrogen/generated/android/c++/JPitchCorrectionMode.hpp +61 -0
  873. package/nitrogen/generated/android/c++/JPlaybackError.hpp +87 -0
  874. package/nitrogen/generated/android/c++/JPlaybackErrorCode.hpp +88 -0
  875. package/nitrogen/generated/android/c++/JPlaybackMode.hpp +63 -0
  876. package/nitrogen/generated/android/c++/JPlaybackModeKind.hpp +58 -0
  877. package/nitrogen/generated/android/c++/JPlayerConfig.hpp +126 -0
  878. package/nitrogen/generated/android/c++/JPlayerProgress.hpp +65 -0
  879. package/nitrogen/generated/android/c++/JPlayerState.hpp +73 -0
  880. package/nitrogen/generated/android/c++/JRemoteControlOptions.hpp +66 -0
  881. package/nitrogen/generated/android/c++/JRemoteSkipMode.hpp +58 -0
  882. package/nitrogen/generated/android/c++/JRepeatMode.hpp +61 -0
  883. package/nitrogen/generated/android/c++/JReplayGainMode.hpp +61 -0
  884. package/nitrogen/generated/android/c++/JSectionIcon.hpp +91 -0
  885. package/nitrogen/generated/android/c++/JServiceReadyReason.hpp +58 -0
  886. package/nitrogen/generated/android/c++/JShuffleResult.hpp +88 -0
  887. package/nitrogen/generated/android/c++/JSkipCapability.hpp +61 -0
  888. package/nitrogen/generated/android/c++/JSleepTimerState.hpp +69 -0
  889. package/nitrogen/generated/android/c++/JStateChangeReason.hpp +73 -0
  890. package/nitrogen/generated/android/c++/JTrackChangeReason.hpp +73 -0
  891. package/nitrogen/generated/android/c++/JTrackItem.hpp +100 -0
  892. package/nitrogen/generated/android/c++/JTrackSource.hpp +61 -0
  893. package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
  894. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
  895. package/nitrogen/generated/android/c++/JVariant_NullType_NowPlayingFormat.cpp +26 -0
  896. package/nitrogen/generated/android/c++/JVariant_NullType_NowPlayingFormat.hpp +83 -0
  897. package/nitrogen/generated/android/c++/JVariant_NullType_String.cpp +26 -0
  898. package/nitrogen/generated/android/c++/JVariant_NullType_String.hpp +70 -0
  899. package/nitrogen/generated/android/c++/JVisualizerConfig.hpp +65 -0
  900. package/nitrogen/generated/android/c++/JVisualizerErrorReason.hpp +64 -0
  901. package/nitrogen/generated/android/c++/JVisualizerFrame.hpp +67 -0
  902. package/nitrogen/generated/android/c++/JVoiceVocabulary.hpp +98 -0
  903. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/AudioCategoryOptions.kt +61 -0
  904. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/AudioCodec.kt +28 -0
  905. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/AudioContainer.kt +29 -0
  906. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/AudioContentType.kt +23 -0
  907. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/AudioRoute.kt +71 -0
  908. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/AudioRouteKind.kt +34 -0
  909. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/BrowseItem.kt +76 -0
  910. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/BrowseSection.kt +71 -0
  911. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/BrowseSnapshot.kt +56 -0
  912. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/BufferState.kt +25 -0
  913. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CacheStatus.kt +71 -0
  914. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastConfigureOptions.kt +56 -0
  915. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastConnectOptions.kt +51 -0
  916. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastDeviceKind.kt +27 -0
  917. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastDiscoveryState.kt +51 -0
  918. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastLocalNetworkPermission.kt +24 -0
  919. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastLocalNetworkPermissionEvent.kt +51 -0
  920. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastProtocol.kt +26 -0
  921. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastReceiver.kt +81 -0
  922. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastReceiverCapabilities.kt +61 -0
  923. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastRoute.kt +76 -0
  924. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastSessionDiedEvent.kt +56 -0
  925. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastSessionEndReason.kt +29 -0
  926. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/CastStreamingModel.kt +23 -0
  927. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/EqualizerBand.kt +56 -0
  928. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/EqualizerPreset.kt +61 -0
  929. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/EvictionPolicy.kt +23 -0
  930. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_BrowseItem______std__string.kt +80 -0
  931. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_TrackItem______MediaSearchRequest.kt +80 -0
  932. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_TrackItem______std__string.kt +80 -0
  933. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void.kt +80 -0
  934. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_AudioRoute.kt +80 -0
  935. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_BufferState.kt +80 -0
  936. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_CacheStatus.kt +80 -0
  937. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_CastDiscoveryState.kt +80 -0
  938. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_CastLocalNetworkPermissionEvent.kt +80 -0
  939. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_CastRoute.kt +80 -0
  940. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_CastSessionDiedEvent.kt +80 -0
  941. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_PlaybackError.kt +80 -0
  942. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_PlayerProgress.kt +80 -0
  943. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_PlayerState_StateChangeReason.kt +80 -0
  944. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_ServiceReadyReason.kt +80 -0
  945. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_SkipCapability.kt +80 -0
  946. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_SleepTimerState.kt +80 -0
  947. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_VisualizerErrorReason.kt +80 -0
  948. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_VisualizerFrame.kt +80 -0
  949. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_bool.kt +80 -0
  950. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_double_double.kt +80 -0
  951. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_std__optional_TrackItem__double_TrackChangeReason_std__optional_double_.kt +80 -0
  952. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_std__optional_std__variant_nitro__NullType__NowPlayingFormat__.kt +80 -0
  953. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_std__vector_CastReceiver_.kt +80 -0
  954. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Func_void_std__vector_EqualizerBand_.kt +80 -0
  955. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/HybridCastManagerSpec.kt +169 -0
  956. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/HybridEqualizerSpec.kt +109 -0
  957. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/HybridTrackPlayerSpec.kt +419 -0
  958. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/HybridVisualizerSpec.kt +63 -0
  959. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/LookaheadCacheConfig.kt +56 -0
  960. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchOrigin.kt +23 -0
  961. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchQueueLocation.kt +24 -0
  962. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchReference.kt +23 -0
  963. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchReleaseDateRange.kt +56 -0
  964. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchRepeatMode.kt +24 -0
  965. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchRequest.kt +121 -0
  966. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/MediaSearchType.kt +26 -0
  967. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/NowPlayingFormat.kt +116 -0
  968. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/NowPlayingFormatAndroidExtras.kt +61 -0
  969. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/NowPlayingFormatIosExtras.kt +51 -0
  970. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PitchCorrectionMode.kt +24 -0
  971. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlaybackError.kt +86 -0
  972. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlaybackErrorCode.kt +33 -0
  973. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlaybackMode.kt +56 -0
  974. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlaybackModeKind.kt +23 -0
  975. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlayerConfig.kt +111 -0
  976. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlayerProgress.kt +61 -0
  977. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/PlayerState.kt +28 -0
  978. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/RemoteControlOptions.kt +61 -0
  979. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/RemoteSkipMode.kt +23 -0
  980. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/RepeatMode.kt +24 -0
  981. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/ReplayGainMode.kt +24 -0
  982. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/SectionIcon.kt +34 -0
  983. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/ServiceReadyReason.kt +23 -0
  984. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/ShuffleResult.kt +61 -0
  985. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/SkipCapability.kt +56 -0
  986. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/SleepTimerState.kt +66 -0
  987. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/StateChangeReason.kt +28 -0
  988. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/TrackChangeReason.kt +28 -0
  989. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/TrackItem.kt +86 -0
  990. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/TrackSource.kt +24 -0
  991. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Variant_NullType_Double.kt +62 -0
  992. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Variant_NullType_NowPlayingFormat.kt +62 -0
  993. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/Variant_NullType_String.kt +62 -0
  994. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/VisualizerConfig.kt +61 -0
  995. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/VisualizerErrorReason.kt +25 -0
  996. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/VisualizerFrame.kt +61 -0
  997. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/VoiceVocabulary.kt +56 -0
  998. package/nitrogen/generated/android/kotlin/com/margelo/nitro/queueplayer/queueplayerOnLoad.kt +35 -0
  999. package/nitrogen/generated/android/queueplayer+autolinking.cmake +90 -0
  1000. package/nitrogen/generated/android/queueplayer+autolinking.gradle +27 -0
  1001. package/nitrogen/generated/android/queueplayerOnLoad.cpp +152 -0
  1002. package/nitrogen/generated/android/queueplayerOnLoad.hpp +34 -0
  1003. package/nitrogen/generated/ios/QueuePlayer+autolinking.rb +62 -0
  1004. package/nitrogen/generated/ios/QueuePlayer-Swift-Cxx-Bridge.cpp +343 -0
  1005. package/nitrogen/generated/ios/QueuePlayer-Swift-Cxx-Bridge.hpp +1831 -0
  1006. package/nitrogen/generated/ios/QueuePlayer-Swift-Cxx-Umbrella.hpp +256 -0
  1007. package/nitrogen/generated/ios/QueuePlayerAutolinking.mm +57 -0
  1008. package/nitrogen/generated/ios/QueuePlayerAutolinking.swift +62 -0
  1009. package/nitrogen/generated/ios/c++/HybridCastManagerSpecSwift.cpp +11 -0
  1010. package/nitrogen/generated/ios/c++/HybridCastManagerSpecSwift.hpp +298 -0
  1011. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.cpp +11 -0
  1012. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.hpp +178 -0
  1013. package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.cpp +11 -0
  1014. package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +749 -0
  1015. package/nitrogen/generated/ios/c++/HybridVisualizerSpecSwift.cpp +11 -0
  1016. package/nitrogen/generated/ios/c++/HybridVisualizerSpecSwift.hpp +103 -0
  1017. package/nitrogen/generated/ios/swift/AudioCategoryOptions.swift +78 -0
  1018. package/nitrogen/generated/ios/swift/AudioCodec.swift +60 -0
  1019. package/nitrogen/generated/ios/swift/AudioContainer.swift +64 -0
  1020. package/nitrogen/generated/ios/swift/AudioContentType.swift +40 -0
  1021. package/nitrogen/generated/ios/swift/AudioRoute.swift +49 -0
  1022. package/nitrogen/generated/ios/swift/AudioRouteKind.swift +84 -0
  1023. package/nitrogen/generated/ios/swift/BrowseItem.swift +93 -0
  1024. package/nitrogen/generated/ios/swift/BrowseSection.swift +74 -0
  1025. package/nitrogen/generated/ios/swift/BrowseSnapshot.swift +40 -0
  1026. package/nitrogen/generated/ios/swift/BufferState.swift +48 -0
  1027. package/nitrogen/generated/ios/swift/CacheStatus.swift +55 -0
  1028. package/nitrogen/generated/ios/swift/CastConfigureOptions.swift +47 -0
  1029. package/nitrogen/generated/ios/swift/CastConnectOptions.swift +29 -0
  1030. package/nitrogen/generated/ios/swift/CastDeviceKind.swift +56 -0
  1031. package/nitrogen/generated/ios/swift/CastDiscoveryState.swift +29 -0
  1032. package/nitrogen/generated/ios/swift/CastLocalNetworkPermission.swift +44 -0
  1033. package/nitrogen/generated/ios/swift/CastLocalNetworkPermissionEvent.swift +29 -0
  1034. package/nitrogen/generated/ios/swift/CastProtocol.swift +52 -0
  1035. package/nitrogen/generated/ios/swift/CastReceiver.swift +59 -0
  1036. package/nitrogen/generated/ios/swift/CastReceiverCapabilities.swift +39 -0
  1037. package/nitrogen/generated/ios/swift/CastRoute.swift +54 -0
  1038. package/nitrogen/generated/ios/swift/CastSessionDiedEvent.swift +34 -0
  1039. package/nitrogen/generated/ios/swift/CastSessionEndReason.swift +64 -0
  1040. package/nitrogen/generated/ios/swift/CastStreamingModel.swift +40 -0
  1041. package/nitrogen/generated/ios/swift/EqualizerBand.swift +34 -0
  1042. package/nitrogen/generated/ios/swift/EqualizerPreset.swift +45 -0
  1043. package/nitrogen/generated/ios/swift/EvictionPolicy.swift +40 -0
  1044. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_BrowseItem______std__string.swift +67 -0
  1045. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_TrackItem______MediaSearchRequest.swift +67 -0
  1046. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_TrackItem______std__string.swift +67 -0
  1047. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  1048. package/nitrogen/generated/ios/swift/Func_void_AudioRoute.swift +46 -0
  1049. package/nitrogen/generated/ios/swift/Func_void_BufferState.swift +46 -0
  1050. package/nitrogen/generated/ios/swift/Func_void_CacheStatus.swift +46 -0
  1051. package/nitrogen/generated/ios/swift/Func_void_CastDiscoveryState.swift +46 -0
  1052. package/nitrogen/generated/ios/swift/Func_void_CastLocalNetworkPermission.swift +46 -0
  1053. package/nitrogen/generated/ios/swift/Func_void_CastLocalNetworkPermissionEvent.swift +46 -0
  1054. package/nitrogen/generated/ios/swift/Func_void_CastRoute.swift +46 -0
  1055. package/nitrogen/generated/ios/swift/Func_void_CastSessionDiedEvent.swift +46 -0
  1056. package/nitrogen/generated/ios/swift/Func_void_PlaybackError.swift +46 -0
  1057. package/nitrogen/generated/ios/swift/Func_void_PlayerProgress.swift +46 -0
  1058. package/nitrogen/generated/ios/swift/Func_void_PlayerState_StateChangeReason.swift +46 -0
  1059. package/nitrogen/generated/ios/swift/Func_void_ServiceReadyReason.swift +46 -0
  1060. package/nitrogen/generated/ios/swift/Func_void_ShuffleResult.swift +46 -0
  1061. package/nitrogen/generated/ios/swift/Func_void_SkipCapability.swift +46 -0
  1062. package/nitrogen/generated/ios/swift/Func_void_SleepTimerState.swift +46 -0
  1063. package/nitrogen/generated/ios/swift/Func_void_VisualizerErrorReason.swift +46 -0
  1064. package/nitrogen/generated/ios/swift/Func_void_VisualizerFrame.swift +46 -0
  1065. package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
  1066. package/nitrogen/generated/ios/swift/Func_void_double_double.swift +46 -0
  1067. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  1068. package/nitrogen/generated/ios/swift/Func_void_std__optional_TrackItem__double_TrackChangeReason_std__optional_double_.swift +53 -0
  1069. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__NowPlayingFormat__.swift +65 -0
  1070. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__vector_BrowseItem___.swift +66 -0
  1071. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__vector_TrackItem___.swift +66 -0
  1072. package/nitrogen/generated/ios/swift/Func_void_std__vector_BrowseItem_.swift +46 -0
  1073. package/nitrogen/generated/ios/swift/Func_void_std__vector_CastReceiver_.swift +46 -0
  1074. package/nitrogen/generated/ios/swift/Func_void_std__vector_EqualizerBand_.swift +46 -0
  1075. package/nitrogen/generated/ios/swift/Func_void_std__vector_TrackItem_.swift +46 -0
  1076. package/nitrogen/generated/ios/swift/HybridCastManagerSpec.swift +76 -0
  1077. package/nitrogen/generated/ios/swift/HybridCastManagerSpec_cxx.swift +519 -0
  1078. package/nitrogen/generated/ios/swift/HybridEqualizerSpec.swift +66 -0
  1079. package/nitrogen/generated/ios/swift/HybridEqualizerSpec_cxx.swift +353 -0
  1080. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +122 -0
  1081. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +1430 -0
  1082. package/nitrogen/generated/ios/swift/HybridVisualizerSpec.swift +56 -0
  1083. package/nitrogen/generated/ios/swift/HybridVisualizerSpec_cxx.swift +163 -0
  1084. package/nitrogen/generated/ios/swift/LookaheadCacheConfig.swift +34 -0
  1085. package/nitrogen/generated/ios/swift/MediaSearchOrigin.swift +40 -0
  1086. package/nitrogen/generated/ios/swift/MediaSearchQueueLocation.swift +44 -0
  1087. package/nitrogen/generated/ios/swift/MediaSearchReference.swift +40 -0
  1088. package/nitrogen/generated/ios/swift/MediaSearchReleaseDateRange.swift +60 -0
  1089. package/nitrogen/generated/ios/swift/MediaSearchRepeatMode.swift +44 -0
  1090. package/nitrogen/generated/ios/swift/MediaSearchRequest.swift +239 -0
  1091. package/nitrogen/generated/ios/swift/MediaSearchType.swift +52 -0
  1092. package/nitrogen/generated/ios/swift/NowPlayingFormat.swift +394 -0
  1093. package/nitrogen/generated/ios/swift/NowPlayingFormatAndroidExtras.swift +135 -0
  1094. package/nitrogen/generated/ios/swift/NowPlayingFormatIosExtras.swift +61 -0
  1095. package/nitrogen/generated/ios/swift/PitchCorrectionMode.swift +44 -0
  1096. package/nitrogen/generated/ios/swift/PlaybackError.swift +64 -0
  1097. package/nitrogen/generated/ios/swift/PlaybackErrorCode.swift +80 -0
  1098. package/nitrogen/generated/ios/swift/PlaybackMode.swift +47 -0
  1099. package/nitrogen/generated/ios/swift/PlaybackModeKind.swift +40 -0
  1100. package/nitrogen/generated/ios/swift/PlayerConfig.swift +251 -0
  1101. package/nitrogen/generated/ios/swift/PlayerProgress.swift +39 -0
  1102. package/nitrogen/generated/ios/swift/PlayerState.swift +60 -0
  1103. package/nitrogen/generated/ios/swift/RemoteControlOptions.swift +39 -0
  1104. package/nitrogen/generated/ios/swift/RemoteSkipMode.swift +40 -0
  1105. package/nitrogen/generated/ios/swift/RepeatMode.swift +44 -0
  1106. package/nitrogen/generated/ios/swift/ReplayGainMode.swift +44 -0
  1107. package/nitrogen/generated/ios/swift/SectionIcon.swift +84 -0
  1108. package/nitrogen/generated/ios/swift/ServiceReadyReason.swift +40 -0
  1109. package/nitrogen/generated/ios/swift/ShuffleResult.swift +51 -0
  1110. package/nitrogen/generated/ios/swift/SkipCapability.swift +34 -0
  1111. package/nitrogen/generated/ios/swift/SleepTimerState.swift +70 -0
  1112. package/nitrogen/generated/ios/swift/StateChangeReason.swift +60 -0
  1113. package/nitrogen/generated/ios/swift/TrackChangeReason.swift +60 -0
  1114. package/nitrogen/generated/ios/swift/TrackItem.swift +169 -0
  1115. package/nitrogen/generated/ios/swift/TrackSource.swift +44 -0
  1116. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +30 -0
  1117. package/nitrogen/generated/ios/swift/Variant_NullType_NowPlayingFormat.swift +30 -0
  1118. package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +30 -0
  1119. package/nitrogen/generated/ios/swift/VisualizerConfig.swift +52 -0
  1120. package/nitrogen/generated/ios/swift/VisualizerErrorReason.swift +48 -0
  1121. package/nitrogen/generated/ios/swift/VisualizerFrame.swift +52 -0
  1122. package/nitrogen/generated/ios/swift/VoiceVocabulary.swift +46 -0
  1123. package/nitrogen/generated/shared/c++/AudioCategoryOptions.hpp +91 -0
  1124. package/nitrogen/generated/shared/c++/AudioCodec.hpp +96 -0
  1125. package/nitrogen/generated/shared/c++/AudioContainer.hpp +100 -0
  1126. package/nitrogen/generated/shared/c++/AudioContentType.hpp +76 -0
  1127. package/nitrogen/generated/shared/c++/AudioRoute.hpp +101 -0
  1128. package/nitrogen/generated/shared/c++/AudioRouteKind.hpp +120 -0
  1129. package/nitrogen/generated/shared/c++/BrowseItem.hpp +104 -0
  1130. package/nitrogen/generated/shared/c++/BrowseSection.hpp +106 -0
  1131. package/nitrogen/generated/shared/c++/BrowseSnapshot.hpp +90 -0
  1132. package/nitrogen/generated/shared/c++/BufferState.hpp +84 -0
  1133. package/nitrogen/generated/shared/c++/CacheStatus.hpp +100 -0
  1134. package/nitrogen/generated/shared/c++/CastConfigureOptions.hpp +88 -0
  1135. package/nitrogen/generated/shared/c++/CastConnectOptions.hpp +83 -0
  1136. package/nitrogen/generated/shared/c++/CastDeviceKind.hpp +92 -0
  1137. package/nitrogen/generated/shared/c++/CastDiscoveryState.hpp +83 -0
  1138. package/nitrogen/generated/shared/c++/CastLocalNetworkPermission.hpp +80 -0
  1139. package/nitrogen/generated/shared/c++/CastLocalNetworkPermissionEvent.hpp +84 -0
  1140. package/nitrogen/generated/shared/c++/CastProtocol.hpp +88 -0
  1141. package/nitrogen/generated/shared/c++/CastReceiver.hpp +115 -0
  1142. package/nitrogen/generated/shared/c++/CastReceiverCapabilities.hpp +92 -0
  1143. package/nitrogen/generated/shared/c++/CastRoute.hpp +111 -0
  1144. package/nitrogen/generated/shared/c++/CastSessionDiedEvent.hpp +89 -0
  1145. package/nitrogen/generated/shared/c++/CastSessionEndReason.hpp +100 -0
  1146. package/nitrogen/generated/shared/c++/CastStreamingModel.hpp +76 -0
  1147. package/nitrogen/generated/shared/c++/EqualizerBand.hpp +87 -0
  1148. package/nitrogen/generated/shared/c++/EqualizerPreset.hpp +92 -0
  1149. package/nitrogen/generated/shared/c++/EvictionPolicy.hpp +76 -0
  1150. package/nitrogen/generated/shared/c++/HybridCastManagerSpec.cpp +42 -0
  1151. package/nitrogen/generated/shared/c++/HybridCastManagerSpec.hpp +115 -0
  1152. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.cpp +32 -0
  1153. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.hpp +81 -0
  1154. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +88 -0
  1155. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +209 -0
  1156. package/nitrogen/generated/shared/c++/HybridVisualizerSpec.cpp +22 -0
  1157. package/nitrogen/generated/shared/c++/HybridVisualizerSpec.hpp +71 -0
  1158. package/nitrogen/generated/shared/c++/LookaheadCacheConfig.hpp +87 -0
  1159. package/nitrogen/generated/shared/c++/MediaSearchOrigin.hpp +76 -0
  1160. package/nitrogen/generated/shared/c++/MediaSearchQueueLocation.hpp +80 -0
  1161. package/nitrogen/generated/shared/c++/MediaSearchReference.hpp +76 -0
  1162. package/nitrogen/generated/shared/c++/MediaSearchReleaseDateRange.hpp +87 -0
  1163. package/nitrogen/generated/shared/c++/MediaSearchRepeatMode.hpp +80 -0
  1164. package/nitrogen/generated/shared/c++/MediaSearchRequest.hpp +157 -0
  1165. package/nitrogen/generated/shared/c++/MediaSearchType.hpp +88 -0
  1166. package/nitrogen/generated/shared/c++/NowPlayingFormat.hpp +149 -0
  1167. package/nitrogen/generated/shared/c++/NowPlayingFormatAndroidExtras.hpp +94 -0
  1168. package/nitrogen/generated/shared/c++/NowPlayingFormatIosExtras.hpp +85 -0
  1169. package/nitrogen/generated/shared/c++/PitchCorrectionMode.hpp +80 -0
  1170. package/nitrogen/generated/shared/c++/PlaybackError.hpp +113 -0
  1171. package/nitrogen/generated/shared/c++/PlaybackErrorCode.hpp +116 -0
  1172. package/nitrogen/generated/shared/c++/PlaybackMode.hpp +89 -0
  1173. package/nitrogen/generated/shared/c++/PlaybackModeKind.hpp +76 -0
  1174. package/nitrogen/generated/shared/c++/PlayerConfig.hpp +141 -0
  1175. package/nitrogen/generated/shared/c++/PlayerProgress.hpp +91 -0
  1176. package/nitrogen/generated/shared/c++/PlayerState.hpp +96 -0
  1177. package/nitrogen/generated/shared/c++/RemoteControlOptions.hpp +92 -0
  1178. package/nitrogen/generated/shared/c++/RemoteSkipMode.hpp +76 -0
  1179. package/nitrogen/generated/shared/c++/RepeatMode.hpp +80 -0
  1180. package/nitrogen/generated/shared/c++/ReplayGainMode.hpp +80 -0
  1181. package/nitrogen/generated/shared/c++/SectionIcon.hpp +120 -0
  1182. package/nitrogen/generated/shared/c++/ServiceReadyReason.hpp +76 -0
  1183. package/nitrogen/generated/shared/c++/ShuffleResult.hpp +94 -0
  1184. package/nitrogen/generated/shared/c++/SkipCapability.hpp +87 -0
  1185. package/nitrogen/generated/shared/c++/SleepTimerState.hpp +95 -0
  1186. package/nitrogen/generated/shared/c++/StateChangeReason.hpp +96 -0
  1187. package/nitrogen/generated/shared/c++/TrackChangeReason.hpp +96 -0
  1188. package/nitrogen/generated/shared/c++/TrackItem.hpp +113 -0
  1189. package/nitrogen/generated/shared/c++/TrackSource.hpp +80 -0
  1190. package/nitrogen/generated/shared/c++/VisualizerConfig.hpp +91 -0
  1191. package/nitrogen/generated/shared/c++/VisualizerErrorReason.hpp +84 -0
  1192. package/nitrogen/generated/shared/c++/VisualizerFrame.hpp +92 -0
  1193. package/nitrogen/generated/shared/c++/VoiceVocabulary.hpp +88 -0
  1194. package/package.json +167 -0
  1195. package/src/CastManager.nitro.ts +206 -0
  1196. package/src/Equalizer.nitro.ts +37 -0
  1197. package/src/TrackPlayer.nitro.ts +667 -0
  1198. package/src/Visualizer.nitro.ts +48 -0
  1199. package/src/cast/index.ts +224 -0
  1200. package/src/clients.ts +50 -0
  1201. package/src/equalizer.ts +86 -0
  1202. package/src/hooks/index.ts +33 -0
  1203. package/src/hooks/useActiveTrack.ts +55 -0
  1204. package/src/hooks/useAudioRoute.ts +69 -0
  1205. package/src/hooks/useBufferState.ts +35 -0
  1206. package/src/hooks/useCanSkip.ts +92 -0
  1207. package/src/hooks/useCast.ts +121 -0
  1208. package/src/hooks/useEqualizer.ts +111 -0
  1209. package/src/hooks/useFullyBuffered.ts +32 -0
  1210. package/src/hooks/useLookaheadCache.ts +54 -0
  1211. package/src/hooks/useNowPlayingFormat.ts +43 -0
  1212. package/src/hooks/usePlaybackState.ts +34 -0
  1213. package/src/hooks/useProgress.ts +36 -0
  1214. package/src/hooks/useSleepTimer.ts +63 -0
  1215. package/src/hooks/useVisualizerState.ts +121 -0
  1216. package/src/index.ts +125 -0
  1217. package/src/playbackService.ts +304 -0
  1218. package/src/types.ts +1387 -0
@@ -0,0 +1,3190 @@
1
+ /*
2
+ * Adaption of ap2-sender by ViktoriiaKh:
3
+ * <https://github.com/ViktoriiaKh/ap2-sender>
4
+ *
5
+ * To test, it is useful to try with this receiver:
6
+ * <https://github.com/ckdo/airplay2-receiver>
7
+ *
8
+ * The Secure Remote Password 6a implementation is adapted from:
9
+ * - Tom Cocagne
10
+ * <https://github.com/cocagne/csrp>
11
+ *
12
+ * TLV helpers are adapted from ESP homekit:
13
+ * <https://github.com/maximkulkin/esp-homekit>
14
+ *
15
+ * The MIT License (MIT)
16
+ *
17
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
18
+ * this software and associated documentation files (the "Software"), to deal in
19
+ * the Software without restriction, including without limitation the rights to
20
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
21
+ * of the Software, and to permit persons to whom the Software is furnished to do
22
+ * so, subject to the following conditions:
23
+ *
24
+ * The above copyright notice and this permission notice shall be included in all
25
+ * copies or substantial portions of the Software.
26
+ *
27
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
28
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
29
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
30
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
31
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
32
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33
+ * SOFTWARE.
34
+ *
35
+ */
36
+
37
+ #include <stdio.h>
38
+ #include <stdlib.h>
39
+ #include <string.h>
40
+ #include <inttypes.h>
41
+
42
+ #include <assert.h>
43
+
44
+ #include <sodium.h>
45
+
46
+ #include "pair-internal.h"
47
+ #include "pair-tlv.h"
48
+
49
+
50
+ /* ----------------------------- DEFINES ETC ------------------------------- */
51
+
52
+ #define USERNAME "Pair-Setup"
53
+ #define AUTHTAG_LENGTH 16
54
+ #define NONCE_LENGTH 12 // 96 bits according to chacha poly1305
55
+ #define REQUEST_BUFSIZE 4096
56
+ #define ENCRYPTED_LEN_MAX 0x400
57
+
58
+ // #define DEBUG_SHORT_A 1
59
+
60
+ enum pair_keys
61
+ {
62
+ PAIR_SETUP_MSG01 = 0,
63
+ PAIR_SETUP_MSG02,
64
+ PAIR_SETUP_MSG03,
65
+ PAIR_SETUP_MSG04,
66
+ PAIR_SETUP_MSG05,
67
+ PAIR_SETUP_MSG06,
68
+ PAIR_SETUP_CONTROLLER_SIGN,
69
+ PAIR_SETUP_ACCESSORY_SIGN,
70
+ PAIR_VERIFY_MSG01,
71
+ PAIR_VERIFY_MSG02,
72
+ PAIR_VERIFY_MSG03,
73
+ PAIR_VERIFY_MSG04,
74
+ PAIR_CONTROL_WRITE,
75
+ PAIR_CONTROL_READ,
76
+ PAIR_EVENTS_WRITE,
77
+ PAIR_EVENTS_READ,
78
+ };
79
+
80
+ struct pair_keys_map
81
+ {
82
+ uint8_t state;
83
+ const char *salt;
84
+ const char *info;
85
+ const char nonce[8];
86
+ };
87
+
88
+ static struct pair_keys_map pair_keys_map[] =
89
+ {
90
+ // Used for /pair-setup
91
+ { 0x01, NULL, NULL, "" },
92
+ { 0x02, NULL, NULL, "" },
93
+ { 0x03, NULL, NULL, "" },
94
+ { 0x04, NULL, NULL, "" },
95
+ { 0x05, "Pair-Setup-Encrypt-Salt", "Pair-Setup-Encrypt-Info", "PS-Msg05" },
96
+ { 0x06, "Pair-Setup-Encrypt-Salt", "Pair-Setup-Encrypt-Info", "PS-Msg06" },
97
+ { 0, "Pair-Setup-Controller-Sign-Salt", "Pair-Setup-Controller-Sign-Info", "" },
98
+ { 0, "Pair-Setup-Accessory-Sign-Salt", "Pair-Setup-Accessory-Sign-Info", "" },
99
+
100
+ // Used for /pair-verify
101
+ { 0x01, NULL, NULL, "" },
102
+ { 0x02, "Pair-Verify-Encrypt-Salt", "Pair-Verify-Encrypt-Info", "PV-Msg02" },
103
+ { 0x03, "Pair-Verify-Encrypt-Salt", "Pair-Verify-Encrypt-Info", "PV-Msg03" },
104
+ { 0x04, NULL, NULL, "" },
105
+
106
+ // Encryption/decryption of control channel
107
+ { 0, "Control-Salt", "Control-Write-Encryption-Key", "" },
108
+ { 0, "Control-Salt", "Control-Read-Encryption-Key", "" },
109
+
110
+ // Encryption/decryption of event channel
111
+ { 0, "Events-Salt", "Events-Write-Encryption-Key", "" },
112
+ { 0, "Events-Salt", "Events-Read-Encryption-Key", "" },
113
+ };
114
+
115
+ enum pair_method {
116
+ PairingMethodPairSetup = 0x00,
117
+ PairingMethodPairSetupWithAuth = 0x01,
118
+ PairingMethodPairVerify = 0x02,
119
+ PairingMethodAddPairing = 0x03,
120
+ PairingMethodRemovePairing = 0x04,
121
+ PairingMethodListPairings = 0x05
122
+ };
123
+
124
+ enum pair_flags {
125
+ PairingFlagsTransient = 0x10,
126
+ };
127
+
128
+ // Forwards
129
+ const struct pair_definition pair_client_homekit_normal;
130
+ const struct pair_definition pair_client_homekit_transient;
131
+ const struct pair_definition pair_server_homekit;
132
+
133
+
134
+ /* ---------------------------------- SRP ----------------------------------- */
135
+
136
+ typedef enum
137
+ {
138
+ SRP_NG_2048,
139
+ SRP_NG_3072,
140
+ SRP_NG_CUSTOM
141
+ } SRP_NGType;
142
+
143
+ typedef struct
144
+ {
145
+ int N_len;
146
+ bnum N;
147
+ bnum g;
148
+ } NGConstant;
149
+
150
+ struct SRPUser
151
+ {
152
+ enum hash_alg alg;
153
+ NGConstant *ng;
154
+
155
+ bnum a;
156
+ bnum A;
157
+ bnum S;
158
+
159
+ const unsigned char *bytes_A;
160
+ int authenticated;
161
+
162
+ char *username;
163
+ unsigned char *password;
164
+ int password_len;
165
+
166
+ unsigned char M [SHA512_DIGEST_LENGTH];
167
+ unsigned char H_AMK [SHA512_DIGEST_LENGTH];
168
+ unsigned char session_key [SHA512_DIGEST_LENGTH];
169
+ int session_key_len;
170
+ };
171
+
172
+ struct SRPVerifier
173
+ {
174
+ enum hash_alg alg;
175
+ NGConstant *ng;
176
+
177
+ const unsigned char *bytes_B;
178
+ int authenticated;
179
+
180
+ char *username;
181
+
182
+ unsigned char M [SHA512_DIGEST_LENGTH];
183
+ unsigned char H_AMK [SHA512_DIGEST_LENGTH];
184
+ unsigned char session_key [SHA512_DIGEST_LENGTH];
185
+ int session_key_len;
186
+ };
187
+
188
+ struct NGHex
189
+ {
190
+ int N_len;
191
+ const char *n_hex;
192
+ const char *g_hex;
193
+ };
194
+
195
+ // These constants here were pulled from Appendix A of RFC 5054
196
+ static struct NGHex global_Ng_constants[] =
197
+ {
198
+ { /* 2048 */
199
+ 256,
200
+ "AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4"
201
+ "A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF60"
202
+ "95179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF"
203
+ "747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B907"
204
+ "8717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB37861"
205
+ "60279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DB"
206
+ "FBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73",
207
+ "2"
208
+ },
209
+ { /* 3072 */
210
+ 384,
211
+ "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B"
212
+ "139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485"
213
+ "B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1F"
214
+ "E649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23"
215
+ "DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32"
216
+ "905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF69558"
217
+ "17183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521"
218
+ "ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D7"
219
+ "1E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B1817"
220
+ "7B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82"
221
+ "D120A93AD2CAFFFFFFFFFFFFFFFF",
222
+ "5"
223
+ },
224
+ {0} /* null sentinel */
225
+ };
226
+
227
+
228
+ static NGConstant *
229
+ new_ng(SRP_NGType ng_type, const char *n_hex, const char *g_hex)
230
+ {
231
+ NGConstant *ng = calloc(1, sizeof(NGConstant));
232
+
233
+ if ( ng_type != SRP_NG_CUSTOM )
234
+ {
235
+ n_hex = global_Ng_constants[ng_type].n_hex;
236
+ g_hex = global_Ng_constants[ng_type].g_hex;
237
+ }
238
+
239
+ bnum_hex2bn(ng->N, n_hex);
240
+ bnum_hex2bn(ng->g, g_hex);
241
+
242
+ ng->N_len = bnum_num_bytes(ng->N);
243
+
244
+ assert(ng_type == SRP_NG_CUSTOM || ng->N_len == global_Ng_constants[ng_type].N_len);
245
+
246
+ return ng;
247
+ }
248
+
249
+ static void
250
+ free_ng(NGConstant * ng)
251
+ {
252
+ if (!ng)
253
+ return;
254
+
255
+ bnum_free(ng->N);
256
+ bnum_free(ng->g);
257
+ free(ng);
258
+ }
259
+
260
+ static int
261
+ N_len(SRP_NGType ng_type)
262
+ {
263
+ if (ng_type == SRP_NG_CUSTOM)
264
+ return -1;
265
+
266
+ return global_Ng_constants[ng_type].N_len;
267
+ }
268
+
269
+ static bnum
270
+ calculate_x(enum hash_alg alg, const bnum salt, const char *username, const unsigned char *password, int password_len)
271
+ {
272
+ unsigned char ucp_hash[SHA512_DIGEST_LENGTH];
273
+ HashCTX ctx;
274
+
275
+ hash_init( alg, &ctx );
276
+ hash_update( alg, &ctx, username, strlen(username) );
277
+ hash_update( alg, &ctx, ":", 1 );
278
+ hash_update( alg, &ctx, password, password_len );
279
+ hash_final( alg, &ctx, ucp_hash );
280
+
281
+ return H_ns( alg, salt, ucp_hash, hash_length(alg) );
282
+ }
283
+
284
+ static void
285
+ calculate_M(enum hash_alg alg, NGConstant *ng, unsigned char *dest, const char *I, const bnum s,
286
+ const bnum A, const bnum B, const unsigned char *K, int K_len)
287
+ {
288
+ unsigned char H_N[ SHA512_DIGEST_LENGTH ];
289
+ unsigned char H_g[ SHA512_DIGEST_LENGTH ];
290
+ unsigned char H_I[ SHA512_DIGEST_LENGTH ];
291
+ unsigned char H_xor[ SHA512_DIGEST_LENGTH ];
292
+ HashCTX ctx;
293
+ int i = 0;
294
+ int hash_len = hash_length(alg);
295
+
296
+ hash_num( alg, ng->N, H_N );
297
+ hash_num( alg, ng->g, H_g );
298
+
299
+ hash(alg, (const unsigned char *)I, strlen(I), H_I);
300
+
301
+ for (i=0; i < hash_len; i++ )
302
+ H_xor[i] = H_N[i] ^ H_g[i];
303
+
304
+ hash_init( alg, &ctx );
305
+
306
+ hash_update( alg, &ctx, H_xor, hash_len );
307
+ hash_update( alg, &ctx, H_I, hash_len );
308
+ update_hash_n( alg, &ctx, s );
309
+ update_hash_n( alg, &ctx, A );
310
+ update_hash_n( alg, &ctx, B );
311
+ hash_update( alg, &ctx, K, K_len );
312
+
313
+ hash_final( alg, &ctx, dest );
314
+ }
315
+
316
+ static void
317
+ calculate_H_AMK(enum hash_alg alg, unsigned char *dest, const bnum A, const unsigned char * M, const unsigned char * K, int K_len)
318
+ {
319
+ HashCTX ctx;
320
+
321
+ hash_init( alg, &ctx );
322
+
323
+ update_hash_n( alg, &ctx, A );
324
+ hash_update( alg, &ctx, M, hash_length(alg) );
325
+ hash_update( alg, &ctx, K, K_len );
326
+
327
+ hash_final( alg, &ctx, dest );
328
+ }
329
+
330
+ /* ----------------------- SRP for the client side -------------------------- */
331
+
332
+ static struct SRPUser *
333
+ srp_user_new(enum hash_alg alg, SRP_NGType ng_type, const char *username,
334
+ const unsigned char *bytes_password, int len_password,
335
+ const char *n_hex, const char *g_hex)
336
+ {
337
+ struct SRPUser *usr = calloc(1, sizeof(struct SRPUser));
338
+ int ulen = strlen(username) + 1;
339
+
340
+ if (!usr)
341
+ goto err_exit;
342
+
343
+ usr->alg = alg;
344
+ usr->ng = new_ng( ng_type, n_hex, g_hex );
345
+
346
+ bnum_new(usr->a);
347
+ bnum_new(usr->A);
348
+ bnum_new(usr->S);
349
+
350
+ if (!usr->ng || !usr->a || !usr->A || !usr->S)
351
+ goto err_exit;
352
+
353
+ usr->username = malloc(ulen);
354
+ usr->password = malloc(len_password);
355
+ usr->password_len = len_password;
356
+
357
+ if (!usr->username || !usr->password)
358
+ goto err_exit;
359
+
360
+ memcpy(usr->username, username, ulen);
361
+ memcpy(usr->password, bytes_password, len_password);
362
+
363
+ usr->authenticated = 0;
364
+ usr->bytes_A = 0;
365
+
366
+ return usr;
367
+
368
+ err_exit:
369
+ if (!usr)
370
+ return NULL;
371
+
372
+ bnum_free(usr->a);
373
+ bnum_free(usr->A);
374
+ bnum_free(usr->S);
375
+
376
+ free(usr->username);
377
+ if (usr->password)
378
+ {
379
+ memset(usr->password, 0, usr->password_len);
380
+ free(usr->password);
381
+ }
382
+ free(usr);
383
+
384
+ return NULL;
385
+ }
386
+
387
+ static void
388
+ srp_user_free(struct SRPUser *usr)
389
+ {
390
+ if(!usr)
391
+ return;
392
+
393
+ bnum_free(usr->a);
394
+ bnum_free(usr->A);
395
+ bnum_free(usr->S);
396
+
397
+ free_ng(usr->ng);
398
+
399
+ memset(usr->password, 0, usr->password_len);
400
+
401
+ free(usr->username);
402
+ free(usr->password);
403
+ free((char *)usr->bytes_A);
404
+
405
+ memset(usr, 0, sizeof(*usr));
406
+ free(usr);
407
+ }
408
+
409
+ static int
410
+ srp_user_is_authenticated(struct SRPUser *usr)
411
+ {
412
+ return usr->authenticated;
413
+ }
414
+
415
+ static const unsigned char *
416
+ srp_user_get_session_key(struct SRPUser *usr, int *key_length)
417
+ {
418
+ if (key_length)
419
+ *key_length = usr->session_key_len;
420
+ return usr->session_key;
421
+ }
422
+
423
+ #ifdef DEBUG_SHORT_A
424
+ // This value of "a" will yield a 383 byte A
425
+ static uint8_t short_a[] = {
426
+ 0xef, 0xb5, 0x93, 0xf5, 0x03, 0x97, 0x69, 0x8e, 0x15, 0xed, 0xee, 0x5b, 0xf2, 0xf9, 0x23, 0x6c,
427
+ 0xf0, 0x59, 0x6c, 0xe2, 0x77, 0xf2, 0x14, 0x16, 0xac, 0x99, 0xfa, 0x31, 0xae, 0x2b, 0xd3, 0x41,
428
+ };
429
+ #endif
430
+
431
+ /* Output: username, bytes_A, len_A */
432
+ static void
433
+ srp_user_start_authentication(struct SRPUser *usr, const char **username,
434
+ const unsigned char **bytes_A, int *len_A)
435
+ {
436
+ // BN_hex2bn(&(usr->a), "D929DFB605687233C9E9030C2280156D03BDB9FDCF3CCE3BC27D9CCFCB5FF6A1");
437
+ bnum_random(usr->a, 256);
438
+ #ifdef DEBUG_SHORT_A
439
+ bnum_bin2bn(usr->a, short_a, sizeof(short_a));
440
+ #endif
441
+ #ifdef DEBUG_PAIR
442
+ bnum_dump("Random value of usr->a:\n", usr->a);
443
+ #endif
444
+
445
+ bnum_modexp(usr->A, usr->ng->g, usr->a, usr->ng->N);
446
+
447
+ *len_A = bnum_num_bytes(usr->A);
448
+ *bytes_A = malloc(*len_A);
449
+
450
+ if (!*bytes_A)
451
+ {
452
+ *len_A = 0;
453
+ *bytes_A = 0;
454
+ *username = 0;
455
+ return;
456
+ }
457
+
458
+ bnum_bn2bin(usr->A, (unsigned char *) *bytes_A, *len_A);
459
+
460
+ usr->bytes_A = *bytes_A;
461
+ *username = usr->username;
462
+ }
463
+
464
+ /* Output: bytes_M. Buffer length is SHA512_DIGEST_LENGTH */
465
+ static void
466
+ srp_user_process_challenge(struct SRPUser *usr, const unsigned char *bytes_s, int len_s,
467
+ const unsigned char *bytes_B, int len_B,
468
+ const unsigned char **bytes_M, int *len_M )
469
+ {
470
+ bnum s, B, k, v;
471
+ bnum tmp1, tmp2, tmp3;
472
+ bnum u, x;
473
+
474
+ *len_M = 0;
475
+ *bytes_M = NULL;
476
+
477
+ bnum_bin2bn(s, bytes_s, len_s);
478
+ bnum_bin2bn(B, bytes_B, len_B);
479
+
480
+ k = H_nn_pad(usr->alg, usr->ng->N, usr->ng->g, usr->ng->N_len);
481
+
482
+ bnum_new(v);
483
+ bnum_new(tmp1);
484
+ bnum_new(tmp2);
485
+ bnum_new(tmp3);
486
+
487
+ if (!s || !B || !k || !v || !tmp1 || !tmp2 || !tmp3)
488
+ goto cleanup1;
489
+
490
+ u = H_nn_pad(usr->alg, usr->A, B, usr->ng->N_len);
491
+ x = calculate_x(usr->alg, s, usr->username, usr->password, usr->password_len);
492
+ if (!u || !x)
493
+ goto cleanup2;
494
+
495
+ // SRP-6a safety check
496
+ if (!bnum_is_zero(B) && !bnum_is_zero(u))
497
+ {
498
+ bnum_modexp(v, usr->ng->g, x, usr->ng->N);
499
+
500
+ // S = (B - k*(g^x)) ^ (a + ux)
501
+ bnum_mul(tmp1, u, x);
502
+ bnum_add(tmp2, usr->a, tmp1); // tmp2 = (a + ux)
503
+ bnum_modexp(tmp1, usr->ng->g, x, usr->ng->N);
504
+ bnum_mul(tmp3, k, tmp1); // tmp3 = k*(g^x)
505
+ bnum_sub(tmp1, B, tmp3); // tmp1 = (B - K*(g^x))
506
+ bnum_modexp(usr->S, tmp1, tmp2, usr->ng->N);
507
+
508
+ hash_num(usr->alg, usr->S, usr->session_key);
509
+ usr->session_key_len = hash_length(usr->alg);
510
+
511
+ calculate_M(usr->alg, usr->ng, usr->M, usr->username, s, usr->A, B, usr->session_key, usr->session_key_len);
512
+ calculate_H_AMK(usr->alg, usr->H_AMK, usr->A, usr->M, usr->session_key, usr->session_key_len);
513
+
514
+ *bytes_M = usr->M;
515
+ *len_M = hash_length(usr->alg);
516
+ }
517
+
518
+ cleanup2:
519
+ bnum_free(x);
520
+ bnum_free(u);
521
+ cleanup1:
522
+ bnum_free(tmp3);
523
+ bnum_free(tmp2);
524
+ bnum_free(tmp1);
525
+ bnum_free(v);
526
+ bnum_free(k);
527
+ bnum_free(B);
528
+ bnum_free(s);
529
+ }
530
+
531
+ static void
532
+ srp_user_verify_session(struct SRPUser *usr, const unsigned char *bytes_HAMK)
533
+ {
534
+ if (memcmp(usr->H_AMK, bytes_HAMK, hash_length(usr->alg)) == 0)
535
+ usr->authenticated = 1;
536
+ }
537
+
538
+
539
+ /* ----------------------- SRP for the server side -------------------------- */
540
+
541
+ static int
542
+ srp_create_salted_verification_key(enum hash_alg alg,
543
+ SRP_NGType ng_type, const char *username,
544
+ const unsigned char *password, int len_password,
545
+ unsigned char **bytes_s, int *len_s,
546
+ unsigned char **bytes_v, int *len_v,
547
+ const char *n_hex, const char *g_hex )
548
+ {
549
+ bnum s, v, x;
550
+ NGConstant *ng;
551
+
552
+ bnum_new(s);
553
+ bnum_new(v);
554
+ x = NULL;
555
+
556
+ ng = new_ng(ng_type, n_hex, g_hex);
557
+
558
+ *bytes_s = NULL;
559
+ *bytes_v = NULL;
560
+
561
+ if (!s || !v || !ng)
562
+ goto error;
563
+
564
+ bnum_random(s, 128); // MODIFIED from csrp's BN_rand(s, 32, -1, 0)
565
+ #ifdef DEBUG_PAIR
566
+ bnum_dump("Random value of s:\n", s);
567
+ #endif
568
+
569
+ x = calculate_x(alg, s, username, password, len_password);
570
+ if (!x)
571
+ goto error;
572
+
573
+ bnum_modexp(v, ng->g, x, ng->N);
574
+
575
+ *len_s = bnum_num_bytes(s);
576
+ *len_v = bnum_num_bytes(v);
577
+
578
+ *bytes_s = malloc(*len_s);
579
+ *bytes_v = malloc(*len_v);
580
+ if (!(*bytes_s) || !(*bytes_v))
581
+ goto error;
582
+
583
+ bnum_bn2bin(s, (unsigned char *) *bytes_s, *len_s);
584
+ bnum_bn2bin(v, (unsigned char *) *bytes_v, *len_v);
585
+
586
+ free_ng(ng);
587
+ bnum_free(s);
588
+ bnum_free(v);
589
+ bnum_free(x);
590
+ return 0;
591
+
592
+ error:
593
+ free(*bytes_s);
594
+ free(*bytes_v);
595
+ free_ng(ng);
596
+ bnum_free(s);
597
+ bnum_free(v);
598
+ bnum_free(x);
599
+ return -1;
600
+ }
601
+
602
+ static int
603
+ srp_verifier_start_authentication(enum hash_alg alg, SRP_NGType ng_type,
604
+ const unsigned char *bytes_v, int len_v,
605
+ unsigned char **bytes_b, int *len_b,
606
+ unsigned char **bytes_B, int *len_B,
607
+ const char *n_hex, const char *g_hex)
608
+ {
609
+ bnum v, k, b, B, tmp1, tmp2;
610
+ NGConstant *ng;
611
+
612
+ v = NULL;
613
+ k = NULL;
614
+ bnum_new(b);
615
+ bnum_new(B);
616
+ bnum_new(tmp1);
617
+ bnum_new(tmp2);
618
+
619
+ *len_b = 0;
620
+ *bytes_b = NULL;
621
+ *len_B = 0;
622
+ *bytes_B = NULL;
623
+
624
+ ng = new_ng(ng_type, n_hex, g_hex);
625
+
626
+ if (!b || !B || !tmp1 || !tmp2 || !ng)
627
+ goto error;
628
+
629
+ bnum_bin2bn(v, bytes_v, len_v);
630
+
631
+ bnum_random(b, 256); // MODIFIED from BN_rand(b, 256, -1, 0)
632
+ #ifdef DEBUG_PAIR
633
+ bnum_dump("Random value of b:\n", b);
634
+ #endif
635
+
636
+ k = H_nn_pad(alg, ng->N, ng->g, ng->N_len); // MODIFIED from H_nn(alg, ng->N, ng->g)
637
+ if (!k)
638
+ goto error;
639
+
640
+ // B = kv + g^b
641
+ bnum_mul(tmp1, k, v);
642
+ bnum_modexp(tmp2, ng->g, b, ng->N);
643
+ bnum_modadd(B, tmp1, tmp2, ng->N);
644
+
645
+ *len_B = bnum_num_bytes(B);
646
+ *len_b = bnum_num_bytes(b);
647
+
648
+ *bytes_B = malloc(*len_B);
649
+ *bytes_b = malloc(*len_b);
650
+ if (!(*bytes_B) || !(*bytes_b))
651
+ goto error;
652
+
653
+ bnum_bn2bin(B, (unsigned char *) *bytes_B, *len_B);
654
+ bnum_bn2bin(b, (unsigned char *) *bytes_b, *len_b);
655
+
656
+ bnum_free(b);
657
+ bnum_free(B);
658
+ bnum_free(v);
659
+ bnum_free(k);
660
+ bnum_free(tmp1);
661
+ bnum_free(tmp2);
662
+ free_ng(ng);
663
+ return 0;
664
+
665
+ error:
666
+ free(*bytes_B);
667
+ free(*bytes_b);
668
+ bnum_free(b);
669
+ bnum_free(B);
670
+ bnum_free(v);
671
+ bnum_free(k);
672
+ bnum_free(tmp1);
673
+ bnum_free(tmp2);
674
+ free_ng(ng);
675
+ return -1;
676
+ }
677
+
678
+ static void
679
+ srp_verifier_free(struct SRPVerifier *ver)
680
+ {
681
+ if (!ver)
682
+ return;
683
+
684
+ free_ng(ver->ng);
685
+
686
+ free(ver->username);
687
+
688
+ memset(ver, 0, sizeof(struct SRPVerifier));
689
+ free(ver);
690
+ }
691
+
692
+ static struct SRPVerifier *
693
+ srp_verifier_new(enum hash_alg alg, SRP_NGType ng_type, const char *username,
694
+ const unsigned char *bytes_s, int len_s,
695
+ const unsigned char *bytes_v, int len_v,
696
+ const unsigned char *bytes_A, int len_A,
697
+ const unsigned char *bytes_b, int len_b,
698
+ const unsigned char *bytes_B, int len_B,
699
+ const char *n_hex, const char *g_hex )
700
+ {
701
+ struct SRPVerifier *ver = NULL;
702
+ bnum s, v, A, b, B, S, tmp1, tmp2, u, k;
703
+ NGConstant *ng;
704
+ size_t ulen;
705
+
706
+ bnum_bin2bn(s, bytes_s, len_s);
707
+ bnum_bin2bn(v, bytes_v, len_v);
708
+ bnum_bin2bn(A, bytes_A, len_A);
709
+ bnum_bin2bn(b, bytes_b, len_b);
710
+ bnum_bin2bn(B, bytes_B, len_B);
711
+ bnum_new(S);
712
+ bnum_new(tmp1);
713
+ bnum_new(tmp2);
714
+ u = NULL;
715
+ k = NULL;
716
+
717
+ ng = new_ng(ng_type, n_hex, g_hex);
718
+
719
+ if (!s || !v || !A || !B || !S || !b || !tmp1 || !tmp2 || !ng)
720
+ goto error;
721
+
722
+ ver = calloc(1, sizeof(struct SRPVerifier));
723
+ if (!ver)
724
+ goto error;
725
+
726
+ ulen = strlen(username) + 1;
727
+
728
+ ver->alg = alg;
729
+ ver->ng = ng;
730
+
731
+ ver->username = malloc(ulen);
732
+ if (!ver->username)
733
+ goto error;
734
+
735
+ memcpy(ver->username, username, ulen);
736
+
737
+ ver->authenticated = 0;
738
+
739
+ // SRP-6a safety check
740
+ bnum_mod(tmp1, A, ng->N);
741
+ if (bnum_is_zero(tmp1))
742
+ goto error;
743
+
744
+ k = H_nn_pad(alg, ng->N, ng->g, ng->N_len); // MODIFIED from H_nn(alg, ng->N, ng->g)
745
+ u = H_nn_pad(alg, A, B, ng->N_len); // MODIFIED from H_nn(alg, A, B)
746
+
747
+ // S = (A *(v^u)) ^ b
748
+ bnum_modexp(tmp1, v, u, ng->N);
749
+ bnum_mul(tmp2, A, tmp1);
750
+ bnum_modexp(S, tmp2, b, ng->N);
751
+
752
+ hash_num(alg, S, ver->session_key);
753
+ ver->session_key_len = hash_length(ver->alg);
754
+
755
+ calculate_M(alg, ng, ver->M, username, s, A, B, ver->session_key, ver->session_key_len);
756
+ calculate_H_AMK(alg, ver->H_AMK, A, ver->M, ver->session_key, ver->session_key_len);
757
+
758
+ ver->bytes_B = bytes_B;
759
+
760
+ bnum_free(s);
761
+ bnum_free(v);
762
+ bnum_free(A);
763
+ bnum_free(u);
764
+ bnum_free(k);
765
+ bnum_free(B);
766
+ bnum_free(S);
767
+ bnum_free(b);
768
+ bnum_free(tmp1);
769
+ bnum_free(tmp2);
770
+ return ver;
771
+
772
+ error:
773
+ srp_verifier_free(ver);
774
+ bnum_free(s);
775
+ bnum_free(v);
776
+ bnum_free(A);
777
+ bnum_free(u);
778
+ bnum_free(k);
779
+ bnum_free(B);
780
+ bnum_free(S);
781
+ bnum_free(b);
782
+ bnum_free(tmp1);
783
+ bnum_free(tmp2);
784
+ return NULL;
785
+ }
786
+
787
+ // user_M must be exactly SHA512_DIGEST_LENGTH bytes in size
788
+ static void
789
+ srp_verifier_verify_session(struct SRPVerifier *ver, const unsigned char *user_M, const unsigned char **bytes_HAMK)
790
+ {
791
+ if (memcmp(ver->M, user_M, hash_length(ver->alg)) == 0)
792
+ {
793
+ ver->authenticated = 1;
794
+ *bytes_HAMK = ver->H_AMK;
795
+ }
796
+ else
797
+ *bytes_HAMK = NULL;
798
+ }
799
+
800
+ static const unsigned char *
801
+ srp_verifier_get_session_key(struct SRPVerifier *ver, int *key_length)
802
+ {
803
+ if (key_length)
804
+ *key_length = hash_length(ver->alg);
805
+
806
+ return ver->session_key;
807
+ }
808
+
809
+ /* -------------------------------- HELPERS --------------------------------- */
810
+
811
+ static void
812
+ hexread(uint8_t *out, size_t out_len, const char *in)
813
+ {
814
+ char hex[] = { 0, 0, 0 };
815
+ int i;
816
+
817
+ for (i = 0; i < out_len; i++, in+=2)
818
+ {
819
+ hex[0] = in[0];
820
+ hex[1] = in[1];
821
+ out[i] = strtol(hex, NULL, 16);
822
+ }
823
+ }
824
+
825
+ static pair_tlv_values_t *
826
+ message_process(const uint8_t *data, size_t data_len, const char **errmsg)
827
+ {
828
+ pair_tlv_values_t *response;
829
+ pair_tlv_t *error;
830
+ int ret;
831
+
832
+ response = pair_tlv_new();
833
+ if (!response)
834
+ {
835
+ *errmsg = "Out of memory\n";
836
+ return NULL;
837
+ }
838
+
839
+ ret = pair_tlv_parse(data, data_len, response);
840
+ if (ret < 0)
841
+ {
842
+ *errmsg = "Could not parse TLV\n";
843
+ goto error;
844
+ }
845
+
846
+ #ifdef DEBUG_PAIR
847
+ pair_tlv_debug(response);
848
+ #endif
849
+
850
+ error = pair_tlv_get_value(response, TLVType_Error);
851
+ if (error)
852
+ {
853
+ if (error->value[0] == TLVError_Authentication)
854
+ *errmsg = "Device returned an authentication failure";
855
+ else if (error->value[0] == TLVError_Backoff)
856
+ *errmsg = "Device told us to back off pairing attempts\n";
857
+ else if (error->value[0] == TLVError_MaxPeers)
858
+ *errmsg = "Max peers trying to connect to device\n";
859
+ else if (error->value[0] == TLVError_MaxTries)
860
+ *errmsg = "Max pairing attemps reached\n";
861
+ else if (error->value[0] == TLVError_Unavailable)
862
+ *errmsg = "Device is unuavailble at this time\n";
863
+ else
864
+ *errmsg = "Device is busy/returned unknown error\n";
865
+
866
+ goto error;
867
+ }
868
+
869
+ return response;
870
+
871
+ error:
872
+ pair_tlv_free(response);
873
+ return NULL;
874
+ }
875
+
876
+ /* Executes SHA512 RFC 5869 extract + expand, writing a derived key to okm
877
+
878
+ hkdfExtract(SHA512, salt, salt_len, ikm, ikm_len, prk);
879
+ hkdfExpand(SHA512, prk, SHA512_LEN, info, info_len, okm, okm_len);
880
+ */
881
+ static int
882
+ hkdf_extract_expand(uint8_t *okm, size_t okm_len, const uint8_t *ikm, size_t ikm_len, enum pair_keys pair_key)
883
+ {
884
+ #ifdef CONFIG_OPENSSL
885
+ #include <openssl/kdf.h>
886
+ EVP_PKEY_CTX *pctx;
887
+
888
+ if (okm_len > SHA512_DIGEST_LENGTH)
889
+ return -1;
890
+ if (! (pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL)))
891
+ return -1;
892
+ if (EVP_PKEY_derive_init(pctx) <= 0)
893
+ goto error;
894
+ if (EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha512()) <= 0)
895
+ goto error;
896
+ if (EVP_PKEY_CTX_set1_hkdf_salt(pctx, (const unsigned char *)pair_keys_map[pair_key].salt, strlen(pair_keys_map[pair_key].salt)) <= 0)
897
+ goto error;
898
+ if (EVP_PKEY_CTX_set1_hkdf_key(pctx, ikm, ikm_len) <= 0)
899
+ goto error;
900
+ if (EVP_PKEY_CTX_add1_hkdf_info(pctx, (const unsigned char *)pair_keys_map[pair_key].info, strlen(pair_keys_map[pair_key].info)) <= 0)
901
+ goto error;
902
+ if (EVP_PKEY_derive(pctx, okm, &okm_len) <= 0)
903
+ goto error;
904
+
905
+ EVP_PKEY_CTX_free(pctx);
906
+ return 0;
907
+
908
+ error:
909
+ EVP_PKEY_CTX_free(pctx);
910
+ return -1;
911
+ #elif CONFIG_GCRYPT
912
+ uint8_t prk[SHA512_DIGEST_LENGTH];
913
+ gcry_md_hd_t hmac_handle;
914
+
915
+ if (okm_len > SHA512_DIGEST_LENGTH)
916
+ return -1; // Below calculation not valid if output is larger than hash size
917
+ if (gcry_md_open(&hmac_handle, GCRY_MD_SHA512, GCRY_MD_FLAG_HMAC) != GPG_ERR_NO_ERROR)
918
+ return -1;
919
+ if (gcry_md_setkey(hmac_handle, (const unsigned char *)pair_keys_map[pair_key].salt, strlen(pair_keys_map[pair_key].salt)) != GPG_ERR_NO_ERROR)
920
+ goto error;
921
+ gcry_md_write(hmac_handle, ikm, ikm_len);
922
+ memcpy(prk, gcry_md_read(hmac_handle, 0), sizeof(prk));
923
+
924
+ gcry_md_reset(hmac_handle);
925
+
926
+ if (gcry_md_setkey(hmac_handle, prk, sizeof(prk)) != GPG_ERR_NO_ERROR)
927
+ goto error;
928
+ gcry_md_write(hmac_handle, (const unsigned char *)pair_keys_map[pair_key].info, strlen(pair_keys_map[pair_key].info));
929
+ gcry_md_putc(hmac_handle, 1);
930
+
931
+ memcpy(okm, gcry_md_read(hmac_handle, 0), okm_len);
932
+
933
+ gcry_md_close(hmac_handle);
934
+ return 0;
935
+
936
+ error:
937
+ gcry_md_close(hmac_handle);
938
+ return -1;
939
+ #else
940
+ return -1;
941
+ #endif
942
+ }
943
+
944
+ static int
945
+ encrypt_chacha(uint8_t *cipher, const uint8_t *plain, size_t plain_len, const uint8_t *key, size_t key_len, const void *ad, size_t ad_len, uint8_t *tag, size_t tag_len, const uint8_t nonce[NONCE_LENGTH])
946
+ {
947
+ #ifdef CONFIG_OPENSSL
948
+ EVP_CIPHER_CTX *ctx;
949
+ int len;
950
+
951
+ if (! (ctx = EVP_CIPHER_CTX_new()))
952
+ return -1;
953
+
954
+ if (EVP_EncryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, key, nonce) != 1)
955
+ goto error;
956
+
957
+ if (EVP_CIPHER_CTX_set_padding(ctx, 0) != 1) // Maybe not necessary
958
+ goto error;
959
+
960
+ if (ad_len > 0 && EVP_EncryptUpdate(ctx, NULL, &len, ad, ad_len) != 1)
961
+ goto error;
962
+
963
+ if (EVP_EncryptUpdate(ctx, cipher, &len, plain, plain_len) != 1)
964
+ goto error;
965
+
966
+ assert(len == plain_len);
967
+
968
+ if (EVP_EncryptFinal_ex(ctx, NULL, &len) != 1)
969
+ goto error;
970
+
971
+ if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, tag) != 1)
972
+ goto error;
973
+
974
+ EVP_CIPHER_CTX_free(ctx);
975
+ return 0;
976
+
977
+ error:
978
+ EVP_CIPHER_CTX_free(ctx);
979
+ return -1;
980
+ #elif CONFIG_GCRYPT
981
+ gcry_cipher_hd_t hd;
982
+
983
+ if (gcry_cipher_open(&hd, GCRY_CIPHER_CHACHA20, GCRY_CIPHER_MODE_POLY1305, 0) != GPG_ERR_NO_ERROR)
984
+ return -1;
985
+
986
+ if (gcry_cipher_setkey(hd, key, key_len) != GPG_ERR_NO_ERROR)
987
+ goto error;
988
+
989
+ if (gcry_cipher_setiv(hd, nonce, NONCE_LENGTH) != GPG_ERR_NO_ERROR)
990
+ goto error;
991
+
992
+ if (ad_len > 0 && gcry_cipher_authenticate(hd, ad, ad_len) != GPG_ERR_NO_ERROR)
993
+ goto error;
994
+
995
+ if (gcry_cipher_encrypt(hd, cipher, plain_len, plain, plain_len) != GPG_ERR_NO_ERROR)
996
+ goto error;
997
+
998
+ if (gcry_cipher_gettag(hd, tag, tag_len) != GPG_ERR_NO_ERROR)
999
+ goto error;
1000
+
1001
+ gcry_cipher_close(hd);
1002
+ return 0;
1003
+
1004
+ error:
1005
+ gcry_cipher_close(hd);
1006
+ return -1;
1007
+ #else
1008
+ return -1;
1009
+ #endif
1010
+ }
1011
+
1012
+ static int
1013
+ decrypt_chacha(uint8_t *plain, const uint8_t *cipher, size_t cipher_len, const uint8_t *key, size_t key_len, const void *ad, size_t ad_len, uint8_t *tag, size_t tag_len, const uint8_t nonce[NONCE_LENGTH])
1014
+ {
1015
+ #ifdef CONFIG_OPENSSL
1016
+ EVP_CIPHER_CTX *ctx;
1017
+ int len;
1018
+
1019
+ if (! (ctx = EVP_CIPHER_CTX_new()))
1020
+ return -1;
1021
+
1022
+ if (EVP_DecryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, key, nonce) != 1)
1023
+ goto error;
1024
+
1025
+ if (EVP_CIPHER_CTX_set_padding(ctx, 0) != 1) // Maybe not necessary
1026
+ goto error;
1027
+
1028
+ if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, tag) != 1)
1029
+ goto error;
1030
+
1031
+ if (ad_len > 0 && EVP_DecryptUpdate(ctx, NULL, &len, ad, ad_len) != 1)
1032
+ goto error;
1033
+
1034
+ if (EVP_DecryptUpdate(ctx, plain, &len, cipher, cipher_len) != 1)
1035
+ goto error;
1036
+
1037
+ if (EVP_DecryptFinal_ex(ctx, NULL, &len) != 1)
1038
+ goto error;
1039
+
1040
+ EVP_CIPHER_CTX_free(ctx);
1041
+ return 0;
1042
+
1043
+ error:
1044
+ EVP_CIPHER_CTX_free(ctx);
1045
+ return -1;
1046
+ #elif CONFIG_GCRYPT
1047
+ gcry_cipher_hd_t hd;
1048
+
1049
+ if (gcry_cipher_open(&hd, GCRY_CIPHER_CHACHA20, GCRY_CIPHER_MODE_POLY1305, 0) != GPG_ERR_NO_ERROR)
1050
+ return -1;
1051
+
1052
+ if (gcry_cipher_setkey(hd, key, key_len) != GPG_ERR_NO_ERROR)
1053
+ goto error;
1054
+
1055
+ if (gcry_cipher_setiv(hd, nonce, NONCE_LENGTH) != GPG_ERR_NO_ERROR)
1056
+ goto error;
1057
+
1058
+ if (ad_len > 0 && gcry_cipher_authenticate(hd, ad, ad_len) != GPG_ERR_NO_ERROR)
1059
+ goto error;
1060
+
1061
+ if (gcry_cipher_decrypt(hd, plain, cipher_len, cipher, cipher_len) != GPG_ERR_NO_ERROR)
1062
+ goto error;
1063
+
1064
+ if (gcry_cipher_checktag(hd, tag, tag_len) != GPG_ERR_NO_ERROR)
1065
+ goto error;
1066
+
1067
+ gcry_cipher_close(hd);
1068
+ return 0;
1069
+
1070
+ error:
1071
+ gcry_cipher_close(hd);
1072
+ return -1;
1073
+ #else
1074
+ return -1;
1075
+ #endif
1076
+ }
1077
+
1078
+ static int
1079
+ create_info(uint8_t *info, size_t *info_len, uint8_t *a, size_t a_len, uint8_t *b, size_t b_len, uint8_t *c, size_t c_len)
1080
+ {
1081
+ if (a_len + b_len + c_len > *info_len)
1082
+ return -1;
1083
+
1084
+ *info_len = a_len + b_len + c_len;
1085
+ memcpy(info, a, a_len);
1086
+ memcpy(info + a_len, b, b_len);
1087
+ memcpy(info + a_len + b_len, c, c_len);
1088
+
1089
+ return 0;
1090
+ }
1091
+
1092
+ static int
1093
+ create_and_sign_device_info(uint8_t *msg, size_t *msg_len, const char *device_id, uint8_t *device_x, size_t device_x_len, uint8_t *pk, size_t pk_len, uint8_t *sk)
1094
+ {
1095
+ pair_tlv_values_t *tlv;
1096
+ uint8_t device_info[256];
1097
+ size_t device_info_len;
1098
+ size_t device_id_len;
1099
+ uint8_t signature[crypto_sign_BYTES];
1100
+ int ret;
1101
+
1102
+ device_id_len = strlen(device_id);
1103
+ device_info_len = sizeof(device_info);
1104
+
1105
+ ret = create_info(device_info, &device_info_len, device_x, device_x_len, (uint8_t *)device_id, device_id_len, pk, pk_len);
1106
+ if (ret < 0)
1107
+ return -1;
1108
+
1109
+ crypto_sign_detached(signature, NULL, device_info, device_info_len, sk);
1110
+
1111
+ tlv = pair_tlv_new();
1112
+ pair_tlv_add_value(tlv, TLVType_Identifier, (unsigned char *)device_id, device_id_len);
1113
+ pair_tlv_add_value(tlv, TLVType_Signature, signature, sizeof(signature));
1114
+
1115
+ ret = pair_tlv_format(tlv, msg, msg_len);
1116
+
1117
+ pair_tlv_free(tlv);
1118
+ return ret;
1119
+ }
1120
+
1121
+ static int
1122
+ create_and_sign_accessory_info(uint8_t *msg, size_t *msg_len, uint8_t *server_pk, size_t server_pk_len, const char *accessory_id, uint8_t *client_pk, size_t client_pk_len, uint8_t *sk)
1123
+ {
1124
+ pair_tlv_values_t *tlv;
1125
+ uint8_t accessory_info[256];
1126
+ size_t accessory_info_len;
1127
+ size_t accessory_id_len;
1128
+ uint8_t signature[crypto_sign_BYTES];
1129
+ int ret;
1130
+
1131
+ accessory_id_len = strlen(accessory_id);
1132
+ accessory_info_len = sizeof(accessory_info);
1133
+
1134
+ ret = create_info(accessory_info, &accessory_info_len, server_pk, server_pk_len, (uint8_t *)accessory_id, accessory_id_len, client_pk, client_pk_len);
1135
+ if (ret < 0)
1136
+ return -1;
1137
+
1138
+ crypto_sign_detached(signature, NULL, accessory_info, accessory_info_len, sk);
1139
+
1140
+ tlv = pair_tlv_new();
1141
+ pair_tlv_add_value(tlv, TLVType_Identifier, (unsigned char *)accessory_id, accessory_id_len);
1142
+ pair_tlv_add_value(tlv, TLVType_Signature, signature, sizeof(signature));
1143
+
1144
+ ret = pair_tlv_format(tlv, msg, msg_len);
1145
+
1146
+ pair_tlv_free(tlv);
1147
+ return ret;
1148
+ }
1149
+
1150
+ static int
1151
+ verify_info(uint8_t *signature, uint8_t *pk, uint8_t *a, size_t a_len, uint8_t *b, size_t b_len, uint8_t *c, size_t c_len)
1152
+ {
1153
+ uint8_t info[256];
1154
+ size_t info_len;
1155
+ int ret;
1156
+
1157
+ info_len = sizeof(info);
1158
+ ret = create_info(info, &info_len, a, a_len, b, b_len, c, c_len);
1159
+ if (ret < 0)
1160
+ return -1;
1161
+
1162
+ return crypto_sign_verify_detached(signature, info, info_len, pk);
1163
+ }
1164
+
1165
+
1166
+ /* ------------------------- CLIENT IMPLEMENTATION -------------------------- */
1167
+
1168
+ static int
1169
+ client_setup_new(struct pair_setup_context *handle, const char *pin, pair_cb add_cb, void *cb_arg, const char *device_id)
1170
+ {
1171
+ struct pair_client_setup_context *sctx = &handle->sctx.client;
1172
+
1173
+ if (!is_initialized())
1174
+ return -1;
1175
+
1176
+ if (!pin && handle->type == &pair_client_homekit_transient)
1177
+ pin = "3939";
1178
+ else if (!pin)
1179
+ return -1;
1180
+
1181
+ if (device_id && strlen(device_id) >= PAIR_AP_DEVICE_ID_LEN_MAX)
1182
+ return -1;
1183
+
1184
+ sctx->pin = strdup(pin);
1185
+ if (!sctx->pin)
1186
+ return -1;
1187
+
1188
+ sctx->add_cb = add_cb;
1189
+ sctx->add_cb_arg = cb_arg;
1190
+
1191
+ if (device_id)
1192
+ memcpy(sctx->device_id, device_id, strlen(device_id));
1193
+
1194
+ crypto_sign_keypair(sctx->public_key, sctx->private_key);
1195
+
1196
+ #ifdef DEBUG_PAIR
1197
+ hexdump("Client public key:\n", sctx->public_key, sizeof(sctx->public_key));
1198
+ hexdump("Client private key:\n", sctx->private_key, sizeof(sctx->private_key));
1199
+ #endif
1200
+
1201
+ return 0;
1202
+ }
1203
+
1204
+ static void
1205
+ client_setup_free(struct pair_setup_context *handle)
1206
+ {
1207
+ struct pair_client_setup_context *sctx = &handle->sctx.client;
1208
+
1209
+ srp_user_free(sctx->user);
1210
+
1211
+ free(sctx->pkB);
1212
+ free(sctx->M2);
1213
+ free(sctx->salt);
1214
+ free(sctx->epk);
1215
+ free(sctx->authtag);
1216
+ free(sctx->pin);
1217
+ }
1218
+
1219
+ static uint8_t *
1220
+ client_setup_request1(size_t *len, struct pair_setup_context *handle)
1221
+ {
1222
+ struct pair_client_setup_context *sctx = &handle->sctx.client;
1223
+ pair_tlv_values_t *request;
1224
+ uint8_t *data;
1225
+ size_t data_len;
1226
+ uint8_t method;
1227
+ uint8_t flags;
1228
+ int endian_test = 1;
1229
+ int ret;
1230
+
1231
+ data_len = REQUEST_BUFSIZE;
1232
+ data = malloc(data_len);
1233
+ request = pair_tlv_new();
1234
+
1235
+ // Test here instead of setup_new() so we can give an error message
1236
+ if(*(char *)&endian_test != 1)
1237
+ {
1238
+ handle->errmsg = "Setup request 1: No support for big endian architechture";
1239
+ goto error;
1240
+ }
1241
+
1242
+ sctx->user = srp_user_new(HASH_SHA512, SRP_NG_3072, USERNAME, (unsigned char *)sctx->pin, strlen(sctx->pin), 0, 0);
1243
+ if (!sctx->user)
1244
+ {
1245
+ handle->errmsg = "Setup request 1: Create SRP user failed";
1246
+ goto error;
1247
+ }
1248
+
1249
+ method = PairingMethodPairSetup;
1250
+ pair_tlv_add_value(request, TLVType_State, &pair_keys_map[PAIR_SETUP_MSG01].state, sizeof(pair_keys_map[PAIR_SETUP_MSG01].state));
1251
+ pair_tlv_add_value(request, TLVType_Method, &method, sizeof(method));
1252
+
1253
+ if (handle->type == &pair_client_homekit_transient)
1254
+ {
1255
+ flags = PairingFlagsTransient;
1256
+ pair_tlv_add_value(request, TLVType_Flags, &flags, sizeof(flags));
1257
+ }
1258
+
1259
+ ret = pair_tlv_format(request, data, &data_len);
1260
+ if (ret < 0)
1261
+ {
1262
+ handle->errmsg = "Setup request 1: pair_tlv_format returned an error";
1263
+ goto error;
1264
+ }
1265
+
1266
+ *len = data_len;
1267
+
1268
+ pair_tlv_free(request);
1269
+ return data;
1270
+
1271
+ error:
1272
+ pair_tlv_free(request);
1273
+ free(data);
1274
+ return NULL;
1275
+ }
1276
+
1277
+ static uint8_t *
1278
+ client_setup_request2(size_t *len, struct pair_setup_context *handle)
1279
+ {
1280
+ struct pair_client_setup_context *sctx = &handle->sctx.client;
1281
+ pair_tlv_values_t *request;
1282
+ uint8_t *data;
1283
+ size_t data_len;
1284
+ const char *auth_username = NULL;
1285
+ int ret;
1286
+
1287
+ data_len = REQUEST_BUFSIZE;
1288
+ data = malloc(data_len);
1289
+ request = pair_tlv_new();
1290
+
1291
+ // Calculate A
1292
+ srp_user_start_authentication(sctx->user, &auth_username, &sctx->pkA, &sctx->pkA_len);
1293
+
1294
+ // Calculate M1 (client proof)
1295
+ srp_user_process_challenge(sctx->user, (const unsigned char *)sctx->salt, sctx->salt_len, (const unsigned char *)sctx->pkB, sctx->pkB_len, &sctx->M1, &sctx->M1_len);
1296
+
1297
+ pair_tlv_add_value(request, TLVType_State, &pair_keys_map[PAIR_SETUP_MSG03].state, sizeof(pair_keys_map[PAIR_SETUP_MSG03].state));
1298
+ pair_tlv_add_value(request, TLVType_PublicKey, sctx->pkA, sctx->pkA_len);
1299
+ pair_tlv_add_value(request, TLVType_Proof, sctx->M1, sctx->M1_len);
1300
+
1301
+ ret = pair_tlv_format(request, data, &data_len);
1302
+ if (ret < 0)
1303
+ {
1304
+ handle->errmsg = "Setup request 2: pair_tlv_format returned an error";
1305
+ goto error;
1306
+ }
1307
+
1308
+ *len = data_len;
1309
+
1310
+ pair_tlv_free(request);
1311
+ return data;
1312
+
1313
+ error:
1314
+ pair_tlv_free(request);
1315
+ free(data);
1316
+ return NULL;
1317
+ }
1318
+
1319
+ static uint8_t *
1320
+ client_setup_request3(size_t *len, struct pair_setup_context *handle)
1321
+ {
1322
+ struct pair_client_setup_context *sctx = &handle->sctx.client;
1323
+ pair_tlv_values_t *request;
1324
+ uint8_t *data;
1325
+ size_t data_len;
1326
+ const unsigned char *session_key;
1327
+ int session_key_len;
1328
+ uint8_t device_x[32];
1329
+ uint8_t nonce[NONCE_LENGTH] = { 0 };
1330
+ uint8_t tag[AUTHTAG_LENGTH];
1331
+ uint8_t derived_key[32];
1332
+ pair_tlv_values_t *append;
1333
+ size_t append_len;
1334
+ uint8_t *encrypted_data = NULL;
1335
+ size_t encrypted_data_len;
1336
+ int ret;
1337
+
1338
+ data_len = REQUEST_BUFSIZE;
1339
+ data = malloc(data_len);
1340
+ request = pair_tlv_new();
1341
+
1342
+ session_key = srp_user_get_session_key(sctx->user, &session_key_len);
1343
+ if (!session_key)
1344
+ {
1345
+ handle->errmsg = "Setup request 3: No valid session key";
1346
+ goto error;
1347
+ }
1348
+
1349
+ ret = hkdf_extract_expand(device_x, sizeof(device_x), session_key, session_key_len, PAIR_SETUP_CONTROLLER_SIGN);
1350
+ if (ret < 0)
1351
+ {
1352
+ handle->errmsg = "Setup request 3: hkdf error getting device_x";
1353
+ goto error;
1354
+ }
1355
+
1356
+ ret = create_and_sign_device_info(data, &data_len, sctx->device_id, device_x, sizeof(device_x), sctx->public_key, sizeof(sctx->public_key), sctx->private_key);
1357
+ if (ret < 0)
1358
+ {
1359
+ handle->errmsg = "Setup request 3: error creating signed device info";
1360
+ goto error;
1361
+ }
1362
+
1363
+ ret = hkdf_extract_expand(derived_key, sizeof(derived_key), session_key, session_key_len, PAIR_SETUP_MSG05);
1364
+ if (ret < 0)
1365
+ {
1366
+ handle->errmsg = "Setup request 3: hkdf error getting derived_key";
1367
+ goto error;
1368
+ }
1369
+
1370
+ // Append TLV-encoded public key to *data, which already has identifier and signature
1371
+ append = pair_tlv_new();
1372
+ append_len = REQUEST_BUFSIZE - data_len;
1373
+ pair_tlv_add_value(append, TLVType_PublicKey, sctx->public_key, sizeof(sctx->public_key));
1374
+ ret = pair_tlv_format(append, data + data_len, &append_len);
1375
+ pair_tlv_free(append);
1376
+ if (ret < 0)
1377
+ {
1378
+ handle->errmsg = "Setup request 3: error appending public key to TLV";
1379
+ goto error;
1380
+ }
1381
+ data_len += append_len;
1382
+
1383
+ memcpy(nonce + 4, pair_keys_map[PAIR_SETUP_MSG05].nonce, NONCE_LENGTH - 4);
1384
+
1385
+ encrypted_data_len = data_len + sizeof(tag); // Space for ciphered payload and authtag
1386
+ encrypted_data = malloc(encrypted_data_len);
1387
+
1388
+ ret = encrypt_chacha(encrypted_data, data, data_len, derived_key, sizeof(derived_key), NULL, 0, tag, sizeof(tag), nonce);
1389
+ if (ret < 0)
1390
+ {
1391
+ handle->errmsg = "Setup request 3: Could not encrypt";
1392
+ goto error;
1393
+ }
1394
+
1395
+ memcpy(encrypted_data + data_len, tag, sizeof(tag));
1396
+
1397
+ pair_tlv_add_value(request, TLVType_State, &pair_keys_map[PAIR_SETUP_MSG05].state, sizeof(pair_keys_map[PAIR_SETUP_MSG05].state));
1398
+ pair_tlv_add_value(request, TLVType_EncryptedData, encrypted_data, encrypted_data_len);
1399
+
1400
+ data_len = REQUEST_BUFSIZE; // Re-using *data, so pass original length to pair_tlv_format
1401
+ ret = pair_tlv_format(request, data, &data_len);
1402
+ if (ret < 0)
1403
+ {
1404
+ handle->errmsg = "Setup request 3: error appending public key to TLV";
1405
+ goto error;
1406
+ }
1407
+
1408
+ *len = data_len;
1409
+
1410
+ free(encrypted_data);
1411
+ pair_tlv_free(request);
1412
+ return data;
1413
+
1414
+ error:
1415
+ free(encrypted_data);
1416
+ pair_tlv_free(request);
1417
+ free(data);
1418
+ return NULL;
1419
+ }
1420
+
1421
+ static int
1422
+ client_setup_response1(struct pair_setup_context *handle, const uint8_t *data, size_t data_len)
1423
+ {
1424
+ struct pair_client_setup_context *sctx = &handle->sctx.client;
1425
+ pair_tlv_values_t *response;
1426
+ pair_tlv_t *pk;
1427
+ pair_tlv_t *salt;
1428
+
1429
+ response = message_process(data, data_len, &handle->errmsg);
1430
+ if (!response)
1431
+ {
1432
+ return -1;
1433
+ }
1434
+
1435
+ pk = pair_tlv_get_value(response, TLVType_PublicKey);
1436
+ if (!pk || pk->size > N_len(SRP_NG_3072)) // max 384 bytes
1437
+ {
1438
+ handle->errmsg = "Setup response 1: Missing or invalid public key";
1439
+ goto error;
1440
+ }
1441
+
1442
+ salt = pair_tlv_get_value(response, TLVType_Salt);
1443
+ if (!salt || salt->size != 16)
1444
+ {
1445
+ handle->errmsg = "Setup response 1: Missing or invalid salt";
1446
+ goto error;
1447
+ }
1448
+
1449
+ sctx->pkB_len = pk->size;
1450
+ sctx->pkB = malloc(sctx->pkB_len);
1451
+ memcpy(sctx->pkB, pk->value, sctx->pkB_len);
1452
+
1453
+ sctx->salt_len = salt->size;
1454
+ sctx->salt = malloc(sctx->salt_len);
1455
+ memcpy(sctx->salt, salt->value, sctx->salt_len);
1456
+
1457
+ pair_tlv_free(response);
1458
+ return 0;
1459
+
1460
+ error:
1461
+ pair_tlv_free(response);
1462
+ return -1;
1463
+ }
1464
+
1465
+ static int
1466
+ client_setup_response2(struct pair_setup_context *handle, const uint8_t *data, size_t data_len)
1467
+ {
1468
+ struct pair_client_setup_context *sctx = &handle->sctx.client;
1469
+ pair_tlv_values_t *response;
1470
+ pair_tlv_t *proof;
1471
+ const uint8_t *session_key;
1472
+ int session_key_len;
1473
+
1474
+ response = message_process(data, data_len, &handle->errmsg);
1475
+ if (!response)
1476
+ {
1477
+ return -1;
1478
+ }
1479
+
1480
+ proof = pair_tlv_get_value(response, TLVType_Proof);
1481
+ if (!proof || proof->size != SHA512_DIGEST_LENGTH)
1482
+ {
1483
+ handle->errmsg = "Setup response 2: Missing or invalid proof";
1484
+ goto error;
1485
+ }
1486
+
1487
+ sctx->M2_len = proof->size;
1488
+ sctx->M2 = malloc(sctx->M2_len);
1489
+ memcpy(sctx->M2, proof->value, sctx->M2_len);
1490
+
1491
+ // Check M2
1492
+ srp_user_verify_session(sctx->user, (const unsigned char *)sctx->M2);
1493
+ if (!srp_user_is_authenticated(sctx->user))
1494
+ {
1495
+ handle->errmsg = "Setup response 2: Server authentication failed";
1496
+ goto error;
1497
+ }
1498
+
1499
+ if (handle->type == &pair_client_homekit_transient)
1500
+ {
1501
+ session_key = srp_user_get_session_key(sctx->user, &session_key_len);
1502
+ if (!session_key)
1503
+ {
1504
+ handle->errmsg = "Setup response 2: Could not compute session key";
1505
+ goto error;
1506
+ }
1507
+
1508
+ assert(sizeof(handle->result.shared_secret) >= session_key_len);
1509
+
1510
+ memcpy(handle->result.shared_secret, session_key, session_key_len);
1511
+ handle->result.shared_secret_len = session_key_len;
1512
+
1513
+ handle->status = PAIR_STATUS_COMPLETED;
1514
+ }
1515
+
1516
+ pair_tlv_free(response);
1517
+ return 0;
1518
+
1519
+ error:
1520
+ pair_tlv_free(response);
1521
+ return -1;
1522
+ }
1523
+
1524
+ static int
1525
+ client_setup_response3(struct pair_setup_context *handle, const uint8_t *data, size_t data_len)
1526
+ {
1527
+ struct pair_client_setup_context *sctx = &handle->sctx.client;
1528
+ pair_tlv_values_t *response;
1529
+ pair_tlv_t *encrypted_data;
1530
+ pair_tlv_t *device_id;
1531
+ pair_tlv_t *pk;
1532
+ pair_tlv_t *signature;
1533
+ uint8_t nonce[NONCE_LENGTH] = { 0 };
1534
+ uint8_t tag[AUTHTAG_LENGTH];
1535
+ uint8_t derived_key[32];
1536
+ size_t encrypted_len;
1537
+ uint8_t *decrypted_data = NULL;
1538
+ const uint8_t *session_key;
1539
+ int session_key_len;
1540
+ uint8_t device_x[32];
1541
+ int ret;
1542
+
1543
+ response = message_process(data, data_len, &handle->errmsg);
1544
+ if (!response)
1545
+ {
1546
+ return -1;
1547
+ }
1548
+
1549
+ encrypted_data = pair_tlv_get_value(response, TLVType_EncryptedData);
1550
+ if (!encrypted_data)
1551
+ {
1552
+ handle->errmsg = "Setup response 3: Missing encrypted_data";
1553
+ goto error;
1554
+ }
1555
+
1556
+ session_key = srp_user_get_session_key(sctx->user, &session_key_len);
1557
+ if (!session_key)
1558
+ {
1559
+ handle->errmsg = "Setup response 3: No valid session key";
1560
+ goto error;
1561
+ }
1562
+
1563
+ ret = hkdf_extract_expand(derived_key, sizeof(derived_key), session_key, session_key_len, PAIR_SETUP_MSG06);
1564
+ if (ret < 0)
1565
+ {
1566
+ handle->errmsg = "Setup response 3: hkdf error getting derived_key";
1567
+ goto error;
1568
+ }
1569
+
1570
+ // encrypted_data->value consists of the encrypted payload + the auth tag
1571
+ if (encrypted_data->size < AUTHTAG_LENGTH)
1572
+ {
1573
+ handle->errmsg = "Setup response 3: Invalid encrypted data";
1574
+ goto error;
1575
+ }
1576
+
1577
+ encrypted_len = encrypted_data->size - AUTHTAG_LENGTH;
1578
+ memcpy(tag, encrypted_data->value + encrypted_len, AUTHTAG_LENGTH);
1579
+ memcpy(nonce + 4, pair_keys_map[PAIR_SETUP_MSG06].nonce, NONCE_LENGTH - 4);
1580
+
1581
+ decrypted_data = malloc(encrypted_len);
1582
+
1583
+ ret = decrypt_chacha(decrypted_data, encrypted_data->value, encrypted_len, derived_key, sizeof(derived_key), NULL, 0, tag, sizeof(tag), nonce);
1584
+ if (ret < 0)
1585
+ {
1586
+ handle->errmsg = "Setup response 3: Decryption error";
1587
+ goto error;
1588
+ }
1589
+
1590
+ pair_tlv_free(response);
1591
+ response = message_process(decrypted_data, encrypted_len, &handle->errmsg);
1592
+ if (!response)
1593
+ {
1594
+ goto error;
1595
+ }
1596
+
1597
+ ret = hkdf_extract_expand(device_x, sizeof(device_x), session_key, session_key_len, PAIR_SETUP_ACCESSORY_SIGN);
1598
+ if (ret < 0)
1599
+ {
1600
+ handle->errmsg = "Setup response 3: hkdf error getting device_x";
1601
+ goto error;
1602
+ }
1603
+
1604
+ device_id = pair_tlv_get_value(response, TLVType_Identifier);
1605
+ pk = pair_tlv_get_value(response, TLVType_PublicKey);
1606
+ signature = pair_tlv_get_value(response, TLVType_Signature);
1607
+ if (!device_id || device_id->size >= sizeof(handle->result.device_id) || !pk || pk->size != crypto_sign_PUBLICKEYBYTES || !signature || signature->size != crypto_sign_BYTES)
1608
+ {
1609
+ handle->errmsg = "Setup response 3: Missing/invalid device ID, public key or signature";
1610
+ goto error;
1611
+ }
1612
+
1613
+ ret = verify_info(signature->value, pk->value, device_x, sizeof(device_x), device_id->value, device_id->size, pk->value, pk->size);
1614
+ if (ret < 0)
1615
+ {
1616
+ handle->errmsg = "Setup request 3: Invalid signature";
1617
+ goto error;
1618
+ }
1619
+
1620
+ assert(sizeof(handle->result.client_private_key) == sizeof(sctx->private_key));
1621
+ assert(sizeof(handle->result.client_public_key) == sizeof(sctx->public_key));
1622
+ assert(sizeof(handle->result.server_public_key) == pk->size);
1623
+
1624
+ memcpy(handle->result.client_private_key, sctx->private_key, sizeof(sctx->private_key));
1625
+ memcpy(handle->result.client_public_key, sctx->public_key, sizeof(sctx->public_key));
1626
+ memcpy(handle->result.server_public_key, pk->value, pk->size);
1627
+ memcpy(handle->result.device_id, device_id->value, device_id->size);
1628
+
1629
+ if (sctx->add_cb)
1630
+ sctx->add_cb(handle->result.server_public_key, handle->result.device_id, sctx->add_cb_arg);
1631
+
1632
+ handle->status = PAIR_STATUS_COMPLETED;
1633
+
1634
+ free(decrypted_data);
1635
+ pair_tlv_free(response);
1636
+ return 0;
1637
+
1638
+ error:
1639
+ free(decrypted_data);
1640
+ pair_tlv_free(response);
1641
+ return -1;
1642
+ }
1643
+
1644
+ static int
1645
+ client_setup_result(struct pair_setup_context *handle)
1646
+ {
1647
+ char *ptr;
1648
+ int i;
1649
+
1650
+ assert(sizeof(handle->result_str) >= 2 * sizeof(handle->result.client_private_key) + 2 * sizeof(handle->result.server_public_key) + 1);
1651
+
1652
+ // It is enough to export the private key, since the public key can be
1653
+ // extracted from that with crypto_sign_ed25519_sk_to_pk (it is the last 32
1654
+ // bytes)
1655
+ ptr = handle->result_str;
1656
+ for (i = 0; i < sizeof(handle->result.client_private_key); i++)
1657
+ ptr += sprintf(ptr, "%02x", handle->result.client_private_key[i]); // 2 x 64 bytes
1658
+ for (i = 0; i < sizeof(handle->result.server_public_key); i++)
1659
+ ptr += sprintf(ptr, "%02x", handle->result.server_public_key[i]); // 2 x 32 bytes
1660
+ *ptr = '\0';
1661
+
1662
+ return 0;
1663
+ }
1664
+
1665
+ static int
1666
+ client_verify_new(struct pair_verify_context *handle, const char *client_setup_keys, pair_cb cb, void *cb_arg, const char *device_id)
1667
+ {
1668
+ struct pair_client_verify_context *vctx = &handle->vctx.client;
1669
+ size_t hexkey_len;
1670
+
1671
+ if (!is_initialized())
1672
+ return -1;
1673
+
1674
+ if (!device_id || strlen(device_id) >= PAIR_AP_DEVICE_ID_LEN_MAX)
1675
+ return -1;
1676
+
1677
+ if (!client_setup_keys)
1678
+ return -1;
1679
+
1680
+ hexkey_len = strlen(client_setup_keys);
1681
+ if (hexkey_len == 2 * sizeof(vctx->client_private_key) + 2 * sizeof(vctx->server_public_key))
1682
+ {
1683
+ hexread(vctx->client_private_key, sizeof(vctx->client_private_key), client_setup_keys);
1684
+ hexread(vctx->server_public_key, sizeof(vctx->server_public_key), client_setup_keys + 2 * sizeof(vctx->client_private_key));
1685
+ vctx->verify_server_signature = true;
1686
+ }
1687
+ else if (hexkey_len == 2 * sizeof(vctx->client_private_key)) // No server public key known, so signature validation will be skipped
1688
+ {
1689
+ hexread(vctx->client_private_key, sizeof(vctx->client_private_key), client_setup_keys);
1690
+ }
1691
+ else
1692
+ return -1;
1693
+
1694
+ crypto_sign_ed25519_sk_to_pk(vctx->client_public_key, vctx->client_private_key);
1695
+
1696
+ snprintf(vctx->device_id, sizeof(vctx->device_id), "%s", device_id);
1697
+
1698
+ return 0;
1699
+ }
1700
+
1701
+ static uint8_t *
1702
+ client_verify_request1(size_t *len, struct pair_verify_context *handle)
1703
+ {
1704
+ struct pair_client_verify_context *vctx = &handle->vctx.client;
1705
+ // const uint8_t basepoint[crypto_scalarmult_BYTES] = {9}; // 32 bytes
1706
+ pair_tlv_values_t *request;
1707
+ uint8_t *data;
1708
+ size_t data_len;
1709
+ int ret;
1710
+
1711
+ data_len = REQUEST_BUFSIZE;
1712
+ data = malloc(data_len);
1713
+ request = pair_tlv_new();
1714
+
1715
+ crypto_box_keypair(vctx->client_eph_public_key, vctx->client_eph_private_key);
1716
+
1717
+ /*
1718
+ // TODO keep around in case box_keypair doesn't work
1719
+ ret = crypto_scalarmult(vctx->client_eph_public_key, vctx->client_eph_private_key, basepoint);
1720
+ if (ret < 0)
1721
+ {
1722
+ handle->errmsg = "Verify request 1: Curve 25519 returned an error";
1723
+ goto error;
1724
+ }
1725
+ */
1726
+
1727
+ pair_tlv_add_value(request, TLVType_State, &pair_keys_map[PAIR_VERIFY_MSG01].state, sizeof(pair_keys_map[PAIR_VERIFY_MSG01].state));
1728
+ pair_tlv_add_value(request, TLVType_PublicKey, vctx->client_eph_public_key, sizeof(vctx->client_eph_public_key));
1729
+
1730
+ ret = pair_tlv_format(request, data, &data_len);
1731
+ if (ret < 0)
1732
+ {
1733
+ handle->errmsg = "Verify request 1: pair_tlv_format returned an error";
1734
+ goto error;
1735
+ }
1736
+
1737
+ *len = data_len;
1738
+
1739
+ pair_tlv_free(request);
1740
+ return data;
1741
+
1742
+ error:
1743
+ pair_tlv_free(request);
1744
+ free(data);
1745
+ return NULL;
1746
+ }
1747
+
1748
+ static uint8_t *
1749
+ client_verify_request2(size_t *len, struct pair_verify_context *handle)
1750
+ {
1751
+ struct pair_client_verify_context *vctx = &handle->vctx.client;
1752
+ pair_tlv_values_t *request;
1753
+ uint8_t *data;
1754
+ size_t data_len;
1755
+ uint8_t nonce[NONCE_LENGTH] = { 0 };
1756
+ uint8_t tag[AUTHTAG_LENGTH];
1757
+ uint8_t derived_key[32];
1758
+ uint8_t *encrypted_data = NULL;
1759
+ size_t encrypted_data_len;
1760
+ int ret;
1761
+
1762
+ data_len = REQUEST_BUFSIZE;
1763
+ data = malloc(data_len);
1764
+ request = pair_tlv_new();
1765
+
1766
+ ret = create_and_sign_device_info(data, &data_len, vctx->device_id, vctx->client_eph_public_key, sizeof(vctx->client_eph_public_key),
1767
+ vctx->server_eph_public_key, sizeof(vctx->server_eph_public_key), vctx->client_private_key);
1768
+ if (ret < 0)
1769
+ {
1770
+ handle->errmsg = "Verify request 2: error creating signed device info";
1771
+ goto error;
1772
+ }
1773
+
1774
+ ret = hkdf_extract_expand(derived_key, sizeof(derived_key), vctx->shared_secret, sizeof(vctx->shared_secret), PAIR_VERIFY_MSG03);
1775
+ if (ret < 0)
1776
+ {
1777
+ handle->errmsg = "Verify request 2: hkdf error getting derived_key";
1778
+ goto error;
1779
+ }
1780
+
1781
+ memcpy(nonce + 4, pair_keys_map[PAIR_VERIFY_MSG03].nonce, NONCE_LENGTH - 4);
1782
+
1783
+ encrypted_data_len = data_len + sizeof(tag); // Space for ciphered payload and authtag
1784
+ encrypted_data = malloc(encrypted_data_len);
1785
+
1786
+ ret = encrypt_chacha(encrypted_data, data, data_len, derived_key, sizeof(derived_key), NULL, 0, tag, sizeof(tag), nonce);
1787
+ if (ret < 0)
1788
+ {
1789
+ handle->errmsg = "Verify request 2: Could not encrypt";
1790
+ goto error;
1791
+ }
1792
+
1793
+ memcpy(encrypted_data + data_len, tag, sizeof(tag));
1794
+
1795
+ pair_tlv_add_value(request, TLVType_State, &pair_keys_map[PAIR_VERIFY_MSG03].state, sizeof(pair_keys_map[PAIR_VERIFY_MSG03].state));
1796
+ pair_tlv_add_value(request, TLVType_EncryptedData, encrypted_data, encrypted_data_len);
1797
+
1798
+ data_len = REQUEST_BUFSIZE; // Re-using *data, so pass original length to pair_tlv_format
1799
+ ret = pair_tlv_format(request, data, &data_len);
1800
+ if (ret < 0)
1801
+ {
1802
+ handle->errmsg = "Verify request 2: pair_tlv_format returned an error";
1803
+ goto error;
1804
+ }
1805
+
1806
+ *len = data_len;
1807
+
1808
+ free(encrypted_data);
1809
+ pair_tlv_free(request);
1810
+ return data;
1811
+
1812
+ error:
1813
+ free(encrypted_data);
1814
+ pair_tlv_free(request);
1815
+ free(data);
1816
+ return NULL;
1817
+ }
1818
+
1819
+ static int
1820
+ client_verify_response1(struct pair_verify_context *handle, const uint8_t *data, size_t data_len)
1821
+ {
1822
+ struct pair_client_verify_context *vctx = &handle->vctx.client;
1823
+ pair_tlv_values_t *response;
1824
+ pair_tlv_t *encrypted_data;
1825
+ pair_tlv_t *public_key;
1826
+ pair_tlv_t *device_id;
1827
+ pair_tlv_t *signature;
1828
+ uint8_t nonce[NONCE_LENGTH] = { 0 };
1829
+ uint8_t tag[AUTHTAG_LENGTH];
1830
+ uint8_t derived_key[32];
1831
+ size_t encrypted_len;
1832
+ uint8_t *decrypted_data = NULL;
1833
+ int ret;
1834
+
1835
+ response = message_process(data, data_len, &handle->errmsg);
1836
+ if (!response)
1837
+ {
1838
+ return -1;
1839
+ }
1840
+
1841
+ encrypted_data = pair_tlv_get_value(response, TLVType_EncryptedData);
1842
+ if (!encrypted_data)
1843
+ {
1844
+ handle->errmsg = "Verify response 1: Missing encrypted_data";
1845
+ goto error;
1846
+ }
1847
+
1848
+ public_key = pair_tlv_get_value(response, TLVType_PublicKey);
1849
+ if (!public_key || public_key->size != sizeof(vctx->server_eph_public_key))
1850
+ {
1851
+ handle->errmsg = "Verify response 1: Missing or invalid public_key";
1852
+ goto error;
1853
+ }
1854
+
1855
+ memcpy(vctx->server_eph_public_key, public_key->value, sizeof(vctx->server_eph_public_key));
1856
+ ret = crypto_scalarmult(vctx->shared_secret, vctx->client_eph_private_key, vctx->server_eph_public_key);
1857
+ if (ret < 0)
1858
+ {
1859
+ handle->errmsg = "Verify response 1: Curve 25519 returned an error";
1860
+ goto error;
1861
+ }
1862
+
1863
+ ret = hkdf_extract_expand(derived_key, sizeof(derived_key), vctx->shared_secret, sizeof(vctx->shared_secret), PAIR_VERIFY_MSG02);
1864
+ if (ret < 0)
1865
+ {
1866
+ handle->errmsg = "Verify response 1: hkdf error getting derived_key";
1867
+ goto error;
1868
+ }
1869
+
1870
+ // encrypted_data->value consists of the encrypted payload + the auth tag
1871
+ if (encrypted_data->size < AUTHTAG_LENGTH)
1872
+ {
1873
+ handle->errmsg = "Verify response 1: Invalid encrypted data";
1874
+ goto error;
1875
+ }
1876
+
1877
+ encrypted_len = encrypted_data->size - AUTHTAG_LENGTH;
1878
+ memcpy(tag, encrypted_data->value + encrypted_len, AUTHTAG_LENGTH);
1879
+ memcpy(nonce + 4, pair_keys_map[PAIR_VERIFY_MSG02].nonce, NONCE_LENGTH - 4);
1880
+
1881
+ decrypted_data = malloc(encrypted_len);
1882
+
1883
+ ret = decrypt_chacha(decrypted_data, encrypted_data->value, encrypted_len, derived_key, sizeof(derived_key), NULL, 0, tag, sizeof(tag), nonce);
1884
+ if (ret < 0)
1885
+ {
1886
+ handle->errmsg = "Verify response 1: Decryption error";
1887
+ goto error;
1888
+ }
1889
+
1890
+ pair_tlv_free(response);
1891
+ response = message_process(decrypted_data, encrypted_len, &handle->errmsg);
1892
+ if (!response)
1893
+ {
1894
+ goto error;
1895
+ }
1896
+
1897
+ device_id = pair_tlv_get_value(response, TLVType_Identifier);
1898
+ signature = pair_tlv_get_value(response, TLVType_Signature);
1899
+ if (!device_id || !signature || signature->size != crypto_sign_BYTES)
1900
+ {
1901
+ handle->errmsg = "Verify response 1: Missing device ID or signature";
1902
+ goto error;
1903
+ }
1904
+
1905
+ if (vctx->verify_server_signature)
1906
+ {
1907
+ ret = verify_info(signature->value, vctx->server_public_key, vctx->server_eph_public_key, sizeof(vctx->server_eph_public_key),
1908
+ device_id->value, device_id->size, vctx->client_eph_public_key, sizeof(vctx->client_eph_public_key));
1909
+ if (ret < 0)
1910
+ {
1911
+ handle->errmsg = "Verify response 1: Invalid signature";
1912
+ goto error;
1913
+ }
1914
+ }
1915
+
1916
+ free(decrypted_data);
1917
+ pair_tlv_free(response);
1918
+ return 0;
1919
+
1920
+ error:
1921
+ free(decrypted_data);
1922
+ pair_tlv_free(response);
1923
+ return -1;
1924
+ }
1925
+
1926
+ static int
1927
+ client_verify_response2(struct pair_verify_context *handle, const uint8_t *data, size_t data_len)
1928
+ {
1929
+ struct pair_client_verify_context *vctx = &handle->vctx.client;
1930
+ pair_tlv_values_t *response;
1931
+
1932
+ response = message_process(data, data_len, &handle->errmsg);
1933
+ if (!response)
1934
+ {
1935
+ return -1;
1936
+ }
1937
+
1938
+ memcpy(handle->result.shared_secret, vctx->shared_secret, sizeof(vctx->shared_secret));
1939
+ handle->result.shared_secret_len = sizeof(vctx->shared_secret);
1940
+
1941
+ handle->status = PAIR_STATUS_COMPLETED;
1942
+
1943
+ pair_tlv_free(response);
1944
+ return 0;
1945
+ }
1946
+
1947
+
1948
+ /* ------------------------- SERVER IMPLEMENTATION -------------------------- */
1949
+
1950
+ // Use (unsecure) keys seeded from device_id. We need the keys to always be the
1951
+ // same during pair setup and pair verify, since the client saves them after
1952
+ // pair-setup 3, so that the signature in pair-verify 1 can be checked.
1953
+ static void
1954
+ server_keypair(uint8_t *public_key, uint8_t *private_key, const char *device_id)
1955
+ {
1956
+ uint8_t seed[crypto_sign_SEEDBYTES] = { 0 };
1957
+ size_t len;
1958
+
1959
+ len = strlen(device_id);
1960
+ if (len > sizeof(seed))
1961
+ len = sizeof(seed);
1962
+
1963
+ memcpy(seed, device_id, len);
1964
+
1965
+ crypto_sign_seed_keypair(public_key, private_key, seed);
1966
+ }
1967
+
1968
+ static uint8_t *
1969
+ server_auth_failed_response(size_t *len, enum pair_keys msg_state)
1970
+ {
1971
+ pair_tlv_values_t *response;
1972
+ uint8_t *data;
1973
+ size_t data_len;
1974
+ uint8_t error = TLVError_Authentication;
1975
+
1976
+ data_len = REQUEST_BUFSIZE;
1977
+ data = malloc(data_len);
1978
+ response = pair_tlv_new();
1979
+
1980
+ pair_tlv_add_value(response, TLVType_State, &pair_keys_map[msg_state].state, sizeof(pair_keys_map[msg_state].state));
1981
+ pair_tlv_add_value(response, TLVType_Error, &error, sizeof(error));
1982
+
1983
+ pair_tlv_format(response, data, &data_len);
1984
+ pair_tlv_free(response);
1985
+
1986
+ *len = data_len;
1987
+
1988
+ return data;
1989
+ }
1990
+
1991
+ static int
1992
+ server_setup_new(struct pair_setup_context *handle, const char *pin, pair_cb add_cb, void *cb_arg, const char *device_id)
1993
+ {
1994
+ struct pair_server_setup_context *sctx = &handle->sctx.server;
1995
+
1996
+ if (!is_initialized())
1997
+ return -1;
1998
+
1999
+ if (!pin)
2000
+ pin = "3939";
2001
+
2002
+ if (!device_id || strlen(device_id) >= PAIR_AP_DEVICE_ID_LEN_MAX)
2003
+ return -1;
2004
+
2005
+ sctx->pin = strdup(pin);
2006
+ if (!sctx->pin)
2007
+ return -1;
2008
+
2009
+ sctx->add_cb = add_cb;
2010
+ sctx->add_cb_arg = cb_arg;
2011
+
2012
+ snprintf(sctx->device_id, sizeof(sctx->device_id), "%s", device_id);
2013
+
2014
+ server_keypair(sctx->public_key, sctx->private_key, sctx->device_id);
2015
+
2016
+ return 0;
2017
+ }
2018
+
2019
+ static void
2020
+ server_setup_free(struct pair_setup_context *handle)
2021
+ {
2022
+ struct pair_server_setup_context *sctx = &handle->sctx.server;
2023
+
2024
+ srp_verifier_free(sctx->verifier);
2025
+
2026
+ free(sctx->pkA);
2027
+ free(sctx->pkB);
2028
+ free(sctx->b);
2029
+ free(sctx->M1);
2030
+ free(sctx->v);
2031
+ free(sctx->salt);
2032
+ free(sctx->pin);
2033
+ }
2034
+
2035
+ static int
2036
+ server_setup_request1(struct pair_setup_context *handle, const uint8_t *data, size_t data_len)
2037
+ {
2038
+ struct pair_server_setup_context *sctx = &handle->sctx.server;
2039
+ // enum pair_keys msg_state = PAIR_SETUP_MSG01;
2040
+ pair_tlv_values_t *request;
2041
+ pair_tlv_t *method;
2042
+ pair_tlv_t *type;
2043
+ int ret;
2044
+
2045
+ request = message_process(data, data_len, &handle->errmsg);
2046
+ if (!request)
2047
+ {
2048
+ RETURN_ERROR(PAIR_STATUS_INVALID, handle->errmsg);
2049
+ }
2050
+
2051
+ method = pair_tlv_get_value(request, TLVType_Method);
2052
+ if (!method || method->size != 1 || method->value[0] != 0)
2053
+ {
2054
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup request 1: Missing or unexpected pairing method in TLV");
2055
+ }
2056
+
2057
+ type = pair_tlv_get_value(request, TLVType_Flags);
2058
+ sctx->is_transient = (type && type->size == 1 && type->value[0] == PairingFlagsTransient);
2059
+
2060
+ // Note this is modified to return a 16 byte salt
2061
+ ret = srp_create_salted_verification_key(HASH_SHA512, SRP_NG_3072, USERNAME, (unsigned char *)sctx->pin, strlen(sctx->pin),
2062
+ &sctx->salt, &sctx->salt_len, &sctx->v, &sctx->v_len, NULL, NULL);
2063
+ if (ret < 0)
2064
+ {
2065
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup request 1: Could not create verification key");
2066
+ }
2067
+
2068
+ ret = srp_verifier_start_authentication(HASH_SHA512, SRP_NG_3072, sctx->v, sctx->v_len,
2069
+ &sctx->b, &sctx->b_len, &sctx->pkB, &sctx->pkB_len, NULL, NULL);
2070
+ if (ret < 0)
2071
+ {
2072
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup request 1: Could not compute B");
2073
+ }
2074
+
2075
+ pair_tlv_free(request);
2076
+ return 0;
2077
+
2078
+ error:
2079
+ pair_tlv_free(request);
2080
+ return -1;
2081
+ }
2082
+
2083
+ static int
2084
+ server_setup_request2(struct pair_setup_context *handle, const uint8_t *data, size_t data_len)
2085
+ {
2086
+ struct pair_server_setup_context *sctx = &handle->sctx.server;
2087
+ // enum pair_keys msg_state = PAIR_SETUP_MSG03;
2088
+ pair_tlv_values_t *request;
2089
+ pair_tlv_t *pk;
2090
+ pair_tlv_t *proof;
2091
+
2092
+ request = message_process(data, data_len, &handle->errmsg);
2093
+ if (!request)
2094
+ {
2095
+ RETURN_ERROR(PAIR_STATUS_INVALID, handle->errmsg);
2096
+ }
2097
+
2098
+ pk = pair_tlv_get_value(request, TLVType_PublicKey);
2099
+ if (!pk || pk->size > N_len(SRP_NG_3072)) // 384 bytes or less
2100
+ {
2101
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup request 2: Missing og invalid public key");
2102
+ }
2103
+
2104
+ proof = pair_tlv_get_value(request, TLVType_Proof);
2105
+ if (!proof || proof->size != SHA512_DIGEST_LENGTH)
2106
+ {
2107
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup request 2: Missing or invalid proof");
2108
+ }
2109
+
2110
+ sctx->pkA_len = pk->size;
2111
+ sctx->pkA = malloc(sctx->pkA_len);
2112
+ memcpy(sctx->pkA, pk->value, sctx->pkA_len);
2113
+
2114
+ sctx->M1_len = proof->size;
2115
+ sctx->M1 = malloc(sctx->M1_len);
2116
+ memcpy(sctx->M1, proof->value, sctx->M1_len);
2117
+
2118
+ sctx->verifier = srp_verifier_new(HASH_SHA512, SRP_NG_3072, USERNAME, sctx->salt, sctx->salt_len, sctx->v, sctx->v_len,
2119
+ sctx->pkA, sctx->pkA_len, sctx->b, sctx->b_len, sctx->pkB, sctx->pkB_len, NULL, NULL);
2120
+ if (!sctx->verifier)
2121
+ {
2122
+ handle->status = PAIR_STATUS_AUTH_FAILED;
2123
+ goto out;
2124
+ }
2125
+
2126
+ sctx->M2_len = SHA512_DIGEST_LENGTH;
2127
+ srp_verifier_verify_session(sctx->verifier, sctx->M1, &sctx->M2);
2128
+ if (!sctx->M2)
2129
+ {
2130
+ handle->status = PAIR_STATUS_AUTH_FAILED;
2131
+ goto out; // Not an error, server should give proper TLV-formatet reply
2132
+ }
2133
+
2134
+ out:
2135
+ pair_tlv_free(request);
2136
+ return 0;
2137
+
2138
+ error:
2139
+ pair_tlv_free(request);
2140
+ return -1;
2141
+ }
2142
+
2143
+ static int
2144
+ server_setup_request3(struct pair_setup_context *handle, const uint8_t *data, size_t data_len)
2145
+ {
2146
+ struct pair_server_setup_context *sctx = &handle->sctx.server;
2147
+ enum pair_keys msg_state = PAIR_SETUP_MSG05;
2148
+ pair_tlv_values_t *request;
2149
+ pair_tlv_t *encrypted_data;
2150
+ pair_tlv_t *device_id;
2151
+ pair_tlv_t *pk;
2152
+ pair_tlv_t *signature;
2153
+ const uint8_t *session_key;
2154
+ int session_key_len;
2155
+ uint8_t nonce[NONCE_LENGTH] = { 0 };
2156
+ uint8_t tag[AUTHTAG_LENGTH];
2157
+ uint8_t derived_key[32];
2158
+ size_t encrypted_len;
2159
+ uint8_t *decrypted_data = NULL;
2160
+ uint8_t device_x[32];
2161
+ int ret;
2162
+
2163
+ request = message_process(data, data_len, &handle->errmsg);
2164
+ if (!request)
2165
+ {
2166
+ RETURN_ERROR(PAIR_STATUS_INVALID, handle->errmsg);
2167
+ }
2168
+
2169
+ session_key = srp_verifier_get_session_key(sctx->verifier, &session_key_len);
2170
+ if (!session_key)
2171
+ {
2172
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup request 3: No valid session key");
2173
+ }
2174
+
2175
+ ret = hkdf_extract_expand(derived_key, sizeof(derived_key), session_key, session_key_len, msg_state);
2176
+ if (ret < 0)
2177
+ {
2178
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup request 3: hkdf error getting derived_key");
2179
+ }
2180
+
2181
+ encrypted_data = pair_tlv_get_value(request, TLVType_EncryptedData);
2182
+ if (!encrypted_data)
2183
+ {
2184
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup request 3: Missing encrypted_data");
2185
+ }
2186
+
2187
+ // encrypted_data->value consists of the encrypted payload + the auth tag
2188
+ if (encrypted_data->size < AUTHTAG_LENGTH)
2189
+ {
2190
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup request 3: Invalid encrypted data");
2191
+ }
2192
+
2193
+ encrypted_len = encrypted_data->size - AUTHTAG_LENGTH;
2194
+ memcpy(tag, encrypted_data->value + encrypted_len, AUTHTAG_LENGTH);
2195
+ memcpy(nonce + 4, pair_keys_map[msg_state].nonce, NONCE_LENGTH - 4);
2196
+
2197
+ decrypted_data = malloc(encrypted_len);
2198
+
2199
+ ret = decrypt_chacha(decrypted_data, encrypted_data->value, encrypted_len, derived_key, sizeof(derived_key), NULL, 0, tag, sizeof(tag), nonce);
2200
+ if (ret < 0)
2201
+ {
2202
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup request 3: Decryption error");
2203
+ }
2204
+
2205
+ pair_tlv_free(request);
2206
+ request = message_process(decrypted_data, encrypted_len, &handle->errmsg);
2207
+ if (!request)
2208
+ {
2209
+ RETURN_ERROR(PAIR_STATUS_INVALID, handle->errmsg);
2210
+ }
2211
+
2212
+ ret = hkdf_extract_expand(device_x, sizeof(device_x), session_key, session_key_len, PAIR_SETUP_CONTROLLER_SIGN);
2213
+ if (ret < 0)
2214
+ {
2215
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup request 3: hkdf error getting device_x");
2216
+ }
2217
+
2218
+ device_id = pair_tlv_get_value(request, TLVType_Identifier);
2219
+ pk = pair_tlv_get_value(request, TLVType_PublicKey);
2220
+ signature = pair_tlv_get_value(request, TLVType_Signature);
2221
+ if (!device_id || device_id->size >= sizeof(handle->result.device_id) || !pk || pk->size != crypto_sign_PUBLICKEYBYTES || !signature || signature->size != crypto_sign_BYTES)
2222
+ {
2223
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup request 3: Missing/invalid device ID, public key or signature");
2224
+ }
2225
+
2226
+ ret = verify_info(signature->value, pk->value, device_x, sizeof(device_x), device_id->value, device_id->size, pk->value, pk->size);
2227
+ if (ret < 0)
2228
+ {
2229
+ handle->status = PAIR_STATUS_AUTH_FAILED;
2230
+ goto out;
2231
+ }
2232
+
2233
+ memcpy(handle->result.device_id, device_id->value, device_id->size);
2234
+ memcpy(handle->result.client_public_key, pk->value, pk->size);
2235
+
2236
+ out:
2237
+ free(decrypted_data);
2238
+ pair_tlv_free(request);
2239
+ return 0;
2240
+
2241
+ error:
2242
+ free(decrypted_data);
2243
+ pair_tlv_free(request);
2244
+ return -1;
2245
+ }
2246
+
2247
+ static uint8_t *
2248
+ server_setup_response1(size_t *len, struct pair_setup_context *handle)
2249
+ {
2250
+ struct pair_server_setup_context *sctx = &handle->sctx.server;
2251
+ enum pair_keys msg_state = PAIR_SETUP_MSG02;
2252
+ pair_tlv_values_t *response;
2253
+ uint8_t *data;
2254
+ size_t data_len;
2255
+ int ret;
2256
+
2257
+ if (handle->status == PAIR_STATUS_AUTH_FAILED)
2258
+ return server_auth_failed_response(len, msg_state);
2259
+
2260
+ data_len = REQUEST_BUFSIZE;
2261
+ data = malloc(data_len);
2262
+ response = pair_tlv_new();
2263
+
2264
+ pair_tlv_add_value(response, TLVType_State, &pair_keys_map[msg_state].state, sizeof(pair_keys_map[msg_state].state));
2265
+ pair_tlv_add_value(response, TLVType_Salt, sctx->salt, sctx->salt_len); // 16
2266
+ pair_tlv_add_value(response, TLVType_PublicKey, sctx->pkB, sctx->pkB_len); // 384
2267
+
2268
+ ret = pair_tlv_format(response, data, &data_len);
2269
+ if (ret < 0)
2270
+ {
2271
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup response 1: pair_tlv_format returned an error");
2272
+ }
2273
+
2274
+ *len = data_len;
2275
+
2276
+ pair_tlv_free(response);
2277
+ return data;
2278
+
2279
+ error:
2280
+ free(data);
2281
+ pair_tlv_free(response);
2282
+ return NULL;
2283
+ }
2284
+
2285
+ static uint8_t *
2286
+ server_setup_response2(size_t *len, struct pair_setup_context *handle)
2287
+ {
2288
+ struct pair_server_setup_context *sctx = &handle->sctx.server;
2289
+ enum pair_keys msg_state = PAIR_SETUP_MSG04;
2290
+ pair_tlv_values_t *response;
2291
+ uint8_t *data;
2292
+ size_t data_len;
2293
+ const uint8_t *session_key;
2294
+ int session_key_len;
2295
+ int ret;
2296
+
2297
+ if (handle->status == PAIR_STATUS_AUTH_FAILED)
2298
+ return server_auth_failed_response(len, msg_state);
2299
+
2300
+ data_len = REQUEST_BUFSIZE;
2301
+ data = malloc(data_len);
2302
+ response = pair_tlv_new();
2303
+
2304
+ pair_tlv_add_value(response, TLVType_State, &pair_keys_map[msg_state].state, sizeof(pair_keys_map[msg_state].state));
2305
+ pair_tlv_add_value(response, TLVType_Proof, sctx->M2, sctx->M2_len); // 384
2306
+
2307
+ ret = pair_tlv_format(response, data, &data_len);
2308
+ if (ret < 0)
2309
+ {
2310
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup response 2: pair_tlv_format returned an error");
2311
+ }
2312
+
2313
+ if (sctx->is_transient)
2314
+ {
2315
+ session_key = srp_verifier_get_session_key(sctx->verifier, &session_key_len);
2316
+ if (!session_key)
2317
+ {
2318
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup request 2: Could not compute session key");
2319
+ }
2320
+
2321
+ assert(sizeof(handle->result.shared_secret) >= session_key_len);
2322
+
2323
+ memcpy(handle->result.shared_secret, session_key, session_key_len);
2324
+ handle->result.shared_secret_len = session_key_len;
2325
+
2326
+ handle->status = PAIR_STATUS_COMPLETED;
2327
+ }
2328
+
2329
+ *len = data_len;
2330
+
2331
+ pair_tlv_free(response);
2332
+ return data;
2333
+
2334
+ error:
2335
+ free(data);
2336
+ pair_tlv_free(response);
2337
+ return NULL;
2338
+ }
2339
+
2340
+ static uint8_t *
2341
+ server_setup_response3(size_t *len, struct pair_setup_context *handle)
2342
+ {
2343
+ struct pair_server_setup_context *sctx = &handle->sctx.server;
2344
+ enum pair_keys msg_state = PAIR_SETUP_MSG06;
2345
+ const uint8_t *session_key;
2346
+ int session_key_len;
2347
+ pair_tlv_values_t *response;
2348
+ uint8_t nonce[NONCE_LENGTH] = { 0 };
2349
+ uint8_t tag[AUTHTAG_LENGTH];
2350
+ uint8_t derived_key[32];
2351
+ pair_tlv_values_t *append;
2352
+ size_t append_len;
2353
+ uint8_t *encrypted_data = NULL;
2354
+ size_t encrypted_data_len;
2355
+ uint8_t *data;
2356
+ size_t data_len;
2357
+ uint8_t device_x[32];
2358
+ int ret;
2359
+
2360
+ if (handle->status == PAIR_STATUS_AUTH_FAILED)
2361
+ return server_auth_failed_response(len, msg_state);
2362
+
2363
+ data_len = REQUEST_BUFSIZE;
2364
+ data = malloc(data_len);
2365
+ response = pair_tlv_new();
2366
+
2367
+ session_key = srp_verifier_get_session_key(sctx->verifier, &session_key_len);
2368
+ if (!session_key)
2369
+ {
2370
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup response 3: No valid session key");
2371
+ }
2372
+
2373
+ ret = hkdf_extract_expand(device_x, sizeof(device_x), session_key, session_key_len, PAIR_SETUP_ACCESSORY_SIGN);
2374
+ if (ret < 0)
2375
+ {
2376
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup response 3: hkdf error getting device_x");
2377
+ }
2378
+
2379
+ ret = create_and_sign_device_info(data, &data_len, sctx->device_id, device_x, sizeof(device_x), sctx->public_key, sizeof(sctx->public_key), sctx->private_key);
2380
+ if (ret < 0)
2381
+ {
2382
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup response 3: create device info returned an error");
2383
+ }
2384
+
2385
+ // Append TLV-encoded public key to *data, which already has identifier and signature
2386
+ append = pair_tlv_new();
2387
+ append_len = REQUEST_BUFSIZE - data_len;
2388
+ pair_tlv_add_value(append, TLVType_PublicKey, sctx->public_key, sizeof(sctx->public_key));
2389
+ ret = pair_tlv_format(append, data + data_len, &append_len);
2390
+ pair_tlv_free(append);
2391
+ if (ret < 0)
2392
+ {
2393
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup response 3: error appending public key to TLV");
2394
+ }
2395
+ data_len += append_len;
2396
+
2397
+ ret = hkdf_extract_expand(derived_key, sizeof(derived_key), session_key, session_key_len, msg_state);
2398
+ if (ret < 0)
2399
+ {
2400
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup response 3: hkdf error getting derived_key");
2401
+ }
2402
+
2403
+ memcpy(nonce + 4, pair_keys_map[msg_state].nonce, NONCE_LENGTH - 4);
2404
+
2405
+ encrypted_data_len = data_len + sizeof(tag); // Space for ciphered payload and authtag
2406
+ encrypted_data = malloc(encrypted_data_len);
2407
+
2408
+ ret = encrypt_chacha(encrypted_data, data, data_len, derived_key, sizeof(derived_key), NULL, 0, tag, sizeof(tag), nonce);
2409
+ if (ret < 0)
2410
+ {
2411
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup response 3: Could not encrypt");
2412
+ }
2413
+
2414
+ memcpy(encrypted_data + data_len, tag, sizeof(tag));
2415
+
2416
+ pair_tlv_add_value(response, TLVType_State, &pair_keys_map[msg_state].state, sizeof(pair_keys_map[msg_state].state));
2417
+ pair_tlv_add_value(response, TLVType_EncryptedData, encrypted_data, encrypted_data_len);
2418
+
2419
+ data_len = REQUEST_BUFSIZE; // Re-using *data, so pass original length to pair_tlv_format
2420
+ ret = pair_tlv_format(response, data, &data_len);
2421
+ if (ret < 0)
2422
+ {
2423
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Setup response 3: error appending public key to TLV");
2424
+ }
2425
+
2426
+ if (sctx->add_cb)
2427
+ sctx->add_cb(handle->result.client_public_key, handle->result.device_id, sctx->add_cb_arg);
2428
+
2429
+ handle->status = PAIR_STATUS_COMPLETED;
2430
+
2431
+ *len = data_len;
2432
+
2433
+ free(encrypted_data);
2434
+ pair_tlv_free(response);
2435
+ return data;
2436
+
2437
+ error:
2438
+ free(encrypted_data);
2439
+ free(data);
2440
+ pair_tlv_free(response);
2441
+ return NULL;
2442
+ }
2443
+
2444
+
2445
+ static int
2446
+ server_verify_new(struct pair_verify_context *handle, const char *client_setup_keys, pair_cb cb, void *cb_arg, const char *device_id)
2447
+ {
2448
+ struct pair_server_verify_context *vctx = &handle->vctx.server;
2449
+
2450
+ if (!is_initialized())
2451
+ return -1;
2452
+
2453
+ if (client_setup_keys)
2454
+ return -1;
2455
+
2456
+ if (!device_id || strlen(device_id) >= PAIR_AP_DEVICE_ID_LEN_MAX)
2457
+ return -1;
2458
+
2459
+ snprintf(vctx->device_id, sizeof(vctx->device_id), "%s", device_id);
2460
+
2461
+ vctx->get_cb = cb;
2462
+ vctx->get_cb_arg = cb_arg;
2463
+ vctx->verify_client_signature = cb;
2464
+
2465
+ server_keypair(vctx->server_public_key, vctx->server_private_key, vctx->device_id);
2466
+
2467
+ return 0;
2468
+ }
2469
+
2470
+ static int
2471
+ server_verify_request1(struct pair_verify_context *handle, const uint8_t *data, size_t data_len)
2472
+ {
2473
+ struct pair_server_verify_context *vctx = &handle->vctx.server;
2474
+ // enum pair_keys msg_state = PAIR_VERIFY_MSG01;
2475
+ pair_tlv_values_t *request;
2476
+ pair_tlv_t *pk;
2477
+
2478
+ request = message_process(data, data_len, &handle->errmsg);
2479
+ if (!request)
2480
+ {
2481
+ RETURN_ERROR(PAIR_STATUS_INVALID, handle->errmsg);
2482
+ }
2483
+
2484
+ pk = pair_tlv_get_value(request, TLVType_PublicKey);
2485
+ if (!pk || pk->size != sizeof(vctx->client_eph_public_key))
2486
+ {
2487
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Verify request 1: Missing or invalid public_key");
2488
+ }
2489
+
2490
+ memcpy(vctx->client_eph_public_key, pk->value, sizeof(vctx->client_eph_public_key));
2491
+
2492
+ pair_tlv_free(request);
2493
+ return 0;
2494
+
2495
+ error:
2496
+ pair_tlv_free(request);
2497
+ return -1;
2498
+ }
2499
+
2500
+ static int
2501
+ server_verify_request2(struct pair_verify_context *handle, const uint8_t *data, size_t data_len)
2502
+ {
2503
+ struct pair_server_verify_context *vctx = &handle->vctx.server;
2504
+ enum pair_keys msg_state = PAIR_VERIFY_MSG03;
2505
+ pair_tlv_values_t *request;
2506
+ pair_tlv_t *encrypted_data;
2507
+ pair_tlv_t *device_id;
2508
+ pair_tlv_t *signature;
2509
+ uint8_t nonce[NONCE_LENGTH] = { 0 };
2510
+ uint8_t tag[AUTHTAG_LENGTH];
2511
+ uint8_t derived_key[32];
2512
+ size_t encrypted_len;
2513
+ uint8_t *decrypted_data = NULL;
2514
+ char id_str[PAIR_AP_DEVICE_ID_LEN_MAX] = { 0 };
2515
+ uint8_t client_public_key[crypto_sign_PUBLICKEYBYTES];
2516
+ int ret;
2517
+
2518
+ request = message_process(data, data_len, &handle->errmsg);
2519
+ if (!request)
2520
+ {
2521
+ RETURN_ERROR(PAIR_STATUS_INVALID, handle->errmsg);
2522
+ }
2523
+
2524
+ ret = hkdf_extract_expand(derived_key, sizeof(derived_key), vctx->shared_secret, sizeof(vctx->shared_secret), msg_state);
2525
+ if (ret < 0)
2526
+ {
2527
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Verify request 2: hkdf error getting derived_key");
2528
+ }
2529
+
2530
+ encrypted_data = pair_tlv_get_value(request, TLVType_EncryptedData);
2531
+ if (!encrypted_data)
2532
+ {
2533
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Verify request 2: Missing encrypted_data");
2534
+ }
2535
+
2536
+ // encrypted_data->value consists of the encrypted payload + the auth tag
2537
+ if (encrypted_data->size < AUTHTAG_LENGTH)
2538
+ {
2539
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Verify request 2: Invalid encrypted data");
2540
+ }
2541
+
2542
+ encrypted_len = encrypted_data->size - AUTHTAG_LENGTH;
2543
+ memcpy(tag, encrypted_data->value + encrypted_len, AUTHTAG_LENGTH);
2544
+ memcpy(nonce + 4, pair_keys_map[msg_state].nonce, NONCE_LENGTH - 4);
2545
+
2546
+ decrypted_data = malloc(encrypted_len);
2547
+
2548
+ ret = decrypt_chacha(decrypted_data, encrypted_data->value, encrypted_len, derived_key, sizeof(derived_key), NULL, 0, tag, sizeof(tag), nonce);
2549
+ if (ret < 0)
2550
+ {
2551
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Verify request 2: Decryption error");
2552
+ }
2553
+
2554
+ pair_tlv_free(request);
2555
+ request = message_process(decrypted_data, encrypted_len, &handle->errmsg);
2556
+ if (!request)
2557
+ {
2558
+ RETURN_ERROR(PAIR_STATUS_INVALID, handle->errmsg);
2559
+ }
2560
+
2561
+ device_id = pair_tlv_get_value(request, TLVType_Identifier);
2562
+ signature = pair_tlv_get_value(request, TLVType_Signature);
2563
+ if (!device_id || !signature || signature->size != crypto_sign_BYTES)
2564
+ {
2565
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Verify request 2: Missing identifier or signature");
2566
+ }
2567
+
2568
+ if (vctx->verify_client_signature)
2569
+ {
2570
+ if (device_id->size >= sizeof(id_str))
2571
+ {
2572
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Verify request 2: Device ID from peer is too long");
2573
+ }
2574
+
2575
+ memcpy(id_str, device_id->value, device_id->size);
2576
+
2577
+ ret = vctx->get_cb(client_public_key, id_str, vctx->get_cb_arg);
2578
+ if (ret < 0)
2579
+ {
2580
+ handle->status = PAIR_STATUS_AUTH_FAILED;
2581
+ goto out;
2582
+ }
2583
+
2584
+ ret = verify_info(signature->value, client_public_key, vctx->client_eph_public_key, sizeof(vctx->client_eph_public_key),
2585
+ device_id->value, device_id->size, vctx->server_eph_public_key, sizeof(vctx->server_eph_public_key));
2586
+ if (ret < 0)
2587
+ {
2588
+ handle->status = PAIR_STATUS_AUTH_FAILED;
2589
+ goto out;
2590
+ }
2591
+ }
2592
+
2593
+ out:
2594
+ free(decrypted_data);
2595
+ pair_tlv_free(request);
2596
+ return 0;
2597
+
2598
+ error:
2599
+ free(decrypted_data);
2600
+ pair_tlv_free(request);
2601
+ return -1;
2602
+ }
2603
+
2604
+ static uint8_t *
2605
+ server_verify_response1(size_t *len, struct pair_verify_context *handle)
2606
+ {
2607
+ struct pair_server_verify_context *vctx = &handle->vctx.server;
2608
+ enum pair_keys msg_state = PAIR_VERIFY_MSG02;
2609
+ pair_tlv_values_t *response;
2610
+ uint8_t nonce[NONCE_LENGTH] = { 0 };
2611
+ uint8_t tag[AUTHTAG_LENGTH];
2612
+ uint8_t derived_key[32];
2613
+ uint8_t *encrypted_data = NULL;
2614
+ size_t encrypted_data_len;
2615
+ uint8_t *data;
2616
+ size_t data_len;
2617
+ int ret;
2618
+
2619
+ if (handle->status == PAIR_STATUS_AUTH_FAILED)
2620
+ return server_auth_failed_response(len, msg_state);
2621
+
2622
+ data_len = REQUEST_BUFSIZE;
2623
+ data = malloc(data_len);
2624
+ response = pair_tlv_new();
2625
+
2626
+ crypto_box_keypair(vctx->server_eph_public_key, vctx->server_eph_private_key);
2627
+
2628
+ ret = crypto_scalarmult(vctx->shared_secret, vctx->server_eph_private_key, vctx->client_eph_public_key);
2629
+ if (ret < 0)
2630
+ {
2631
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Verify response 1: Error generating shared secret");
2632
+ }
2633
+
2634
+ ret = create_and_sign_accessory_info(data, &data_len, vctx->server_eph_public_key, sizeof(vctx->server_eph_public_key), vctx->device_id,
2635
+ vctx->client_eph_public_key, sizeof(vctx->client_eph_public_key), vctx->server_private_key);
2636
+ if (ret < 0)
2637
+ {
2638
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Verify response 1: Error creating device info");
2639
+ }
2640
+
2641
+ ret = hkdf_extract_expand(derived_key, sizeof(derived_key), vctx->shared_secret, sizeof(vctx->shared_secret), msg_state);
2642
+ if (ret < 0)
2643
+ {
2644
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Verify response 1: hkdf error getting derived_key");
2645
+ }
2646
+
2647
+ memcpy(nonce + 4, pair_keys_map[msg_state].nonce, NONCE_LENGTH - 4);
2648
+
2649
+ encrypted_data_len = data_len + sizeof(tag); // Space for ciphered payload and authtag
2650
+ encrypted_data = malloc(encrypted_data_len);
2651
+
2652
+ ret = encrypt_chacha(encrypted_data, data, data_len, derived_key, sizeof(derived_key), NULL, 0, tag, sizeof(tag), nonce);
2653
+ if (ret < 0)
2654
+ {
2655
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Verify response 1: Could not encrypt");
2656
+ }
2657
+
2658
+ memcpy(encrypted_data + data_len, tag, sizeof(tag));
2659
+
2660
+ pair_tlv_add_value(response, TLVType_State, &pair_keys_map[msg_state].state, sizeof(pair_keys_map[msg_state].state));
2661
+ pair_tlv_add_value(response, TLVType_PublicKey, vctx->server_eph_public_key, sizeof(vctx->server_eph_public_key));
2662
+ pair_tlv_add_value(response, TLVType_EncryptedData, encrypted_data, encrypted_data_len);
2663
+
2664
+ data_len = REQUEST_BUFSIZE; // Re-using *data, so pass original length to pair_tlv_format
2665
+ ret = pair_tlv_format(response, data, &data_len);
2666
+ if (ret < 0)
2667
+ {
2668
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Verify response 1: pair_tlv_format returned an error");
2669
+ }
2670
+
2671
+ *len = data_len;
2672
+
2673
+ free(encrypted_data);
2674
+ pair_tlv_free(response);
2675
+ return data;
2676
+
2677
+ error:
2678
+ free(encrypted_data);
2679
+ free(data);
2680
+ pair_tlv_free(response);
2681
+ return NULL;
2682
+ }
2683
+
2684
+ static uint8_t *
2685
+ server_verify_response2(size_t *len, struct pair_verify_context *handle)
2686
+ {
2687
+ struct pair_server_verify_context *vctx = &handle->vctx.server;
2688
+ enum pair_keys msg_state = PAIR_VERIFY_MSG04;
2689
+ pair_tlv_values_t *response;
2690
+ uint8_t *data;
2691
+ size_t data_len;
2692
+ int ret;
2693
+
2694
+ if (handle->status == PAIR_STATUS_AUTH_FAILED)
2695
+ return server_auth_failed_response(len, msg_state);
2696
+
2697
+ data_len = REQUEST_BUFSIZE;
2698
+ data = malloc(data_len);
2699
+ response = pair_tlv_new();
2700
+
2701
+ pair_tlv_add_value(response, TLVType_State, &pair_keys_map[msg_state].state, sizeof(pair_keys_map[msg_state].state));
2702
+
2703
+ ret = pair_tlv_format(response, data, &data_len);
2704
+ if (ret < 0)
2705
+ {
2706
+ RETURN_ERROR(PAIR_STATUS_INVALID, "Verify response 2: pair_tlv_format returned an error");
2707
+ }
2708
+
2709
+ *len = data_len;
2710
+
2711
+ memcpy(handle->result.shared_secret, vctx->shared_secret, sizeof(vctx->shared_secret));
2712
+ handle->result.shared_secret_len = sizeof(vctx->shared_secret);
2713
+
2714
+ handle->status = PAIR_STATUS_COMPLETED;
2715
+
2716
+ pair_tlv_free(response);
2717
+ return data;
2718
+
2719
+ error:
2720
+ free(data);
2721
+ pair_tlv_free(response);
2722
+ return NULL;
2723
+ }
2724
+
2725
+ static int
2726
+ server_add_remove_request(pair_cb cb, void *cb_arg, const uint8_t *in, size_t in_len)
2727
+ {
2728
+ const char *errmsg;
2729
+ pair_tlv_values_t *request;
2730
+ pair_tlv_t *device_id;
2731
+ pair_tlv_t *pk;
2732
+ char id_str[PAIR_AP_DEVICE_ID_LEN_MAX] = { 0 };
2733
+ uint8_t *public_key = NULL;
2734
+
2735
+ request = message_process(in, in_len, &errmsg);
2736
+ if (!request)
2737
+ {
2738
+ goto error;
2739
+ }
2740
+
2741
+ device_id = pair_tlv_get_value(request, TLVType_Identifier);
2742
+ if (!device_id || device_id->size >= sizeof(id_str))
2743
+ {
2744
+ goto error;
2745
+ }
2746
+
2747
+ // Only present when adding
2748
+ pk = pair_tlv_get_value(request, TLVType_PublicKey);
2749
+ if (pk && pk->size == crypto_sign_PUBLICKEYBYTES)
2750
+ {
2751
+ public_key = pk->value;
2752
+ }
2753
+
2754
+ memcpy(id_str, device_id->value, device_id->size);
2755
+
2756
+ cb(public_key, id_str, cb_arg);
2757
+
2758
+ pair_tlv_free(request);
2759
+ return 0;
2760
+
2761
+ error:
2762
+ pair_tlv_free(request);
2763
+ return -1;
2764
+ }
2765
+
2766
+ static uint8_t *
2767
+ server_add_remove_response(size_t *len)
2768
+ {
2769
+ pair_tlv_values_t *response;
2770
+ uint8_t *data;
2771
+ uint8_t state = 2;
2772
+ size_t data_len;
2773
+ int ret;
2774
+
2775
+ data_len = REQUEST_BUFSIZE;
2776
+ data = malloc(data_len);
2777
+ response = pair_tlv_new();
2778
+
2779
+ pair_tlv_add_value(response, TLVType_State, &state, sizeof(state));
2780
+
2781
+ ret = pair_tlv_format(response, data, &data_len);
2782
+ if (ret < 0)
2783
+ {
2784
+ goto error;
2785
+ }
2786
+
2787
+ *len = data_len;
2788
+
2789
+ pair_tlv_free(response);
2790
+ return data;
2791
+
2792
+ error:
2793
+ free(data);
2794
+ pair_tlv_free(response);
2795
+ return NULL;
2796
+ }
2797
+
2798
+ static int
2799
+ server_add_remove(uint8_t **out, size_t *out_len, pair_cb cb, void *cb_arg, const uint8_t *in, size_t in_len)
2800
+ {
2801
+ int ret;
2802
+
2803
+ ret = server_add_remove_request(cb, cb_arg, in, in_len);
2804
+ if (ret < 0)
2805
+ return -1;
2806
+
2807
+ *out = server_add_remove_response(out_len);
2808
+ if (!*out)
2809
+ return -1;
2810
+
2811
+ return 0;
2812
+ }
2813
+
2814
+ static int
2815
+ server_list_cb(uint8_t public_key[crypto_sign_PUBLICKEYBYTES], const char *device_id, void *cb_arg)
2816
+ {
2817
+ pair_tlv_values_t *response = cb_arg;
2818
+ pair_tlv_t *previous_id;
2819
+ uint8_t permissions = 1; // Means admin (TODO don't hardcode - let caller set)
2820
+
2821
+ // If this isn't the first iteration (item) then we must add a separator
2822
+ previous_id = pair_tlv_get_value(response, TLVType_Identifier);
2823
+ if (previous_id)
2824
+ pair_tlv_add_value(response, TLVType_Separator, NULL, 0);
2825
+
2826
+ pair_tlv_add_value(response, TLVType_Identifier, (unsigned char *)device_id, strlen(device_id));
2827
+ pair_tlv_add_value(response, TLVType_PublicKey, public_key, crypto_sign_PUBLICKEYBYTES);
2828
+ pair_tlv_add_value(response, TLVType_Permissions, &permissions, sizeof(permissions));
2829
+
2830
+ return 0;
2831
+ }
2832
+
2833
+ static uint8_t *
2834
+ server_list_response(size_t *len, pair_list_cb cb, void *cb_arg)
2835
+ {
2836
+ pair_tlv_values_t *response;
2837
+ uint8_t *data;
2838
+ uint8_t state = 2;
2839
+ size_t data_len;
2840
+ int ret;
2841
+
2842
+ data_len = REQUEST_BUFSIZE;
2843
+ data = malloc(data_len);
2844
+ response = pair_tlv_new();
2845
+
2846
+ pair_tlv_add_value(response, TLVType_State, &state, sizeof(state));
2847
+
2848
+ cb(server_list_cb, response, cb_arg);
2849
+
2850
+ ret = pair_tlv_format(response, data, &data_len);
2851
+ if (ret < 0)
2852
+ {
2853
+ goto error;
2854
+ }
2855
+
2856
+ *len = data_len;
2857
+
2858
+ pair_tlv_free(response);
2859
+ return data;
2860
+
2861
+ error:
2862
+ free(data);
2863
+ pair_tlv_free(response);
2864
+ return NULL;
2865
+ }
2866
+
2867
+ static int
2868
+ server_list(uint8_t **out, size_t *out_len, pair_list_cb cb, void *cb_arg, const uint8_t *in, size_t in_len)
2869
+ {
2870
+ // Skip reading the request, it just has state = 1 and pair method =
2871
+ // PairingMethodListPairings
2872
+
2873
+ *out = server_list_response(out_len, cb, cb_arg);
2874
+ if (!*out)
2875
+ return -1;
2876
+
2877
+ return 0;
2878
+ }
2879
+
2880
+
2881
+ /* ----------------------- CIPHERING IMPLEMENTATION ------------------------- */
2882
+
2883
+ static void
2884
+ cipher_free(struct pair_cipher_context *cctx)
2885
+ {
2886
+ if (!cctx)
2887
+ return;
2888
+
2889
+ free(cctx);
2890
+ }
2891
+
2892
+ static struct pair_cipher_context *
2893
+ cipher_new(struct pair_definition *type, int channel, const uint8_t *shared_secret, size_t shared_secret_len)
2894
+ {
2895
+ struct pair_cipher_context *cctx;
2896
+ enum pair_keys write_key;
2897
+ enum pair_keys read_key;
2898
+ int ret;
2899
+
2900
+ // Note that events is opposite, probably because it is a reverse connection
2901
+ switch (channel)
2902
+ {
2903
+ case 0:
2904
+ write_key = PAIR_CONTROL_WRITE;
2905
+ read_key = PAIR_CONTROL_READ;
2906
+ break;
2907
+ case 1:
2908
+ write_key = PAIR_EVENTS_READ;
2909
+ read_key = PAIR_EVENTS_WRITE;
2910
+ break;
2911
+ case 2:
2912
+ write_key = PAIR_CONTROL_READ;
2913
+ read_key = PAIR_CONTROL_WRITE;
2914
+ break;
2915
+ case 3:
2916
+ write_key = PAIR_EVENTS_WRITE;
2917
+ read_key = PAIR_EVENTS_READ;
2918
+ break;
2919
+ default:
2920
+ return NULL;
2921
+ }
2922
+
2923
+ cctx = calloc(1, sizeof(struct pair_cipher_context));
2924
+ if (!cctx)
2925
+ goto error;
2926
+
2927
+ cctx->type = type;
2928
+
2929
+ ret = hkdf_extract_expand(cctx->encryption_key, sizeof(cctx->encryption_key), shared_secret, shared_secret_len, write_key);
2930
+ if (ret < 0)
2931
+ goto error;
2932
+
2933
+ ret = hkdf_extract_expand(cctx->decryption_key, sizeof(cctx->decryption_key), shared_secret, shared_secret_len, read_key);
2934
+ if (ret < 0)
2935
+ goto error;
2936
+
2937
+ return cctx;
2938
+
2939
+ error:
2940
+ pair_cipher_free(cctx);
2941
+ return NULL;
2942
+ }
2943
+
2944
+ static ssize_t
2945
+ encrypt(uint8_t **ciphertext, size_t *ciphertext_len, const uint8_t *plaintext, size_t plaintext_len, struct pair_cipher_context *cctx)
2946
+ {
2947
+ uint8_t nonce[NONCE_LENGTH] = { 0 };
2948
+ uint8_t tag[AUTHTAG_LENGTH];
2949
+ const uint8_t *plain_block;
2950
+ uint8_t *cipher_block;
2951
+ uint16_t block_len;
2952
+ int nblocks;
2953
+ int ret;
2954
+ int i;
2955
+
2956
+ if (plaintext_len == 0 || !plaintext)
2957
+ return -1;
2958
+
2959
+ // Encryption is done in blocks, where each block consists of a short, the
2960
+ // encrypted data and an auth tag. The short is the size of the encrypted
2961
+ // data. The encrypted data in the block cannot exceed ENCRYPTED_LEN_MAX.
2962
+ nblocks = 1 + ((plaintext_len - 1) / ENCRYPTED_LEN_MAX); // Ceiling of division
2963
+
2964
+ *ciphertext_len = nblocks * (sizeof(block_len) + AUTHTAG_LENGTH) + plaintext_len;
2965
+ *ciphertext = malloc(*ciphertext_len);
2966
+
2967
+ cctx->encryption_counter_prev = cctx->encryption_counter;
2968
+
2969
+ for (i = 0, plain_block = plaintext, cipher_block = *ciphertext; i < nblocks; i++)
2970
+ {
2971
+ // If it is the last block we will encrypt only the remaining data
2972
+ block_len = (i + 1 == nblocks) ? (plaintext + plaintext_len - plain_block) : ENCRYPTED_LEN_MAX;
2973
+
2974
+ memcpy(nonce + 4, &(cctx->encryption_counter), sizeof(cctx->encryption_counter));// TODO BE or LE?
2975
+
2976
+ // Write the ciphered block
2977
+ memcpy(cipher_block, &block_len, sizeof(block_len)); // TODO BE or LE?
2978
+ ret = encrypt_chacha(cipher_block + sizeof(block_len), plain_block, block_len, cctx->encryption_key, sizeof(cctx->encryption_key), &block_len, sizeof(block_len), tag, sizeof(tag), nonce);
2979
+ if (ret < 0)
2980
+ {
2981
+ cctx->errmsg = "Encryption with chacha poly1305 failed";
2982
+ cctx->encryption_counter = cctx->encryption_counter_prev;
2983
+ free(*ciphertext);
2984
+ return -1;
2985
+ }
2986
+ memcpy(cipher_block + sizeof(block_len) + block_len, tag, AUTHTAG_LENGTH);
2987
+
2988
+ plain_block += block_len;
2989
+ cipher_block += block_len + sizeof(block_len) + AUTHTAG_LENGTH;
2990
+ cctx->encryption_counter++;
2991
+ }
2992
+
2993
+ #ifdef DEBUG_PAIR
2994
+ hexdump("Encrypted:\n", *ciphertext, *ciphertext_len);
2995
+ #endif
2996
+
2997
+ return plain_block - plaintext;
2998
+ }
2999
+
3000
+ static ssize_t
3001
+ decrypt(uint8_t **plaintext, size_t *plaintext_len, const uint8_t *ciphertext, size_t ciphertext_len, struct pair_cipher_context *cctx)
3002
+ {
3003
+ uint8_t nonce[NONCE_LENGTH] = { 0 };
3004
+ uint8_t tag[AUTHTAG_LENGTH];
3005
+ uint8_t *plain_block;
3006
+ const uint8_t *cipher_block;
3007
+ uint16_t block_len;
3008
+ int ret;
3009
+
3010
+ if (ciphertext_len < sizeof(block_len) || !ciphertext)
3011
+ return -1;
3012
+
3013
+ // This will allocate more than we need. Since we don't know the number of
3014
+ // blocks in the ciphertext yet we can't calculate the exact required length.
3015
+ *plaintext = malloc(ciphertext_len);
3016
+
3017
+ cctx->decryption_counter_prev = cctx->decryption_counter;
3018
+
3019
+ for (plain_block = *plaintext, cipher_block = ciphertext; cipher_block < ciphertext + ciphertext_len; )
3020
+ {
3021
+ memcpy(&block_len, cipher_block, sizeof(block_len)); // TODO BE or LE?
3022
+ if (cipher_block + block_len + sizeof(block_len) + AUTHTAG_LENGTH > ciphertext + ciphertext_len)
3023
+ {
3024
+ // The remaining ciphertext doesn't contain an entire block, so stop
3025
+ break;
3026
+ }
3027
+
3028
+ memcpy(tag, cipher_block + sizeof(block_len) + block_len, sizeof(tag));
3029
+ memcpy(nonce + 4, &(cctx->decryption_counter), sizeof(cctx->decryption_counter));// TODO BE or LE?
3030
+
3031
+ ret = decrypt_chacha(plain_block, cipher_block + sizeof(block_len), block_len, cctx->decryption_key, sizeof(cctx->decryption_key), &block_len, sizeof(block_len), tag, sizeof(tag), nonce);
3032
+ if (ret < 0)
3033
+ {
3034
+ cctx->errmsg = "Decryption with chacha poly1305 failed";
3035
+ cctx->decryption_counter = cctx->decryption_counter_prev;
3036
+ free(*plaintext);
3037
+ return -1;
3038
+ }
3039
+
3040
+ plain_block += block_len;
3041
+ cipher_block += block_len + sizeof(block_len) + AUTHTAG_LENGTH;
3042
+ cctx->decryption_counter++;
3043
+ }
3044
+
3045
+ *plaintext_len = plain_block - *plaintext;
3046
+
3047
+ #ifdef DEBUG_PAIR
3048
+ hexdump("Decrypted:\n", *plaintext, *plaintext_len);
3049
+ #endif
3050
+
3051
+ return cipher_block - ciphertext;
3052
+ }
3053
+
3054
+ static int
3055
+ state_get(const char **errmsg, const uint8_t *data, size_t data_len)
3056
+ {
3057
+ pair_tlv_values_t *message;
3058
+ pair_tlv_t *state;
3059
+ int ret;
3060
+
3061
+ if (!data || data_len == 0)
3062
+ {
3063
+ return 0; // state 0 = no incoming data yet -> first request
3064
+ }
3065
+
3066
+ message = message_process(data, data_len, errmsg);
3067
+ if (!message)
3068
+ {
3069
+ goto error;
3070
+ }
3071
+
3072
+ state = pair_tlv_get_value(message, TLVType_State);
3073
+ if (!state || state->size != 1)
3074
+ {
3075
+ *errmsg = "Could not get message state";
3076
+ goto error;
3077
+ }
3078
+
3079
+ ret = state->value[0];
3080
+
3081
+ pair_tlv_free(message);
3082
+ return ret;
3083
+
3084
+ error:
3085
+ pair_tlv_free(message);
3086
+ return -1;
3087
+ }
3088
+
3089
+ static void
3090
+ public_key_get(uint8_t server_public_key[crypto_sign_PUBLICKEYBYTES], const char *device_id)
3091
+ {
3092
+ uint8_t private_key[crypto_sign_SECRETKEYBYTES];
3093
+ server_keypair(server_public_key, private_key, device_id);
3094
+ }
3095
+
3096
+ const struct pair_definition pair_client_homekit_normal =
3097
+ {
3098
+ .pair_setup_new = client_setup_new,
3099
+ .pair_setup_free = client_setup_free,
3100
+ .pair_setup_result = client_setup_result,
3101
+
3102
+ .pair_setup_request1 = client_setup_request1,
3103
+ .pair_setup_request2 = client_setup_request2,
3104
+ .pair_setup_request3 = client_setup_request3,
3105
+
3106
+ .pair_setup_response1 = client_setup_response1,
3107
+ .pair_setup_response2 = client_setup_response2,
3108
+ .pair_setup_response3 = client_setup_response3,
3109
+
3110
+ .pair_verify_new = client_verify_new,
3111
+
3112
+ .pair_verify_request1 = client_verify_request1,
3113
+ .pair_verify_request2 = client_verify_request2,
3114
+
3115
+ .pair_verify_response1 = client_verify_response1,
3116
+ .pair_verify_response2 = client_verify_response2,
3117
+
3118
+ .pair_cipher_new = cipher_new,
3119
+ .pair_cipher_free = cipher_free,
3120
+
3121
+ .pair_encrypt = encrypt,
3122
+ .pair_decrypt = decrypt,
3123
+
3124
+ .pair_state_get = state_get,
3125
+ };
3126
+
3127
+ const struct pair_definition pair_client_homekit_transient =
3128
+ {
3129
+ .pair_setup_new = client_setup_new,
3130
+ .pair_setup_free = client_setup_free,
3131
+
3132
+ .pair_setup_request1 = client_setup_request1,
3133
+ .pair_setup_request2 = client_setup_request2,
3134
+ .pair_setup_request3 = client_setup_request3,
3135
+
3136
+ .pair_setup_response1 = client_setup_response1,
3137
+ .pair_setup_response2 = client_setup_response2,
3138
+ .pair_setup_response3 = client_setup_response3,
3139
+
3140
+ .pair_verify_new = client_verify_new,
3141
+
3142
+ .pair_verify_request1 = client_verify_request1,
3143
+ .pair_verify_request2 = client_verify_request2,
3144
+
3145
+ .pair_verify_response1 = client_verify_response1,
3146
+ .pair_verify_response2 = client_verify_response2,
3147
+
3148
+ .pair_cipher_new = cipher_new,
3149
+ .pair_cipher_free = cipher_free,
3150
+
3151
+ .pair_encrypt = encrypt,
3152
+ .pair_decrypt = decrypt,
3153
+
3154
+ .pair_state_get = state_get,
3155
+ };
3156
+
3157
+ const struct pair_definition pair_server_homekit =
3158
+ {
3159
+ .pair_setup_new = server_setup_new,
3160
+ .pair_setup_free = server_setup_free,
3161
+
3162
+ .pair_setup_request1 = server_setup_response1,
3163
+ .pair_setup_request2 = server_setup_response2,
3164
+ .pair_setup_request3 = server_setup_response3,
3165
+
3166
+ .pair_setup_response1 = server_setup_request1,
3167
+ .pair_setup_response2 = server_setup_request2,
3168
+ .pair_setup_response3 = server_setup_request3,
3169
+
3170
+ .pair_verify_new = server_verify_new,
3171
+
3172
+ .pair_verify_request1 = server_verify_response1,
3173
+ .pair_verify_request2 = server_verify_response2,
3174
+
3175
+ .pair_verify_response1 = server_verify_request1,
3176
+ .pair_verify_response2 = server_verify_request2,
3177
+
3178
+ .pair_add = server_add_remove,
3179
+ .pair_remove = server_add_remove,
3180
+ .pair_list = server_list,
3181
+
3182
+ .pair_cipher_new = cipher_new,
3183
+ .pair_cipher_free = cipher_free,
3184
+
3185
+ .pair_encrypt = encrypt,
3186
+ .pair_decrypt = decrypt,
3187
+
3188
+ .pair_state_get = state_get,
3189
+ .pair_public_key_get = public_key_get,
3190
+ };