Coverage Report

Created: 2024-05-20 06:23

/src/nss/lib/softoken/sftkpars.c
Line
Count
Source (jump to first uncovered line)
1
/* This Source Code Form is subject to the terms of the Mozilla Public
2
 * License, v. 2.0. If a copy of the MPL was not distributed with this
3
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
/*
5
 *  The following code handles the storage of PKCS 11 modules used by the
6
 * NSS. This file is written to abstract away how the modules are
7
 * stored so we can deside that later.
8
 */
9
#include "pkcs11i.h"
10
#include "sdb.h"
11
#include "prprf.h"
12
#include "prenv.h"
13
#include "utilpars.h"
14
15
#define FREE_CLEAR(p) \
16
37
    if (p) {          \
17
8
        PORT_Free(p); \
18
8
        p = NULL;     \
19
8
    }
20
21
static void
22
sftk_parseTokenFlags(char *tmp, sftk_token_parameters *parsed)
23
0
{
24
0
    parsed->readOnly = NSSUTIL_ArgHasFlag("flags", "readOnly", tmp);
25
0
    parsed->noCertDB = NSSUTIL_ArgHasFlag("flags", "noCertDB", tmp);
26
0
    parsed->noKeyDB = NSSUTIL_ArgHasFlag("flags", "noKeyDB", tmp);
27
0
    parsed->forceOpen = NSSUTIL_ArgHasFlag("flags", "forceOpen", tmp);
28
0
    parsed->pwRequired = NSSUTIL_ArgHasFlag("flags", "passwordRequired", tmp);
29
0
    parsed->optimizeSpace = NSSUTIL_ArgHasFlag("flags", "optimizeSpace", tmp);
30
0
    return;
31
0
}
32
33
static void
34
sftk_parseFlags(char *tmp, sftk_parameters *parsed)
35
1
{
36
1
    parsed->noModDB = NSSUTIL_ArgHasFlag("flags", "noModDB", tmp);
37
1
    parsed->readOnly = NSSUTIL_ArgHasFlag("flags", "readOnly", tmp);
38
    /* keep legacy interface working */
39
1
    parsed->noCertDB = NSSUTIL_ArgHasFlag("flags", "noCertDB", tmp);
40
1
    parsed->forceOpen = NSSUTIL_ArgHasFlag("flags", "forceOpen", tmp);
41
1
    parsed->pwRequired = NSSUTIL_ArgHasFlag("flags", "passwordRequired", tmp);
42
1
    parsed->optimizeSpace = NSSUTIL_ArgHasFlag("flags", "optimizeSpace", tmp);
43
1
    return;
44
1
}
45
46
static CK_RV
47
sftk_parseTokenParameters(char *param, sftk_token_parameters *parsed)
48
0
{
49
0
    int next;
50
0
    char *tmp = NULL;
51
0
    const char *index;
52
0
    index = NSSUTIL_ArgStrip(param);
53
54
0
    while (*index) {
55
0
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->configdir, "configDir=", ;)
56
0
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->updatedir, "updateDir=", ;)
57
0
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->updCertPrefix, "updateCertPrefix=", ;)
58
0
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->updKeyPrefix, "updateKeyPrefix=", ;)
59
0
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->updateID, "updateID=", ;)
60
0
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->certPrefix, "certPrefix=", ;)
61
0
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->keyPrefix, "keyPrefix=", ;)
62
0
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->tokdes, "tokenDescription=", ;)
63
0
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->updtokdes, "updateTokenDescription=", ;)
64
0
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->slotdes, "slotDescription=", ;)
65
0
        NSSUTIL_HANDLE_STRING_ARG(
66
0
            index, tmp, "minPWLen=",
67
0
            if (tmp) { parsed->minPW=atoi(tmp); PORT_Free(tmp); tmp = NULL; })
68
0
        NSSUTIL_HANDLE_STRING_ARG(
69
0
            index, tmp, "flags=",
70
0
            if (tmp) { sftk_parseTokenFlags(param,parsed); PORT_Free(tmp); tmp = NULL; })
71
0
        NSSUTIL_HANDLE_FINAL_ARG(index)
72
0
    }
73
0
    return CKR_OK;
74
0
}
75
76
static void
77
sftk_parseTokens(char *tokenParams, sftk_parameters *parsed)
78
0
{
79
0
    const char *tokenIndex;
80
0
    sftk_token_parameters *tokens = NULL;
81
0
    int i = 0, count = 0, next;
82
83
0
    if ((tokenParams == NULL) || (*tokenParams == 0))
84
0
        return;
85
86
    /* first count the number of slots */
87
0
    for (tokenIndex = NSSUTIL_ArgStrip(tokenParams); *tokenIndex;
88
0
         tokenIndex = NSSUTIL_ArgStrip(NSSUTIL_ArgSkipParameter(tokenIndex))) {
89
0
        count++;
90
0
    }
91
92
    /* get the data structures */
93
0
    tokens = (sftk_token_parameters *)
94
0
        PORT_ZAlloc(count * sizeof(sftk_token_parameters));
95
0
    if (tokens == NULL)
96
0
        return;
97
98
0
    for (tokenIndex = NSSUTIL_ArgStrip(tokenParams), i = 0;
99
0
         *tokenIndex && i < count; i++) {
100
0
        char *name;
101
0
        name = NSSUTIL_ArgGetLabel(tokenIndex, &next);
102
0
        tokenIndex += next;
103
104
0
        tokens[i].slotID = NSSUTIL_ArgDecodeNumber(name);
105
0
        tokens[i].readOnly = PR_FALSE;
106
0
        tokens[i].noCertDB = PR_FALSE;
107
0
        tokens[i].noKeyDB = PR_FALSE;
108
0
        if (!NSSUTIL_ArgIsBlank(*tokenIndex)) {
109
0
            char *args = NSSUTIL_ArgFetchValue(tokenIndex, &next);
110
0
            tokenIndex += next;
111
0
            if (args) {
112
0
                sftk_parseTokenParameters(args, &tokens[i]);
113
0
                PORT_Free(args);
114
0
            }
115
0
        }
116
0
        if (name)
117
0
            PORT_Free(name);
118
0
        tokenIndex = NSSUTIL_ArgStrip(tokenIndex);
119
0
    }
120
0
    parsed->token_count = i;
121
0
    parsed->tokens = tokens;
122
0
    return;
123
0
}
124
125
CK_RV
126
sftk_parseParameters(char *param, sftk_parameters *parsed, PRBool isFIPS)
127
1
{
128
1
    int next;
129
1
    char *tmp = NULL;
130
1
    const char *index;
131
1
    char *certPrefix = NULL, *keyPrefix = NULL;
132
1
    char *tokdes = NULL, *ptokdes = NULL, *pupdtokdes = NULL;
133
1
    char *slotdes = NULL, *pslotdes = NULL;
134
1
    char *fslotdes = NULL, *ftokdes = NULL;
135
1
    char *minPW = NULL;
136
1
    index = NSSUTIL_ArgStrip(param);
137
138
1
    PORT_Memset(parsed, 0, sizeof(sftk_parameters));
139
140
11
    while (*index) {
141
10
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->configdir, "configDir=", ;)
142
9
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->updatedir, "updateDir=", ;)
143
8
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->updateID, "updateID=", ;)
144
7
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->secmodName, "secmod=", ;)
145
6
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->man, "manufacturerID=", ;)
146
6
        NSSUTIL_HANDLE_STRING_ARG(index, parsed->libdes, "libraryDescription=", ;)
147
        /* constructed values, used so legacy interfaces still work */
148
6
        NSSUTIL_HANDLE_STRING_ARG(index, certPrefix, "certPrefix=", ;)
149
5
        NSSUTIL_HANDLE_STRING_ARG(index, keyPrefix, "keyPrefix=", ;)
150
4
        NSSUTIL_HANDLE_STRING_ARG(index, tokdes, "cryptoTokenDescription=", ;)
151
4
        NSSUTIL_HANDLE_STRING_ARG(index, ptokdes, "dbTokenDescription=", ;)
152
4
        NSSUTIL_HANDLE_STRING_ARG(index, slotdes, "cryptoSlotDescription=", ;)
153
4
        NSSUTIL_HANDLE_STRING_ARG(index, pslotdes, "dbSlotDescription=", ;)
154
4
        NSSUTIL_HANDLE_STRING_ARG(index, fslotdes, "FIPSSlotDescription=", ;)
155
4
        NSSUTIL_HANDLE_STRING_ARG(index, ftokdes, "FIPSTokenDescription=", ;)
156
4
        NSSUTIL_HANDLE_STRING_ARG(index, pupdtokdes, "updateTokenDescription=", ;)
157
3
        NSSUTIL_HANDLE_STRING_ARG(index, minPW, "minPWLen=", ;)
158
159
3
        NSSUTIL_HANDLE_STRING_ARG(
160
3
            index, tmp, "flags=",
161
3
            if (tmp) { sftk_parseFlags(param,parsed); PORT_Free(tmp); tmp = NULL; })
162
2
        NSSUTIL_HANDLE_STRING_ARG(
163
2
            index, tmp, "tokens=",
164
2
            if (tmp) { sftk_parseTokens(tmp,parsed); PORT_Free(tmp); tmp = NULL; })
165
2
        NSSUTIL_HANDLE_FINAL_ARG(index)
166
10
    }
167
1
    if (parsed->tokens == NULL) {
168
1
        int count = isFIPS ? 1 : 2;
169
1
        int i = count - 1;
170
1
        sftk_token_parameters *tokens = NULL;
171
172
1
        tokens = (sftk_token_parameters *)
173
1
            PORT_ZAlloc(count * sizeof(sftk_token_parameters));
174
1
        if (tokens == NULL) {
175
0
            goto loser;
176
0
        }
177
1
        parsed->tokens = tokens;
178
1
        parsed->token_count = count;
179
1
        tokens[i].slotID = isFIPS ? FIPS_SLOT_ID : PRIVATE_KEY_SLOT_ID;
180
1
        tokens[i].certPrefix = certPrefix;
181
1
        tokens[i].keyPrefix = keyPrefix;
182
1
        tokens[i].minPW = minPW ? atoi(minPW) : 0;
183
1
        tokens[i].readOnly = parsed->readOnly;
184
1
        tokens[i].noCertDB = parsed->noCertDB;
185
1
        tokens[i].noKeyDB = parsed->noCertDB;
186
1
        tokens[i].forceOpen = parsed->forceOpen;
187
1
        tokens[i].pwRequired = parsed->pwRequired;
188
1
        tokens[i].optimizeSpace = parsed->optimizeSpace;
189
1
        tokens[0].optimizeSpace = parsed->optimizeSpace;
190
1
        certPrefix = NULL;
191
1
        keyPrefix = NULL;
192
1
        if (isFIPS) {
193
0
            tokens[i].tokdes = ftokdes;
194
0
            tokens[i].updtokdes = pupdtokdes;
195
0
            tokens[i].slotdes = fslotdes;
196
0
            fslotdes = NULL;
197
0
            ftokdes = NULL;
198
0
            pupdtokdes = NULL;
199
1
        } else {
200
1
            tokens[i].tokdes = ptokdes;
201
1
            tokens[i].updtokdes = pupdtokdes;
202
1
            tokens[i].slotdes = pslotdes;
203
1
            tokens[0].slotID = NETSCAPE_SLOT_ID;
204
1
            tokens[0].tokdes = tokdes;
205
1
            tokens[0].slotdes = slotdes;
206
1
            tokens[0].noCertDB = PR_TRUE;
207
1
            tokens[0].noKeyDB = PR_TRUE;
208
1
            pupdtokdes = NULL;
209
1
            ptokdes = NULL;
210
1
            pslotdes = NULL;
211
1
            tokdes = NULL;
212
1
            slotdes = NULL;
213
1
        }
214
1
    }
215
216
1
loser:
217
1
    FREE_CLEAR(certPrefix);
218
1
    FREE_CLEAR(keyPrefix);
219
1
    FREE_CLEAR(tokdes);
220
1
    FREE_CLEAR(ptokdes);
221
1
    FREE_CLEAR(pupdtokdes);
222
1
    FREE_CLEAR(slotdes);
223
1
    FREE_CLEAR(pslotdes);
224
1
    FREE_CLEAR(fslotdes);
225
1
    FREE_CLEAR(ftokdes);
226
1
    FREE_CLEAR(minPW);
227
1
    return CKR_OK;
228
1
}
229
230
void
231
sftk_freeParams(sftk_parameters *params)
232
1
{
233
1
    int i;
234
235
3
    for (i = 0; i < params->token_count; i++) {
236
2
        FREE_CLEAR(params->tokens[i].configdir);
237
2
        FREE_CLEAR(params->tokens[i].certPrefix);
238
2
        FREE_CLEAR(params->tokens[i].keyPrefix);
239
2
        FREE_CLEAR(params->tokens[i].tokdes);
240
2
        FREE_CLEAR(params->tokens[i].slotdes);
241
2
        FREE_CLEAR(params->tokens[i].updatedir);
242
2
        FREE_CLEAR(params->tokens[i].updCertPrefix);
243
2
        FREE_CLEAR(params->tokens[i].updKeyPrefix);
244
2
        FREE_CLEAR(params->tokens[i].updateID);
245
2
        FREE_CLEAR(params->tokens[i].updtokdes);
246
2
    }
247
248
1
    FREE_CLEAR(params->configdir);
249
1
    FREE_CLEAR(params->secmodName);
250
1
    FREE_CLEAR(params->man);
251
1
    FREE_CLEAR(params->libdes);
252
1
    FREE_CLEAR(params->tokens);
253
1
    FREE_CLEAR(params->updatedir);
254
1
    FREE_CLEAR(params->updateID);
255
1
}
256
257
PRBool
258
sftk_RawArgHasFlag(const char *entry, const char *flag, const void *pReserved)
259
0
{
260
0
    CK_C_INITIALIZE_ARGS *init_args = (CK_C_INITIALIZE_ARGS *)pReserved;
261
262
    /* if we don't have any params, the flag isn't set */
263
0
    if ((!init_args || !init_args->LibraryParameters)) {
264
0
        return PR_FALSE;
265
0
    }
266
267
0
    return NSSUTIL_ArgHasFlag(entry, flag, (const char *)init_args->LibraryParameters);
268
0
}