123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.*/
- #ifndef UA_SECURECHANNEL_H_
- #define UA_SECURECHANNEL_H_
- #include "queue.h"
- #include "ua_types.h"
- #include "ua_transport_generated.h"
- #include "ua_connection_internal.h"
- struct UA_Session;
- typedef struct UA_Session UA_Session;
- struct SessionEntry {
- LIST_ENTRY(SessionEntry) pointers;
- UA_Session *session; // Just a pointer. The session is held in the session manager or the client
- };
- /* For chunked requests */
- struct ChunkEntry {
- LIST_ENTRY(ChunkEntry) pointers;
- UA_UInt32 requestId;
- UA_ByteString bytes;
- };
- /* For chunked responses */
- typedef struct {
- UA_SecureChannel *channel;
- UA_UInt32 requestId;
- UA_UInt32 messageType;
- UA_UInt16 chunksSoFar;
- size_t messageSizeSoFar;
- UA_Boolean final;
- UA_StatusCode errorCode;
- } UA_ChunkInfo;
- struct UA_SecureChannel {
- UA_MessageSecurityMode securityMode;
- UA_ChannelSecurityToken securityToken; // the channelId is contained in the securityToken
- UA_ChannelSecurityToken nextSecurityToken; // the channelId is contained in the securityToken
- UA_AsymmetricAlgorithmSecurityHeader clientAsymAlgSettings;
- UA_AsymmetricAlgorithmSecurityHeader serverAsymAlgSettings;
- UA_ByteString clientNonce;
- UA_ByteString serverNonce;
- UA_UInt32 receiveSequenceNumber;
- UA_UInt32 sendSequenceNumber;
- UA_Connection *connection;
- LIST_HEAD(session_pointerlist, SessionEntry) sessions;
- LIST_HEAD(chunk_pointerlist, ChunkEntry) chunks;
- };
- void UA_SecureChannel_init(UA_SecureChannel *channel);
- void UA_SecureChannel_deleteMembersCleanup(UA_SecureChannel *channel);
- UA_StatusCode UA_SecureChannel_generateNonce(UA_ByteString *nonce);
- void UA_SecureChannel_attachSession(UA_SecureChannel *channel, UA_Session *session);
- void UA_SecureChannel_detachSession(UA_SecureChannel *channel, UA_Session *session);
- UA_Session * UA_SecureChannel_getSession(UA_SecureChannel *channel, UA_NodeId *token);
- UA_StatusCode UA_SecureChannel_sendBinaryMessage(UA_SecureChannel *channel, UA_UInt32 requestId,
- const void *content, const UA_DataType *contentType);
- void UA_SecureChannel_revolveTokens(UA_SecureChannel *channel);
- /**
- * Chunking
- * -------- */
- typedef void
- (UA_ProcessMessageCallback)(void *application, UA_SecureChannel *channel,
- UA_MessageType messageType, UA_UInt32 requestId,
- const UA_ByteString *message);
- UA_StatusCode
- UA_SecureChannel_processChunks(UA_SecureChannel *channel, const UA_ByteString *chunks,
- UA_ProcessMessageCallback callback, void *application);
- /**
- * Log Helper
- * ---------- */
- #define UA_LOG_TRACE_CHANNEL(LOGGER, CHANNEL, MSG, ...) \
- UA_LOG_TRACE(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, "Connection %i | SecureChannel %i | " MSG, \
- ((CHANNEL)->connection ? CHANNEL->connection->sockfd : 0), \
- (CHANNEL)->securityToken.channelId, ##__VA_ARGS__);
- #define UA_LOG_DEBUG_CHANNEL(LOGGER, CHANNEL, MSG, ...) \
- UA_LOG_DEBUG(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, "Connection %i | SecureChannel %i | " MSG, \
- ((CHANNEL)->connection ? (CHANNEL)->connection->sockfd : 0), \
- (CHANNEL)->securityToken.channelId, ##__VA_ARGS__);
- #define UA_LOG_INFO_CHANNEL(LOGGER, CHANNEL, MSG, ...) \
- UA_LOG_INFO(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, "Connection %i | SecureChannel %i | " MSG, \
- ((CHANNEL)->connection ? (CHANNEL)->connection->sockfd : 0), \
- (CHANNEL)->securityToken.channelId, ##__VA_ARGS__);
- #define UA_LOG_WARNING_CHANNEL(LOGGER, CHANNEL, MSG, ...) \
- UA_LOG_WARNING(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, "Connection %i | SecureChannel %i | " MSG, \
- ((CHANNEL)->connection ? (CHANNEL)->connection->sockfd : 0), \
- (CHANNEL)->securityToken.channelId, ##__VA_ARGS__);
- #define UA_LOG_ERROR_CHANNEL(LOGGER, CHANNEL, MSG, ...) \
- UA_LOG_ERROR(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, "Connection %i | SecureChannel %i | " MSG, \
- ((CHANNEL)->connection ? (CHANNEL)->connection->sockfd : 0), \
- (CHANNEL)->securityToken.channelId, ##__VA_ARGS__);
- #define UA_LOG_FATAL_CHANNEL(LOGGER, CHANNEL, MSG, ...) \
- UA_LOG_FATAL(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, "Connection %i | SecureChannel %i | " MSG, \
- ((CHANNEL)->connection ? (CHANNEL)->connection->sockfd : 0), \
- (CHANNEL)->securityToken.channelId, ##__VA_ARGS__);
- #endif /* UA_SECURECHANNEL_H_ */
|