embox

Форк
0
/
tls_server_example.c 
233 строки · 7.3 Кб
1
/*
2
 *  tls_server_example.c
3
 *
4
 *  How to configure a TLS server
5
 */
6

7
#include "iec61850_server.h"
8
#include "hal_thread.h"
9
#include <signal.h>
10
#include <stdlib.h>
11
#include <stdio.h>
12
#include <math.h>
13

14
#include "static_model.h"
15

16
/* import IEC 61850 device model created from SCL-File */
17
extern IedModel iedModel;
18

19
static int running = 0;
20
static IedServer iedServer = NULL;
21

22
void
23
sigint_handler(int signalId)
24
{
25
    running = 0;
26
}
27

28
static ControlHandlerResult
29
controlHandlerForBinaryOutput(ControlAction action, void* parameter, MmsValue* value, bool test)
30
{
31
    if (test)
32
        return CONTROL_RESULT_FAILED;
33

34
    if (MmsValue_getType(value) == MMS_BOOLEAN) {
35
        printf("received binary control command: ");
36

37
        if (MmsValue_getBoolean(value))
38
            printf("on\n");
39
        else
40
            printf("off\n");
41
    }
42
    else
43
        return CONTROL_RESULT_FAILED;
44

45
    uint64_t timeStamp = Hal_getTimeInMs();
46

47
    if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) {
48
        IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp);
49
        IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value);
50
    }
51

52
    if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) {
53
        IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp);
54
        IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value);
55
    }
56

57
    if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) {
58
        IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp);
59
        IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value);
60
    }
61

62
    if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) {
63
        IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timeStamp);
64
        IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value);
65
    }
66

67
    return CONTROL_RESULT_OK;
68
}
69

70

71
static void
72
connectionHandler (IedServer self, ClientConnection connection, bool connected, void* parameter)
73
{
74
    if (connected)
75
        printf("Connection opened\n");
76
    else
77
        printf("Connection closed\n");
78
}
79

80
static void
81
printAppTitle(ItuObjectIdentifier* oid)
82
{
83
    int i;
84

85
    for (i = 0; i < oid->arcCount; i++) {
86
        printf("%i", oid->arc[i]);
87

88
        if (i != (oid->arcCount - 1))
89
            printf(".");
90
    }
91
}
92

93
static bool
94
clientAuthenticator(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken, IsoApplicationReference* appRef)
95
{
96
    printf("ACSE Authenticator:\n");
97
    printf("  client ap-title: "); printAppTitle(&(appRef->apTitle)); printf("\n");
98
    printf("  client ae-qualifier: %i\n", appRef->aeQualifier);
99
    printf("  auth-mechanism: %i\n", authParameter->mechanism);
100

101
    if (authParameter->mechanism == ACSE_AUTH_TLS) {
102
        printf("  Has certificate with size: %i\n", authParameter->value.certificate.length);
103
    }
104

105
    return true;
106
}
107

108
int
109
main(int argc, char** argv)
110
{
111
    printf("Using libIEC61850 version %s\n", LibIEC61850_getVersionString());
112

113
    TLSConfiguration tlsConfig = TLSConfiguration_create();
114

115
    TLSConfiguration_setChainValidation(tlsConfig, false);
116
    TLSConfiguration_setAllowOnlyKnownCertificates(tlsConfig, true);
117

118
    if (!TLSConfiguration_setOwnKeyFromFile(tlsConfig, "server-key.pem", NULL)) {
119
        printf("Failed to load private key!\n");
120
        return 0;
121
    }
122

123
    if (!TLSConfiguration_setOwnCertificateFromFile(tlsConfig, "server.cer")) {
124
        printf("ERROR: Failed to load own certificate!\n");
125
        return 0;
126
    }
127

128
    if (!TLSConfiguration_addCACertificateFromFile(tlsConfig, "root.cer")) {
129
        printf("ERROR: Failed to load root certificate\n");
130
        return 0;
131
    }
132

133
    /**
134
     * Configure two allowed clients
135
     */
136

137
    if (!TLSConfiguration_addAllowedCertificateFromFile(tlsConfig, "client1.cer")) {
138
        printf("ERROR: Failed to load allowed client certificate\n");
139
        return 0;
140
    }
141

142
    if (!TLSConfiguration_addAllowedCertificateFromFile(tlsConfig, "client2.cer")) {
143
        printf("ERROR: Failed to load allowed client certificate\n");
144
        return 0;
145
    }
146

147
    iedServer = IedServer_createWithTlsSupport(&iedModel, tlsConfig);
148

149
    IedServer_setAuthenticator(iedServer, clientAuthenticator, NULL);
150

151
    /* Install handler for operate command */
152
    IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1,
153
            (ControlHandler) controlHandlerForBinaryOutput,
154
            IEDMODEL_GenericIO_GGIO1_SPCSO1);
155

156
    IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2,
157
            (ControlHandler) controlHandlerForBinaryOutput,
158
            IEDMODEL_GenericIO_GGIO1_SPCSO2);
159

160
    IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3,
161
            (ControlHandler) controlHandlerForBinaryOutput,
162
            IEDMODEL_GenericIO_GGIO1_SPCSO3);
163

164
    IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4,
165
            (ControlHandler) controlHandlerForBinaryOutput,
166
            IEDMODEL_GenericIO_GGIO1_SPCSO4);
167

168
    IedServer_setConnectionIndicationHandler(iedServer, (IedConnectionIndicationHandler) connectionHandler, NULL);
169

170
    /* MMS server will be instructed to start listening to client connections. */
171
    IedServer_start(iedServer, -1);
172

173
    if (!IedServer_isRunning(iedServer)) {
174
        printf("Starting server failed! Exit.\n");
175
        IedServer_destroy(iedServer);
176
        exit(-1);
177
    }
178

179
    running = 1;
180

181
    signal(SIGINT, sigint_handler);
182

183
    float t = 0.f;
184

185
    while (running) {
186
        uint64_t timestamp = Hal_getTimeInMs();
187

188
        t += 0.1f;
189

190
        float an1 = t;//sinf(t);
191
        float an2 = t + 1.f;//sinf(t + 1.f);
192
        float an3 = t + 2.f;//sinf(t + 2.f);
193
        float an4 = t + 3.f;//sinf(t + 3.f);
194

195
        IedServer_lockDataModel(iedServer);
196

197
        Timestamp iecTimestamp;
198

199
        Timestamp_clearFlags(&iecTimestamp);
200
        Timestamp_setTimeInMilliseconds(&iecTimestamp, timestamp);
201
        Timestamp_setLeapSecondKnown(&iecTimestamp, true);
202

203
        /* toggle clock-not-synchronized flag in timestamp */
204
        if (((int) t % 2) == 0)
205
            Timestamp_setClockNotSynchronized(&iecTimestamp, true);
206

207
        IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, &iecTimestamp);
208
        IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, an1);
209

210
        IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_t, &iecTimestamp);
211
        IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f, an2);
212

213
        IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_t, &iecTimestamp);
214
        IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f, an3);
215

216
        IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_t, &iecTimestamp);
217
        IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f, an4);
218

219
        IedServer_unlockDataModel(iedServer);
220

221
        Thread_sleep(100);
222
    }
223

224
    /* stop MMS server - close TCP server socket and all client sockets */
225
    IedServer_stop(iedServer);
226

227
    /* Cleanup - free all resources */
228
    IedServer_destroy(iedServer);
229

230
    TLSConfiguration_destroy(tlsConfig);
231

232
    return 0;
233
} /* main() */
234

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.