/* * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved. * * The contents of this file constitute Original Code as defined in and are * subject to the Apple Public Source License Version 1.2 (the 'License'). * You may not use this file except in compliance with the License. Please obtain * a copy of the License at http://www.apple.com/publicsource and read it before * using this file. * * This Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the * specific language governing rights and limitations under the License. */ // SampleGroup.cpp // // CSSM_SAMPLE POD routines #ifdef __MWERKS__ #define _CPP_UTILITIES #endif #include #include #include #include CssmSample::CssmSample() { Verifier = NULL; TypedSample.ListType = CSSM_LIST_TYPE_UNKNOWN; TypedSample.Head = NULL; TypedSample.Tail = NULL; } CssmSample::CssmSample( CSSM_LIST &list, CSSM_SUBSERVICE_UID *verifier) { Verifier = verifier; TypedSample.ListType = list.ListType; TypedSample.Head = list.Head; TypedSample.Tail = list.Tail; } CssmSample::~CssmSample() { } CssmSample* CssmSample::operator = (CssmSample& sample) { if( this == &sample ) return NULL; this->Verifier = sample.Verifier; this->TypedSample = sample.TypedSample; return this; } CSSM_RETURN CssmSample::AddPasswordImmediate( char* password, CSSM_SUBSERVICE_UID *optionalVerifier ) { CSSM_RETURN result = CSSM_OK; CSSM_LIST_ELEMENT* passwordTypeElement = MakeWordIDElement( CSSM_SAMPLE_TYPE_PASSWORD ); // declares the type to be password (CssmList::overlay(TypedSample)).append( ListElement::overlay(passwordTypeElement) ); char* permanentPasswordData = (char*)malloc( strlen(password) + 1 ); // need error handling. Going to assume these succeed for now strcpy( permanentPasswordData, password ); CSSM_LIST_ELEMENT* passwordElement = MakeDatumElement( (void*)permanentPasswordData, strlen(password) ); // has the password CSSM_DATA in it (CssmList::overlay(TypedSample)).append( ListElement::overlay(passwordElement) ); Verifier = optionalVerifier; return result; } CSSM_RETURN CssmSample::AddPasswordCallback( ) { CSSM_RETURN result = CSSM_OK; CSSM_LIST_ELEMENT* passwordCallbackElement = MakeWordIDElement( CSSM_SAMPLE_TYPE_PASSWORD ); // declares the type to be password (CssmList::overlay(TypedSample)).append( ListElement::overlay(passwordCallbackElement) ); Verifier = NULL; return result; } CSSM_RETURN CssmSample::AddHashedPassword( char* password, CSSM_SUBSERVICE_UID *optionalVerifier ) { CSSM_RETURN result = CSSM_OK; CSSM_LIST_ELEMENT* passwordTypeElement = MakeWordIDElement( CSSM_SAMPLE_TYPE_HASHED_PASSWORD ); // declares the type to be password (CssmList::overlay(TypedSample)).append( ListElement::overlay(passwordTypeElement) ); char* permanentPasswordData = (char*)malloc( strlen(password) + 1 ); // need error handling. Going to assume these succeed for now strcpy( permanentPasswordData, password ); CSSM_LIST_ELEMENT* passwordElement = MakeDatumElement( (void*)permanentPasswordData, strlen(password) ); // has the password CSSM_DATA in it (CssmList::overlay(TypedSample)).append( ListElement::overlay(passwordElement) ); Verifier = optionalVerifier; return result; } CSSM_RETURN CssmSample::AddProtectedPasword(CSSM_SUBSERVICE_UID *optionalVerifier) { CSSM_RETURN result = CSSM_OK; CSSM_LIST_ELEMENT* passwordCallbackElement = MakeWordIDElement( CSSM_SAMPLE_TYPE_PROTECTED_PASSWORD ); // declares the type to be password (CssmList::overlay(TypedSample)).append( ListElement::overlay(passwordCallbackElement) ); Verifier = optionalVerifier; return result; } CSSM_RETURN CssmSample::AddPromptedPassword( char* promptedPassword, CSSM_SUBSERVICE_UID *optionalVerifier ) { CSSM_RETURN result = CSSM_OK; CSSM_LIST_ELEMENT* passwordTypeElement = MakeWordIDElement( CSSM_SAMPLE_TYPE_PROMPTED_PASSWORD ); // declares the type to be password (CssmList::overlay(TypedSample)).append( ListElement::overlay(passwordTypeElement) ); char* permanentPasswordData = (char*)malloc( strlen(promptedPassword) + 1 ); // need error handling. Going to assume these succeed for now strcpy( permanentPasswordData, promptedPassword ); CSSM_LIST_ELEMENT* passwordPromptElement = MakeDatumElement( (void*)permanentPasswordData, strlen(promptedPassword) ); // has the password CSSM_DATA in it (CssmList::overlay(TypedSample)).append( ListElement::overlay(passwordPromptElement) ); Verifier = optionalVerifier; return result; } CSSM_RETURN CssmSample::AddSignedNonceForCallback( CSSM_SUBSERVICE_UID *requiredVerifier ) { CSSM_RETURN result = CSSM_OK; CSSM_LIST_ELEMENT* signedNonceCallbackElement = MakeWordIDElement( CSSM_SAMPLE_TYPE_SIGNED_NONCE ); (CssmList::overlay(TypedSample)).append( ListElement::overlay(signedNonceCallbackElement) ); Verifier = requiredVerifier; return result; } CSSM_RETURN CssmSample::AddSignedNonceReply( CSSM_DATA_PTR signedNonce, CSSM_SUBSERVICE_UID *requiredVerifier ) { CSSM_RETURN result = CSSM_OK; CSSM_LIST_ELEMENT* signedNonceTypeElement = MakeWordIDElement( CSSM_SAMPLE_TYPE_SIGNED_NONCE ); (CssmList::overlay(TypedSample)).append( ListElement::overlay(signedNonceTypeElement) ); CSSM_LIST_ELEMENT* signedNonceDataElement = MakeDatumElement( (void*)signedNonce->Data, signedNonce->Length ); (CssmList::overlay(TypedSample)).append( ListElement::overlay(signedNonceDataElement) ); Verifier = requiredVerifier; return result; } CSSM_RETURN CssmSample::AddSignedSecretForCallback( CSSM_SUBSERVICE_UID *requiredVerifier ) { CSSM_RETURN result = CSSM_OK; CSSM_LIST_ELEMENT* signedSecretCallbackElement = MakeWordIDElement( CSSM_SAMPLE_TYPE_SIGNED_SECRET ); (CssmList::overlay(TypedSample)).append( ListElement::overlay(signedSecretCallbackElement) ); Verifier = requiredVerifier; return result; } CSSM_RETURN CssmSample::AddSignedSecretImmediate( CSSM_DATA_PTR signedSecret, CSSM_SUBSERVICE_UID *requiredVerifier ) { CSSM_RETURN result = CSSM_OK; CSSM_LIST_ELEMENT* signedSecretTypeElement = MakeWordIDElement( CSSM_SAMPLE_TYPE_SIGNED_SECRET ); (CssmList::overlay(TypedSample)).append( ListElement::overlay(signedSecretTypeElement) ); CSSM_LIST_ELEMENT* signedSecretElement = MakeDatumElement( (void*)signedSecret->Data, signedSecret->Length ); (CssmList::overlay(TypedSample)).append( ListElement::overlay(signedSecretElement) ); Verifier = requiredVerifier; return result; } CSSM_RETURN CssmSample::AddBiometricCallback( CSSM_SUBSERVICE_UID *requiredVerifier ) { CSSM_RETURN result = CSSM_OK; CSSM_LIST_ELEMENT* callbackElement = MakeWordIDElement( CSSM_SAMPLE_TYPE_BIOMETRIC ); (CssmList::overlay(TypedSample)).append( ListElement::overlay(callbackElement) ); Verifier = requiredVerifier; return result; } CSSM_RETURN CssmSample::AddBiometricImmediate( CSSM_DATA_PTR biometricData, CSSM_SUBSERVICE_UID *requiredVerifier ) { CSSM_RETURN result = CSSM_OK; CSSM_LIST_ELEMENT* typeElement = MakeWordIDElement( CSSM_SAMPLE_TYPE_BIOMETRIC ); (CssmList::overlay(TypedSample)).append( ListElement::overlay(typeElement) ); CSSM_LIST_ELEMENT* dataElement = MakeDatumElement( (void*)biometricData->Data, biometricData->Length ); (CssmList::overlay(TypedSample)).append( ListElement::overlay(dataElement) ); Verifier = requiredVerifier; return result; } CSSM_RETURN CssmSample::AddProtectedBiometric( CSSM_SUBSERVICE_UID *requiredVerifier ) { CSSM_RETURN result = CSSM_OK; CSSM_LIST_ELEMENT* callbackElement = MakeWordIDElement( CSSM_SAMPLE_TYPE_PROTECTED_BIOMETRIC ); (CssmList::overlay(TypedSample)).append( ListElement::overlay(callbackElement) ); Verifier = requiredVerifier; return result; } CSSM_RETURN CssmSample::AddPromptedBiometric( CSSM_DATA_PTR biometricData, CSSM_SUBSERVICE_UID *requiredVerifier ) { CSSM_RETURN result = CSSM_OK; CSSM_LIST_ELEMENT* callbackElement = MakeWordIDElement( CSSM_SAMPLE_TYPE_PROMPTED_BIOMETRIC ); (CssmList::overlay(TypedSample)).append( ListElement::overlay(callbackElement) ); CSSM_LIST_ELEMENT* dataElement = MakeDatumElement( (void*)biometricData->Data, biometricData->Length ); (CssmList::overlay(TypedSample)).append( ListElement::overlay(dataElement) ); Verifier = requiredVerifier; return result; } // CssmSampleGroup CssmSampleGroup::CssmSampleGroup() { // creates the nothing sample group NumberOfSamples = 0; Samples = NULL; } CSSM_RETURN CssmSampleGroup::AddSample(CSSM_SAMPLE* sample) { CSSM_RETURN result = CSSM_OK; CSSM_SAMPLE* sampleBase; if( NumberOfSamples == 0 ) { // malloc to create the first item sampleBase = (CSSM_SAMPLE*)malloc( sizeof(CSSM_SAMPLE) ); Samples = sampleBase; } else { // realloc to add the next item sampleBase = (CSSM_SAMPLE*)realloc( (void*)Samples, sizeof(CSSM_SAMPLE) * (NumberOfSamples + 1) ); Samples = sampleBase; } sampleBase[NumberOfSamples].TypedSample.ListType = sample->TypedSample.ListType; sampleBase[NumberOfSamples].TypedSample.Head = sample->TypedSample.Head; sampleBase[NumberOfSamples].TypedSample.Tail = sample->TypedSample.Tail; sampleBase[NumberOfSamples].Verifier = sample->Verifier; NumberOfSamples++; return result; } CSSM_SAMPLE* CssmSampleGroup::GetIthSample(uint32 sampleIndex) { if( (0 != NumberOfSamples) && (sampleIndex < NumberOfSamples-1) ) return (CSSM_SAMPLE*)&Samples[sampleIndex]; else return NULL; }