Esempio n. 1
0
{
    check(CSSM_QuerySize(handle(), encrypt, count, &sizes));
}


//
// The override() method of Context is an expert feature. It replaces the entire
// context with a context object provided. It is up to the caller to keep this context
// consistent with the purpose of the Context subclass he is (mis)using.
// This feature is currently used by the SecurityServer.
//
void Context::override(const Security::Context &ctx)
{
	if (!isActive()) {
		// make a valid context object (it doesn't matter what kind - keep it cheap)
		check(CSSM_CSP_CreateDigestContext(attachment()->handle(), CSSM_ALGID_NONE, &mHandle));
	}
	// now replace everything with the context data provided
	check(CSSM_SetContext(mHandle, &ctx));
	mActive = true;		// now active
}


//
// RccContexts
//
const ResourceControlContext &RccBearer::compositeRcc() const
{
	// explicitly specified RCC wins
	if (mRcc)
		return *mRcc;
static int doTest(CSSM_CSP_HANDLE cspHand,
	CSSM_ALGORITHMS alg,
	const char *algStr,
	CSSM_DATA_PTR ptext,
	CSSM_BOOL verbose,
	CSSM_BOOL quiet)
{
	CSSM_CC_HANDLE		digHand1 = 0;	// reference
	CSSM_CC_HANDLE		digHand2 = 0;	// to be cloned
	CSSM_CC_HANDLE		digHand3 = 0;	// cloned from digHand2
	CSSM_DATA 			dig1 = {0, NULL};
	CSSM_DATA 			dig2 = {0, NULL};
	CSSM_DATA 			dig3 = {0, NULL};
	CSSM_RETURN			crtn;
	unsigned			thisMove;		// this update
	unsigned			toMove;			// total to go
	unsigned			totalRequest;	// originally requested
	CSSM_DATA			thisText;		// actually passed to update
		
	/* cook up two digest contexts */
	crtn = CSSM_CSP_CreateDigestContext(cspHand,
		alg,
		&digHand1);
	if(crtn) {
		printError("CSSM_CSP_CreateDigestContext (1)", crtn);
		return testError(quiet);
	}
	crtn = CSSM_CSP_CreateDigestContext(cspHand,
		alg,
		&digHand2);
	if(crtn) {
		printError("CSSM_CSP_CreateDigestContext (2)", crtn);
		return testError(quiet);
	}
	crtn = CSSM_DigestDataInit(digHand1);
	if(crtn) {
		printError("CSSM_DigestDataInit (1)", crtn);
		return testError(quiet);
	}
	crtn = CSSM_DigestDataInit(digHand2);
	if(crtn) {
		printError("CSSM_DigestDataInit (2)", crtn);
		return testError(quiet);
	}
	
	/* do some random updates to first two digests, until we've digested
	 * at least half of the requested data */
	totalRequest = ptext->Length;
	toMove = ptext->Length;
	thisText.Data = ptext->Data;
	while(toMove > (totalRequest / 2)) {
		thisMove = genRand((MIN_PTEXT / 2), toMove);
		thisText.Length = thisMove;
		if(verbose) {
			printf("  ..updating digest1, digest2 with %d bytes\n", thisMove);
		}
		crtn = CSSM_DigestDataUpdate(digHand1, &thisText, 1);
		if(crtn) {
			printError("CSSM_DigestDataUpdate (1)", crtn);
			return testError(quiet);
		}
		crtn = CSSM_DigestDataUpdate(digHand2, &thisText, 1);
		if(crtn) {
			printError("CSSM_DigestDataUpdate (2)", crtn);
			return testError(quiet);
		}
		thisText.Data += thisMove;
		toMove -= thisMove;
	}
	
	/* digest3 := clone(digest2) */
	crtn = CSSM_DigestDataClone(digHand2, &digHand3);
	if(crtn) {
		printError("CSSM_DigestDataClone", crtn);
		return testError(quiet);
	}
	
	/* finish off remaining ptext, updating all 3 digests identically */
	while(toMove) {
		thisMove = genRand(1, toMove);
		thisText.Length = thisMove;
		if(verbose) {
			printf("  ..updating all three digests with %d bytes\n", thisMove);
		}
		crtn = CSSM_DigestDataUpdate(digHand1, &thisText, 1);
		if(crtn) {
			printError("CSSM_DigestDataUpdate (3)", crtn);
			return testError(quiet);
		}
		crtn = CSSM_DigestDataUpdate(digHand2, &thisText, 1);
		if(crtn) {
			printError("CSSM_DigestDataUpdate (4)", crtn);
			return testError(quiet);
		}
		crtn = CSSM_DigestDataUpdate(digHand3, &thisText, 1);
		if(crtn) {
			printError("CSSM_DigestDataUpdate (5)", crtn);
			return testError(quiet);
		}
		thisText.Data += thisMove;
		toMove -= thisMove;
	}
	
	/* obtain all three digests */
	crtn = CSSM_DigestDataFinal(digHand1, &dig1);
	if(crtn) {
		printError("CSSM_DigestDataFinal (1)", crtn);
		return testError(quiet);
	}
	crtn = CSSM_DigestDataFinal(digHand2, &dig2);
	if(crtn) {
		printError("CSSM_DigestDataFinal (2)", crtn);
		return testError(quiet);
	}
	crtn = CSSM_DigestDataFinal(digHand3, &dig3);
	if(crtn) {
		printError("CSSM_DigestDataFinal (3)", crtn);
		return testError(quiet);
	}
	
	/* ensure all three digests identical */
	if(!appCompareCssmData(&dig1, &dig2)) {
		printf("***Digest miscompare(dig1, dig2)***\n");
		if(testError(quiet)) {
			return 1;
		}
	}
	if(!appCompareCssmData(&dig2, &dig3)) {
		printf("***Digest miscompare(dig2, dig3)***\n");
		if(testError(quiet)) {
			return 1;
		}
	}
	
	/* free resources */
	appFreeCssmData(&dig1, CSSM_FALSE);
	appFreeCssmData(&dig2, CSSM_FALSE);
	appFreeCssmData(&dig3, CSSM_FALSE);
	CSSM_DeleteContext(digHand1);
	CSSM_DeleteContext(digHand2);
	CSSM_DeleteContext(digHand3);
	return 0;
}