Arduino LMIC 6.0.1
Arduino LoRaWAN(r) MAC in C
Loading...
Searching...
No Matches
lmic_secure_element_interface.h
Go to the documentation of this file.
1/*
2
3Module: lmic_secure_element_interface.h
4
5Function:
6 The API type
7
8Copyright & License:
9 See accompanying LICENSE file.
10
11Author:
12 Terry Moore, MCCI May 2020
13
14*/
15
17
18#ifndef _lmic_secure_element_interface_h_
19#define _lmic_secure_element_interface_h_
20
21#ifndef _lmic_env_h_
22# include "../../lmic/lmic_env.h"
23#endif
24
25#ifndef _oslmic_types_h_
26# include "../../lmic/oslmic_types.h"
27#endif
28
62
63LMIC_BEGIN_DECLS
64
74
76
81
86
91
106
116
118
136#define LMIC_SecureElement_KeySelector_NAME_MULTISZ_INIT \
137 "Unicast\0" \
138 "Mc0\0" \
139 "Mc1\0" \
140 "Mc2\0" \
141 "Mc3\0"
142
153
162
164
165
166/****************************************************************************\
167| The API function signatures.
168\****************************************************************************/
169
192
194
199typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
201
203typedef uint8_t LMIC_ABI_STD
205
207typedef uint16_t LMIC_ABI_STD
209
218typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
219LMIC_SecureElement_fillRandomBuffer_t(uint8_t *buffer, uint8_t nBuffer);
220
226typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
228
236typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
238
246typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
248
258typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
260
268typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
270
280typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
282
291typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
293
300typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
302
311typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
313
320typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
322
342typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
344 uint8_t *pJoinRequestBytes, LMIC_SecureElement_JoinFormat_t joinFormat
345);
346
366typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
368 const uint8_t *pJoinAcceptBytes, uint8_t nJoinAcceptBytes,
369 uint8_t *pJoinAcceptClearText,
371);
372
392typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
393LMIC_SecureElement_encodeMessage_t(const uint8_t *pMessage, uint8_t nMessage, uint8_t iPayload, uint8_t *pCipherTextBuffer, LMIC_SecureElement_KeySelector_t iKey);
394
412typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
414 const uint8_t *pPhyPayload,
415 uint8_t nPhyPayload,
416 uint32_t devAddr,
417 uint32_t FCntDown,
419);
420
441typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
443 const uint8_t *pPhyPayload, uint8_t nPhyPayload,
444 uint32_t devAddr, uint32_t FCntDown,
446 uint8_t *pClearTextBuffer
447 );
448
464typedef LMIC_SecureElement_Error_t LMIC_ABI_STD
465LMIC_SecureElement_aes128Encrypt_t(const uint8_t *pKey, const uint8_t *pInput, uint8_t *pOutput);
466
467/****************************************************************************\
468| The portable API functions.
469\****************************************************************************/
470
497#define LMIC_SecureElement_DECLARE_DRIVER_FNS(a_driver) \
498 LMIC_SecureElement_initialize_t LMIC_SecureElement_##a_driver##_initialize; \
499 LMIC_SecureElement_getRandomU1_t LMIC_SecureElement_##a_driver##_getRandomU1; \
500 LMIC_SecureElement_getRandomU2_t LMIC_SecureElement_##a_driver##_getRandomU2; \
501 LMIC_SecureElement_fillRandomBuffer_t LMIC_SecureElement_##a_driver##_fillRandomBuffer; \
502 LMIC_SecureElement_setAppKey_t LMIC_SecureElement_##a_driver##_setAppKey; \
503 LMIC_SecureElement_getAppKey_t LMIC_SecureElement_##a_driver##_getAppKey; \
504 LMIC_SecureElement_setAppEUI_t LMIC_SecureElement_##a_driver##_setAppEUI; \
505 LMIC_SecureElement_getAppEUI_t LMIC_SecureElement_##a_driver##_getAppEUI; \
506 LMIC_SecureElement_setDevEUI_t LMIC_SecureElement_##a_driver##_setDevEUI; \
507 LMIC_SecureElement_getDevEUI_t LMIC_SecureElement_##a_driver##_getDevEUI; \
508 LMIC_SecureElement_setNwkSKey_t LMIC_SecureElement_##a_driver##_setNwkSKey; \
509 LMIC_SecureElement_getNwkSKey_t LMIC_SecureElement_##a_driver##_getNwkSKey; \
510 LMIC_SecureElement_setAppSKey_t LMIC_SecureElement_##a_driver##_setAppSKey; \
511 LMIC_SecureElement_getAppSKey_t LMIC_SecureElement_##a_driver##_getAppSKey; \
512 LMIC_SecureElement_createJoinRequest_t LMIC_SecureElement_##a_driver##_createJoinRequest; \
513 LMIC_SecureElement_decodeJoinAccept_t LMIC_SecureElement_##a_driver##_decodeJoinAccept; \
514 LMIC_SecureElement_encodeMessage_t LMIC_SecureElement_##a_driver##_encodeMessage; \
515 LMIC_SecureElement_verifyMIC_t LMIC_SecureElement_##a_driver##_verifyMIC; \
516 LMIC_SecureElement_decodeMessage_t LMIC_SecureElement_##a_driver##_decodeMessage; \
517 LMIC_SecureElement_aes128Encrypt_t LMIC_SecureElement_##a_driver##_aes128Encrypt
518
519LMIC_END_DECLS
520
521// end group lmic_se_driver
523// end group lmic_se
525
526#endif // _lmic_secure_element_interface_h_
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_aes128Encrypt_t(const uint8_t *pKey, const uint8_t *pInput, uint8_t *pOutput)
Perform an AES128 encryption.
Definition lmic_secure_element_interface.h:465
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_setDevEUI_t(const LMIC_SecureElement_EUI_t *pDevEUI)
Set device EUI.
Definition lmic_secure_element_interface.h:301
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_setAppSKey_t(const LMIC_SecureElement_Aes128Key_t *pAppSKey, LMIC_SecureElement_KeySelector_t iKey)
Set application session key.
Definition lmic_secure_element_interface.h:269
uint16_t LMIC_ABI_STD LMIC_SecureElement_getRandomU2_t(void)
Return a random integer uniformly distributed in [0..65535].
Definition lmic_secure_element_interface.h:208
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_decodeMessage_t(const uint8_t *pPhyPayload, uint8_t nPhyPayload, uint32_t devAddr, uint32_t FCntDown, LMIC_SecureElement_KeySelector_t iKey, uint8_t *pClearTextBuffer)
Decode an application message.
Definition lmic_secure_element_interface.h:442
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_getAppEUI_t(LMIC_SecureElement_EUI_t *pAppEUI)
Get application EUI.
Definition lmic_secure_element_interface.h:312
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_fillRandomBuffer_t(uint8_t *buffer, uint8_t nBuffer)
Fill buffer with random independently distributed integers, each in [0..255].
Definition lmic_secure_element_interface.h:219
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_encodeMessage_t(const uint8_t *pMessage, uint8_t nMessage, uint8_t iPayload, uint8_t *pCipherTextBuffer, LMIC_SecureElement_KeySelector_t iKey)
Encode an application uplink message.
Definition lmic_secure_element_interface.h:393
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_verifyMIC_t(const uint8_t *pPhyPayload, uint8_t nPhyPayload, uint32_t devAddr, uint32_t FCntDown, LMIC_SecureElement_KeySelector_t iKey)
Verify the MIC of a downlink message.
Definition lmic_secure_element_interface.h:413
uint8_t LMIC_ABI_STD LMIC_SecureElement_getRandomU1_t(void)
Return a random integer uniformly distributed in [0..255].
Definition lmic_secure_element_interface.h:204
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_setAppKey_t(const LMIC_SecureElement_Aes128Key_t *pAppKey)
Set application key.
Definition lmic_secure_element_interface.h:227
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_initialize_t(void)
Initialize the Secure Element.
Definition lmic_secure_element_interface.h:200
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_decodeJoinAccept_t(const uint8_t *pJoinAcceptBytes, uint8_t nJoinAcceptBytes, uint8_t *pJoinAcceptClearText, LMIC_SecureElement_JoinFormat_t joinFormat)
Decode a join accept message; capture keys.
Definition lmic_secure_element_interface.h:367
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_setNwkSKey_t(const LMIC_SecureElement_Aes128Key_t *pNwkSKey, LMIC_SecureElement_KeySelector_t iKey)
Set network session key.
Definition lmic_secure_element_interface.h:247
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_getAppSKey_t(LMIC_SecureElement_Aes128Key_t *pAppSKey, LMIC_SecureElement_KeySelector_t iKey)
Get application session key.
Definition lmic_secure_element_interface.h:281
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_createJoinRequest_t(uint8_t *pJoinRequestBytes, LMIC_SecureElement_JoinFormat_t joinFormat)
Create a join request.
Definition lmic_secure_element_interface.h:343
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_getDevEUI_t(LMIC_SecureElement_EUI_t *pDevEUI)
Get device EUI.
Definition lmic_secure_element_interface.h:292
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_getAppKey_t(LMIC_SecureElement_Aes128Key_t *pAppKey)
Get application key.
Definition lmic_secure_element_interface.h:237
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_getNwkSKey_t(LMIC_SecureElement_Aes128Key_t *pNwkSKey, LMIC_SecureElement_KeySelector_t iKey)
Get network session key.
Definition lmic_secure_element_interface.h:259
LMIC_SecureElement_Error_t LMIC_ABI_STD LMIC_SecureElement_setAppEUI_t(const LMIC_SecureElement_EUI_t *pAppEUI)
Set application EUI.
Definition lmic_secure_element_interface.h:321
struct LMIC_SecureLElement_JoinRequest_s LMIC_SecureElement_JoinRequest_t
an object to carry a LoRaWAN Join Request message.
LMIC_SecureElement_Error_e
Values of type and LMIC_SecureElement_Error_t enumerate errors returned by the Secure Element APIs.
Definition lmic_secure_element_interface.h:66
LMIC_SecureElement_KeySelector_e
Values of this type and LMIC_SecureElement_KeySelector_t select specific keys for encryption/decrypti...
Definition lmic_secure_element_interface.h:107
struct LMIC_SecureElement_EUI_s LMIC_SecureElement_EUI_t
an object to carry a 64-bit EUI.
uint8_t LMIC_SecureElement_KeySelector_t
Controlled-width type for LMIC_SecureElement_KeySelector_e.
Definition lmic_secure_element_interface.h:117
LMIC_SecureElement_JoinFormat_e
Values of this type and LMIC_SecureElement_JoinFormat_t select specific formats of Join Request.
Definition lmic_secure_element_interface.h:154
struct LMIC_SecureElement_Aes128Key_s LMIC_SecureElement_Aes128Key_t
an object to carry an AES128 (16-byte) key.
uint8_t LMIC_SecureElement_JoinFormat_t
Controlled-width type for LMIC_SecureElement_JoinFormat_e.
Definition lmic_secure_element_interface.h:163
enum LMIC_SecureElement_Error_e LMIC_SecureElement_Error_t
Controlled-width type for LMIC_SecureElement_Error_e.
Definition lmic_secure_element_interface.h:75
@ LMIC_SecureElement_Error_OK
The operation completed successfully.
Definition lmic_secure_element_interface.h:67
@ LMIC_SecureElement_Error_NotProvisioned
The security element is not provisioned.
Definition lmic_secure_element_interface.h:70
@ LMIC_SecureElement_Error_Permission
The application doesn't have permission to do this operation.
Definition lmic_secure_element_interface.h:69
@ LMIC_SecureElement_Error_InvalidMIC
The computed MIC was not valid.
Definition lmic_secure_element_interface.h:71
@ LMIC_SecureElement_Error_Implementation
Implementation-defined error.
Definition lmic_secure_element_interface.h:72
@ LMIC_SecureElement_Error_InvalidParameter
Invalid parameter detected.
Definition lmic_secure_element_interface.h:68
@ LMIC_SecureElement_KeySelector_Mc2
The operation should use the keys for multicast session Mc2.
Definition lmic_secure_element_interface.h:111
@ LMIC_SecureElement_KeySelector_Unicast
The operation should use the unicast keys.
Definition lmic_secure_element_interface.h:108
@ LMIC_SecureElement_KeySelector_Mc1
The operation should use the keys for multicast session Mc1.
Definition lmic_secure_element_interface.h:110
@ LMIC_SecureElement_KeySelector_AppKey
The operation should use the (LoRaWAN 1.0.3) Application Key.
Definition lmic_secure_element_interface.h:113
@ LMIC_SecureElement_KeySelector_Mc3
The operation should use the keys for multicast session MC3.
Definition lmic_secure_element_interface.h:112
@ LMIC_SecureElement_KeySelector_SIZE
One greater than maximum value in this enum.
Definition lmic_secure_element_interface.h:114
@ LMIC_SecureElement_KeySelector_Mc0
The operation should use the keys for multicast session Mc0.
Definition lmic_secure_element_interface.h:109
@ LMIC_SecureElement_JoinFormat_RejoinRequest0
Rejoin-request type 0.
Definition lmic_secure_element_interface.h:157
@ LMIC_SecureElement_JoinFormat_JoinRequest11
Basic Join Request (1.1) – no difference on encode, enables 1.1 features on decode....
Definition lmic_secure_element_interface.h:156
@ LMIC_SecureElement_JoinFormat_RejoinRequest1
Rejoin-request type 1.
Definition lmic_secure_element_interface.h:158
@ LMIC_SecureElement_JoinFormat_SIZE
One greater than maximum value in this enum.
Definition lmic_secure_element_interface.h:160
@ LMIC_SecureElement_JoinFormat_JoinRequest10
Basic Join Request (1.0.3).
Definition lmic_secure_element_interface.h:155
@ LMIC_SecureElement_JoinFormat_RejoinRequest2
Rejoin-request type 2.
Definition lmic_secure_element_interface.h:159
an object to carry an AES128 (16-byte) key.
Definition lmic_secure_element_interface.h:78
uint8_t bytes[16]
Key data, normally stored in big-endian order.
Definition lmic_secure_element_interface.h:79
an object to carry a 64-bit EUI.
Definition lmic_secure_element_interface.h:83
uint8_t bytes[8]
EUI-64 data. Normally stored in little-endian order.
Definition lmic_secure_element_interface.h:84
an object to carry a LoRaWAN Join Request message.
Definition lmic_secure_element_interface.h:88
uint8_t bytes[23]
Join request data, in network byte order.
Definition lmic_secure_element_interface.h:89