aboutsummaryrefslogtreecommitdiffstats
path: root/src/common.h
blob: 72901814e249fc9f8bc40bdf2669f3add7e6f053 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#ifndef DISCOVERY_COMMON_H
#define DISCOVERY_COMMON_H

/**
 * @file  common.h
 * @brief Shared helpers for the OPC UA discovery demo programs.
 *
 * Provides file-loading, factory, and output formatting functions used by
 * the LDS, the registering server, and the FindServers client.
 */

#include <open62541/client.h>
#include <open62541/server.h>
#include <open62541/types.h>

#include <stddef.h>

/**
 * @brief Loads a DER-encoded certificate or key file into a UA_ByteString.
 *
 * @param path File path to read.
 * @return The file contents, or UA_BYTESTRING_NULL on error.
 */
UA_ByteString loadFile (const char *const path);

/**
 * @brief Collects all *.der file paths from a trust store directory.
 *
 * Opens the directory, finds every file ending in ".der", and builds
 * heap-allocated full paths (dirPath/filename).  The caller must free
 * the result with freeTrustStore().
 *
 * @param dirPath   Path to the trust store directory.
 * @param outPaths  Output: heap-allocated array of heap-allocated strings.
 *                  Set to NULL when the directory is empty.
 * @param outSize   Output: number of entries in outPaths.
 * @return 0 on success, -1 on error (logged via UA_LOG_ERROR).
 */
int loadTrustStore (const char *dirPath, char ***outPaths, size_t *outSize);

/**
 * @brief Frees the array returned by loadTrustStore().
 *
 * @param paths  The array of strings (may be NULL).
 * @param size   Number of entries.
 */
void freeTrustStore (char **paths, size_t size);

/**
 * @brief Creates a UA_Server configured with security policies and encryption.
 *
 * The server is initialized with the specified port, certificate, private key,
 * and trustlist. The applicationUri is set in the server's application
 * description.
 *
 * @param port Server port number.
 * @param applicationUri OPC UA application URI.
 * @param certPath Path to server certificate (.der).
 * @param keyPath Path to private key (.der).
 * @param trustPaths Array of trustlist file paths (may be NULL if trustSize is
 * 0).
 * @param trustSize Number of entries in trustPaths.
 * @param retval Output parameter set to the status code on failure.
 * @return A configured UA_Server, or NULL on error.
 */
UA_Server *createSecureServer (UA_UInt16 port, const char *applicationUri,
                               const char *certPath, const char *keyPath,
                               char **trustPaths, size_t trustSize,
                               UA_StatusCode *retval);

/**
 * @brief Parses a log-level name into the corresponding UA_LogLevel value.
 *
 * Accepted names (case-sensitive): "trace", "debug", "info", "warning",
 * "error", "fatal".
 *
 * @param name Log-level name string.
 * @return The matching UA_LogLevel, or -1 if the name is not recognized.
 */
int parseLogLevel (const char *name);

/**
 * @brief Parses a security mode name into the corresponding enum value.
 *
 * Accepted names: "None", "Sign", "SignAndEncrypt".
 *
 * @param name Mode name string.
 * @return The matching UA_MessageSecurityMode, or
 * UA_MESSAGESECURITYMODE_INVALID if the name is not recognized.
 */
UA_MessageSecurityMode parseSecurityMode (const char *name);

/**
 * @brief Maps a short security policy name to its full OPC UA URI.
 *
 * Accepted names: "None", "Basic256Sha256", "Aes256_Sha256_RsaPss",
 * "Aes128_Sha256_RsaOaep", "ECC_nistP256".
 *
 * @param shortName Short policy name.
 * @return The full URI string, or NULL if the name is not recognized.
 */
const char *resolveSecurityPolicyUri (const char *shortName);

/**
 * @brief Initializes a UA_ClientConfig with encryption from file paths.
 *
 * The config must be zero-initialized by the caller before calling this
 * function. Loads the certificate, private key, and trustlist, then applies
 * default encryption settings.
 *
 * @param cc Pointer to a zero-initialized UA_ClientConfig.
 * @param applicationUri OPC UA application URI.
 * @param certPath Path to client certificate (.der).
 * @param keyPath Path to private key (.der).
 * @param trustPaths Array of trustlist file paths (may be NULL if trustSize is
 * 0).
 * @param trustSize Number of entries in trustPaths.
 * @param securityMode Requested message security mode.
 * @param securityPolicyUri Security policy URI string (e.g.
 * "http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256").
 * @return UA_STATUSCODE_GOOD on success, error code otherwise.
 */
UA_StatusCode createSecureClientConfig (
    UA_ClientConfig *cc, const char *applicationUri, const char *certPath,
    const char *keyPath, char **trustPaths, size_t trustSize,
    UA_MessageSecurityMode securityMode, const char *securityPolicyUri);

/**
 * @brief Logs a UA_ApplicationDescription (server info from FindServers).
 *
 * Outputs the application URI, name, product URI, type, and discovery URLs
 * via UA_LOG_INFO.
 *
 * @param description The application description to print.
 * @param index Display index (e.g. position in the FindServers result array).
 */
void printApplicationDescription (const UA_ApplicationDescription *description,
                                  size_t index);

/**
 * @brief Logs a UA_EndpointDescription in a compact one-line format.
 *
 * Outputs the endpoint URL, security level, security mode, and the short
 * policy name (the part after '#') via UA_LOG_INFO.
 *
 * @param endpoint The endpoint description to print.
 * @param index Display index (e.g. position in the GetEndpoints result array).
 */
void printEndpoint (const UA_EndpointDescription *endpoint, size_t index);

#endif /* DISCOVERY_COMMON_H */