test-mesh-crypto.c 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079
  1. // SPDX-License-Identifier: LGPL-2.1-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  7. *
  8. *
  9. */
  10. #ifdef HAVE_CONFIG_H
  11. #include <config.h>
  12. #endif
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include "client/display.h"
  16. #include "mesh/crypto.c"
  17. struct mesh_crypto_test {
  18. const char *name;
  19. const char *dev_key;
  20. const char *app_key;
  21. const char *net_key;
  22. const char *uuid;
  23. uint32_t iv_index;
  24. uint8_t net_nid;
  25. uint8_t key_aid;
  26. bool md[32];
  27. bool szmic;
  28. bool frnd;
  29. bool ctl;
  30. bool segmented;
  31. bool relay;
  32. bool akf;
  33. bool kr;
  34. bool ivu;
  35. bool network_only;
  36. uint8_t seg_max;
  37. uint8_t seg_num;
  38. uint8_t opcode;
  39. uint8_t net_ttl;
  40. uint16_t seqZero;
  41. uint32_t app_seq;
  42. uint32_t net_seq[32];
  43. uint16_t net_src;
  44. uint16_t net_dst;
  45. const char *app_msg;
  46. const char *ikm;
  47. const char *okm;
  48. const char *info;
  49. const char *salt;
  50. const char *salt_out;
  51. const char *nid;
  52. const char *lpn_addr;
  53. const char *lpn_cntr;
  54. const char *fn_addr;
  55. const char *fn_cntr;
  56. const char *p;
  57. const char *short_net_id;
  58. const char *net_key_id;
  59. const char *aid;
  60. const char *enc_key;
  61. const char *net_id;
  62. const char *net_nonce[32];
  63. const char *app_nonce;
  64. const char *priv_key;
  65. const char *priv_rand[32];
  66. const char *enc_msg;
  67. uint32_t app_mic32;
  68. uint64_t app_mic64;
  69. const char *trans_pkt[32];
  70. const char *net_msg[32];
  71. uint32_t net_mic32[32];
  72. uint64_t net_mic64;
  73. const char *packet[32];
  74. uint8_t beacon_type;
  75. uint8_t beacon_flags;
  76. const char *beacon_cmac;
  77. const char *beacon;
  78. const char *rand;
  79. const char *ident_res_key;
  80. const char *hash_input;
  81. const char *mesh_id_hash;
  82. const char *identity_hash;
  83. };
  84. static const struct mesh_crypto_test s8_1_1 = {
  85. .name = "8.1.1 s1 SALT generation function",
  86. .salt = "test",
  87. .salt_out = "b73cefbd641ef2ea598c2b6efb62f79c",
  88. };
  89. static const struct mesh_crypto_test s8_1_2 = {
  90. .name = "8.1.2 k1 function",
  91. .ikm = "3216d1509884b533248541792b877f98",
  92. .salt = "salt",
  93. .info = "info",
  94. .okm = "f6ed15a8934afbe7d83e8dcb57fcf5d7",
  95. };
  96. static const struct mesh_crypto_test s8_1_3 = {
  97. .name = "8.1.3 k2 function (flooding)",
  98. .net_key = "f7a2a44f8e8a8029064f173ddc1e2b00",
  99. .p = "00",
  100. .nid = "7f",
  101. .enc_key = "9f589181a0f50de73c8070c7a6d27f46",
  102. .priv_key = "4c715bd4a64b938f99b453351653124f",
  103. };
  104. static const struct mesh_crypto_test s8_1_4 = {
  105. .name = "8.1.4 k2 function (friendship)",
  106. .frnd = true,
  107. .lpn_addr = "0203",
  108. .fn_addr = "0405",
  109. .lpn_cntr = "0607",
  110. .fn_cntr = "0809",
  111. .net_key = "f7a2a44f8e8a8029064f173ddc1e2b00",
  112. .p = "010203040506070809",
  113. .nid = "73",
  114. .enc_key = "11efec0642774992510fb5929646df49",
  115. .priv_key = "d4d7cc0dfa772d836a8df9df5510d7a7",
  116. };
  117. static const struct mesh_crypto_test s8_1_5 = {
  118. .name = "8.1.5 k3 function",
  119. .net_key = "f7a2a44f8e8a8029064f173ddc1e2b00",
  120. .salt = "smk3",
  121. .info = "id64\01",
  122. .short_net_id = "ff046958233db014",
  123. };
  124. static const struct mesh_crypto_test s8_1_6 = {
  125. .name = "8.1.6 k4 function",
  126. .app_key = "3216d1509884b533248541792b877f98",
  127. .salt = "smk4",
  128. .info = "id6\01",
  129. .aid = "38",
  130. };
  131. static const struct mesh_crypto_test s8_2_1 = {
  132. .name = "8.2.1 Application key AID",
  133. .app_key = "63964771734fbd76e3b40519d1d94a48",
  134. .salt = "smk4",
  135. .info = "id6\01",
  136. .aid = "26",
  137. };
  138. static const struct mesh_crypto_test s8_2_2 = {
  139. .name = "8.2.2 Encryption and privacy keys (flooding)",
  140. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  141. .p = "00",
  142. .nid = "68",
  143. .enc_key = "0953fa93e7caac9638f58820220a398e",
  144. .priv_key = "8b84eedec100067d670971dd2aa700cf",
  145. };
  146. static const struct mesh_crypto_test s8_2_3 = {
  147. .name = "8.2.3 Encryption and privacy keys (Friendship)",
  148. .frnd = true,
  149. .lpn_addr = "1201",
  150. .fn_addr = "2345",
  151. .lpn_cntr = "0000",
  152. .fn_cntr = "072f",
  153. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  154. .p = "01120123450000072f",
  155. .nid = "5e",
  156. .enc_key = "be635105434859f484fc798e043ce40e",
  157. .priv_key = "5d396d4b54d3cbafe943e051fe9a4eb8",
  158. };
  159. static const struct mesh_crypto_test s8_2_4 = {
  160. .name = "8.2.4 Network ID",
  161. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  162. .salt = "smk3",
  163. .info = "id64\01",
  164. .short_net_id = "3ecaff672f673370",
  165. };
  166. static const struct mesh_crypto_test s8_2_5 = {
  167. .name = "8.2.5 Identity Key",
  168. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  169. .salt = "nkik",
  170. .info = "id128\01",
  171. .enc_key = "84396c435ac48560b5965385253e210c",
  172. };
  173. static const struct mesh_crypto_test s8_2_6 = {
  174. .name = "8.2.6 Beacon Key",
  175. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  176. .salt = "nkbk",
  177. .info = "id128\01",
  178. .enc_key = "5423d967da639a99cb02231a83f7d254",
  179. };
  180. static const struct mesh_crypto_test s8_3_1 = {
  181. .name = "8.3.1 Message #1",
  182. .app_key = "63964771734fbd76e3b40519d1d94a48",
  183. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  184. .dev_key = "9d6dd0e96eb25dc19a40ed9914f8f03f",
  185. .iv_index = 0x12345678,
  186. .net_ttl = 0x00,
  187. .net_seq = {0x000001},
  188. .net_src = 0x1201,
  189. .net_dst = 0xfffd,
  190. .opcode = NET_OP_FRND_REQUEST,
  191. .trans_pkt = {"034b50057e400000010000"},
  192. .net_nid = 0x68,
  193. .ctl = true,
  194. .enc_key = "0953fa93e7caac9638f58820220a398e",
  195. .net_nonce = {"00800000011201000012345678"},
  196. .priv_key = "8b84eedec100067d670971dd2aa700cf",
  197. .priv_rand = {"000000000012345678b5e5bfdacbaf6c"},
  198. .net_msg = {"b5e5bfdacbaf6cb7fb6bff871f"},
  199. .net_mic64 = 0x035444ce83a670df,
  200. .packet = {"68eca487516765b5e5bfdacbaf6cb7fb6bff871f035444ce83a670df"},
  201. };
  202. static const struct mesh_crypto_test s8_3_2 = {
  203. .name = "8.3.2 Message #2",
  204. .app_key = "63964771734fbd76e3b40519d1d94a48",
  205. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  206. .dev_key = "9d6dd0e96eb25dc19a40ed9914f8f03f",
  207. .iv_index = 0x12345678,
  208. .ctl = true,
  209. .net_ttl = 0x00,
  210. .net_seq = {0x014820},
  211. .net_src = 0x2345,
  212. .net_dst = 0x1201,
  213. .trans_pkt = {"04320308ba072f"},
  214. .net_nid = 0x68,
  215. .opcode = NET_OP_FRND_OFFER,
  216. .enc_key = "0953fa93e7caac9638f58820220a398e",
  217. .net_nonce = {"00800148202345000012345678"},
  218. .priv_key = "8b84eedec100067d670971dd2aa700cf",
  219. .net_msg = {"79d7dbc0c9b4d43eeb"},
  220. .net_mic64 = 0xec129d20a620d01e,
  221. .priv_rand = {"00000000001234567879d7dbc0c9b4d4"},
  222. .packet = {"68d4c826296d7979d7dbc0c9b4d43eebec129d20a620d01e"},
  223. };
  224. static const struct mesh_crypto_test s8_3_3 = {
  225. .name = "8.3.3 Message #3",
  226. .app_key = "63964771734fbd76e3b40519d1d94a48",
  227. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  228. .dev_key = "9d6dd0e96eb25dc19a40ed9914f8f03f",
  229. .iv_index = 0x12345678,
  230. .ctl = true,
  231. .net_ttl = 0x00,
  232. .net_seq = {0x2b3832},
  233. .net_dst = 0x1201,
  234. .net_src = 0x2fe3,
  235. .trans_pkt = {"04fa0205a6000a"},
  236. .net_nid = 0x68,
  237. .opcode = NET_OP_FRND_OFFER,
  238. .enc_key = "0953fa93e7caac9638f58820220a398e",
  239. .net_nonce = {"00802b38322fe3000012345678"},
  240. .priv_key = "8b84eedec100067d670971dd2aa700cf",
  241. .priv_rand = {"00000000001234567853273086b8c5ee"},
  242. .net_msg = {"53273086b8c5ee00bd"},
  243. .net_mic64 = 0xd9cfcc62a2ddf572,
  244. .packet = {"68da062bc96df253273086b8c5ee00bdd9cfcc62a2ddf572"},
  245. };
  246. static const struct mesh_crypto_test s8_3_4 = {
  247. .name = "8.3.4 Message #4",
  248. .app_key = "63964771734fbd76e3b40519d1d94a48",
  249. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  250. .dev_key = "9d6dd0e96eb25dc19a40ed9914f8f03f",
  251. .iv_index = 0x12345678,
  252. .net_nid = 0x5e,
  253. .net_ttl = 0x00,
  254. .net_seq = {0x000002},
  255. .net_dst = 0x2345,
  256. .net_src = 0x1201,
  257. .trans_pkt = {"0100"},
  258. .frnd = true,
  259. .lpn_addr = "1201",
  260. .fn_addr = "2345",
  261. .lpn_cntr = "0000",
  262. .fn_cntr = "072f",
  263. .p = "01120123450000072f",
  264. .ctl = true,
  265. .opcode = NET_OP_FRND_POLL,
  266. .enc_key = "be635105434859f484fc798e043ce40e",
  267. .net_nonce = {"00800000021201000012345678"},
  268. .priv_key = "5d396d4b54d3cbafe943e051fe9a4eb8",
  269. .priv_rand = {"000000000012345678b0e5d0ad970d57"},
  270. .net_msg = {"b0e5d0ad"},
  271. .net_mic64 = 0x970d579a4e88051c,
  272. .packet = {"5e84eba092380fb0e5d0ad970d579a4e88051c"},
  273. };
  274. static const struct mesh_crypto_test s8_3_5 = {
  275. .name = "8.3.5 Message #5",
  276. .app_key = "63964771734fbd76e3b40519d1d94a48",
  277. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  278. .dev_key = "9d6dd0e96eb25dc19a40ed9914f8f03f",
  279. .iv_index = 0x12345678,
  280. .net_nid = 0x5e,
  281. .net_ttl = 0x00,
  282. .net_seq = {0x014834},
  283. .net_src = 0x2345,
  284. .net_dst = 0x1201,
  285. .trans_pkt = {"02001234567800"},
  286. .frnd = true,
  287. .lpn_addr = "1201",
  288. .fn_addr = "2345",
  289. .lpn_cntr = "0000",
  290. .fn_cntr = "072f",
  291. .p = "01120123450000072f",
  292. .ctl = true,
  293. .opcode = NET_OP_FRND_UPDATE,
  294. .enc_key = "be635105434859f484fc798e043ce40e",
  295. .net_nonce = {"00800148342345000012345678"},
  296. .priv_key = "5d396d4b54d3cbafe943e051fe9a4eb8",
  297. .priv_rand = {"0000000000123456785c39da1792b1fe"},
  298. .net_msg = {"5c39da1792b1fee9ec"},
  299. .net_mic64 = 0x74b786c56d3a9dee,
  300. .packet = {"5eafd6f53c43db5c39da1792b1fee9ec74b786c56d3a9dee"},
  301. };
  302. static const struct mesh_crypto_test s8_3_6 = {
  303. .name = "8.3.6 Message #6",
  304. .app_key = "63964771734fbd76e3b40519d1d94a48",
  305. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  306. .dev_key = "9d6dd0e96eb25dc19a40ed9914f8f03f",
  307. .iv_index = 0x12345678,
  308. .segmented = true,
  309. .net_nid = 0x68,
  310. .net_ttl = 0x04,
  311. .app_seq = 0x3129ab,
  312. .net_seq = {0x3129ab,
  313. 0x3129ac},
  314. .net_src = 0x0003,
  315. .net_dst = 0x1201,
  316. .app_msg = "0056341263964771734fbd76e3b40519d1d94a48",
  317. .enc_msg = "ee9dddfd2169326d23f3afdfcfdc18c52fdef772",
  318. .app_mic32 = 0xe0e17308,
  319. .enc_key = "0953fa93e7caac9638f58820220a398e",
  320. .app_nonce = "02003129ab0003120112345678",
  321. .priv_key = "8b84eedec100067d670971dd2aa700cf",
  322. .net_nonce = {"00043129ab0003000012345678",
  323. "00043129ac0003000012345678"},
  324. .priv_rand = {"0000000000123456780afba8c63d4e68",
  325. "0000000000123456786cae0c032bf074"},
  326. .trans_pkt = {"8026ac01ee9dddfd2169326d23f3afdf",
  327. "8026ac21cfdc18c52fdef772e0e17308"},
  328. .net_msg = {"0afba8c63d4e686364979deaf4fd40961145",
  329. "6cae0c032bf0746f44f1b8cc8ce5edc57e55"},
  330. .net_mic32 = {0x939cda0e,
  331. 0xbeed49c0},
  332. .packet = {"68cab5c5348a230afba8c63d4e686364979deaf4fd40961145939cda0e",
  333. "681615b5dd4a846cae0c032bf0746f44f1b8cc8ce5edc57e55beed49c0"},
  334. };
  335. static const struct mesh_crypto_test s8_3_7 = {
  336. .name = "8.3.7 Message #7",
  337. .app_key = "63964771734fbd76e3b40519d1d94a48",
  338. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  339. .dev_key = "9d6dd0e96eb25dc19a40ed9914f8f03f",
  340. .iv_index = 0x12345678,
  341. .net_nid = 0x68,
  342. .relay = true,
  343. .ctl = true,
  344. .net_ttl = 0x0b,
  345. .net_seq = {0x014835},
  346. .net_src = 0x2345,
  347. .net_dst = 0x0003,
  348. .opcode = NET_OP_SEG_ACKNOWLEDGE,
  349. .seqZero = 0x09ab,
  350. .trans_pkt = {"00a6ac00000002"},
  351. .enc_key = "0953fa93e7caac9638f58820220a398e",
  352. .net_nonce = {"008b0148352345000012345678"},
  353. .priv_key = "8b84eedec100067d670971dd2aa700cf",
  354. .priv_rand = {"0000000000123456780d0d730f94d7f3"},
  355. .net_msg = {"0d0d730f94d7f3509d"},
  356. .net_mic64 = 0xf987bb417eb7c05f,
  357. .packet = {"68e476b5579c980d0d730f94d7f3509df987bb417eb7c05f"},
  358. };
  359. static const struct mesh_crypto_test s8_3_8 = {
  360. .name = "8.3.8 Message #8",
  361. .network_only = true, /* Test has incomplete Access Payload */
  362. .seg_max = 1,
  363. .seg_num = 0,
  364. .app_key = "63964771734fbd76e3b40519d1d94a48",
  365. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  366. .dev_key = "9d6dd0e96eb25dc19a40ed9914f8f03f",
  367. .iv_index = 0x12345678,
  368. .net_nid = 0x68,
  369. .relay = true,
  370. .net_ttl = 0x04,
  371. .net_seq = {0x3129ad},
  372. .net_src = 0x0003,
  373. .net_dst = 0x1201,
  374. .segmented = true,
  375. .seqZero = 0x09ab,
  376. .trans_pkt = {"8026ac01ee9dddfd2169326d23f3afdf"},
  377. .enc_key = "0953fa93e7caac9638f58820220a398e",
  378. .net_nonce = {"00043129ad0003000012345678"},
  379. .priv_key = "8b84eedec100067d670971dd2aa700cf",
  380. .priv_rand = {"0000000000123456780e2f91add6f06e"},
  381. .net_msg = {"0e2f91add6f06e66006844cec97f973105ae"},
  382. .net_mic32 = {0x2534f958},
  383. .packet = {"684daa6267c2cf0e2f91add6f06e66006844cec97f973105ae2534f958"},
  384. };
  385. static const struct mesh_crypto_test s8_3_9 = {
  386. .name = "8.3.9 Message #9",
  387. .app_key = "63964771734fbd76e3b40519d1d94a48",
  388. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  389. .dev_key = "9d6dd0e96eb25dc19a40ed9914f8f03f",
  390. .iv_index = 0x12345678,
  391. .net_nid = 0x68,
  392. .relay = true,
  393. .ctl = true,
  394. .net_ttl = 0x0b,
  395. .net_seq = {0x014836},
  396. .net_src = 0x2345,
  397. .net_dst = 0x0003,
  398. .opcode = NET_OP_SEG_ACKNOWLEDGE,
  399. .seqZero = 0x09ab,
  400. .trans_pkt = {"00a6ac00000003"},
  401. .enc_key = "0953fa93e7caac9638f58820220a398e",
  402. .net_nonce = {"008b0148362345000012345678"},
  403. .priv_key = "8b84eedec100067d670971dd2aa700cf",
  404. .priv_rand = {"000000000012345678d85d806bbed248"},
  405. .net_msg = {"d85d806bbed248614f"},
  406. .net_mic64 = 0x938067b0d983bb7b,
  407. .packet = {"68aec467ed4901d85d806bbed248614f938067b0d983bb7b"},
  408. };
  409. static const struct mesh_crypto_test s8_3_10 = {
  410. .name = "8.3.10 Message #10",
  411. .app_key = "63964771734fbd76e3b40519d1d94a48",
  412. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  413. .dev_key = "9d6dd0e96eb25dc19a40ed9914f8f03f",
  414. .iv_index = 0x12345678,
  415. .net_nid = 0x5e,
  416. .net_ttl = 0x00,
  417. .net_seq = {0x000003},
  418. .net_src = 0x1201,
  419. .net_dst = 0x2345,
  420. .trans_pkt = {"0101"},
  421. .frnd = true,
  422. .lpn_addr = "1201",
  423. .fn_addr = "2345",
  424. .lpn_cntr = "0000",
  425. .fn_cntr = "072f",
  426. .p = "01120123450000072f",
  427. .ctl = true,
  428. .opcode = NET_OP_FRND_POLL,
  429. .enc_key = "be635105434859f484fc798e043ce40e",
  430. .net_nonce = {"00800000031201000012345678"},
  431. .priv_key = "5d396d4b54d3cbafe943e051fe9a4eb8",
  432. .priv_rand = {"0000000000123456787777ed355afaf6"},
  433. .net_msg = {"7777ed35"},
  434. .net_mic64 = 0x5afaf66d899c1e3d,
  435. .packet = {"5e7b786568759f7777ed355afaf66d899c1e3d"},
  436. };
  437. static const struct mesh_crypto_test s8_3_11 = {
  438. .name = "8.3.11 Message #11",
  439. /* Test has incomplete Access Payload */
  440. .network_only = true,
  441. .seg_max = 1,
  442. .seg_num = 0,
  443. .frnd = true,
  444. .lpn_addr = "1201",
  445. .fn_addr = "2345",
  446. .lpn_cntr = "0000",
  447. .fn_cntr = "072f",
  448. .p = "01120123450000072f",
  449. .app_key = "63964771734fbd76e3b40519d1d94a48",
  450. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  451. .dev_key = "9d6dd0e96eb25dc19a40ed9914f8f03f",
  452. .iv_index = 0x12345678,
  453. .net_nid = 0x5e,
  454. .net_ttl = 0x03,
  455. .net_seq = {0x3129ad},
  456. .net_src = 0x0003,
  457. .net_dst = 0x1201,
  458. .akf = true,
  459. .key_aid = 0x00,
  460. .segmented = true,
  461. .seqZero = 0x09ab,
  462. .trans_pkt = {"c026ac01ee9dddfd2169326d23f3afdf"},
  463. .enc_key = "be635105434859f484fc798e043ce40e",
  464. .net_nonce = {"00033129ad0003000012345678"},
  465. .priv_key = "5d396d4b54d3cbafe943e051fe9a4eb8",
  466. .priv_rand = {"000000000012345678d5e748a20ecfd9"},
  467. .net_msg = {"d5e748a20ecfd98ddfd32de80befb400213d"},
  468. .net_mic32 = {0x113813b5},
  469. .packet = {"5e6ebfc021edf5d5e748a20ecfd98ddfd32de80befb400213d113813b5"},
  470. };
  471. static const struct mesh_crypto_test s8_3_22 = {
  472. .name = "8.3.22 Message #22",
  473. .app_key = "63964771734fbd76e3b40519d1d94a48",
  474. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  475. .dev_key = "9d6dd0e96eb25dc19a40ed9914f8f03f",
  476. .iv_index = 0x12345677,
  477. .net_nid = 0x68,
  478. .net_ttl = 0x03,
  479. .app_seq = 0x07080b,
  480. .net_seq = {0x07080b},
  481. .net_src = 0x1234,
  482. .net_dst = 0xb529,
  483. .uuid = "0073e7e4d8b9440faf8415df4c56c0e1",
  484. .akf = true,
  485. .key_aid = 0x26,
  486. .app_msg = "d50a0048656c6c6f",
  487. .enc_msg = "3871b904d4315263",
  488. .app_mic32 = 0x16ca48a0,
  489. .enc_key = "0953fa93e7caac9638f58820220a398e",
  490. .app_nonce = "010007080b1234b52912345677",
  491. .priv_key = "8b84eedec100067d670971dd2aa700cf",
  492. .net_nonce = {"000307080b1234000012345677"},
  493. .priv_rand = {"000000000012345677ed31f3fdcf88a4"},
  494. .trans_pkt = {"663871b904d431526316ca48a0"},
  495. .net_msg = {"ed31f3fdcf88a411135fea55df730b"},
  496. .net_mic32 = {0x6b28e255},
  497. .packet = {"e8d85caecef1e3ed31f3fdcf88a411135fea55df730b6b28e255" },
  498. };
  499. static const struct mesh_crypto_test s8_4_3 = {
  500. .name = "8.4.3 Secure Network Beacon",
  501. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  502. .iv_index = 0x12345678,
  503. .enc_key = "5423d967da639a99cb02231a83f7d254",
  504. .net_id = "3ecaff672f673370",
  505. .beacon_type = 0x01,
  506. .beacon_flags = 0x00,
  507. .beacon_cmac = "8ea261582f364f6f",
  508. .beacon = "01003ecaff672f673370123456788ea261582f364f6f",
  509. };
  510. static const struct mesh_crypto_test s8_6_2 = {
  511. .name = "8.6.2 Service Data using Node Identity",
  512. .net_key = "7dd7364cd842ad18c17c2b820c84c3d6",
  513. .net_src = 0x1201,
  514. .rand = "34ae608fbbc1f2c6",
  515. .ident_res_key = "84396c435ac48560b5965385253e210c",
  516. .hash_input = "00000000000034ae608fbbc1f2c61201",
  517. .identity_hash = "00861765aefcc57b",
  518. .beacon = "0100861765aefcc57b34ae608fbbc1f2c6",
  519. };
  520. #define PASS COLOR_GREEN "PASS" COLOR_OFF
  521. #define FAIL COLOR_RED "FAIL" COLOR_OFF
  522. #define INVAL COLOR_YELLOW "INVALID" COLOR_OFF
  523. #define EVALCMP(a, b, l) memcmp((a), (b), (l)) ? FAIL : PASS
  524. #define EXITCMP(a, b, l) do { if (memcmp((a), (b), (l))) \
  525. exit(1); \
  526. } while (0)
  527. #define EVALSTR(a, b) (((a) && (b)) ? (strcmp((a), (b)) ? FAIL : PASS) \
  528. : INVAL)
  529. #define EXITSTR(a, b) do { if ((a) && (b)) { \
  530. if (strcmp((a), (b))) \
  531. exit(1); \
  532. } else \
  533. exit(1); \
  534. } while (0)
  535. #define EVALNUM(a, b) (((a) == (b)) ? PASS : FAIL)
  536. #define EXITNUM(a, b) do { if (a != b) exit(1); } while (0)
  537. #define EVALBOOLNOTBOTH(a, b) !(a && b) ? PASS : FAIL
  538. #define EXITBOOLNOTBOTH(a, b) do { if (!!(a && b)) exit(1); } while (0)
  539. static void verify_data(const char *label, unsigned int indent,
  540. const char *sample, const uint8_t *data, size_t size)
  541. {
  542. char *str;
  543. str = l_util_hexstring(data, size);
  544. l_info("%-20s =%*c%s", label, 1 + (indent * 2), ' ', sample);
  545. l_info("%-20s %*c%s => %s", "", 1 + (indent * 2), ' ', str,
  546. EVALSTR(sample, str));
  547. EXITSTR(sample, str);
  548. l_free(str);
  549. }
  550. static void verify_bool_not_both(const char *label, unsigned int indent,
  551. bool sample, bool data)
  552. {
  553. l_info("%-20s =%*c%s", label, 1 + (indent * 2), ' ',
  554. sample ? "true" : "false");
  555. l_info("%-20s %*c%s => %s", "", 1 + (indent * 2), ' ',
  556. data ? "true" : "false",
  557. EVALBOOLNOTBOTH(sample, data));
  558. EXITBOOLNOTBOTH(sample, data);
  559. }
  560. static void verify_uint8(const char *label, unsigned int indent,
  561. uint8_t sample, uint8_t data)
  562. {
  563. l_info("%-20s =%*c%02x", label, 1 + (indent * 2), ' ', sample);
  564. l_info("%-20s %*c%02x => %s", "", 1 + (indent * 2), ' ', data,
  565. EVALNUM(sample, data));
  566. EXITNUM(sample, data);
  567. }
  568. static void verify_uint16(const char *label, unsigned int indent,
  569. uint16_t sample, uint16_t data)
  570. {
  571. l_info("%-20s =%*c%04x", label, 1 + (indent * 2), ' ', sample);
  572. l_info("%-20s %*c%04x => %s", "", 1 + (indent * 2), ' ', data,
  573. EVALNUM(sample, data));
  574. EXITNUM(sample, data);
  575. }
  576. static void verify_uint24(const char *label, unsigned int indent,
  577. uint32_t sample, uint32_t data)
  578. {
  579. l_info("%-20s =%*c%06x", label, 1 + (indent * 2), ' ', sample);
  580. l_info("%-20s %*c%06x => %s", "", 1 + (indent * 2), ' ', data,
  581. EVALNUM(sample, data));
  582. EXITNUM(sample, data);
  583. }
  584. static void verify_uint32(const char *label, unsigned int indent,
  585. uint32_t sample, uint32_t data)
  586. {
  587. l_info("%-20s =%*c%08x", label, 1 + (indent * 2), ' ', sample);
  588. l_info("%-20s %*c%08x => %s", "", 1 + (indent * 2), ' ', data,
  589. EVALNUM(sample, data));
  590. EXITNUM(sample, data);
  591. }
  592. static void verify_uint64(const char *label, unsigned int indent,
  593. uint64_t sample, uint64_t data)
  594. {
  595. l_info("%-20s =%*c%16llx", label, 1 + (indent * 2), ' ',
  596. (long long unsigned int) sample);
  597. l_info("%-20s %*c%16llx => %s", "", 1 + (indent * 2), ' ',
  598. (long long unsigned int) data,
  599. EVALNUM(sample, data));
  600. EXITNUM(sample, data);
  601. }
  602. static void show_str(const char *label, unsigned int indent,
  603. const char *sample)
  604. {
  605. char *printable = l_malloc(strlen(sample) + 1);
  606. char *tmp = printable;
  607. while (*sample) {
  608. if (l_ascii_isprint(*sample))
  609. *tmp++ = *sample++;
  610. else {
  611. *tmp++ = '?';
  612. sample++;
  613. }
  614. }
  615. *tmp = '\0';
  616. l_info("%-20s =%*c%s", label, 1 + (indent * 2), ' ', printable);
  617. l_free(printable);
  618. }
  619. static void show_data(const char *label, unsigned int indent,
  620. const void *data, size_t size)
  621. {
  622. char *str;
  623. str = l_util_hexstring(data, size);
  624. l_info("%-20s =%*c%s", label, 1 + (indent * 2), ' ', str);
  625. l_free(str);
  626. }
  627. static void show_uint8(const char *label, unsigned int indent, uint8_t data)
  628. {
  629. l_info("%-20s =%*c%2.2x", label, 1 + (indent * 2), ' ', data);
  630. }
  631. static void show_uint32(const char *label, unsigned int indent, uint32_t data)
  632. {
  633. l_info("%-20s =%*c%8.8x", label, 1 + (indent * 2), ' ', data);
  634. }
  635. static void check_encrypt_segment(const struct mesh_crypto_test *keys,
  636. uint16_t seg, uint16_t seg_max,
  637. uint8_t *enc_msg, size_t len,
  638. uint8_t *enc_key, uint8_t *priv_key,
  639. uint8_t nid)
  640. {
  641. uint8_t net_nonce[13];
  642. uint8_t priv_rand[16];
  643. uint8_t packet[29];
  644. uint8_t packet_len;
  645. uint32_t hdr;
  646. uint64_t net_mic64, net_mic32;
  647. size_t net_msg_len;
  648. uint8_t key_aid = keys->key_aid | (keys->akf ? KEY_ID_AKF : 0x00);
  649. if (keys->ctl) {
  650. mesh_crypto_packet_build(keys->ctl, keys->net_ttl,
  651. keys->net_seq[0],
  652. keys->net_src, keys->net_dst,
  653. keys->opcode,
  654. keys->segmented, key_aid,
  655. keys->szmic, keys->relay, keys->seqZero,
  656. seg, seg_max,
  657. enc_msg, len,
  658. packet, &packet_len);
  659. } else {
  660. mesh_crypto_packet_build(keys->ctl, keys->net_ttl,
  661. keys->net_seq[0],
  662. keys->net_src, keys->net_dst,
  663. keys->opcode,
  664. keys->segmented, key_aid,
  665. keys->szmic, keys->relay, keys->seqZero,
  666. seg, seg_max,
  667. enc_msg, len,
  668. packet, &packet_len);
  669. }
  670. l_info(COLOR_YELLOW "Segment-%d" COLOR_OFF, seg);
  671. hdr = l_get_be32(packet + 9);
  672. verify_uint8("SEG", 9, keys->segmented << (SEG_HDR_SHIFT % 8),
  673. packet[9] & (1 << (SEG_HDR_SHIFT % 8)));
  674. if (keys->ctl) {
  675. verify_uint8("Opcode", 9,
  676. keys->opcode << (OPCODE_HDR_SHIFT % 8),
  677. (packet[9] & OPCODE_MASK) <<
  678. (OPCODE_HDR_SHIFT % 8));
  679. } else {
  680. verify_uint8("AKF", 9, keys->akf << (AKF_HDR_SHIFT % 8),
  681. packet[9] & (1 << (AKF_HDR_SHIFT % 8)));
  682. verify_uint8("AID", 9,
  683. keys->key_aid << (KEY_HDR_SHIFT % 8),
  684. (packet[9] & KEY_AID_MASK) <<
  685. (KEY_HDR_SHIFT % 8));
  686. }
  687. verify_uint8("SZMIC", 10,
  688. keys->szmic << (SZMIC_HDR_SHIFT % 8),
  689. packet[10] & (1 << (SZMIC_HDR_SHIFT % 8)));
  690. /* Awkward shift-by-two for correct display */
  691. verify_uint16("SeqZero", 10,
  692. (keys->seqZero & SEQ_ZERO_MASK) << 2,
  693. ((hdr >> SEQ_ZERO_HDR_SHIFT) & SEQ_ZERO_MASK)
  694. << 2);
  695. verify_uint16("SegO", 11,
  696. (seg & SEG_MASK) << SEGO_HDR_SHIFT,
  697. hdr & (SEG_MASK << SEGO_HDR_SHIFT));
  698. verify_uint8("SegN", 12,
  699. (seg_max & SEG_MASK) << SEGN_HDR_SHIFT,
  700. hdr & (SEG_MASK << SEGN_HDR_SHIFT));
  701. show_data("Payload", 13, enc_msg, len);
  702. len += 4;
  703. mesh_crypto_network_nonce(keys->ctl, keys->net_ttl,
  704. keys->net_seq[0], keys->net_src,
  705. keys->iv_index, net_nonce);
  706. verify_data("TransportData", 9, keys->trans_pkt[0],
  707. packet + 9, len);
  708. verify_uint16("DST", 7, keys->net_dst, l_get_be16(packet + 7));
  709. net_msg_len = len + 2;
  710. show_data("TransportPayload", 7, packet + 7, net_msg_len);
  711. mesh_crypto_packet_encrypt(packet, packet_len,
  712. enc_key,
  713. keys->iv_index, false,
  714. keys->ctl, keys->net_ttl,
  715. keys->net_seq[0],
  716. keys->net_src);
  717. mesh_crypto_privacy_counter(keys->iv_index, packet + 7, priv_rand);
  718. l_info("");
  719. show_uint32("IVindex", 0, keys->iv_index);
  720. verify_data("NetworkNonce", 0, keys->net_nonce[0], net_nonce, 13);
  721. verify_data("PrivacyRandom", 0, keys->priv_rand[0], priv_rand, 16);
  722. show_uint8("INI", 0, (keys->iv_index & 0x01) << 7);
  723. verify_uint8("NID", 0, keys->net_nid, nid);
  724. verify_uint8("CTL", 1, keys->ctl << 7, packet[1] & 0x80);
  725. verify_uint8("TTL", 1, keys->net_ttl, packet[1] & 0x7f);
  726. verify_uint24("SEQ", 2, keys->net_seq[0],
  727. l_get_be32(packet + 1) & SEQ_MASK);
  728. verify_uint16("SRC", 5, keys->net_src, l_get_be16(packet + 5));
  729. verify_data("EncNetworkPayload", 7, keys->net_msg[0],
  730. packet + 7, net_msg_len);
  731. if (keys->ctl) {
  732. net_mic64 = l_get_be64(packet + 7 + net_msg_len);
  733. verify_uint64("NetworkMIC", 7 + net_msg_len,
  734. keys->net_mic64, net_mic64);
  735. net_msg_len += 8;
  736. } else {
  737. net_mic32 = l_get_be32(packet + 7 + net_msg_len);
  738. verify_uint32("NetworkMIC", 7 + net_msg_len,
  739. keys->net_mic32[0], net_mic32);
  740. net_msg_len += 4;
  741. }
  742. show_data("PreObsPayload", 1, packet + 1, 6 + net_msg_len);
  743. mesh_crypto_network_obfuscate(packet, priv_key,
  744. keys->iv_index,
  745. keys->ctl, keys->net_ttl,
  746. keys->net_seq[0], keys->net_src);
  747. show_data("PostObsPayload", 1, packet + 1, 6 + net_msg_len);
  748. packet[0] = (keys->iv_index & 0x01) << 7 | nid;
  749. packet_len = 7 + net_msg_len;
  750. verify_data("Packet", 0, keys->packet[0], packet, packet_len);
  751. l_info("");
  752. }
  753. static void check_encrypt(const struct mesh_crypto_test *keys)
  754. {
  755. uint8_t *dev_key;
  756. uint8_t *app_key;
  757. uint8_t *net_key;
  758. uint8_t nid;
  759. uint8_t enc_key[16];
  760. uint8_t priv_key[16];
  761. uint8_t net_nonce[13];
  762. uint8_t app_nonce[13];
  763. uint8_t priv_rand[16];
  764. uint8_t p[9];
  765. size_t p_len;
  766. size_t aad_len = 0;
  767. uint8_t *aad;
  768. size_t app_msg_len;
  769. uint8_t *app_msg = NULL;
  770. uint8_t *enc_msg;
  771. uint32_t app_mic32;
  772. uint64_t app_mic64;
  773. size_t net_msg_len;
  774. uint32_t net_mic32;
  775. uint64_t net_mic64;
  776. uint8_t key_aid;
  777. uint8_t packet[29];
  778. uint8_t packet_len;
  779. uint16_t i, seg_max, seg_len = 0;
  780. uint32_t seqZero, hdr;
  781. l_info(COLOR_BLUE "[Encrypt %s]" COLOR_OFF, keys->name);
  782. verify_bool_not_both("CTL && Segmented", 0, keys->ctl, keys->segmented);
  783. dev_key = l_util_from_hexstring(keys->dev_key, NULL);
  784. app_key = l_util_from_hexstring(keys->app_key, NULL);
  785. net_key = l_util_from_hexstring(keys->net_key, NULL);
  786. aad = l_util_from_hexstring(keys->uuid, &aad_len);
  787. show_data("NetworkKey", 0, net_key, 16);
  788. if (keys->akf) {
  789. mesh_crypto_k4(app_key, &key_aid);
  790. key_aid |= KEY_ID_AKF;
  791. } else {
  792. key_aid = 0;
  793. }
  794. if (keys->frnd) {
  795. uint8_t *lpn_addr, *fn_addr, *lpn_cntr, *fn_cntr;
  796. lpn_addr = l_util_from_hexstring(keys->lpn_addr, NULL);
  797. fn_addr = l_util_from_hexstring(keys->fn_addr, NULL);
  798. lpn_cntr = l_util_from_hexstring(keys->lpn_cntr, NULL);
  799. fn_cntr = l_util_from_hexstring(keys->fn_cntr, NULL);
  800. show_data("LPN Address", 0, lpn_addr, 2);
  801. show_data("Friend Address", 0, fn_addr, 2);
  802. show_data("LPN Counter", 0, lpn_cntr, 2);
  803. show_data("Friend Counter", 0, fn_cntr, 2);
  804. l_info("");
  805. p[0] = 1;
  806. l_put_be16(l_get_be16(lpn_addr), p + 1);
  807. l_put_be16(l_get_be16(fn_addr), p + 3);
  808. l_put_be16(l_get_be16(lpn_cntr), p + 5);
  809. l_put_be16(l_get_be16(fn_cntr), p + 7);
  810. p_len = 9;
  811. l_free(fn_cntr);
  812. l_free(lpn_cntr);
  813. l_free(fn_addr);
  814. l_free(lpn_addr);
  815. } else {
  816. p[0] = 0;
  817. p_len = 1;
  818. }
  819. if (p_len > 1) verify_data("P", 0, keys->p, p, p_len);
  820. mesh_crypto_k2(net_key, p, p_len, &nid, enc_key, priv_key);
  821. verify_data("EncryptionKey", 0, keys->enc_key, enc_key,
  822. sizeof(enc_key));
  823. verify_data("PrivacyKey", 0, keys->priv_key, priv_key,
  824. sizeof(priv_key));
  825. verify_uint8("NID", 0, keys->net_nid, nid);
  826. if (keys->network_only) {
  827. enc_msg = l_util_from_hexstring(keys->trans_pkt[0],
  828. &app_msg_len);
  829. check_encrypt_segment(keys, keys->seg_num, keys->seg_max,
  830. enc_msg + 4, app_msg_len - 4,
  831. enc_key, priv_key, nid);
  832. goto done;
  833. }
  834. if (keys->akf)
  835. mesh_crypto_application_nonce(keys->app_seq, keys->net_src,
  836. keys->net_dst, keys->iv_index,
  837. keys->szmic, app_nonce);
  838. else
  839. mesh_crypto_device_nonce(keys->app_seq, keys->net_src,
  840. keys->net_dst, keys->iv_index,
  841. keys->szmic, app_nonce);
  842. seqZero = keys->app_seq;
  843. if (!keys->ctl) {
  844. app_msg = l_util_from_hexstring(keys->app_msg, &app_msg_len);
  845. if (keys->szmic) {
  846. seg_max = SEG_MAX(keys->segmented, app_msg_len + 8);
  847. enc_msg = l_malloc(app_msg_len + 8);
  848. mesh_crypto_payload_encrypt(aad, app_msg,
  849. enc_msg, app_msg_len,
  850. keys->net_src, keys->net_dst, key_aid,
  851. keys->app_seq, keys->iv_index,
  852. keys->szmic,
  853. keys->akf ? app_key : dev_key);
  854. } else {
  855. seg_max = SEG_MAX(keys->segmented, app_msg_len + 4);
  856. enc_msg = l_malloc(app_msg_len + 4);
  857. mesh_crypto_payload_encrypt(aad, app_msg,
  858. enc_msg, app_msg_len,
  859. keys->net_src, keys->net_dst, key_aid,
  860. keys->app_seq, keys->iv_index,
  861. keys->szmic,
  862. keys->akf ? app_key : dev_key);
  863. }
  864. if (keys->dev_key && !keys->akf)
  865. show_data("DeviceKey", 0, dev_key, 16);
  866. if (keys->app_key && keys->akf)
  867. show_data("ApplicationKey", 0, app_key, 16);
  868. if (aad) show_data("UUID", 0, aad, 16);
  869. verify_data("EncryptionKey", 0, keys->enc_key, enc_key, 16);
  870. verify_data("ApplicationNonce", 0, keys->app_nonce,
  871. app_nonce, 13);
  872. verify_data("PrivacyKey", 0, keys->priv_key, priv_key, 16);
  873. show_data("AppPayload", 0, app_msg, app_msg_len);
  874. verify_data("EncryptedAppPayload", 0, keys->enc_msg, enc_msg,
  875. app_msg_len);
  876. if (keys->szmic) {
  877. app_mic64 = l_get_be64(enc_msg + app_msg_len);
  878. verify_uint64("ApplicationMIC", app_msg_len,
  879. keys->app_mic64, app_mic64);
  880. app_msg_len += 8;
  881. } else {
  882. app_mic32 = l_get_be32(enc_msg + app_msg_len);
  883. verify_uint32("ApplicationMIC", app_msg_len,
  884. keys->app_mic32, app_mic32);
  885. app_msg_len += 4;
  886. }
  887. } else {
  888. enc_msg = l_util_from_hexstring(keys->trans_pkt[0],
  889. &app_msg_len);
  890. seg_max = 0;
  891. app_msg_len--;
  892. }
  893. for (i = 0; i <= seg_max; i++) {
  894. if (seg_max) {
  895. if (i < seg_max || !(app_msg_len % 12))
  896. seg_len = 12;
  897. else
  898. seg_len = app_msg_len % 12;
  899. } else {
  900. seg_len = app_msg_len;
  901. }
  902. if (keys->ctl) {
  903. mesh_crypto_packet_build(keys->ctl, keys->net_ttl,
  904. keys->net_seq[i],
  905. keys->net_src, keys->net_dst,
  906. keys->opcode,
  907. keys->segmented, key_aid,
  908. keys->szmic, keys->relay, keys->seqZero,
  909. i, seg_max,
  910. enc_msg + 1, seg_len,
  911. packet, &packet_len);
  912. } else {
  913. mesh_crypto_packet_build(keys->ctl, keys->net_ttl,
  914. keys->net_seq[i],
  915. keys->net_src, keys->net_dst,
  916. keys->opcode,
  917. keys->segmented, key_aid,
  918. keys->szmic, keys->relay, seqZero,
  919. i, seg_max,
  920. enc_msg + (i * 12), seg_len,
  921. packet, &packet_len);
  922. }
  923. if (seg_max) l_info(COLOR_YELLOW "Segment-%d" COLOR_OFF, i);
  924. hdr = l_get_be32(packet + 9);
  925. verify_uint8("SEG", 9, keys->segmented << (SEG_HDR_SHIFT % 8),
  926. packet[9] & (1 << (SEG_HDR_SHIFT % 8)));
  927. if (keys->ctl) {
  928. verify_uint8("Opcode", 9,
  929. keys->opcode << (OPCODE_HDR_SHIFT % 8),
  930. (packet[9] & OPCODE_MASK) <<
  931. (OPCODE_HDR_SHIFT % 8));
  932. } else {
  933. verify_uint8("AKF", 9, keys->akf << (AKF_HDR_SHIFT % 8),
  934. packet[9] & (1 << (AKF_HDR_SHIFT % 8)));
  935. verify_uint8("AID", 9,
  936. keys->key_aid << (KEY_HDR_SHIFT % 8),
  937. (packet[9] & KEY_AID_MASK) <<
  938. (KEY_HDR_SHIFT % 8));
  939. }
  940. if (seg_max == 0) {
  941. if (!keys->ctl) {
  942. show_data("Payload", 10, app_msg, seg_len - 4);
  943. show_data("EncryptedPayload", 10, packet + 10,
  944. seg_len);
  945. } else if (keys->opcode == NET_OP_SEG_ACKNOWLEDGE) {
  946. verify_uint8("Relay", 10,
  947. keys->relay << (RELAY_HDR_SHIFT % 8),
  948. packet[10] &
  949. (1 << (RELAY_HDR_SHIFT % 8)));
  950. /* Awkward shift-by-two for correct display */
  951. verify_uint16("SeqZero", 10,
  952. (keys->seqZero & SEQ_ZERO_MASK) << 2,
  953. ((hdr >> SEQ_ZERO_HDR_SHIFT) &
  954. SEQ_ZERO_MASK) << 2);
  955. show_data("Payload", 12, packet + 12, seg_len);
  956. } else {
  957. show_data("Payload", 10, packet + 10, seg_len);
  958. }
  959. seg_len += 1;
  960. } else {
  961. verify_uint8("SZMIC", 10,
  962. keys->szmic << (SZMIC_HDR_SHIFT % 8),
  963. packet[10] & (1 << (SZMIC_HDR_SHIFT % 8)));
  964. /* Awkward shift-by-two for correct display */
  965. verify_uint16("SeqZero", 10,
  966. (keys->app_seq & SEQ_ZERO_MASK) << 2,
  967. ((hdr >> SEQ_ZERO_HDR_SHIFT) & SEQ_ZERO_MASK)
  968. << 2);
  969. verify_uint16("SegO", 11,
  970. (i & SEG_MASK) << SEGO_HDR_SHIFT,
  971. hdr & (SEG_MASK << SEGO_HDR_SHIFT));
  972. verify_uint8("SegN", 12,
  973. (seg_max & SEG_MASK) << SEGN_HDR_SHIFT,
  974. hdr & (SEG_MASK << SEGN_HDR_SHIFT));
  975. show_data("Payload", 13, enc_msg + (i * 12), seg_len);
  976. seg_len += 4;
  977. }
  978. mesh_crypto_network_nonce(keys->ctl, keys->net_ttl,
  979. keys->net_seq[i], keys->net_src,
  980. keys->iv_index, net_nonce);
  981. verify_data("TransportData", 9, keys->trans_pkt[i],
  982. packet + 9, seg_len);
  983. verify_uint16("DST", 7, keys->net_dst, l_get_be16(packet + 7));
  984. net_msg_len = seg_len + 2;
  985. show_data("TransportPayload", 7, packet + 7, net_msg_len);
  986. mesh_crypto_packet_encrypt(packet, packet_len, enc_key,
  987. keys->iv_index, false,
  988. keys->ctl, keys->net_ttl,
  989. keys->net_seq[i],
  990. keys->net_src);
  991. mesh_crypto_privacy_counter(keys->iv_index, packet + 7,
  992. priv_rand);
  993. l_info("");
  994. show_uint32("IVindex", 0, keys->iv_index);
  995. verify_data("NetworkNonce", 0, keys->net_nonce[i],
  996. net_nonce, 13);
  997. verify_data("PrivacyRandom", 0, keys->priv_rand[i],
  998. priv_rand, 16);
  999. show_uint8("INI", 0, (keys->iv_index & 0x01) << 7);
  1000. verify_uint8("NID", 0, keys->net_nid, nid);
  1001. verify_uint8("CTL", 1, keys->ctl << 7, packet[1] & 0x80);
  1002. verify_uint8("TTL", 1, keys->net_ttl, packet[1] & 0x7f);
  1003. verify_uint24("SEQ", 2, keys->net_seq[i],
  1004. l_get_be32(packet + 1) & SEQ_MASK);
  1005. verify_uint16("SRC", 5, keys->net_src, l_get_be16(packet + 5));
  1006. verify_data("EncNetworkPayload", 7, keys->net_msg[i],
  1007. packet + 7, net_msg_len);
  1008. if (keys->ctl) {
  1009. net_mic64 = l_get_be64(packet + packet_len - 8);
  1010. verify_uint64("NetworkMIC", 7 + net_msg_len,
  1011. keys->net_mic64, net_mic64);
  1012. net_msg_len += 8;
  1013. } else {
  1014. net_mic32 = l_get_be32(packet + packet_len - 4);
  1015. verify_uint32("NetworkMIC", 7 + net_msg_len,
  1016. keys->net_mic32[i], net_mic32);
  1017. net_msg_len += 4;
  1018. }
  1019. show_data("PreObsPayload", 1, packet + 1, 6 + net_msg_len);
  1020. mesh_crypto_network_obfuscate(packet, priv_key,
  1021. keys->iv_index,
  1022. keys->ctl, keys->net_ttl,
  1023. keys->net_seq[i], keys->net_src);
  1024. show_data("PostObsPayload", 1, packet + 1, 6 + net_msg_len);
  1025. packet[0] = (keys->iv_index & 0x01) << 7 | nid;
  1026. packet_len = 7 + net_msg_len;
  1027. verify_data("Packet", 0, keys->packet[i], packet, packet_len);
  1028. l_info("");
  1029. }
  1030. done:
  1031. l_free(dev_key);
  1032. l_free(app_key);
  1033. l_free(aad);
  1034. l_free(net_key);
  1035. l_free(app_msg);
  1036. l_free(enc_msg);
  1037. }
  1038. static void check_decrypt_segment(const struct mesh_crypto_test *keys,
  1039. uint16_t seg, uint16_t seg_max,
  1040. uint8_t *pkt, uint8_t pkt_len,
  1041. const uint8_t *msg, uint8_t msg_len,
  1042. uint8_t *enc_key, uint8_t *priv_key,
  1043. uint8_t nid)
  1044. {
  1045. uint8_t net_clr[29];
  1046. uint64_t net_mic64, calc_net_mic64;
  1047. uint32_t hdr, net_mic32, calc_net_mic32;
  1048. bool ctl, segmented, relay, szmic, key_akf;
  1049. uint8_t ttl, opcode, key_aid, segO, segN;
  1050. uint32_t seq;
  1051. uint16_t src, dst, seqZero;
  1052. memcpy(net_clr, pkt, pkt_len);
  1053. show_data("NetworkMessage", 0, pkt, pkt_len);
  1054. mesh_crypto_packet_decode(pkt, pkt_len,
  1055. false, net_clr, keys->iv_index,
  1056. enc_key, priv_key);
  1057. show_data("Decoded", 0, net_clr, pkt_len);
  1058. mesh_crypto_packet_parse(net_clr, pkt_len,
  1059. &ctl, &ttl, &seq,
  1060. &src, &dst,
  1061. NULL, &opcode,
  1062. &segmented, &key_aid,
  1063. &szmic, &relay, &seqZero,
  1064. &segO, &segN,
  1065. &msg, &msg_len);
  1066. if (ctl) {
  1067. net_mic64 = l_get_be64(pkt + pkt_len - 8);
  1068. show_data("EncryptedPayload", 7, pkt + 7, pkt_len - 7 - 8);
  1069. mesh_crypto_packet_decrypt(pkt, pkt_len,
  1070. enc_key,
  1071. keys->iv_index, false,
  1072. ctl, ttl, seq,
  1073. src);
  1074. calc_net_mic64 = l_get_be64(pkt + pkt_len - 8);
  1075. verify_uint64("NetworkMIC", pkt_len - 8, net_mic64,
  1076. net_mic64 ^ calc_net_mic64);
  1077. show_data("DecryptedPayload", 7, net_clr + 7, pkt_len - 7 - 8);
  1078. } else {
  1079. net_mic32 = l_get_be32(pkt + pkt_len - 4);
  1080. show_data("EncryptedPayload", 7, pkt + 7, pkt_len - 7 - 4);
  1081. mesh_crypto_packet_decrypt(pkt, pkt_len,
  1082. enc_key,
  1083. keys->iv_index, false,
  1084. ctl, ttl, seq,
  1085. src);
  1086. calc_net_mic32 = l_get_be32(pkt + pkt_len - 4);
  1087. verify_uint32("NetworkMIC", pkt_len - 4, net_mic32,
  1088. net_mic32 ^ calc_net_mic32);
  1089. show_data("DecryptedPayload", 7, net_clr + 7, pkt_len - 7 - 4);
  1090. }
  1091. hdr = l_get_be32(net_clr + 9);
  1092. segmented = !!((hdr >> SEG_HDR_SHIFT) & 1);
  1093. if (ctl) {
  1094. opcode = (hdr >> OPCODE_HDR_SHIFT) & OPCODE_MASK;
  1095. if (opcode == NET_OP_SEG_ACKNOWLEDGE) {
  1096. relay = !!((hdr >> RELAY_HDR_SHIFT) & 1);
  1097. seqZero = (hdr >> SEQ_ZERO_HDR_SHIFT) & SEQ_ZERO_MASK;
  1098. verify_uint24("SeqZero", 9,
  1099. ((keys->seqZero) & SEQ_ZERO_MASK)
  1100. << (SEQ_ZERO_HDR_SHIFT - 8),
  1101. seqZero << (SEQ_ZERO_HDR_SHIFT - 8));
  1102. verify_uint24("Relay", 9,
  1103. keys->relay << (RELAY_HDR_SHIFT - 8),
  1104. relay << (RELAY_HDR_SHIFT - 8));
  1105. verify_uint24("Opcode", 9,
  1106. keys->opcode << (OPCODE_HDR_SHIFT - 8),
  1107. opcode << (OPCODE_HDR_SHIFT - 8));
  1108. verify_uint24("SEGMENTED", 9,
  1109. keys->segmented << (SEG_HDR_SHIFT - 8),
  1110. segmented << (SEG_HDR_SHIFT - 8));
  1111. } else {
  1112. verify_uint8("Opcode", 9,
  1113. keys->opcode << (OPCODE_HDR_SHIFT % 8),
  1114. opcode << (OPCODE_HDR_SHIFT % 8));
  1115. verify_uint8("SEGMENTED", 9,
  1116. keys->segmented << (SEG_HDR_SHIFT % 8),
  1117. segmented << (SEG_HDR_SHIFT % 8));
  1118. }
  1119. } else {
  1120. key_akf = !!((hdr >> AKF_HDR_SHIFT) & 1);
  1121. key_aid = (hdr >> KEY_HDR_SHIFT) & KEY_AID_MASK;
  1122. if (segmented) {
  1123. show_data("EncryptedApp", 13, net_clr + 13,
  1124. pkt_len - 13 - 4);
  1125. segN = (hdr >> SEGN_HDR_SHIFT) & SEG_MASK;
  1126. segO = (hdr >> SEGO_HDR_SHIFT) & SEG_MASK;
  1127. seqZero = ((hdr >> SEQ_ZERO_HDR_SHIFT) &
  1128. SEQ_ZERO_MASK);
  1129. verify_uint32("SegN", 9,
  1130. seg_max << SEGN_HDR_SHIFT,
  1131. segN << SEGN_HDR_SHIFT);
  1132. verify_uint32("SegO", 9, seg << SEGO_HDR_SHIFT,
  1133. segO << SEGO_HDR_SHIFT);
  1134. verify_uint32("SeqZero", 9,
  1135. (keys->seqZero & SEQ_ZERO_MASK)
  1136. << SEQ_ZERO_HDR_SHIFT,
  1137. (seqZero & SEQ_ZERO_MASK)
  1138. << SEQ_ZERO_HDR_SHIFT);
  1139. verify_uint32("AID", 9,
  1140. keys->key_aid << KEY_HDR_SHIFT,
  1141. key_aid << KEY_HDR_SHIFT);
  1142. verify_uint32("AKF", 9,
  1143. keys->akf << AKF_HDR_SHIFT,
  1144. key_akf << AKF_HDR_SHIFT);
  1145. verify_uint32("SEGMENTED", 9,
  1146. keys->segmented << SEG_HDR_SHIFT,
  1147. segmented << SEG_HDR_SHIFT);
  1148. } else {
  1149. show_data("EncryptedApp", 10, msg + 3, pkt_len - 3);
  1150. verify_uint8("AID", 9,
  1151. keys->key_aid << (KEY_HDR_SHIFT % 8),
  1152. key_aid << (KEY_HDR_SHIFT % 8));
  1153. verify_uint8("AKF", 9,
  1154. keys->akf << (AKF_HDR_SHIFT % 8),
  1155. key_aid << (AKF_HDR_SHIFT % 8));
  1156. verify_uint8("SEGMENTED", 9,
  1157. keys->segmented << (SEG_HDR_SHIFT % 8),
  1158. segmented << (SEG_HDR_SHIFT % 8));
  1159. }
  1160. }
  1161. dst = l_get_be16(net_clr + 7);
  1162. verify_uint16("DST", 7, keys->net_dst, dst);
  1163. verify_uint16("SRC", 5, keys->net_src, src);
  1164. verify_uint24("SEQ", 2, keys->net_seq[0], seq);
  1165. verify_uint8("TTL", 1, keys->net_ttl, ttl);
  1166. verify_uint8("CTL", 1, keys->ctl << 7, ctl << 7);
  1167. verify_uint8("NID", 0, keys->net_nid, net_clr[0] & 0x7f);
  1168. verify_uint8("INI", 0, (keys->iv_index & 0x01) << 7, net_clr[0] & 0x80);
  1169. }
  1170. static void check_decrypt(const struct mesh_crypto_test *keys)
  1171. {
  1172. uint8_t *dev_key;
  1173. uint8_t *app_key;
  1174. uint8_t *net_key;
  1175. uint8_t enc_key[16];
  1176. uint8_t priv_key[16];
  1177. uint8_t p[9];
  1178. size_t p_len;
  1179. uint8_t *packet = NULL;
  1180. size_t packet_len;
  1181. uint8_t *net_msg;
  1182. uint8_t net_msg_len;
  1183. uint16_t app_msg_len = 0;
  1184. uint32_t calc_net_mic32, net_mic32 = 0;
  1185. uint64_t calc_net_mic64, net_mic64 = 0;
  1186. bool net_ctl, net_segmented, net_rly, net_akf;
  1187. uint8_t net_aid, net_ttl, nid, net_segO, net_segN = 0;
  1188. uint32_t net_seq, hdr, seqZero = 0;
  1189. uint16_t net_src, net_dst;
  1190. uint32_t calc_app_mic32;
  1191. uint64_t calc_app_mic64;
  1192. uint32_t app_mic32;
  1193. uint64_t app_mic64;
  1194. uint8_t *app_msg;
  1195. uint8_t *aad;
  1196. uint8_t *payload;
  1197. size_t trans_msg_len, payload_len, aad_len = 0;
  1198. uint8_t pkt_len, hdr_len, net_op = 0;
  1199. uint16_t i, seg_max;
  1200. uint8_t keys_aid = 0;
  1201. l_info(COLOR_BLUE "[Decrypt %s]" COLOR_OFF, keys->name);
  1202. verify_bool_not_both("CTL && Segmented", 0, keys->ctl, keys->segmented);
  1203. dev_key = l_util_from_hexstring(keys->dev_key, NULL);
  1204. app_key = l_util_from_hexstring(keys->app_key, NULL);
  1205. net_key = l_util_from_hexstring(keys->net_key, NULL);
  1206. aad = l_util_from_hexstring(keys->uuid, &aad_len);
  1207. if (keys->frnd) {
  1208. uint8_t *lpn_addr, *fn_addr, *lpn_cntr, *fn_cntr;
  1209. lpn_addr = l_util_from_hexstring(keys->lpn_addr, NULL);
  1210. fn_addr = l_util_from_hexstring(keys->fn_addr, NULL);
  1211. lpn_cntr = l_util_from_hexstring(keys->lpn_cntr, NULL);
  1212. fn_cntr = l_util_from_hexstring(keys->fn_cntr, NULL);
  1213. show_data("LPN Address", 0, lpn_addr, 2);
  1214. show_data("Friend Address", 0, fn_addr, 2);
  1215. show_data("LPN Counter", 0, lpn_cntr, 2);
  1216. show_data("Friend Counter", 0, fn_cntr, 2);
  1217. l_info("");
  1218. p[0] = 1;
  1219. l_put_be16(l_get_be16(lpn_addr), p + 1);
  1220. l_put_be16(l_get_be16(fn_addr), p + 3);
  1221. l_put_be16(l_get_be16(lpn_cntr), p + 5);
  1222. l_put_be16(l_get_be16(fn_cntr), p + 7);
  1223. p_len = 9;
  1224. l_free(fn_cntr);
  1225. l_free(lpn_cntr);
  1226. l_free(fn_addr);
  1227. l_free(lpn_addr);
  1228. } else {
  1229. p[0] = 0;
  1230. p_len = 1;
  1231. }
  1232. if (p_len > 1) verify_data("P", 0, keys->p, p, p_len);
  1233. mesh_crypto_k2(net_key, p, p_len, &nid, enc_key, priv_key);
  1234. if (keys->network_only) {
  1235. app_msg = l_util_from_hexstring(keys->trans_pkt[0],
  1236. &trans_msg_len);
  1237. packet = l_util_from_hexstring(keys->packet[0], &packet_len);
  1238. check_decrypt_segment(keys, keys->seg_num, keys->seg_max,
  1239. packet, packet_len,
  1240. app_msg + 4, trans_msg_len - 4,
  1241. enc_key, priv_key, nid);
  1242. goto done;
  1243. }
  1244. app_msg = l_malloc(384);
  1245. seg_max = (sizeof(keys->packet) / sizeof(keys->packet[0])) - 1;
  1246. /* Calculate number of segments in sample data */
  1247. while (keys->packet[seg_max] == NULL && seg_max) seg_max--;
  1248. for (i = 0; i <= seg_max; i++) {
  1249. if (keys->segmented)
  1250. l_info(COLOR_YELLOW "Segment-%d" COLOR_OFF, i);
  1251. l_free(packet);
  1252. packet = l_util_from_hexstring(keys->packet[i], &packet_len);
  1253. net_msg = packet + 7;
  1254. net_msg_len = packet_len - 7;
  1255. mesh_crypto_network_clarify(packet, priv_key, keys->iv_index,
  1256. &net_ctl, &net_ttl, &net_seq, &net_src);
  1257. show_str("Packet", 0, keys->packet[i]);
  1258. if (net_ctl) {
  1259. net_mic64 = l_get_be64(packet + packet_len - 8);
  1260. show_data("NetworkMessage", 7, net_msg,
  1261. net_msg_len - 8);
  1262. mesh_crypto_packet_decrypt(packet, packet_len,
  1263. enc_key,
  1264. keys->iv_index, false,
  1265. net_ctl, net_ttl,
  1266. net_seq,
  1267. net_src);
  1268. calc_net_mic64 = l_get_be64(packet + packet_len - 8);
  1269. net_msg_len -= 8;
  1270. verify_uint64("NetworkMIC", 7 + net_msg_len, net_mic64,
  1271. net_mic64 ^ calc_net_mic64);
  1272. show_data("DecryptedNetwork", 7, net_msg, net_msg_len);
  1273. } else {
  1274. net_mic32 = l_get_be32(packet + packet_len - 4);
  1275. show_data("NetworkMessage", 7, net_msg,
  1276. net_msg_len - 4);
  1277. mesh_crypto_packet_decrypt(packet, packet_len,
  1278. enc_key,
  1279. keys->iv_index, false,
  1280. net_ctl, net_ttl,
  1281. net_seq,
  1282. net_src);
  1283. calc_net_mic32 = l_get_be32(packet + packet_len - 4);
  1284. net_msg_len -= 4;
  1285. verify_uint32("NetworkMIC", 7 + net_msg_len, net_mic32,
  1286. net_mic32 ^ calc_net_mic32);
  1287. show_data("DecryptedNetwork", 7, net_msg, net_msg_len);
  1288. }
  1289. hdr = l_get_be32(packet + 9);
  1290. net_segmented = !!((hdr >> SEG_HDR_SHIFT) & 1);
  1291. if (net_ctl) {
  1292. net_op = (hdr >> OPCODE_HDR_SHIFT) & OPCODE_MASK;
  1293. hdr_len = 1;
  1294. if (net_op == NET_OP_SEG_ACKNOWLEDGE) {
  1295. net_rly = !!((hdr >> RELAY_HDR_SHIFT) & 1);
  1296. seqZero = (hdr >> SEQ_ZERO_HDR_SHIFT) &
  1297. SEQ_ZERO_MASK;
  1298. verify_uint24("SeqZero", 9,
  1299. ((keys->seqZero) & SEQ_ZERO_MASK)
  1300. << (SEQ_ZERO_HDR_SHIFT - 8),
  1301. seqZero << (SEQ_ZERO_HDR_SHIFT - 8));
  1302. verify_uint24("Relay", 9,
  1303. keys->relay << (RELAY_HDR_SHIFT - 8),
  1304. net_rly << (RELAY_HDR_SHIFT - 8));
  1305. verify_uint24("Opcode", 9,
  1306. keys->opcode << (OPCODE_HDR_SHIFT - 8),
  1307. net_op << (OPCODE_HDR_SHIFT - 8));
  1308. verify_uint24("SEGMENTED", 9,
  1309. keys->segmented << (SEG_HDR_SHIFT - 8),
  1310. net_segmented << (SEG_HDR_SHIFT - 8));
  1311. } else {
  1312. verify_uint8("Opcode", 9,
  1313. keys->opcode << (OPCODE_HDR_SHIFT % 8),
  1314. net_op << (OPCODE_HDR_SHIFT % 8));
  1315. verify_uint8("SEGMENTED", 9,
  1316. keys->segmented << (SEG_HDR_SHIFT % 8),
  1317. net_segmented << (SEG_HDR_SHIFT % 8));
  1318. }
  1319. } else {
  1320. net_akf = !!((hdr >> AKF_HDR_SHIFT) & 1);
  1321. net_aid = (hdr >> KEY_HDR_SHIFT) & KEY_AID_MASK;
  1322. if (net_segmented) {
  1323. hdr_len = 4;
  1324. show_data("EncryptedApp", 13, net_msg + 6,
  1325. net_msg_len - 6);
  1326. memcpy(app_msg + (12 * i), net_msg + 6,
  1327. net_msg_len - 6);
  1328. app_msg_len += net_msg_len - 6;
  1329. net_segN = (hdr >> SEGN_HDR_SHIFT) & SEG_MASK;
  1330. net_segO = (hdr >> SEGO_HDR_SHIFT) & SEG_MASK;
  1331. seqZero = ((hdr >> SEQ_ZERO_HDR_SHIFT)
  1332. & SEQ_ZERO_MASK) |
  1333. (net_seq & ~SEQ_ZERO_MASK);
  1334. if (seqZero > net_seq) seqZero -=
  1335. (SEQ_ZERO_MASK + 1);
  1336. verify_uint32("SegN", 9,
  1337. seg_max << SEGN_HDR_SHIFT,
  1338. net_segN << SEGN_HDR_SHIFT);
  1339. verify_uint32("SegO", 9, i << SEGO_HDR_SHIFT,
  1340. net_segO << SEGO_HDR_SHIFT);
  1341. verify_uint32("SeqZero", 9,
  1342. (keys->app_seq & SEQ_ZERO_MASK)
  1343. << SEQ_ZERO_HDR_SHIFT,
  1344. (seqZero & SEQ_ZERO_MASK)
  1345. << SEQ_ZERO_HDR_SHIFT);
  1346. verify_uint32("AID", 9,
  1347. keys->key_aid << KEY_HDR_SHIFT,
  1348. net_aid << KEY_HDR_SHIFT);
  1349. verify_uint32("AKF", 9,
  1350. keys->akf << AKF_HDR_SHIFT,
  1351. net_akf << AKF_HDR_SHIFT);
  1352. verify_uint32("SEGMENTED", 9,
  1353. keys->segmented << SEG_HDR_SHIFT,
  1354. net_segmented << SEG_HDR_SHIFT);
  1355. } else {
  1356. hdr_len = 1;
  1357. show_data("EncryptedApp", 10, net_msg + 3,
  1358. net_msg_len - 3);
  1359. memcpy(app_msg + (12 * i), net_msg + 3,
  1360. net_msg_len - 3);
  1361. app_msg_len += net_msg_len - 3;
  1362. seqZero = net_seq;
  1363. verify_uint8("AID", 9,
  1364. keys->key_aid << (KEY_HDR_SHIFT % 8),
  1365. net_aid << (KEY_HDR_SHIFT % 8));
  1366. verify_uint8("AKF", 9,
  1367. keys->akf << (AKF_HDR_SHIFT % 8),
  1368. net_akf << (AKF_HDR_SHIFT % 8));
  1369. verify_uint8("SEGMENTED", 9,
  1370. keys->segmented << (SEG_HDR_SHIFT % 8),
  1371. net_segmented << (SEG_HDR_SHIFT % 8));
  1372. }
  1373. }
  1374. net_dst = l_get_be16(net_msg);
  1375. verify_uint16("DST", 7, keys->net_dst, net_dst);
  1376. verify_uint16("SRC", 5, keys->net_src, net_src);
  1377. verify_uint24("SEQ", 2, keys->net_seq[i], net_seq);
  1378. verify_uint8("TTL", 1, keys->net_ttl, net_ttl);
  1379. verify_uint8("CTL", 1, keys->ctl << 7, net_ctl << 7);
  1380. verify_uint8("NID", 0, keys->net_nid, nid);
  1381. verify_uint8("INI", 0, (keys->iv_index & 0x01) << 7,
  1382. packet[0] & 0x80);
  1383. payload = l_util_from_hexstring(keys->trans_pkt[i],
  1384. &payload_len);
  1385. memset(packet, 0, packet_len);
  1386. mesh_crypto_packet_build(keys->ctl, keys->net_ttl,
  1387. keys->net_seq[i], keys->net_src,
  1388. keys->net_dst, net_op,
  1389. keys->segmented,
  1390. keys->key_aid | (keys->akf ? KEY_ID_AKF : 0),
  1391. keys->szmic, keys->relay, seqZero,
  1392. i, seg_max,
  1393. payload + hdr_len, payload_len - hdr_len,
  1394. packet, &pkt_len);
  1395. verify_data("TransportData", 9, keys->trans_pkt[i], packet + 9,
  1396. payload_len);
  1397. mesh_crypto_packet_encode(packet, pkt_len, keys->iv_index,
  1398. enc_key, priv_key);
  1399. mesh_crypto_packet_label(packet, pkt_len, keys->iv_index, nid);
  1400. verify_data("Encoded-Packet", 0, keys->packet[i], packet,
  1401. pkt_len);
  1402. l_free(payload);
  1403. l_info("");
  1404. mesh_crypto_packet_decode(packet, pkt_len, false, packet,
  1405. keys->iv_index, enc_key, priv_key);
  1406. show_data("Decoded-Packet", 0, packet, pkt_len);
  1407. l_info("");
  1408. }
  1409. if (keys->segmented && keys->szmic) {
  1410. verify_data("EncryptedPayload", 0, keys->enc_msg, app_msg,
  1411. app_msg_len - 8);
  1412. app_mic64 = l_get_be64(app_msg + app_msg_len - 8);
  1413. mesh_crypto_payload_decrypt(
  1414. aad, aad_len,
  1415. app_msg, app_msg_len,
  1416. true,
  1417. net_src, net_dst,
  1418. keys->akf ? keys_aid | KEY_ID_AKF : APP_AID_DEV,
  1419. seqZero,
  1420. keys->iv_index,
  1421. app_msg,
  1422. keys->akf ? app_key : dev_key);
  1423. calc_app_mic64 = l_get_be64(app_msg + app_msg_len - 8);
  1424. verify_data("Payload", 0, keys->app_msg, app_msg,
  1425. app_msg_len - 8);
  1426. verify_uint64("ApplicationMIC", app_msg_len - 8, app_mic64,
  1427. app_mic64 ^ calc_app_mic64);
  1428. } else if (!keys->ctl) {
  1429. verify_data("EncryptedPayload", 0, keys->enc_msg, app_msg,
  1430. app_msg_len - 4);
  1431. app_mic32 = l_get_be32(app_msg + app_msg_len - 4);
  1432. mesh_crypto_payload_decrypt(
  1433. aad, aad_len,
  1434. app_msg, app_msg_len,
  1435. false,
  1436. net_src, net_dst,
  1437. keys->akf ? keys_aid | KEY_ID_AKF : APP_AID_DEV,
  1438. seqZero,
  1439. keys->iv_index,
  1440. app_msg,
  1441. keys->akf ? app_key : dev_key);
  1442. calc_app_mic32 = l_get_be32(app_msg + app_msg_len - 4);
  1443. verify_data("Payload", 0, keys->app_msg, app_msg,
  1444. app_msg_len - 4);
  1445. verify_uint32("ApplicationMIC", app_msg_len - 4, app_mic32,
  1446. app_mic32 ^ calc_app_mic32);
  1447. }
  1448. done:
  1449. l_info("");
  1450. l_free(dev_key);
  1451. l_free(aad);
  1452. l_free(app_key);
  1453. l_free(net_key);
  1454. l_free(app_msg);
  1455. l_free(packet);
  1456. }
  1457. static void check_beacon(const struct mesh_crypto_test *keys)
  1458. {
  1459. uint8_t *net_key;
  1460. uint8_t *beacon_cmac;
  1461. uint8_t beacon[22];
  1462. uint8_t enc_key[16];
  1463. uint8_t net_id[8];
  1464. uint8_t cmac[8];
  1465. uint64_t cmac_tmp;
  1466. net_key = l_util_from_hexstring(keys->net_key, NULL);
  1467. beacon_cmac = l_util_from_hexstring(keys->beacon_cmac, NULL);
  1468. mesh_crypto_nkbk(net_key, enc_key);
  1469. mesh_crypto_k3(net_key, net_id);
  1470. l_info(COLOR_BLUE "[%s]" COLOR_OFF, keys->name);
  1471. verify_data("NetworkKey", 0, keys->net_key, net_key, 16);
  1472. show_uint32("IVindex", 0, keys->iv_index);
  1473. verify_data("BeaconKey", 0, keys->enc_key, enc_key, 16);
  1474. verify_data("NetworkID", 0, keys->net_id, net_id, 8);
  1475. beacon[0] = keys->beacon_type;
  1476. beacon[1] = keys->beacon_flags;
  1477. memcpy(beacon + 2, net_id, 8);
  1478. l_put_be32(keys->iv_index, beacon + 10);
  1479. mesh_crypto_beacon_cmac(enc_key, net_id, keys->iv_index,
  1480. !!(keys->beacon_flags & 0x01),
  1481. !!(keys->beacon_flags & 0x02),
  1482. &cmac_tmp);
  1483. l_put_be64(cmac_tmp, cmac);
  1484. l_put_be64(cmac_tmp, beacon + 14);
  1485. verify_data("BeaconCMAC", 0, keys->beacon_cmac, cmac, 8);
  1486. verify_data("Beacon", 0, keys->beacon, beacon, sizeof(beacon));
  1487. l_info("");
  1488. l_free(beacon_cmac);
  1489. l_free(net_key);
  1490. }
  1491. static void check_id_beacon(const struct mesh_crypto_test *keys)
  1492. {
  1493. uint8_t *net_key;
  1494. uint8_t *rand;
  1495. uint8_t identity_key[16];
  1496. uint8_t hash_input[16];
  1497. uint8_t hash[16];
  1498. uint8_t beacon[17];
  1499. net_key = l_util_from_hexstring(keys->net_key, NULL);
  1500. rand = l_util_from_hexstring(keys->rand, NULL);
  1501. mesh_crypto_nkik(net_key, identity_key);
  1502. l_info(COLOR_BLUE "[%s]" COLOR_OFF, keys->name);
  1503. verify_data("ID Resolving Key", 0, keys->ident_res_key,
  1504. identity_key, 16);
  1505. memset(hash_input, 0, 6);
  1506. memcpy(hash_input + 6, rand, 8);
  1507. l_put_be16(keys->net_src, hash_input + 6 + 8);
  1508. verify_data("Hash Input", 0, keys->hash_input, hash_input, 16);
  1509. aes_ecb_one(identity_key, hash_input, hash);
  1510. verify_data("Hash", 0, keys->identity_hash, hash + 8, 8);
  1511. beacon[0] = 0x01;
  1512. memcpy(beacon + 1, hash + 8, 8);
  1513. memcpy(beacon + 9, rand, 8);
  1514. verify_data("Mesh ID Beacon", 0, keys->beacon, beacon, 17);
  1515. l_info("");
  1516. l_free(rand);
  1517. l_free(net_key);
  1518. }
  1519. static void check_s1(const struct mesh_crypto_test *keys)
  1520. {
  1521. uint8_t salt_out[16];
  1522. l_info(COLOR_BLUE "[%s]" COLOR_OFF, keys->name);
  1523. show_str("Salt Input", 0, keys->salt);
  1524. show_data("Salt Input", 0, keys->salt, strlen(keys->salt));
  1525. mesh_crypto_s1(keys->salt, strlen(keys->salt), salt_out);
  1526. verify_data("s1(Salt)", 0, keys->salt_out, salt_out, 16);
  1527. l_info("");
  1528. }
  1529. static void check_k128(const struct mesh_crypto_test *keys)
  1530. {
  1531. uint8_t salt[16];
  1532. uint8_t t[16];
  1533. uint8_t enc_key[16];
  1534. uint8_t *net_key;
  1535. l_info(COLOR_BLUE "[%s]" COLOR_OFF, keys->name);
  1536. net_key = l_util_from_hexstring(keys->net_key, NULL);
  1537. show_data("NetKey", 0, net_key, 16);
  1538. l_info("");
  1539. show_str("Salt Input", 0, keys->salt);
  1540. show_data("Salt Input", 0, keys->salt, strlen(keys->salt));
  1541. mesh_crypto_s1(keys->salt, strlen(keys->salt), salt);
  1542. show_data("s1(Salt)", 0, salt, 16);
  1543. l_info("");
  1544. show_str("Info", 0, keys->info);
  1545. show_data("Info", 0, keys->info, strlen(keys->info));
  1546. l_info("");
  1547. mesh_crypto_aes_cmac(salt, net_key, 16, t);
  1548. show_data("T", 0, t, 16);
  1549. l_info("");
  1550. if (memcmp(keys->salt, "nkbk", 4) == 0)
  1551. mesh_crypto_nkbk(net_key, enc_key);
  1552. else if (memcmp(keys->salt, "nkpk", 4) == 0)
  1553. mesh_crypto_nkpk(net_key, enc_key);
  1554. else if (memcmp(keys->salt, "nkik", 4) == 0)
  1555. mesh_crypto_nkik(net_key, enc_key);
  1556. verify_data("k1(N, salt, info)", 0, keys->enc_key, enc_key, 16);
  1557. l_free(net_key);
  1558. l_info("");
  1559. }
  1560. static void check_k1(const struct mesh_crypto_test *keys)
  1561. {
  1562. uint8_t salt[16];
  1563. uint8_t info[16];
  1564. uint8_t t[16];
  1565. uint8_t okm[16];
  1566. uint8_t *ikm;
  1567. l_info(COLOR_BLUE "[%s]" COLOR_OFF, keys->name);
  1568. ikm = l_util_from_hexstring(keys->ikm, NULL);
  1569. show_data("IKM", 0, ikm, 16);
  1570. l_info("");
  1571. show_str("Salt Input", 0, keys->salt);
  1572. show_data("Salt Input", 0, keys->salt, strlen(keys->salt));
  1573. mesh_crypto_s1(keys->salt, strlen(keys->salt), salt);
  1574. show_data("s1(Salt)", 0, salt, 16);
  1575. l_info("");
  1576. show_str("Info Input", 0, keys->info);
  1577. show_data("Info Input", 0, keys->info, strlen(keys->info));
  1578. mesh_crypto_s1(keys->info, strlen(keys->info), info);
  1579. show_data("s1(Info)", 0, info, 16);
  1580. l_info("");
  1581. mesh_crypto_aes_cmac(salt, ikm, 16, t);
  1582. show_data("T", 0, t, 16);
  1583. l_info("");
  1584. mesh_crypto_k1(ikm, salt, info, 16, okm);
  1585. verify_data("k1(ikm, salt, info)", 0, keys->okm, okm, 16);
  1586. l_free(ikm);
  1587. l_info("");
  1588. }
  1589. static void check_k2(const struct mesh_crypto_test *keys)
  1590. {
  1591. uint8_t *net_key;
  1592. uint8_t p[9];
  1593. size_t p_len;
  1594. uint8_t nid;
  1595. uint8_t enc_key[16];
  1596. uint8_t priv_key[16];
  1597. l_info(COLOR_BLUE "[%s]" COLOR_OFF, keys->name);
  1598. net_key = l_util_from_hexstring(keys->net_key, NULL);
  1599. show_data("NetKey", 0, net_key, 16);
  1600. l_info("");
  1601. if (keys->frnd) {
  1602. uint8_t *lpn_addr, *fn_addr, *lpn_cntr, *fn_cntr;
  1603. lpn_addr = l_util_from_hexstring(keys->lpn_addr, NULL);
  1604. fn_addr = l_util_from_hexstring(keys->fn_addr, NULL);
  1605. lpn_cntr = l_util_from_hexstring(keys->lpn_cntr, NULL);
  1606. fn_cntr = l_util_from_hexstring(keys->fn_cntr, NULL);
  1607. show_data("LPN Address", 0, lpn_addr, 2);
  1608. show_data("Friend Address", 0, fn_addr, 2);
  1609. show_data("LPN Counter", 0, lpn_cntr, 2);
  1610. show_data("Friend Counter", 0, fn_cntr, 2);
  1611. l_info("");
  1612. p[0] = 1;
  1613. l_put_be16(l_get_be16(lpn_addr), p + 1);
  1614. l_put_be16(l_get_be16(fn_addr), p + 3);
  1615. l_put_be16(l_get_be16(lpn_cntr), p + 5);
  1616. l_put_be16(l_get_be16(fn_cntr), p + 7);
  1617. p_len = 9;
  1618. l_free(fn_cntr);
  1619. l_free(lpn_cntr);
  1620. l_free(fn_addr);
  1621. l_free(lpn_addr);
  1622. } else {
  1623. p[0] = 0;
  1624. p_len = 1;
  1625. }
  1626. mesh_crypto_k2(net_key, p, p_len, &nid, enc_key, priv_key);
  1627. verify_data("P", 0, keys->p, p, p_len);
  1628. l_info("");
  1629. verify_data("NID", 0, keys->nid, &nid, 1);
  1630. verify_data("EncryptionKey", 0, keys->enc_key, enc_key, 16);
  1631. verify_data("PrivacyKey", 0, keys->priv_key, priv_key, 16);
  1632. l_free(net_key);
  1633. l_info("");
  1634. }
  1635. static void check_k3(const struct mesh_crypto_test *keys)
  1636. {
  1637. uint8_t *net_key;
  1638. uint8_t tmp[16];
  1639. uint8_t short_net_id[8];
  1640. l_info(COLOR_BLUE "[%s]" COLOR_OFF, keys->name);
  1641. net_key = l_util_from_hexstring(keys->net_key, NULL);
  1642. show_data("NetKey", 0, net_key, 16);
  1643. l_info("");
  1644. show_str("Salt Input", 0, keys->salt);
  1645. show_data("Salt Input", 0, keys->salt, strlen(keys->salt));
  1646. mesh_crypto_s1(keys->salt, strlen(keys->salt), tmp);
  1647. show_data("s1(Salt)", 0, tmp, 16);
  1648. l_info("");
  1649. show_str("Info", 0, keys->info);
  1650. show_data("Info", 0, keys->info, strlen(keys->info));
  1651. l_info("");
  1652. mesh_crypto_aes_cmac(tmp, net_key, 16, tmp);
  1653. show_data("T", 0, tmp, 16);
  1654. l_info("");
  1655. mesh_crypto_k3(net_key, short_net_id);
  1656. verify_data("k3(NetKey)", 0, keys->short_net_id, short_net_id, 8);
  1657. l_free(net_key);
  1658. l_info("");
  1659. }
  1660. static void check_k4(const struct mesh_crypto_test *keys)
  1661. {
  1662. uint8_t *app_key;
  1663. uint8_t tmp[16];
  1664. uint8_t aid;
  1665. l_info(COLOR_BLUE "[%s]" COLOR_OFF, keys->name);
  1666. app_key = l_util_from_hexstring(keys->app_key, NULL);
  1667. show_data("AppKey", 0, app_key, 16);
  1668. l_info("");
  1669. show_str("Salt Input", 0, keys->salt);
  1670. show_data("Salt Input", 0, keys->salt, strlen(keys->salt));
  1671. mesh_crypto_s1(keys->salt, strlen(keys->salt), tmp);
  1672. show_data("s1(Salt)", 0, tmp, 16);
  1673. l_info("");
  1674. show_str("Info", 0, keys->info);
  1675. show_data("Info", 0, keys->info, strlen(keys->info));
  1676. l_info("");
  1677. mesh_crypto_aes_cmac(tmp, app_key, 16, tmp);
  1678. show_data("T", 0, tmp, 16);
  1679. l_info("");
  1680. mesh_crypto_k4(app_key, &aid);
  1681. verify_data("k4(AppKey)", 0, keys->aid, &aid, 1);
  1682. l_free(app_key);
  1683. l_info("");
  1684. }
  1685. int main(int argc, char *argv[])
  1686. {
  1687. l_log_set_stderr();
  1688. /* Section 8.1 Sample Data Tests */
  1689. check_s1(&s8_1_1);
  1690. check_k1(&s8_1_2);
  1691. check_k2(&s8_1_3);
  1692. check_k2(&s8_1_4);
  1693. check_k3(&s8_1_5);
  1694. check_k4(&s8_1_6);
  1695. /* Section 8.2 Sample Data Tests */
  1696. check_k4(&s8_2_1);
  1697. check_k2(&s8_2_2);
  1698. check_k2(&s8_2_3);
  1699. check_k3(&s8_2_4);
  1700. check_k128(&s8_2_5);
  1701. check_k128(&s8_2_6);
  1702. /* Section 8.3 Sample Data Tests */
  1703. check_encrypt(&s8_3_1);
  1704. check_decrypt(&s8_3_1);
  1705. check_encrypt(&s8_3_2);
  1706. check_decrypt(&s8_3_2);
  1707. check_encrypt(&s8_3_3);
  1708. check_decrypt(&s8_3_3);
  1709. check_encrypt(&s8_3_4);
  1710. check_decrypt(&s8_3_4);
  1711. check_encrypt(&s8_3_5);
  1712. check_decrypt(&s8_3_5);
  1713. check_encrypt(&s8_3_6);
  1714. check_decrypt(&s8_3_6);
  1715. check_encrypt(&s8_3_7);
  1716. check_decrypt(&s8_3_7);
  1717. check_encrypt(&s8_3_8); /* Single segment tester unavailable */
  1718. check_decrypt(&s8_3_8); /* Single segment tester unavailable */
  1719. check_encrypt(&s8_3_9);
  1720. check_decrypt(&s8_3_9);
  1721. check_encrypt(&s8_3_10);
  1722. check_decrypt(&s8_3_10);
  1723. check_encrypt(&s8_3_11); /* Single segment tester unavailable */
  1724. check_decrypt(&s8_3_11); /* Single segment tester unavailable */
  1725. check_encrypt(&s8_3_22);
  1726. check_decrypt(&s8_3_22);
  1727. /* Section 8.4 Beacon Sample Data */
  1728. check_beacon(&s8_4_3);
  1729. /* Section 8.6 Mesh Proxy Service sample data */
  1730. check_id_beacon(&s8_6_2);
  1731. return 0;
  1732. }