37 APDU& apdu,
bool status)
override;
58 enum class AddrType : uint8_t
68 Addr(uint8_t addr) : addr{addr} {}
71 AddrType addrType{AddrType::unknown};
73 bool operator ==(
const Addr& cmpAddr)
const
75 if ((cmpAddr.addrType == AddrType::unknown) || (addrType == AddrType::unknown))
77 println(
"Unknown address type detected!");
81 return (cmpAddr.addr == addr) && (cmpAddr.addrType == addrType);
89 addrType = AddrType::group;
91 GrpAddr(uint8_t addr) : Addr{addr}
93 addrType = AddrType::group;
101 addrType = AddrType::individual;
103 IndAddr(uint8_t addr) : Addr{addr}
105 addrType = AddrType::individual;
109 uint32_t calcAuthOnlyMac(uint8_t* apdu, uint8_t apduLength,
const uint8_t* key, uint8_t* iv, uint8_t* ctr0);
110 uint32_t calcConfAuthMac(uint8_t* associatedData, uint16_t associatedDataLength, uint8_t* apdu, uint8_t apduLength,
const uint8_t* key, uint8_t* iv);
112 void block0(uint8_t* buffer, uint8_t* seqNum, uint16_t indSrcAddr, uint16_t dstAddr,
bool dstAddrIsGroupAddr, uint8_t extFrameFormat, uint8_t tpci, uint8_t apci, uint8_t payloadLength);
113 void blockCtr0(uint8_t* buffer, uint8_t* seqNum, uint16_t indSrcAddr, uint16_t dstAddr);
115 const uint8_t* securityKey(uint16_t addr,
bool isGroupAddress);
117 uint16_t groupAddressIndex(uint16_t groupAddr);
118 uint16_t groupObjectIndex(uint16_t groupAddrIndex);
120 uint8_t groupObjectSecurity(uint16_t groupObjectIndex);
122 uint64_t nextSequenceNumber(
bool toolAccess);
123 void updateSequenceNumber(
bool toolAccess, uint64_t seqNum);
125 uint64_t lastValidSequenceNumber(
bool toolAcces, uint16_t srcAddr);
126 void updateLastValidSequence(
bool toolAccess, uint16_t remoteAddr, uint64_t seqNo);
128 uint64_t getRandomNumber();
130 bool isSyncService(
APDU& secureAsdu);
132 void sendSyncRequest(uint16_t dstAddr,
bool dstAddrIsGroupAddr,
const SecurityControl& secCtrl,
bool systemBcast);
133 void sendSyncResponse(uint16_t dstAddr,
bool dstAddrIsGroupAddr,
const SecurityControl& secCtrl, uint64_t remoteNextSeqNum,
bool systemBcast);
134 void receivedSyncRequest(uint16_t srcAddr, uint16_t dstAddr,
bool dstAddrIsGroupAddr,
const SecurityControl& secCtrl, uint8_t* seq, uint64_t challenge,
bool systemBcast);
135 void receivedSyncResponse(uint16_t remoteAddr,
const SecurityControl& secCtrl, uint8_t* plainApdu);
137 bool decrypt(uint8_t* plainApdu, uint16_t plainapduLength, uint16_t srcAddr, uint16_t dstAddr,
bool dstAddrIsGroupAddr, uint8_t tpci, uint8_t* secureAsdu,
SecurityControl& secCtrl,
bool systemBcast);
138 bool secure(uint8_t* buffer, uint16_t service, uint16_t srcAddr, uint16_t dstAddr,
bool dstAddrIsGroupAddr, uint8_t tpci, uint8_t* apdu, uint16_t apduLength,
const SecurityControl& secCtrl,
bool systemBcast);
143 void encryptAesCbc(uint8_t* buffer, uint16_t bufLen,
const uint8_t* iv,
const uint8_t* key);
144 void xcryptAesCtr(uint8_t* buffer, uint16_t bufLen,
const uint8_t* iv,
const uint8_t* key);
146 bool _syncReqBroadcastIncoming{
false};
147 bool _syncReqBroadcastOutgoing{
false};
148 uint32_t _lastSyncRes;
153 uint64_t _sequenceNumberToolAccess = 50;
154 uint64_t _sequenceNumber = 0;
156 uint64_t _lastValidSequenceNumberTool = 0;
157 uint64_t _lastValidSequenceNumber = 0;
This class represents an Application Protocol Data Unit.
This class represents the group address table.
This is an implementation of the application layer as specified in .
This is an implementation of the application layer as specified in .
void dataConnectedRequest(uint16_t tsap, Priority priority, APDU &apdu, const SecurityControl &secCtrl) override
void dataGroupRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU &apdu, const SecurityControl &secCtrl) override
void dataIndividualConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU &apdu, bool status) override
void dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU &apdu, const SecurityControl &secCtrl) override
void dataGroupIndication(HopCountType hopType, Priority priority, uint16_t tsap, APDU &apdu) override
Somebody send us an APDU via multicast communication.
void dataSystemBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU &apdu) override
void dataConnectedIndication(Priority priority, uint16_t tsap, APDU &apdu) override
void dataConnectedConfirm(uint16_t tsap) override
void dataSystemBroadcastConfirm(HopCountType hopType, Priority priority, APDU &apdu, bool status) override
SecureApplicationLayer(DeviceObject &deviceObj, SecurityInterfaceObject &secIfObj, BusAccessUnit &bau)
The constructor.
void groupAddressTable(AddressTableObject &addrTable)
void dataGroupConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU &apdu, bool status) override
Report the status of an APDU that we sent via multicast communication back to us.
void dataBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU &apdu) override
void dataIndividualIndication(HopCountType hopType, Priority priority, uint16_t source, APDU &apdu) override
void dataIndividualRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t destination, APDU &apdu, const SecurityControl &secCtrl) override
void dataBroadcastConfirm(AckType ack, HopCountType hopType, Priority priority, APDU &apdu, bool status) override
void dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU &apdu, const SecurityControl &secCtrl) override