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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
#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>
#include "config.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, optionally configured with security policies.
*
* When @p certPath is non-NULL the server is initialized with encryption
* (certificate, private key, trustlist). When @p discovery is true the
* server additionally offers SecurityPolicy#None restricted to discovery
* services (FindServers, GetEndpoints) so that unencrypted clients can
* still discover the server. When @p discovery is false the server is
* purely secure — no None security policy, no None endpoint. When
* @p certPath is NULL the server runs with SecurityPolicy#None only
* (keyPath, trustPaths and discovery are ignored). The applicationUri
* is set in both cases.
*
* @param port Server port number.
* @param applicationUri OPC UA application URI.
* @param certPath Path to server certificate (.der), or NULL for unsecure.
* @param keyPath Path to private key (.der), or NULL when certPath is NULL.
* @param trustPaths Array of trustlist file paths (may be NULL).
* @param trustSize Number of entries in trustPaths.
* @param discovery When true and certPath is non-NULL, add a None
* endpoint restricted to discovery services.
* @param retval Output parameter set to the status code on failure.
* @return A configured UA_Server, or NULL on error.
*/
UA_Server *createServer (UA_UInt16 port, const char *applicationUri,
const char *certPath, const char *keyPath,
char **trustPaths, size_t trustSize,
UA_Boolean discovery, 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 the authMode key from a configuration file.
*
* When authMode is "anonymous", sets *allowAnonymous to true and
* *username / *password to NULL. When authMode is "user", sets
* *allowAnonymous to false and loads the username/password keys.
* Logs errors internally.
*
* @param cfg Parsed configuration.
* @param program Program name (for error messages).
* @param allowAnonymous Output: true for anonymous, false for user.
* May be NULL (ignored — useful for client callers).
* @param username Output: username string (owned by cfg), or NULL.
* @param password Output: password string (owned by cfg), or NULL.
* @return 0 on success, -1 on error.
*/
int parseAuthConfig (const Config *cfg, const char *program,
UA_Boolean *allowAnonymous, const char **username,
const char **password);
/**
* @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 without encryption.
*
* Sets up a default client config with SecurityPolicy#None and the given
* application URI. Explicitly sets securityMode and securityPolicyUri so
* that internal endpoint negotiation matches None endpoints.
*
* @param cc Pointer to a zero-initialized UA_ClientConfig.
* @param applicationUri OPC UA application URI.
* @return UA_STATUSCODE_GOOD on success, error code otherwise.
*/
UA_StatusCode createUnsecureClientConfig (UA_ClientConfig *cc,
const char *applicationUri);
/**
* @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 */
|