1
2/*
3 * Licensed Materials - Property of IBM
4 *
5 * trousers - An open source TCG Software Stack
6 *
7 * (C) Copyright International Business Machines Corp. 2004-2007
8 *
9 */
10
11
12#include <stdlib.h>
13#include <stdio.h>
14#include <string.h>
15#include <time.h>
16#include <errno.h>
17
18#include "trousers/tss.h"
19#include "trousers/trousers.h"
20#include "trousers_types.h"
21#include "trousers_types.h"
22#include "spi_utils.h"
23#include "capabilities.h"
24#include "tsplog.h"
25#include "obj.h"
26#include "tsp_audit.h"
27
28
29TSS_RESULT
30Tspi_SetAttribUint32(TSS_HOBJECT hObject,	/* in */
31		     TSS_FLAG attribFlag,	/* in */
32		     TSS_FLAG subFlag,		/* in */
33		     UINT32 ulAttrib)		/* in */
34{
35	TSS_RESULT result;
36
37	if (obj_is_rsakey(hObject)) {
38#ifdef TSS_BUILD_RSAKEY_LIST
39		if (attribFlag == TSS_TSPATTRIB_KEY_REGISTER) {
40			if (subFlag)
41				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
42
43			if (ulAttrib == TSS_TSPATTRIB_KEYREGISTER_USER)
44				result = obj_rsakey_set_pstype(hObject, TSS_PS_TYPE_USER);
45			else if (ulAttrib == TSS_TSPATTRIB_KEYREGISTER_SYSTEM)
46				result = obj_rsakey_set_pstype(hObject, TSS_PS_TYPE_SYSTEM);
47			else if (ulAttrib == TSS_TSPATTRIB_KEYREGISTER_NO)
48				result = obj_rsakey_set_pstype(hObject, TSS_PS_TYPE_NO);
49			else
50				return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
51		} else if (attribFlag == TSS_TSPATTRIB_KEY_INFO) {
52			switch (subFlag) {
53				case TSS_TSPATTRIB_KEYINFO_USAGE:
54					result = obj_rsakey_set_usage(hObject, ulAttrib);
55					break;
56				case TSS_TSPATTRIB_KEYINFO_MIGRATABLE:
57					if (ulAttrib != TRUE && ulAttrib != FALSE)
58						return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
59
60					result = obj_rsakey_set_migratable(hObject, ulAttrib);
61					break;
62				case TSS_TSPATTRIB_KEYINFO_REDIRECTED:
63					if (ulAttrib != TRUE && ulAttrib != FALSE)
64						return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
65
66					result = obj_rsakey_set_redirected(hObject, ulAttrib);
67					break;
68				case TSS_TSPATTRIB_KEYINFO_VOLATILE:
69					if (ulAttrib != TRUE && ulAttrib != FALSE)
70						return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
71
72					result = obj_rsakey_set_volatile(hObject, ulAttrib);
73					break;
74				case TSS_TSPATTRIB_KEYINFO_AUTHUSAGE:
75					/* fall through */
76				case TSS_TSPATTRIB_KEYINFO_AUTHDATAUSAGE:
77					if (ulAttrib != TRUE && ulAttrib != FALSE)
78						return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
79
80					result = obj_rsakey_set_authdata_usage(hObject, ulAttrib);
81					break;
82				case TSS_TSPATTRIB_KEYINFO_ALGORITHM:
83					result = obj_rsakey_set_alg(hObject, ulAttrib);
84					break;
85				case TSS_TSPATTRIB_KEYINFO_ENCSCHEME:
86					if (ulAttrib != TSS_ES_NONE &&
87					    ulAttrib != TSS_ES_RSAESPKCSV15 &&
88					    ulAttrib != TSS_ES_RSAESOAEP_SHA1_MGF1)
89						return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
90
91					result = obj_rsakey_set_es(hObject, ulAttrib);
92					break;
93				case TSS_TSPATTRIB_KEYINFO_SIGSCHEME:
94					if (ulAttrib != TSS_SS_NONE &&
95					    ulAttrib != TSS_SS_RSASSAPKCS1V15_SHA1 &&
96					    ulAttrib != TSS_SS_RSASSAPKCS1V15_DER  &&
97					    ulAttrib !=	TSS_SS_RSASSAPKCS1V15_INFO)
98						return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
99
100					result = obj_rsakey_set_ss(hObject, ulAttrib);
101					break;
102				case TSS_TSPATTRIB_KEYINFO_KEYFLAGS:
103					result = obj_rsakey_set_flags(hObject, ulAttrib);
104					break;
105				case TSS_TSPATTRIB_KEYINFO_SIZE:
106					result = obj_rsakey_set_size(hObject, ulAttrib);
107					break;
108				default:
109					return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
110			}
111		} else if (attribFlag == TSS_TSPATTRIB_RSAKEY_INFO) {
112			if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_PRIMES) {
113				result = obj_rsakey_set_num_primes(hObject, ulAttrib);
114			} else
115				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
116		} else
117			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
118#endif
119#ifdef TSS_BUILD_NV
120	} else if (obj_is_nvstore(hObject)) {
121		switch (attribFlag) {
122			case TSS_TSPATTRIB_NV_INDEX:
123				if ((result = obj_nvstore_set_index(hObject, ulAttrib)))
124					return result;
125				break;
126			case TSS_TSPATTRIB_NV_DATASIZE:
127				if ((result = obj_nvstore_set_datasize(hObject, ulAttrib)))
128					return result;
129				break;
130			case TSS_TSPATTRIB_NV_PERMISSIONS:
131				if ((result = obj_nvstore_set_permission(hObject, ulAttrib)))
132					return result;
133				break;
134			default:
135				return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
136				break;
137		}
138#endif
139	} else if (obj_is_policy(hObject)) {
140		switch (attribFlag) {
141			case TSS_TSPATTRIB_POLICY_CALLBACK_HMAC:
142			case TSS_TSPATTRIB_POLICY_CALLBACK_XOR_ENC:
143			case TSS_TSPATTRIB_POLICY_CALLBACK_TAKEOWNERSHIP:
144			case TSS_TSPATTRIB_POLICY_CALLBACK_CHANGEAUTHASYM:
145				result = obj_policy_set_cb11(hObject, attribFlag,
146							     subFlag, ulAttrib);
147				break;
148			case TSS_TSPATTRIB_POLICY_SECRET_LIFETIME:
149				if (subFlag == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_ALWAYS ||
150				    subFlag == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_COUNTER ||
151				    subFlag == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_TIMER) {
152					result = obj_policy_set_lifetime(hObject, subFlag,
153									 ulAttrib);
154				} else {
155					result = TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
156				}
157				break;
158			case TSS_TSPATTRIB_SECRET_HASH_MODE:
159				result = obj_policy_set_hash_mode(hObject, ulAttrib);
160				break;
161#ifdef TSS_BUILD_DELEGATION
162			case TSS_TSPATTRIB_POLICY_DELEGATION_INFO:
163				switch (subFlag) {
164				case TSS_TSPATTRIB_POLDEL_TYPE:
165					switch (ulAttrib) {
166					case TSS_DELEGATIONTYPE_NONE:
167					case TSS_DELEGATIONTYPE_OWNER:
168					case TSS_DELEGATIONTYPE_KEY:
169						result = obj_policy_set_delegation_type(hObject,
170											ulAttrib);
171						break;
172					default:
173						result = TSPERR(TSS_E_INVALID_ATTRIB_DATA);
174					}
175					break;
176				case TSS_TSPATTRIB_POLDEL_INDEX:
177					result = obj_policy_set_delegation_index(hObject, ulAttrib);
178					break;
179				case TSS_TSPATTRIB_POLDEL_PER1:
180					result = obj_policy_set_delegation_per1(hObject, ulAttrib);
181					break;
182				case TSS_TSPATTRIB_POLDEL_PER2:
183					result = obj_policy_set_delegation_per2(hObject, ulAttrib);
184					break;
185				default:
186					result = TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
187				}
188				break;
189#endif
190			default:
191				return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
192				break;
193		}
194	} else if (obj_is_context(hObject)) {
195		switch (attribFlag) {
196			case TSS_TSPATTRIB_CONTEXT_SILENT_MODE:
197				if (ulAttrib == TSS_TSPATTRIB_CONTEXT_NOT_SILENT)
198					result = obj_context_set_mode(hObject, ulAttrib);
199				else if (ulAttrib == TSS_TSPATTRIB_CONTEXT_SILENT) {
200					if (obj_context_has_popups(hObject))
201						return TSPERR(TSS_E_SILENT_CONTEXT);
202					result = obj_context_set_mode(hObject, ulAttrib);
203				} else
204					return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
205				break;
206#ifdef TSS_BUILD_TRANSPORT
207			case TSS_TSPATTRIB_CONTEXT_TRANSPORT:
208				if (subFlag == TSS_TSPATTRIB_CONTEXTTRANS_CONTROL) {
209					if (ulAttrib != TSS_TSPATTRIB_DISABLE_TRANSPORT &&
210					    ulAttrib != TSS_TSPATTRIB_ENABLE_TRANSPORT)
211						return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
212
213					result = obj_context_transport_set_control(hObject,
214										   ulAttrib);
215				} else if (subFlag == TSS_TSPATTRIB_CONTEXTTRANS_MODE) {
216					switch (ulAttrib) {
217						case TSS_TSPATTRIB_TRANSPORT_NO_DEFAULT_ENCRYPTION:
218						case TSS_TSPATTRIB_TRANSPORT_DEFAULT_ENCRYPTION:
219						case TSS_TSPATTRIB_TRANSPORT_AUTHENTIC_CHANNEL:
220						case TSS_TSPATTRIB_TRANSPORT_EXCLUSIVE:
221						case TSS_TSPATTRIB_TRANSPORT_STATIC_AUTH:
222							break;
223						default:
224							return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
225					}
226
227					result = obj_context_transport_set_mode(hObject, ulAttrib);
228				} else
229					return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
230
231				break;
232#endif
233			case TSS_TSPATTRIB_SECRET_HASH_MODE:
234				result = obj_context_set_hash_mode(hObject, ulAttrib);
235				break;
236			default:
237				return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
238				break;
239		}
240	} else if (obj_is_tpm(hObject)) {
241		switch (attribFlag) {
242			case TSS_TSPATTRIB_TPM_CALLBACK_COLLATEIDENTITY:
243			case TSS_TSPATTRIB_TPM_CALLBACK_ACTIVATEIDENTITY:
244				if ((result = obj_tpm_set_cb11(hObject, attribFlag, subFlag,
245							       ulAttrib)))
246					return result;
247				break;
248#ifdef TSS_BUILD_AUDIT
249			case TSS_TSPATTRIB_TPM_ORDINAL_AUDIT_STATUS:
250				result = __tspi_audit_set_ordinal_audit_status(hObject, attribFlag,
251									subFlag, ulAttrib);
252				break;
253#endif
254			default:
255				result = TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
256				break;
257		}
258#ifdef TSS_BUILD_SEALX
259	} else if (obj_is_encdata(hObject)) {
260		if (attribFlag != TSS_TSPATTRIB_ENCDATA_SEAL)
261			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
262		if (subFlag == TSS_TSPATTRIB_ENCDATASEAL_PROTECT_MODE) {
263			if (ulAttrib != TSS_TSPATTRIB_ENCDATASEAL_NO_PROTECT &&
264			    ulAttrib != TSS_TSPATTRIB_ENCDATASEAL_PROTECT)
265				return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
266
267			result = obj_encdata_set_seal_protect_mode(hObject, ulAttrib);
268		} else
269			return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
270#endif
271#ifdef TSS_BUILD_DELEGATION
272	} else if (obj_is_delfamily(hObject)) {
273		switch (attribFlag) {
274		case TSS_TSPATTRIB_DELFAMILY_STATE:
275			switch (subFlag) {
276			case TSS_TSPATTRIB_DELFAMILYSTATE_LOCKED:
277				result = obj_delfamily_set_locked(hObject, (TSS_BOOL)ulAttrib, TRUE);
278				break;
279			case TSS_TSPATTRIB_DELFAMILYSTATE_ENABLED:
280				result = obj_delfamily_set_enabled(hObject, (TSS_BOOL)ulAttrib, TRUE);
281				break;
282			default:
283				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
284			}
285			break;
286		default:
287			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
288		}
289#endif
290	} else {
291		if (obj_is_hash(hObject) || obj_is_pcrs(hObject))
292			result = TSPERR(TSS_E_BAD_PARAMETER);
293		else
294			result = TSPERR(TSS_E_INVALID_HANDLE);
295	}
296
297	return result;
298}
299
300TSS_RESULT
301Tspi_GetAttribUint32(TSS_HOBJECT hObject,	/* in */
302		     TSS_FLAG attribFlag,	/* in */
303		     TSS_FLAG subFlag,		/* in */
304		     UINT32 * pulAttrib)	/* out */
305{
306	UINT32 attrib;
307	TSS_RESULT result = TSS_SUCCESS;
308
309	if (pulAttrib == NULL)
310		return TSPERR(TSS_E_BAD_PARAMETER);
311
312	if (obj_is_rsakey(hObject)) {
313#ifdef TSS_BUILD_RSAKEY_LIST
314		if (attribFlag == TSS_TSPATTRIB_KEY_REGISTER) {
315			if (subFlag != 0)
316				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
317
318			if ((result = obj_rsakey_get_pstype(hObject, &attrib)))
319				return result;
320
321			if (attrib == TSS_PS_TYPE_USER)
322				*pulAttrib = TSS_TSPATTRIB_KEYREGISTER_USER;
323			else if (attrib == TSS_PS_TYPE_SYSTEM)
324				*pulAttrib = TSS_TSPATTRIB_KEYREGISTER_SYSTEM;
325			else
326				*pulAttrib = TSS_TSPATTRIB_KEYREGISTER_NO;
327		} else if (attribFlag == TSS_TSPATTRIB_KEY_INFO) {
328			switch (subFlag) {
329			case TSS_TSPATTRIB_KEYINFO_USAGE:
330				if ((result = obj_rsakey_get_usage(hObject, pulAttrib)))
331					return result;
332				break;
333			case TSS_TSPATTRIB_KEYINFO_MIGRATABLE:
334				*pulAttrib = obj_rsakey_is_migratable(hObject);
335				break;
336			case TSS_TSPATTRIB_KEYINFO_REDIRECTED:
337				*pulAttrib = obj_rsakey_is_redirected(hObject);
338				break;
339			case TSS_TSPATTRIB_KEYINFO_VOLATILE:
340				*pulAttrib = obj_rsakey_is_volatile(hObject);
341				break;
342			case TSS_TSPATTRIB_KEYINFO_AUTHUSAGE:
343				/* fall through */
344			case TSS_TSPATTRIB_KEYINFO_AUTHDATAUSAGE:
345				if ((result = obj_rsakey_get_authdata_usage(hObject, pulAttrib)))
346					return result;
347				break;
348			case TSS_TSPATTRIB_KEYINFO_ALGORITHM:
349				if ((result = obj_rsakey_get_alg(hObject, pulAttrib)))
350					return result;
351				break;
352			case TSS_TSPATTRIB_KEYINFO_ENCSCHEME:
353				if ((result = obj_rsakey_get_es(hObject, pulAttrib)))
354					return result;
355				break;
356			case TSS_TSPATTRIB_KEYINFO_SIGSCHEME:
357				if ((result = obj_rsakey_get_ss(hObject, pulAttrib)))
358					return result;
359				break;
360			case TSS_TSPATTRIB_KEYINFO_KEYFLAGS:
361				if ((result = obj_rsakey_get_flags(hObject, pulAttrib)))
362					return result;
363				break;
364			case TSS_TSPATTRIB_KEYINFO_SIZE:
365				if ((result = obj_rsakey_get_size(hObject, pulAttrib)))
366					return result;
367				break;
368#ifdef TSS_BUILD_CMK
369			case TSS_TSPATTRIB_KEYINFO_CMK:
370				*pulAttrib = obj_rsakey_is_cmk(hObject);
371				break;
372#endif
373			default:
374				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
375			}
376		} else if (attribFlag == TSS_TSPATTRIB_RSAKEY_INFO) {
377			if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_KEYSIZE) {
378				if ((result = obj_rsakey_get_size(hObject, pulAttrib)))
379					return result;
380			} else if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_PRIMES) {
381				if ((result = obj_rsakey_get_num_primes(hObject, pulAttrib)))
382					return result;
383			} else {
384				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
385			}
386		} else if (attribFlag == TSS_TSPATTRIB_KEY_PCR_LONG) {
387			if (subFlag == TSS_TSPATTRIB_KEYPCRLONG_LOCALITY_ATCREATION ||
388			    subFlag == TSS_TSPATTRIB_KEYPCRLONG_LOCALITY_ATRELEASE) {
389				result = obj_rsakey_get_pcr_locality(hObject, subFlag, pulAttrib);
390			} else
391				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
392		} else
393			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
394#endif
395#ifdef TSS_BUILD_NV
396	} else if (obj_is_nvstore(hObject)) {
397		switch (attribFlag) {
398			case TSS_TSPATTRIB_NV_INDEX:
399				if ((result = obj_nvstore_get_index(hObject, pulAttrib)))
400					return result;
401				break;
402			case TSS_TSPATTRIB_NV_DATASIZE:
403				if ((result = obj_nvstore_get_datasize(hObject, pulAttrib)))
404					return result;
405				break;
406			case TSS_TSPATTRIB_NV_PERMISSIONS:
407				if ((result = obj_nvstore_get_permission(hObject, pulAttrib)))
408					return result;
409				break;
410			case TSS_TSPATTRIB_NV_STATE:
411				switch (subFlag) {
412					case TSS_TSPATTRIB_NVSTATE_READSTCLEAR:
413						if ((result =
414						     obj_nvstore_get_state_readstclear(hObject,
415										       pulAttrib)))
416							return result;
417						break;
418					case TSS_TSPATTRIB_NVSTATE_WRITEDEFINE:
419						if ((result =
420						     obj_nvstore_get_state_writedefine(hObject,
421										       pulAttrib)))
422							return result;
423						break;
424					case TSS_TSPATTRIB_NVSTATE_WRITESTCLEAR:
425						if ((result =
426						     obj_nvstore_get_state_writestclear(hObject,
427											pulAttrib)))
428							return result;
429						break;
430					default:
431						return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
432					}
433				break;
434			case TSS_TSPATTRIB_NV_PCR:
435				switch (subFlag) {
436					case TSS_TSPATTRIB_NVPCR_READLOCALITYATRELEASE:
437						if ((result =
438						     obj_nvstore_get_readlocalityatrelease(hObject,
439										   pulAttrib)))
440							return result;
441						break;
442					case TSS_TSPATTRIB_NVPCR_WRITELOCALITYATRELEASE:
443						if ((result =
444						     obj_nvstore_get_writelocalityatrelease(hObject,
445										    pulAttrib)))
446							return result;
447						break;
448					default:
449						return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
450					}
451				break;
452			case TSS_TSPATTRIB_KEYCONTROL_OWNEREVICT:
453				if ((result = obj_rsakey_get_ownerevict(hObject, pulAttrib)))
454					return result;
455				break;
456			default:
457				return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
458		}
459#endif
460	} else if (obj_is_policy(hObject)) {
461		switch (attribFlag) {
462			case TSS_TSPATTRIB_POLICY_CALLBACK_HMAC:
463			case TSS_TSPATTRIB_POLICY_CALLBACK_XOR_ENC:
464			case TSS_TSPATTRIB_POLICY_CALLBACK_TAKEOWNERSHIP:
465			case TSS_TSPATTRIB_POLICY_CALLBACK_CHANGEAUTHASYM:
466				if ((result = obj_policy_get_cb11(hObject, attribFlag, pulAttrib)))
467					return result;
468				break;
469			case TSS_TSPATTRIB_POLICY_SECRET_LIFETIME:
470				if ((result = obj_policy_get_lifetime(hObject, &attrib)))
471					return result;
472
473				if (subFlag == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_ALWAYS) {
474					if (attrib == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_ALWAYS)
475						*pulAttrib = TRUE;
476					else
477						*pulAttrib = FALSE;
478				} else if (subFlag == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_COUNTER) {
479					if (attrib != TSS_TSPATTRIB_POLICYSECRET_LIFETIME_COUNTER)
480						return TSPERR(TSS_E_BAD_PARAMETER);
481					if ((result = obj_policy_get_counter(hObject, pulAttrib)))
482						return result;
483				} else if (subFlag == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_TIMER) {
484					if ((result =
485					    obj_policy_get_secs_until_expired(hObject, pulAttrib)))
486						return result;
487				} else
488					return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
489				break;
490			case TSS_TSPATTRIB_SECRET_HASH_MODE:
491				if (subFlag == TSS_TSPATTRIB_SECRET_HASH_MODE_POPUP)
492					result = obj_policy_get_hash_mode(hObject, pulAttrib);
493				else
494					return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
495				break;
496#ifdef TSS_BUILD_DELEGATION
497			case TSS_TSPATTRIB_POLICY_DELEGATION_INFO:
498				switch (subFlag) {
499				case TSS_TSPATTRIB_POLDEL_TYPE:
500					result = obj_policy_get_delegation_type(hObject,
501							pulAttrib);
502					break;
503				case TSS_TSPATTRIB_POLDEL_INDEX:
504					result = obj_policy_get_delegation_index(hObject,
505							pulAttrib);
506					break;
507				case TSS_TSPATTRIB_POLDEL_PER1:
508					result = obj_policy_get_delegation_per1(hObject,
509							pulAttrib);
510					break;
511				case TSS_TSPATTRIB_POLDEL_PER2:
512					result = obj_policy_get_delegation_per2(hObject,
513							pulAttrib);
514					break;
515				case TSS_TSPATTRIB_POLDEL_LABEL:
516					result = obj_policy_get_delegation_label(hObject,
517							(BYTE *)pulAttrib);
518					break;
519				case TSS_TSPATTRIB_POLDEL_FAMILYID:
520					result = obj_policy_get_delegation_familyid(hObject,
521							pulAttrib);
522					break;
523				case TSS_TSPATTRIB_POLDEL_VERCOUNT:
524					result = obj_policy_get_delegation_vercount(hObject,
525							pulAttrib);
526					break;
527				default:
528					result = TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
529				}
530				break;
531			case TSS_TSPATTRIB_POLICY_DELEGATION_PCR:
532				switch (subFlag) {
533				case TSS_TSPATTRIB_POLDELPCR_LOCALITY:
534					result = obj_policy_get_delegation_pcr_locality(hObject,
535							pulAttrib);
536					break;
537				default:
538					result = TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
539				}
540				break;
541#endif
542			default:
543				return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
544				break;
545		}
546	} else if (obj_is_context(hObject)) {
547		switch (attribFlag) {
548			case TSS_TSPATTRIB_CONTEXT_SILENT_MODE:
549				if ((result = obj_context_get_mode(hObject, pulAttrib)))
550					return result;
551				break;
552			case TSS_TSPATTRIB_SECRET_HASH_MODE:
553				if (subFlag == TSS_TSPATTRIB_SECRET_HASH_MODE_POPUP)
554					result = obj_context_get_hash_mode(hObject, pulAttrib);
555				else
556					return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
557				break;
558#ifdef TSS_BUILD_TRANSPORT
559			case TSS_TSPATTRIB_CONTEXT_TRANSPORT:
560				if (subFlag == TSS_TSPATTRIB_DISABLE_TRANSPORT ||
561				    subFlag == TSS_TSPATTRIB_ENABLE_TRANSPORT) {
562					result = obj_context_transport_get_control(hObject, subFlag,
563										   pulAttrib);
564				} else if (
565					subFlag == TSS_TSPATTRIB_TRANSPORT_NO_DEFAULT_ENCRYPTION ||
566					subFlag == TSS_TSPATTRIB_TRANSPORT_DEFAULT_ENCRYPTION ||
567					subFlag == TSS_TSPATTRIB_TRANSPORT_AUTHENTIC_CHANNEL ||
568					subFlag == TSS_TSPATTRIB_TRANSPORT_EXCLUSIVE ||
569					subFlag == TSS_TSPATTRIB_TRANSPORT_STATIC_AUTH) {
570					result = obj_context_transport_get_mode(hObject, subFlag,
571										pulAttrib);
572				} else
573					return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
574				break;
575#endif
576			default:
577				return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
578				break;
579		}
580	} else if (obj_is_tpm(hObject)) {
581		switch (attribFlag) {
582			case TSS_TSPATTRIB_TPM_CALLBACK_COLLATEIDENTITY:
583			case TSS_TSPATTRIB_TPM_CALLBACK_ACTIVATEIDENTITY:
584				if ((result = obj_tpm_get_cb11(hObject, attribFlag, pulAttrib)))
585					return result;
586				break;
587			default:
588				result = TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
589				break;
590		}
591	} else if (obj_is_encdata(hObject)) {
592#ifdef TSS_BUILD_SEALX
593		if (attribFlag == TSS_TSPATTRIB_ENCDATA_SEAL) {
594			if (subFlag == TSS_TSPATTRIB_ENCDATASEAL_PROTECT_MODE)
595				result = obj_encdata_get_seal_protect_mode(hObject, pulAttrib);
596			else
597				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
598		} else if (attribFlag == TSS_TSPATTRIB_ENCDATA_PCR_LONG) {
599			if (subFlag == TSS_TSPATTRIB_ENCDATAPCRLONG_LOCALITY_ATCREATION ||
600			    subFlag == TSS_TSPATTRIB_ENCDATAPCRLONG_LOCALITY_ATRELEASE) {
601				result = obj_encdata_get_pcr_locality(hObject, subFlag, pulAttrib);
602			} else
603				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
604		} else
605			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
606#endif
607#ifdef TSS_BUILD_DELEGATION
608	} else if (obj_is_delfamily(hObject)) {
609		switch (attribFlag) {
610		case TSS_TSPATTRIB_DELFAMILY_STATE:
611			switch (subFlag) {
612			case TSS_TSPATTRIB_DELFAMILYSTATE_LOCKED:
613				result = obj_delfamily_get_locked(hObject, (TSS_BOOL *)pulAttrib);
614				break;
615			case TSS_TSPATTRIB_DELFAMILYSTATE_ENABLED:
616				result = obj_delfamily_get_enabled(hObject, (TSS_BOOL *)pulAttrib);
617				break;
618			default:
619				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
620			}
621			break;
622		case TSS_TSPATTRIB_DELFAMILY_INFO:
623			switch (subFlag) {
624			case TSS_TSPATTRIB_DELFAMILYINFO_LABEL:
625				result = obj_delfamily_get_label(hObject, (BYTE *)pulAttrib);
626				break;
627			case TSS_TSPATTRIB_DELFAMILYINFO_VERCOUNT:
628				result = obj_delfamily_get_vercount(hObject, pulAttrib);
629				break;
630			case TSS_TSPATTRIB_DELFAMILYINFO_FAMILYID:
631				result = obj_delfamily_get_familyid(hObject, pulAttrib);
632				break;
633			default:
634				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
635			}
636			break;
637		default:
638			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
639		}
640#endif
641	} else {
642		if (obj_is_hash(hObject) || obj_is_pcrs(hObject))
643			result = TSPERR(TSS_E_BAD_PARAMETER);
644		else
645			result = TSPERR(TSS_E_INVALID_HANDLE);
646	}
647
648	return result;
649}
650
651TSS_RESULT
652Tspi_SetAttribData(TSS_HOBJECT hObject,		/* in */
653		   TSS_FLAG attribFlag,		/* in */
654		   TSS_FLAG subFlag,		/* in */
655		   UINT32 ulAttribDataSize,	/* in */
656		   BYTE * rgbAttribData)	/* in */
657{
658	TSS_RESULT result;
659	BYTE *string = NULL;
660
661	if (obj_is_rsakey(hObject)) {
662#ifdef TSS_BUILD_RSAKEY_LIST
663		if (attribFlag == TSS_TSPATTRIB_KEY_BLOB) {
664			if (subFlag == TSS_TSPATTRIB_KEYBLOB_BLOB) {
665				/* A TPM_KEY(12) structure, in blob form */
666				result = obj_rsakey_set_tcpakey(hObject, ulAttribDataSize,
667								rgbAttribData);
668				if (result == TSS_SUCCESS)
669					result = obj_rsakey_set_tcs_handle(hObject, 0);
670			} else if (subFlag == TSS_TSPATTRIB_KEYBLOB_PUBLIC_KEY) {
671				/* A TCPA_PUBKEY structure, in blob form */
672				result = obj_rsakey_set_pubkey(hObject, FALSE, rgbAttribData);
673			} else if (subFlag == TSS_TSPATTRIB_KEYBLOB_PRIVATE_KEY) {
674				/* A blob, either encrypted or unencrypted */
675				result = obj_rsakey_set_privkey(hObject, FALSE, ulAttribDataSize,
676								rgbAttribData);
677			} else {
678				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
679			}
680		} else if (attribFlag == TSS_TSPATTRIB_RSAKEY_INFO) {
681			if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_EXPONENT) {
682				result = obj_rsakey_set_exponent(hObject, ulAttribDataSize,
683								 rgbAttribData);
684			} else if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_MODULUS) {
685				result = obj_rsakey_set_modulus(hObject, ulAttribDataSize,
686								rgbAttribData);
687			} else {
688				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
689			}
690#ifdef TSS_BUILD_CMK
691		} else if (attribFlag == TSS_TSPATTRIB_KEY_CMKINFO) {
692			if (subFlag == TSS_TSPATTRIB_KEYINFO_CMK_MA_APPROVAL) {
693				result = obj_rsakey_set_msa_approval(hObject, ulAttribDataSize,
694						rgbAttribData);
695			} else if (subFlag == TSS_TSPATTRIB_KEYINFO_CMK_MA_DIGEST) {
696				result = obj_rsakey_set_msa_digest(hObject, ulAttribDataSize,
697						rgbAttribData);
698			} else {
699				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
700			}
701#endif
702		} else {
703			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
704		}
705#endif
706	} else if (obj_is_encdata(hObject)) {
707#ifdef TSS_BUILD_ENCDATA_LIST
708		if (attribFlag != TSS_TSPATTRIB_ENCDATA_BLOB)
709			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
710		if (subFlag != TSS_TSPATTRIB_ENCDATABLOB_BLOB)
711			return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
712
713		result = obj_encdata_set_data(hObject, ulAttribDataSize, rgbAttribData);
714#endif
715	} else if (obj_is_policy(hObject)) {
716		switch (attribFlag) {
717			case TSS_TSPATTRIB_POLICY_POPUPSTRING:
718				if ((string = Trspi_UNICODE_To_Native(rgbAttribData,
719								      NULL)) == NULL)
720					return TSPERR(TSS_E_INTERNAL_ERROR);
721
722				result = obj_policy_set_string(hObject,
723							       ulAttribDataSize,
724							       string);
725				break;
726			case TSS_TSPATTRIB_POLICY_CALLBACK_HMAC:
727			case TSS_TSPATTRIB_POLICY_CALLBACK_XOR_ENC:
728			case TSS_TSPATTRIB_POLICY_CALLBACK_TAKEOWNERSHIP:
729			case TSS_TSPATTRIB_POLICY_CALLBACK_CHANGEAUTHASYM:
730#ifdef TSS_BUILD_SEALX
731			case TSS_TSPATTRIB_POLICY_CALLBACK_SEALX_MASK:
732#endif
733				result = obj_policy_set_cb12(hObject, attribFlag,
734							     rgbAttribData);
735				break;
736#ifdef TSS_BUILD_DELEGATION
737			case TSS_TSPATTRIB_POLICY_DELEGATION_INFO:
738				switch (subFlag) {
739				case TSS_TSPATTRIB_POLDEL_OWNERBLOB:
740					result = obj_policy_set_delegation_blob(hObject,
741							TSS_DELEGATIONTYPE_OWNER,
742							ulAttribDataSize, rgbAttribData);
743					break;
744				case TSS_TSPATTRIB_POLDEL_KEYBLOB:
745					result = obj_policy_set_delegation_blob(hObject,
746							TSS_DELEGATIONTYPE_KEY,
747							ulAttribDataSize, rgbAttribData);
748					break;
749				default:
750					result = TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
751				}
752				break;
753#endif
754			default:
755				return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
756				break;
757		}
758	} else if (obj_is_hash(hObject)) {
759#ifdef TSS_BUILD_HASH_LIST
760		if (attribFlag != TSS_TSPATTRIB_HASH_IDENTIFIER)
761			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
762
763		if (subFlag != 0)
764			return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
765
766		result = obj_hash_set_value(hObject, ulAttribDataSize, rgbAttribData);
767#endif
768	} else if (obj_is_tpm(hObject)) {
769		switch (attribFlag) {
770			case TSS_TSPATTRIB_TPM_CALLBACK_COLLATEIDENTITY:
771			case TSS_TSPATTRIB_TPM_CALLBACK_ACTIVATEIDENTITY:
772				result = obj_tpm_set_cb12(hObject, attribFlag,
773							  rgbAttribData);
774				break;
775			case TSS_TSPATTRIB_TPM_CREDENTIAL:
776				if (subFlag == TSS_TPMATTRIB_EKCERT ||
777				    subFlag == TSS_TPMATTRIB_TPM_CC ||
778				    subFlag == TSS_TPMATTRIB_PLATFORMCERT ||
779				    subFlag == TSS_TPMATTRIB_PLATFORM_CC) {
780					result = obj_tpm_set_cred(hObject, subFlag,
781								  ulAttribDataSize, rgbAttribData);
782				} else {
783					return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
784				}
785				break;
786			default:
787				return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
788				break;
789		}
790	} else if (obj_is_migdata(hObject)) {
791#ifdef TSS_BUILD_CMK
792		switch (attribFlag) {
793		case TSS_MIGATTRIB_MIGRATIONBLOB:
794			switch (subFlag) {
795			case TSS_MIGATTRIB_MIG_MSALIST_PUBKEY_BLOB:
796			case TSS_MIGATTRIB_MIG_AUTHORITY_PUBKEY_BLOB:
797			case TSS_MIGATTRIB_MIG_DESTINATION_PUBKEY_BLOB:
798			case TSS_MIGATTRIB_MIG_SOURCE_PUBKEY_BLOB:
799				result = obj_migdata_set_migrationblob(hObject, subFlag,
800						ulAttribDataSize, rgbAttribData);
801				break;
802			default:
803				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
804			}
805			break;
806		case TSS_MIGATTRIB_MIGRATIONTICKET:
807			if (subFlag != 0)
808				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
809			result = obj_migdata_set_ticket_blob(hObject, ulAttribDataSize, rgbAttribData);
810			break;
811		case TSS_MIGATTRIB_AUTHORITY_DATA:
812			switch (subFlag) {
813			case TSS_MIGATTRIB_AUTHORITY_DIGEST:
814			case TSS_MIGATTRIB_AUTHORITY_APPROVAL_HMAC:
815			case TSS_MIGATTRIB_AUTHORITY_MSALIST:
816				result = obj_migdata_set_authoritydata(hObject, subFlag,
817						ulAttribDataSize, rgbAttribData);
818				break;
819			default:
820				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
821			}
822			break;
823		case TSS_MIGATTRIB_MIG_AUTH_DATA:
824			switch (subFlag) {
825			case TSS_MIGATTRIB_MIG_AUTH_AUTHORITY_DIGEST:
826			case TSS_MIGATTRIB_MIG_AUTH_DESTINATION_DIGEST:
827			case TSS_MIGATTRIB_MIG_AUTH_SOURCE_DIGEST:
828				result = obj_migdata_set_migauthdata(hObject, subFlag,
829						ulAttribDataSize, rgbAttribData);
830				break;
831			default:
832				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
833			}
834			break;
835		case TSS_MIGATTRIB_TICKET_DATA:
836			switch (subFlag) {
837			case TSS_MIGATTRIB_TICKET_SIG_DIGEST:
838			case TSS_MIGATTRIB_TICKET_SIG_VALUE:
839			case TSS_MIGATTRIB_TICKET_SIG_TICKET:
840			case TSS_MIGATTRIB_TICKET_RESTRICT_TICKET:
841				result = obj_migdata_set_ticketdata(hObject, subFlag,
842						ulAttribDataSize, rgbAttribData);
843				break;
844			default:
845				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
846			}
847			break;
848		default:
849			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
850			break;
851		}
852#endif
853	} else {
854		if (obj_is_pcrs(hObject) || obj_is_context(hObject))
855			result = TSPERR(TSS_E_BAD_PARAMETER);
856#ifdef TSS_BUILD_NV
857		else if (obj_is_nvstore(hObject))
858			result = TSPERR(TSS_E_BAD_PARAMETER);
859#endif
860		else
861			result = TSPERR(TSS_E_INVALID_HANDLE);
862	}
863
864	return result;
865}
866
867TSS_RESULT
868Tspi_GetAttribData(TSS_HOBJECT hObject,		/* in */
869		   TSS_FLAG attribFlag,		/* in */
870		   TSS_FLAG subFlag,		/* in */
871		   UINT32 * pulAttribDataSize,	/* out */
872		   BYTE ** prgbAttribData)	/* out */
873{
874	TSS_RESULT result;
875
876	if (pulAttribDataSize == NULL || prgbAttribData == NULL)
877		return TSPERR(TSS_E_BAD_PARAMETER);
878
879	if (obj_is_rsakey(hObject)) {
880#ifdef TSS_BUILD_RSAKEY_LIST
881		if (attribFlag == TSS_TSPATTRIB_KEY_BLOB) {
882			if (subFlag == TSS_TSPATTRIB_KEYBLOB_BLOB) {
883				/* A TPM_KEY(12) structure, in blob form */
884				result = obj_rsakey_get_blob(hObject, pulAttribDataSize,
885							     prgbAttribData);
886			} else if (subFlag == TSS_TSPATTRIB_KEYBLOB_PRIVATE_KEY) {
887				/* A blob, either encrypted or unencrypted */
888				result = obj_rsakey_get_priv_blob(hObject, pulAttribDataSize,
889								  prgbAttribData);
890			} else if (subFlag == TSS_TSPATTRIB_KEYBLOB_PUBLIC_KEY) {
891				/* A TCPA_PUBKEY structure, in blob form */
892				result = obj_rsakey_get_pub_blob(hObject, pulAttribDataSize,
893								 prgbAttribData);
894			} else {
895				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
896			}
897		} else if (attribFlag == TSS_TSPATTRIB_KEY_INFO) {
898			if (subFlag != TSS_TSPATTRIB_KEYINFO_VERSION)
899				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
900
901			result = obj_rsakey_get_version(hObject, pulAttribDataSize,
902							prgbAttribData);
903		} else if (attribFlag == TSS_TSPATTRIB_RSAKEY_INFO) {
904			if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_EXPONENT) {
905				result = obj_rsakey_get_exponent(hObject, pulAttribDataSize,
906								 prgbAttribData);
907			} else if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_MODULUS) {
908				result = obj_rsakey_get_modulus(hObject, pulAttribDataSize,
909								prgbAttribData);
910			} else
911				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
912		} else if (attribFlag == TSS_TSPATTRIB_KEY_UUID) {
913			if (subFlag)
914				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
915
916			result = obj_rsakey_get_uuid(hObject, pulAttribDataSize, prgbAttribData);
917		} else if (attribFlag == TSS_TSPATTRIB_KEY_PCR) {
918			if (subFlag == TSS_TSPATTRIB_KEYPCR_DIGEST_ATCREATION ||
919			    subFlag == TSS_TSPATTRIB_KEYPCR_DIGEST_ATRELEASE) {
920				result = obj_rsakey_get_pcr_digest(hObject, TSS_PCRS_STRUCT_INFO,
921								   subFlag, pulAttribDataSize,
922								   prgbAttribData);
923			} else if (subFlag == TSS_TSPATTRIB_KEYPCR_SELECTION) {
924				result = obj_rsakey_get_pcr_selection(hObject, TSS_PCRS_STRUCT_INFO,
925								      subFlag, pulAttribDataSize,
926								      prgbAttribData);
927			} else
928				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
929		} else if (attribFlag == TSS_TSPATTRIB_KEY_PCR_LONG) {
930			if (subFlag == TSS_TSPATTRIB_KEYPCRLONG_DIGEST_ATCREATION ||
931			    subFlag == TSS_TSPATTRIB_KEYPCRLONG_DIGEST_ATRELEASE) {
932				result = obj_rsakey_get_pcr_digest(hObject,
933								   TSS_PCRS_STRUCT_INFO_LONG,
934								   subFlag, pulAttribDataSize,
935								   prgbAttribData);
936			} else if (subFlag == TSS_TSPATTRIB_KEYPCRLONG_CREATION_SELECTION ||
937			           subFlag == TSS_TSPATTRIB_KEYPCRLONG_RELEASE_SELECTION) {
938				result = obj_rsakey_get_pcr_selection(hObject,
939								      TSS_PCRS_STRUCT_INFO_LONG,
940								      subFlag, pulAttribDataSize,
941								      prgbAttribData);
942			} else
943				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
944#ifdef TSS_BUILD_CMK
945		} else if (attribFlag == TSS_TSPATTRIB_KEY_CMKINFO) {
946			if (subFlag == TSS_TSPATTRIB_KEYINFO_CMK_MA_APPROVAL) {
947				result = obj_rsakey_get_msa_approval(hObject, pulAttribDataSize,
948						prgbAttribData);
949			} else if (subFlag == TSS_TSPATTRIB_KEYINFO_CMK_MA_DIGEST) {
950				result = obj_rsakey_get_msa_digest(hObject, pulAttribDataSize,
951						prgbAttribData);
952			} else {
953				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
954			}
955#endif
956		} else
957			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
958#endif
959#ifdef TSS_BUILD_NV
960	} else if (obj_is_nvstore(hObject)) {
961		if (attribFlag == TSS_TSPATTRIB_NV_PCR) {
962			switch (subFlag) {
963				case TSS_TSPATTRIB_NVPCR_READDIGESTATRELEASE:
964					if ((result = obj_nvstore_get_readdigestatrelease(hObject,
965									pulAttribDataSize,
966									prgbAttribData)))
967							return result;
968					break;
969				case TSS_TSPATTRIB_NVPCR_READPCRSELECTION:
970					if ((result = obj_nvstore_get_readpcrselection(
971									hObject,
972									pulAttribDataSize,
973									prgbAttribData)))
974						return result;
975					break;
976				case TSS_TSPATTRIB_NVPCR_WRITEDIGESTATRELEASE:
977					if ((result = obj_nvstore_get_writedigestatrelease(hObject,
978									pulAttribDataSize,
979									prgbAttribData)))
980						return result;
981					break;
982				case TSS_TSPATTRIB_NVPCR_WRITEPCRSELECTION:
983					if ((result = obj_nvstore_get_writepcrselection(hObject,
984									pulAttribDataSize,
985									prgbAttribData)))
986						return result;
987					break;
988				default:
989					return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
990			}
991		} else
992			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
993#endif
994	} else if (obj_is_encdata(hObject)) {
995#ifdef TSS_BUILD_ENCDATA_LIST
996		if (attribFlag == TSS_TSPATTRIB_ENCDATA_BLOB) {
997			if (subFlag != TSS_TSPATTRIB_ENCDATABLOB_BLOB)
998				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
999
1000			result = obj_encdata_get_data(hObject, pulAttribDataSize, prgbAttribData);
1001		} else if (attribFlag == TSS_TSPATTRIB_ENCDATA_PCR) {
1002			if (subFlag == TSS_TSPATTRIB_ENCDATAPCR_DIGEST_ATCREATION ||
1003			    subFlag == TSS_TSPATTRIB_ENCDATAPCR_DIGEST_RELEASE) {
1004				result = obj_encdata_get_pcr_digest(hObject, TSS_PCRS_STRUCT_INFO,
1005								    subFlag, pulAttribDataSize,
1006								    prgbAttribData);
1007			} else if (subFlag == TSS_TSPATTRIB_ENCDATAPCR_SELECTION) {
1008				result = obj_encdata_get_pcr_selection(hObject,
1009								       TSS_PCRS_STRUCT_INFO,
1010								       subFlag, pulAttribDataSize,
1011								       prgbAttribData);
1012			} else {
1013				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1014			}
1015		} else if (attribFlag == TSS_TSPATTRIB_ENCDATA_PCR_LONG) {
1016			if (subFlag == TSS_TSPATTRIB_ENCDATAPCRLONG_CREATION_SELECTION ||
1017			    subFlag == TSS_TSPATTRIB_ENCDATAPCRLONG_RELEASE_SELECTION) {
1018				result = obj_encdata_get_pcr_selection(hObject,
1019								       TSS_PCRS_STRUCT_INFO_LONG,
1020								       subFlag, pulAttribDataSize,
1021								       prgbAttribData);
1022			} else if (subFlag == TSS_TSPATTRIB_ENCDATAPCRLONG_DIGEST_ATCREATION ||
1023				   subFlag == TSS_TSPATTRIB_ENCDATAPCRLONG_DIGEST_ATRELEASE) {
1024				result = obj_encdata_get_pcr_digest(hObject,
1025								    TSS_PCRS_STRUCT_INFO_LONG,
1026								    subFlag, pulAttribDataSize,
1027								    prgbAttribData);
1028			} else {
1029				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1030			}
1031		} else {
1032			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
1033		}
1034#endif
1035	} else if (obj_is_context(hObject)) {
1036		if (attribFlag != TSS_TSPATTRIB_CONTEXT_MACHINE_NAME)
1037			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
1038
1039		if ((result = obj_context_get_machine_name_attrib(hObject,
1040								  pulAttribDataSize,
1041								  prgbAttribData)))
1042			return result;
1043	} else if (obj_is_policy(hObject)) {
1044		switch (attribFlag) {
1045			case TSS_TSPATTRIB_POLICY_CALLBACK_HMAC:
1046			case TSS_TSPATTRIB_POLICY_CALLBACK_XOR_ENC:
1047			case TSS_TSPATTRIB_POLICY_CALLBACK_TAKEOWNERSHIP:
1048			case TSS_TSPATTRIB_POLICY_CALLBACK_CHANGEAUTHASYM:
1049#ifdef TSS_BUILD_SEALX
1050			case TSS_TSPATTRIB_POLICY_CALLBACK_SEALX_MASK:
1051#endif
1052				result = obj_policy_get_cb12(hObject, attribFlag,
1053							     pulAttribDataSize, prgbAttribData);
1054				break;
1055			case TSS_TSPATTRIB_POLICY_POPUPSTRING:
1056				if ((result = obj_policy_get_string(hObject, pulAttribDataSize,
1057								    prgbAttribData)))
1058					return result;
1059				break;
1060#ifdef TSS_BUILD_DELEGATION
1061			case TSS_TSPATTRIB_POLICY_DELEGATION_INFO:
1062				switch (subFlag) {
1063				case TSS_TSPATTRIB_POLDEL_OWNERBLOB:
1064					result = obj_policy_get_delegation_blob(hObject,
1065							TSS_DELEGATIONTYPE_OWNER,
1066							pulAttribDataSize, prgbAttribData);
1067					break;
1068				case TSS_TSPATTRIB_POLDEL_KEYBLOB:
1069					result = obj_policy_get_delegation_blob(hObject,
1070							TSS_DELEGATIONTYPE_KEY,
1071							pulAttribDataSize, prgbAttribData);
1072					break;
1073				default:
1074					return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1075				}
1076				break;
1077			case TSS_TSPATTRIB_POLICY_DELEGATION_PCR:
1078				switch (subFlag) {
1079				case TSS_TSPATTRIB_POLDELPCR_DIGESTATRELEASE:
1080					result = obj_policy_get_delegation_pcr_digest(hObject,
1081							pulAttribDataSize, prgbAttribData);
1082					break;
1083				case TSS_TSPATTRIB_POLDELPCR_SELECTION:
1084					result = obj_policy_get_delegation_pcr_selection(hObject,
1085							pulAttribDataSize, prgbAttribData);
1086					break;
1087				default:
1088					return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1089				}
1090				break;
1091#endif
1092			default:
1093				result = TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
1094				break;
1095		}
1096	} else if (obj_is_tpm(hObject)) {
1097		switch (attribFlag) {
1098			case TSS_TSPATTRIB_TPM_CALLBACK_COLLATEIDENTITY:
1099			case TSS_TSPATTRIB_TPM_CALLBACK_ACTIVATEIDENTITY:
1100				result = obj_tpm_get_cb12(hObject, attribFlag,
1101							  pulAttribDataSize, prgbAttribData);
1102				break;
1103			default:
1104				return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
1105				break;
1106		}
1107	} else if (obj_is_migdata(hObject)) {
1108#ifdef TSS_BUILD_CMK
1109		switch (attribFlag) {
1110		case TSS_MIGATTRIB_MIGRATIONBLOB:
1111			switch (subFlag) {
1112			case TSS_MIGATTRIB_MIG_XOR_BLOB:
1113				result = obj_migdata_get_migrationblob(hObject, subFlag,
1114						pulAttribDataSize, prgbAttribData);
1115				break;
1116			default:
1117				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1118			}
1119			break;
1120		case TSS_MIGATTRIB_AUTHORITY_DATA:
1121			switch (subFlag) {
1122			case TSS_MIGATTRIB_AUTHORITY_DIGEST:
1123			case TSS_MIGATTRIB_AUTHORITY_APPROVAL_HMAC:
1124			case TSS_MIGATTRIB_AUTHORITY_MSALIST:
1125				result = obj_migdata_get_authoritydata(hObject, subFlag,
1126						pulAttribDataSize, prgbAttribData);
1127				break;
1128			default:
1129				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1130			}
1131			break;
1132		case TSS_MIGATTRIB_MIG_AUTH_DATA:
1133			switch (subFlag) {
1134			case TSS_MIGATTRIB_MIG_AUTH_AUTHORITY_DIGEST:
1135			case TSS_MIGATTRIB_MIG_AUTH_DESTINATION_DIGEST:
1136			case TSS_MIGATTRIB_MIG_AUTH_SOURCE_DIGEST:
1137				result = obj_migdata_get_migauthdata(hObject, subFlag,
1138						pulAttribDataSize, prgbAttribData);
1139				break;
1140			default:
1141				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1142			}
1143			break;
1144		case TSS_MIGATTRIB_TICKET_DATA:
1145			switch (subFlag) {
1146			case TSS_MIGATTRIB_TICKET_SIG_TICKET:
1147				result = obj_migdata_get_ticketdata(hObject, subFlag,
1148						pulAttribDataSize, prgbAttribData);
1149				break;
1150			default:
1151				return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1152			}
1153			break;
1154		default:
1155			return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
1156			break;
1157		}
1158#endif
1159	} else {
1160		if (obj_is_hash(hObject) || obj_is_pcrs(hObject))
1161			result = TSPERR(TSS_E_BAD_PARAMETER);
1162		else
1163			result = TSPERR(TSS_E_INVALID_HANDLE);
1164	}
1165
1166	return result;
1167}
1168
1169