276 lines
5.7 KiB
C
276 lines
5.7 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (C) Microsoft Corporation, 2000
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
policy
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module provides common CSP Algorithm Limit policy control.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Doug Barlow (dbarlow) 8/11/2000
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
?Notes?
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||
|
#define WIN32_LEAN_AND_MEAN
|
||
|
#endif
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <wincrypt.h>
|
||
|
#include "policy.h"
|
||
|
|
||
|
|
||
|
/*++
|
||
|
|
||
|
LocateAlgorithm:
|
||
|
|
||
|
This routine searches a PROV_ENUMALGS_EX array for the specified
|
||
|
Algorithm.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
rgEnumAlgs supplies the array of PROV_ENUMALGS_EX structures to be
|
||
|
searched. The last entry in the array must be filled with zeroes.
|
||
|
|
||
|
algId supplies the algorithm Id for which to search.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
The corresponding PROV_ENUMALGS_EX structure in the array, or NULL if no
|
||
|
such algorithm entry exists.
|
||
|
|
||
|
Remarks:
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Doug Barlow (dbarlow) 8/16/2000
|
||
|
|
||
|
--*/
|
||
|
#undef __SUBROUTINE__
|
||
|
#define __SUBROUTINE__ TEXT("LocateAlgorithm")
|
||
|
|
||
|
CONST PROV_ENUMALGS_EX *
|
||
|
LocateAlgorithm(
|
||
|
IN CONST PROV_ENUMALGS_EX *rgEnumAlgs,
|
||
|
IN ALG_ID algId)
|
||
|
{
|
||
|
CONST PROV_ENUMALGS_EX *pEnumAlg = rgEnumAlgs;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Run through the list and try to find the given algorithm.
|
||
|
//
|
||
|
|
||
|
while (0 != pEnumAlg->aiAlgid)
|
||
|
{
|
||
|
if (pEnumAlg->aiAlgid == algId)
|
||
|
return pEnumAlg;
|
||
|
pEnumAlg += 1;
|
||
|
}
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*++
|
||
|
|
||
|
IsLegalAlgorithm:
|
||
|
|
||
|
Given an array of allowed algorithms, is the given algorithm Id in the
|
||
|
list?
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
rgEnumAlgs supplies the array of PROV_ENUMALGS_EX structures identifying
|
||
|
the policy to enforce. The last entry in the array must be filled
|
||
|
with zeroes.
|
||
|
|
||
|
algId supplies the algorithm Id to be validated.
|
||
|
|
||
|
ppEnumAlg, if supplied, receives the PROV_ENUMALGS_EX structure containing
|
||
|
the policies associated with this algorithm Id. This can be used in
|
||
|
following routines to speed up access to policy information.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE -- That algorithm is supported.
|
||
|
FALSE -- That algorithm is not supported.
|
||
|
|
||
|
Remarks:
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Doug Barlow (dbarlow) 8/16/2000
|
||
|
|
||
|
--*/
|
||
|
#undef __SUBROUTINE__
|
||
|
#define __SUBROUTINE__ TEXT("IsLegalAlgorithm")
|
||
|
|
||
|
BOOL
|
||
|
IsLegalAlgorithm(
|
||
|
IN CONST PROV_ENUMALGS_EX *rgEnumAlgs,
|
||
|
IN ALG_ID algId,
|
||
|
OUT CONST PROV_ENUMALGS_EX **ppEnumAlg)
|
||
|
{
|
||
|
CONST PROV_ENUMALGS_EX *pEnumAlg = LocateAlgorithm(rgEnumAlgs, algId);
|
||
|
|
||
|
if (NULL != ppEnumAlg)
|
||
|
*ppEnumAlg = pEnumAlg;
|
||
|
return (NULL != pEnumAlg);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*++
|
||
|
|
||
|
IsLegalLength:
|
||
|
|
||
|
This routine determines if the requested key length is valid for the given
|
||
|
algorithm, according to policy.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
rgEnumAlgs supplies the array of PROV_ENUMALGS_EX structures identifying
|
||
|
the policy to enforce. The last entry in the array must be filled
|
||
|
with zeroes.
|
||
|
|
||
|
algId supplies the algorithm Id to be validated.
|
||
|
|
||
|
cBitLength supplies the length of the proposed key, in bits.
|
||
|
|
||
|
pEnumAlg, if not NULL, supplies the PROV_ENUMALGS_EX structure containing
|
||
|
the policies associated with this algorithm Id. This can be obtained
|
||
|
from the IsLegalAlgorithm call, above. If this parameter is NULL,
|
||
|
then the PROV_ENUMALGS_EX structure is located from the algId
|
||
|
parameter.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE -- This key length is legal for this algorithm.
|
||
|
FALSE -- This key length is not allowed for this algorithm.
|
||
|
|
||
|
Remarks:
|
||
|
|
||
|
This routine only determines policy rules. It does not address whether or
|
||
|
not the exact keylength is supported by the algorithm.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Doug Barlow (dbarlow) 8/16/2000
|
||
|
|
||
|
--*/
|
||
|
#undef __SUBROUTINE__
|
||
|
#define __SUBROUTINE__ TEXT("IsLegalLength")
|
||
|
|
||
|
BOOL
|
||
|
IsLegalLength(
|
||
|
IN CONST PROV_ENUMALGS_EX *rgEnumAlgs,
|
||
|
IN ALG_ID algId,
|
||
|
IN DWORD cBitLength,
|
||
|
IN CONST PROV_ENUMALGS_EX *pEnumAlg)
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// Make sure we've got a PROV_ENUMALGS_EX structure to work with.
|
||
|
//
|
||
|
|
||
|
if (NULL == pEnumAlg)
|
||
|
{
|
||
|
pEnumAlg = LocateAlgorithm(rgEnumAlgs, algId);
|
||
|
if (NULL == pEnumAlg)
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Now check the length.
|
||
|
//
|
||
|
|
||
|
return ((pEnumAlg->dwMinLen <= cBitLength)
|
||
|
&& (pEnumAlg->dwMaxLen >= cBitLength));
|
||
|
}
|
||
|
|
||
|
|
||
|
/*++
|
||
|
|
||
|
GetDefaultLength:
|
||
|
|
||
|
This routine determines the default length for a given algorithm, based on
|
||
|
policy described in an array of PROV_ENUMALGS_EX structures.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
rgEnumAlgs supplies the array of PROV_ENUMALGS_EX structures identifying
|
||
|
the policy to enforce. The last entry in the array must be filled
|
||
|
with zeroes.
|
||
|
|
||
|
algId supplies the algorithm Id to be validated.
|
||
|
|
||
|
pEnumAlg, if not NULL, supplies the PROV_ENUMALGS_EX structure containing
|
||
|
the policies associated with this algorithm Id. This can be obtained
|
||
|
from the IsLegalAlgorithm call, above. If this parameter is NULL,
|
||
|
then the PROV_ENUMALGS_EX structure is located from the algId
|
||
|
parameter.
|
||
|
|
||
|
pcBitLength receives the default length of the proposed key, in bits.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE -- The algorithm is supported, and the value returned in pcBitLength
|
||
|
is valid.
|
||
|
FALSE -- The requested algorithm isn't supported.
|
||
|
|
||
|
Remarks:
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Doug Barlow (dbarlow) 8/16/2000
|
||
|
|
||
|
--*/
|
||
|
#undef __SUBROUTINE__
|
||
|
#define __SUBROUTINE__ TEXT("GetDefaultLength")
|
||
|
|
||
|
BOOL
|
||
|
GetDefaultLength(
|
||
|
IN CONST PROV_ENUMALGS_EX *rgEnumAlgs,
|
||
|
IN ALG_ID algId,
|
||
|
IN CONST PROV_ENUMALGS_EX *pEnumAlg,
|
||
|
OUT LPDWORD pcBitLength)
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// Clear the returned bit length, just in case.
|
||
|
//
|
||
|
|
||
|
*pcBitLength = 0;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Make sure we've got a PROV_ENUMALGS_EX structure to work with.
|
||
|
//
|
||
|
|
||
|
if (NULL == pEnumAlg)
|
||
|
{
|
||
|
pEnumAlg = LocateAlgorithm(rgEnumAlgs, algId);
|
||
|
if (NULL == pEnumAlg)
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Now return the default length.
|
||
|
//
|
||
|
|
||
|
*pcBitLength = pEnumAlg->dwDefaultLen;
|
||
|
return TRUE;
|
||
|
}
|
||
|
|