~ubuntu-branches/ubuntu/hardy/trousers/hardy-proposed

« back to all changes in this revision

Viewing changes to src/tspi/obj_encdata.c

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2008-01-23 22:03:00 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080123220300-fhtqja3c0oq0gp6z
Tags: 0.3.1-4
* Added patch from Aaron M. Ucko <ucko@debian.org> to allow trousers to
  build successfully on amd64, and presumably also other 64-bit
  architectures (Closes: #457400).
* Including udev rule for /dev/tpm from William Lima
  <wlima.amadeus@gmail.com> as suggested by David Smith <dds@google.com>
  (Closes: #459682).
* Added lintian overrides.

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
 *
5
5
 * trousers - An open source TCG Software Stack
6
6
 *
7
 
 * (C) Copyright International Business Machines Corp. 2005
 
7
 * (C) Copyright International Business Machines Corp. 2005, 2007
8
8
 *
9
9
 */
10
10
 
13
13
#include <stdio.h>
14
14
#include <errno.h>
15
15
#include <string.h>
16
 
#include <pthread.h>
17
16
 
18
17
#include "trousers/tss.h"
19
18
#include "trousers/trousers.h"
20
 
#include "spi_internal_types.h"
 
19
#include "trousers_types.h"
21
20
#include "spi_utils.h"
22
21
#include "capabilities.h"
23
22
#include "tsplog.h"
35
34
                return TSPERR(TSS_E_OUTOFMEMORY);
36
35
        }
37
36
 
38
 
#ifdef TSS_COPY_POLICY_OBJECTS
39
37
        /* add usage policy */
40
 
        if ((result = obj_policy_add(tspContext, TSS_POLICY_USAGE, &encdata->usagePolicy))) {
41
 
                free(encdata);
42
 
                return result;
43
 
        }
44
 
#else
45
 
        if ((result = obj_context_get_policy(tspContext, &encdata->usagePolicy))) {
46
 
                free(encdata);
47
 
                return result;
48
 
        }
49
 
#endif
 
38
        if ((result = obj_context_get_policy(tspContext, TSS_POLICY_USAGE,
 
39
                                             &encdata->usagePolicy))) {
 
40
                free(encdata);
 
41
                return result;
 
42
        }
50
43
 
51
44
        encdata->type = type;
52
45
 
83
76
 
84
77
        obj_list_put(&encdata_list);
85
78
 
86
 
        if (!obj_is_context(*tspContext))
87
 
                return TSPERR(TSS_E_INVALID_HANDLE);
88
 
 
89
79
        return TSS_SUCCESS;
90
80
}
91
81
 
92
 
#if 0
93
82
TSS_RESULT
94
 
obj_encdata_is_connected(TSS_HENCDATA hEncdata, TCS_CONTEXT_HANDLE *tcsContext)
 
83
obj_encdata_get_policy(TSS_HENCDATA hEncData, UINT32 policyType, TSS_HPOLICY *phPolicy)
95
84
{
96
85
        struct tsp_object *obj;
 
86
        struct tr_encdata_obj *encdata;
97
87
        TSS_RESULT result = TSS_SUCCESS;
98
88
 
99
 
        if ((obj = obj_list_get_obj(&encdata_list, hEncdata)) == NULL)
100
 
                return TSPERR(TSS_E_INVALID_HANDLE);
101
 
 
102
 
        if (obj->tcsContext == NULL_HCONTEXT)
103
 
                result = TSPERR(TSS_E_NO_CONNECTION);
104
 
 
105
 
        *tcsContext = obj->tcsContext;
106
 
 
107
 
        obj_list_put(&encdata_list);
108
 
 
109
 
        return result;
110
 
}
111
 
#endif
112
 
 
113
 
TSS_RESULT
114
 
obj_encdata_get_policy(TSS_HENCDATA hEncData, TSS_HPOLICY *phPolicy)
115
 
{
116
 
        struct tsp_object *obj;
117
 
        struct tr_encdata_obj *encdata;
118
 
 
119
89
        if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
120
90
                return TSPERR(TSS_E_INVALID_HANDLE);
121
91
 
122
92
        encdata = (struct tr_encdata_obj *)obj->data;
123
93
 
124
 
        *phPolicy = encdata->usagePolicy;
 
94
        switch (policyType) {
 
95
                case TSS_POLICY_USAGE:
 
96
                        *phPolicy = encdata->usagePolicy;
 
97
                        break;
 
98
                default:
 
99
                        result = TSPERR(TSS_E_BAD_PARAMETER);
 
100
        }
125
101
 
126
102
        obj_list_put(&encdata_list);
127
103
 
128
 
        return TSS_SUCCESS;
 
104
        return result;
129
105
}
130
106
 
131
107
TSS_RESULT
133
109
{
134
110
        struct tsp_object *obj;
135
111
        struct tr_encdata_obj *encdata;
 
112
        UINT32 policyType;
 
113
        TSS_RESULT result = TSS_SUCCESS;
 
114
 
 
115
        if ((result = obj_policy_get_type(hPolicy, &policyType)))
 
116
                return result;
136
117
 
137
118
        if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
138
119
                return TSPERR(TSS_E_INVALID_HANDLE);
139
120
 
140
121
        encdata = (struct tr_encdata_obj *)obj->data;
141
122
 
142
 
        encdata->usagePolicy = hPolicy;
 
123
        switch (policyType) {
 
124
                case TSS_POLICY_USAGE:
 
125
                        encdata->usagePolicy = hPolicy;
 
126
                        break;
 
127
                default:
 
128
                        result = TSPERR(TSS_E_BAD_PARAMETER);
 
129
        }
143
130
 
144
131
        obj_list_put(&encdata_list);
145
132
 
146
 
        return TSS_SUCCESS;
 
133
        return result;
147
134
}
148
135
 
149
136
TSS_RESULT
180
167
}
181
168
 
182
169
TSS_RESULT
183
 
obj_encdata_get_pcr_atcreation(TSS_HENCDATA hEncData, UINT32 *size, BYTE **data)
184
 
{
185
 
        struct tsp_object *obj;
186
 
        struct tr_encdata_obj *encdata;
187
 
        TSS_RESULT result = TSS_SUCCESS;
188
 
 
189
 
        if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
190
 
                return TSPERR(TSS_E_INVALID_HANDLE);
191
 
 
192
 
        encdata = (struct tr_encdata_obj *)obj->data;
193
 
 
194
 
        if ((obj->flags & TSS_OBJ_FLAG_PCRS) == FALSE) {
195
 
                *data = NULL;
196
 
                *size = 0;
197
 
        } else {
198
 
                *data = calloc_tspi(obj->tspContext, sizeof(TCPA_DIGEST));
199
 
                if (*data == NULL) {
200
 
                        LogError("malloc of %zd bytes failed.", sizeof(TCPA_DIGEST));
201
 
                        result = TSPERR(TSS_E_OUTOFMEMORY);
202
 
                        goto done;
203
 
                }
204
 
                *size = sizeof(TCPA_DIGEST);
205
 
                memcpy(*data, &encdata->pcrInfo.digestAtCreation,
206
 
                                sizeof(TCPA_DIGEST));
207
 
        }
208
 
 
209
 
done:
210
 
        obj_list_put(&encdata_list);
211
 
 
212
 
        return result;
213
 
}
214
 
 
215
 
TSS_RESULT
216
 
obj_encdata_get_pcr_atrelease(TSS_HENCDATA hEncData, UINT32 *size, BYTE **data)
217
 
{
218
 
        struct tsp_object *obj;
219
 
        struct tr_encdata_obj *encdata;
220
 
        TSS_RESULT result = TSS_SUCCESS;
221
 
 
222
 
        if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
223
 
                return TSPERR(TSS_E_INVALID_HANDLE);
224
 
 
225
 
        encdata = (struct tr_encdata_obj *)obj->data;
226
 
 
227
 
        if ((obj->flags & TSS_OBJ_FLAG_PCRS) == FALSE) {
228
 
                *data = NULL;
229
 
                *size = 0;
230
 
        } else {
231
 
                *data = calloc_tspi(obj->tspContext, sizeof(TCPA_DIGEST));
232
 
                if (*data == NULL) {
233
 
                        LogError("malloc of %zd bytes failed.", sizeof(TCPA_DIGEST));
234
 
                        result = TSPERR(TSS_E_OUTOFMEMORY);
235
 
                        goto done;
236
 
                }
237
 
                *size = sizeof(TCPA_DIGEST);
238
 
                memcpy(*data, &encdata->pcrInfo.digestAtRelease,
239
 
                                sizeof(TCPA_DIGEST));
240
 
        }
241
 
 
242
 
done:
243
 
        obj_list_put(&encdata_list);
244
 
 
245
 
        return result;
246
 
}
247
 
 
248
 
TSS_RESULT
249
 
obj_encdata_get_pcr_selection(TSS_HENCDATA hEncData, UINT32 *size, BYTE **data)
250
 
{
251
 
        struct tsp_object *obj;
252
 
        struct tr_encdata_obj *encdata;
253
 
        TSS_RESULT result = TSS_SUCCESS;
254
 
 
255
 
        if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
256
 
                return TSPERR(TSS_E_INVALID_HANDLE);
257
 
 
258
 
        encdata = (struct tr_encdata_obj *)obj->data;
259
 
 
260
 
        if ((obj->flags & TSS_OBJ_FLAG_PCRS) == FALSE) {
261
 
                *data = NULL;
262
 
                *size = 0;
263
 
        } else {
264
 
                if (encdata->pcrInfo.pcrSelection.sizeOfSelect == 0) {
265
 
                        *data = NULL;
266
 
                        *size = 0;
267
 
                } else {
268
 
                        *data = calloc_tspi(obj->tspContext,
269
 
                                        encdata->pcrInfo.pcrSelection.sizeOfSelect);
270
 
                        if (*data == NULL) {
271
 
                                LogError("malloc of %d bytes failed.",
272
 
                                         encdata->pcrInfo.pcrSelection.sizeOfSelect);
273
 
                                result = TSPERR(TSS_E_OUTOFMEMORY);
274
 
                                goto done;
275
 
                        }
276
 
                        *size = encdata->pcrInfo.pcrSelection.sizeOfSelect;
277
 
                        memcpy(*data, encdata->pcrInfo.pcrSelection.pcrSelect, *size);
278
 
                }
279
 
        }
280
 
 
281
 
done:
282
 
        obj_list_put(&encdata_list);
283
 
 
284
 
        return result;
285
 
}
286
 
 
287
 
TSS_RESULT
288
 
obj_encdata_set_pcr_info(TSS_HENCDATA hEncData, BYTE *info_blob)
289
 
{
290
 
        struct tsp_object *obj;
291
 
        struct tr_encdata_obj *encdata;
292
 
        TSS_RESULT result;
293
 
        UINT64 offset;
294
 
 
295
 
        if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
296
 
                return TSPERR(TSS_E_INVALID_HANDLE);
297
 
 
298
 
        encdata = (struct tr_encdata_obj *)obj->data;
299
 
 
300
 
        free(encdata->pcrInfo.pcrSelection.pcrSelect);
301
 
 
302
 
        offset = 0;
303
 
        result = Trspi_UnloadBlob_PCR_INFO(&offset, info_blob, &encdata->pcrInfo);
 
170
obj_encdata_get_pcr_digest(TSS_HENCDATA hEncData,
 
171
                           TSS_FLAG pcrInfoType,
 
172
                           TSS_FLAG dir,
 
173
                           UINT32 *size,
 
174
                           BYTE **data)
 
175
{
 
176
        struct tsp_object *obj;
 
177
        struct tr_encdata_obj *encdata;
 
178
        TSS_RESULT result = TSS_SUCCESS;
 
179
        TPM_DIGEST *digest;
 
180
        UINT64 offset;
 
181
 
 
182
        if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
 
183
                return TSPERR(TSS_E_INVALID_HANDLE);
 
184
 
 
185
        encdata = (struct tr_encdata_obj *)obj->data;
 
186
 
 
187
        if (pcrInfoType != encdata->pcrInfoType) {
 
188
                result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
 
189
                goto done;
 
190
        }
 
191
 
 
192
        switch (pcrInfoType) {
 
193
                case TSS_PCRS_STRUCT_INFO:
 
194
                        if (dir == TSS_TSPATTRIB_ENCDATAPCR_DIGEST_ATCREATION)
 
195
                                digest = &encdata->pcrInfo.info11.digestAtCreation;
 
196
                        else if (dir == TSS_TSPATTRIB_ENCDATAPCR_DIGEST_ATRELEASE)
 
197
                                digest = &encdata->pcrInfo.info11.digestAtRelease;
 
198
                        else {
 
199
                                result = TSPERR(TSS_E_BAD_PARAMETER);
 
200
                                goto done;
 
201
                        }
 
202
                        break;
 
203
                case TSS_PCRS_STRUCT_INFO_LONG:
 
204
                        if (dir == TSS_TSPATTRIB_ENCDATAPCRLONG_DIGEST_ATCREATION)
 
205
                                digest = &encdata->pcrInfo.infolong.digestAtCreation;
 
206
                        else if (dir == TSS_TSPATTRIB_ENCDATAPCRLONG_DIGEST_ATRELEASE)
 
207
                                digest = &encdata->pcrInfo.infolong.digestAtRelease;
 
208
                        else {
 
209
                                result = TSPERR(TSS_E_BAD_PARAMETER);
 
210
                                goto done;
 
211
                        }
 
212
                        break;
 
213
                default:
 
214
                        result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
 
215
                        goto done;
 
216
        }
 
217
 
 
218
        *size = sizeof(TPM_DIGEST);
 
219
 
 
220
        if ((*data = calloc_tspi(obj->tspContext, *size)) == NULL) {
 
221
                LogError("malloc of %u bytes failed.", *size);
 
222
                *size = 0;
 
223
                result = TSPERR(TSS_E_OUTOFMEMORY);
 
224
                goto done;
 
225
        }
 
226
 
 
227
        offset = 0;
 
228
        Trspi_LoadBlob_DIGEST(&offset, *data, digest);
 
229
done:
 
230
        obj_list_put(&encdata_list);
 
231
 
 
232
        return result;
 
233
}
 
234
 
 
235
TSS_RESULT
 
236
obj_encdata_get_pcr_locality(TSS_HENCDATA hEncData, TSS_FLAG dir, UINT32 *locality)
 
237
{
 
238
        struct tsp_object *obj;
 
239
        struct tr_encdata_obj *encdata;
 
240
        TSS_RESULT result = TSS_SUCCESS;
 
241
 
 
242
        if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
 
243
                return TSPERR(TSS_E_INVALID_HANDLE);
 
244
 
 
245
        encdata = (struct tr_encdata_obj *)obj->data;
 
246
 
 
247
        if (encdata->pcrInfoType == TSS_PCRS_STRUCT_INFO_LONG) {
 
248
                if (dir == TSS_TSPATTRIB_ENCDATAPCRLONG_LOCALITY_ATCREATION)
 
249
                        *locality = encdata->pcrInfo.infolong.localityAtCreation;
 
250
                else if (dir == TSS_TSPATTRIB_ENCDATAPCRLONG_LOCALITY_ATRELEASE)
 
251
                        *locality = encdata->pcrInfo.infolong.localityAtRelease;
 
252
                else
 
253
                        result = TSPERR(TSS_E_BAD_PARAMETER);
 
254
        } else
 
255
                result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
 
256
 
 
257
        obj_list_put(&encdata_list);
 
258
 
 
259
        return result;
 
260
}
 
261
 
 
262
TSS_RESULT
 
263
obj_encdata_get_pcr_selection(TSS_HENCDATA hEncData,
 
264
                              TSS_FLAG pcrInfoType,
 
265
                              TSS_FLAG dir,
 
266
                              UINT32 *size,
 
267
                              BYTE **data)
 
268
{
 
269
        struct tsp_object *obj;
 
270
        struct tr_encdata_obj *encdata;
 
271
        TSS_RESULT result = TSS_SUCCESS;
 
272
        TPM_PCR_SELECTION *selection = NULL;
 
273
        UINT64 offset;
 
274
 
 
275
        if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
 
276
                return TSPERR(TSS_E_INVALID_HANDLE);
 
277
 
 
278
        encdata = (struct tr_encdata_obj *)obj->data;
 
279
 
 
280
        if (pcrInfoType != encdata->pcrInfoType) {
 
281
                result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
 
282
                goto done;
 
283
        }
 
284
 
 
285
        switch (pcrInfoType) {
 
286
                case TSS_PCRS_STRUCT_INFO:
 
287
                        if (dir == TSS_TSPATTRIB_ENCDATAPCR_SELECTION)
 
288
                                selection = &encdata->pcrInfo.info11.pcrSelection;
 
289
                        break;
 
290
                case TSS_PCRS_STRUCT_INFO_LONG:
 
291
                        if (dir == TSS_TSPATTRIB_ENCDATAPCRLONG_CREATION_SELECTION)
 
292
                                selection = &encdata->pcrInfo.infolong.creationPCRSelection;
 
293
                        else if (dir == TSS_TSPATTRIB_ENCDATAPCRLONG_RELEASE_SELECTION)
 
294
                                selection = &encdata->pcrInfo.infolong.releasePCRSelection;
 
295
                        else {
 
296
                                result = TSPERR(TSS_E_INTERNAL_ERROR);
 
297
                                goto done;
 
298
                        }
 
299
                        break;
 
300
                default:
 
301
                        result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
 
302
                        goto done;
 
303
        }
 
304
 
 
305
        *size = sizeof(UINT16) + selection->sizeOfSelect;
 
306
 
 
307
        if ((*data = calloc_tspi(obj->tspContext, *size)) == NULL) {
 
308
                LogError("malloc of %u bytes failed.", *size);
 
309
                *size = 0;
 
310
                result = TSPERR(TSS_E_OUTOFMEMORY);
 
311
                goto done;
 
312
        }
 
313
 
 
314
        offset = 0;
 
315
        Trspi_LoadBlob_PCR_SELECTION(&offset, *data, selection);
 
316
done:
 
317
        obj_list_put(&encdata_list);
 
318
 
 
319
        return result;
 
320
}
 
321
 
 
322
TSS_RESULT
 
323
obj_encdata_set_pcr_info(TSS_HENCDATA hEncData, UINT32 pcrInfoType, BYTE *info_blob)
 
324
{
 
325
        struct tsp_object *obj;
 
326
        struct tr_encdata_obj *encdata;
 
327
        TSS_RESULT result = TSS_SUCCESS;
 
328
        UINT64 offset = 0;
 
329
 
 
330
        if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
 
331
                return TSPERR(TSS_E_INVALID_HANDLE);
 
332
 
 
333
        encdata = (struct tr_encdata_obj *)obj->data;
 
334
 
 
335
        switch (pcrInfoType) {
 
336
                case TSS_PCRS_STRUCT_INFO_LONG:
 
337
                        result = Trspi_UnloadBlob_PCR_INFO_LONG(&offset, info_blob,
 
338
                                                                &encdata->pcrInfo.infolong);
 
339
                        break;
 
340
                case TSS_PCRS_STRUCT_INFO:
 
341
                        result = Trspi_UnloadBlob_PCR_INFO(&offset, info_blob,
 
342
                                                           &encdata->pcrInfo.info11);
 
343
                        break;
 
344
                default:
 
345
                        result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
 
346
                        goto done;
 
347
        }
 
348
 
 
349
        encdata->pcrInfoType = pcrInfoType;
 
350
 
 
351
        /* XXX are we using this anywhere? */
304
352
        obj->flags |= TSS_OBJ_FLAG_PCRS;
305
 
 
 
353
done:
306
354
        obj_list_put(&encdata_list);
307
355
 
308
356
        return result;
313
361
{
314
362
        struct tsp_object *obj;
315
363
        struct tr_encdata_obj *encdata;
316
 
 
317
 
        /* XXX hard-coded */
318
 
        if (size > 512)
319
 
                return TSPERR(TSS_E_BAD_PARAMETER);
 
364
        TSS_RESULT result = TSS_SUCCESS;
320
365
 
321
366
        if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
322
367
                return TSPERR(TSS_E_INVALID_HANDLE);
323
368
 
324
369
        encdata = (struct tr_encdata_obj *)obj->data;
325
370
 
326
 
        encdata->encryptedDataLength = size;
327
 
        memcpy(encdata->encryptedData, data, size);
328
 
 
 
371
        free(encdata->encryptedData);
 
372
        encdata->encryptedData = NULL;
 
373
        encdata->encryptedDataLength = 0;
 
374
 
 
375
        if (size > 0) {
 
376
                if ((encdata->encryptedData = malloc(size)) == NULL) {
 
377
                        LogError("malloc of %u bytes failed.", size);
 
378
                        result = TSPERR(TSS_E_OUTOFMEMORY);
 
379
                        goto done;
 
380
                }
 
381
                encdata->encryptedDataLength = size;
 
382
                memcpy(encdata->encryptedData, data, size);
 
383
        }
 
384
 
 
385
done:
329
386
        obj_list_put(&encdata_list);
330
387
 
331
 
        return TSS_SUCCESS;
 
388
        return result;
332
389
}
333
390
 
334
391
void
335
 
encdata_free(struct tr_encdata_obj *encdata)
 
392
encdata_free(void *data)
336
393
{
337
 
        free(encdata->pcrInfo.pcrSelection.pcrSelect);
 
394
        struct tr_encdata_obj *encdata = (struct tr_encdata_obj *)data;
 
395
 
 
396
        free(encdata->encryptedData);
 
397
 
 
398
        switch (encdata->pcrInfoType) {
 
399
                case TSS_PCRS_STRUCT_INFO:
 
400
                        free(encdata->pcrInfo.info11.pcrSelection.pcrSelect);
 
401
                        break;
 
402
                case TSS_PCRS_STRUCT_INFO_LONG:
 
403
                        free(encdata->pcrInfo.infolong.creationPCRSelection.pcrSelect);
 
404
                        free(encdata->pcrInfo.infolong.releasePCRSelection.pcrSelect);
 
405
                        break;
 
406
                default:
 
407
                        /* no PCR data was set */
 
408
                        break;
 
409
        }
 
410
 
338
411
        free(encdata);
339
412
}
340
413
 
343
416
TSS_RESULT
344
417
obj_encdata_remove(TSS_HOBJECT hObject, TSS_HCONTEXT tspContext)
345
418
{
346
 
        struct tsp_object *obj, *prev = NULL;
347
 
        struct obj_list *list = &encdata_list;
348
 
        TSS_RESULT result = TSPERR(TSS_E_INVALID_HANDLE);
349
 
 
350
 
        pthread_mutex_lock(&list->lock);
351
 
 
352
 
        for (obj = list->head; obj; prev = obj, obj = obj->next) {
353
 
                if (obj->handle == hObject) {
354
 
                        /* validate tspContext */
355
 
                        if (obj->tspContext != tspContext)
356
 
                                break;
357
 
 
358
 
                        encdata_free(obj->data);
359
 
                        if (prev)
360
 
                                prev->next = obj->next;
361
 
                        else
362
 
                                list->head = obj->next;
363
 
                        free(obj);
364
 
                        result = TSS_SUCCESS;
365
 
                        break;
366
 
                }
367
 
        }
368
 
 
369
 
        pthread_mutex_unlock(&list->lock);
370
 
 
371
 
        return result;
372
 
}
373
 
 
374
 
void
375
 
obj_list_encdata_close(struct obj_list *list, TSS_HCONTEXT tspContext)
376
 
{
377
 
        struct tsp_object *index;
378
 
        struct tsp_object *next = NULL;
379
 
        struct tsp_object *toKill;
380
 
        struct tsp_object *prev = NULL;
381
 
 
382
 
        pthread_mutex_lock(&list->lock);
383
 
 
384
 
        for (index = list->head; index; ) {
385
 
                next = index->next;
386
 
                if (index->tspContext == tspContext) {
387
 
                        toKill = index;
388
 
                        if (prev == NULL) {
389
 
                                list->head = toKill->next;
390
 
                        } else {
391
 
                                prev->next = toKill->next;
392
 
                        }
393
 
 
394
 
                        encdata_free(toKill->data);
395
 
                        free(toKill);
396
 
 
397
 
                        index = next;
398
 
                } else {
399
 
                        prev = index;
400
 
                        index = next;
401
 
                }
402
 
        }
403
 
 
404
 
        pthread_mutex_unlock(&list->lock);
 
419
        TSS_RESULT result;
 
420
 
 
421
        if ((result = obj_list_remove(&encdata_list, &encdata_free, hObject, tspContext)))
 
422
                return result;
 
423
 
 
424
        return TSS_SUCCESS;
405
425
}
406
426
 
407
427
void
424
444
 
425
445
        pthread_mutex_unlock(&list->lock);
426
446
}
 
447
 
 
448
#ifdef TSS_BUILD_SEALX
 
449
TSS_RESULT
 
450
obj_encdata_set_seal_protect_mode(TSS_HENCDATA hEncData, UINT32 protectMode)
 
451
{
 
452
        struct tsp_object *obj;
 
453
        struct tr_encdata_obj *encdata;
 
454
 
 
455
        if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
 
456
                return TSPERR(TSS_E_INVALID_HANDLE);
 
457
 
 
458
        encdata = (struct tr_encdata_obj *)obj->data;
 
459
 
 
460
        encdata->protectMode = protectMode;
 
461
 
 
462
        obj_list_put(&encdata_list);
 
463
 
 
464
        return TSS_SUCCESS;
 
465
}
 
466
 
 
467
TSS_RESULT
 
468
obj_encdata_get_seal_protect_mode(TSS_HENCDATA hEncData, UINT32 *protectMode)
 
469
{
 
470
        struct tsp_object *obj;
 
471
        struct tr_encdata_obj *encdata;
 
472
 
 
473
        if ((obj = obj_list_get_obj(&encdata_list, hEncData)) == NULL)
 
474
                return TSPERR(TSS_E_INVALID_HANDLE);
 
475
 
 
476
        encdata = (struct tr_encdata_obj *)obj->data;
 
477
 
 
478
        *protectMode = encdata->protectMode;
 
479
 
 
480
        obj_list_put(&encdata_list);
 
481
 
 
482
        return TSS_SUCCESS;
 
483
}
 
484
#endif
 
485