Código fuente de Signal.h
Todos los derechos reservados
Resumen:
Programa de ejemplo para firma ECDSA 256 usando CNG
Ejemplo de uso de BCrypt/NCrypt API
Para persistente claves para firma y claves temporales para verificación
- */
# include & ltwindows.h & gt
# include & h & gt
# incluir & ltbcrypt.h & gt
# incluir & ltncrypt.h & gt
# definir NT _ SUCCESS(Estado)(( (Estado NT)( Estado))>= 0)
# define ESTADO _ UNSUCCESSFUL((NTSTATUS)0xc 0000001L)
Byte constante estática rgbMsg[] = p>
{
0x04, 0x87, 0xec, 0x66, 0xa8, 0xbf, 0x17, 0xa6,
0xe3, 0x62, 0x6f, 0x1a, 0x55, 0xe2, 0xaf, 0x5e,
0xbc, 0x54, 0xa4, 0xdc, 0x68, 0x19, 0x3e, 0x94,
};
Valor del byte []=
{0x02, 0x00 , 0x00, 0x 00};
void __cdecl wmain(
int argc,
__in_ecount(argc) LPWSTR *wargv )
{
NCRYPT _ PROV _ HANDLE hProv = NULL
NCRYPT _ KEY _ HANDLE hKey = NULL
BCRYPT _ KEY _ HANDLE hTmpKey = NULL
SECURITY_STATUS secStatus =Error_Success;
BCRYPT_ALG_HANDLE hHashAlg = NULL,
hSignAlg = NULL
BCRYPT_HASH _ HANDLE hHash = NULL
ESTADO NTSTATUS = ESTADO _ UNSUCCESSFUL;
DWORD cbData = 0,
cbHash = 0,
cbBlob = 0,
cbSignature = 0,
cbHashObject = 0,
prueba CB = 0
PBYTE pbHashObject = NULL p>
PBYTE pbHash = NULL, p>
pbBlob = NULL,
pbSignature = NULL
sin referencia _ PARAMETER(argc);
sin referencia _ PARAMETER(wargv);
//Abrir identificador de algoritmo
Si (! NT_SUCCESS(status = bcryptopenalgorithprovider(
& amphHashAlg,
BCRYPT_sha 1_algorithm,
null,
0) ))
{
wprintf(L"****Error 0x%x por BCryptO
penAlgorithmProvider \ n "retorno, estado);
Ir a limpieza;
}
if (!NT_SUCCESS(status = bcryptopenalgorithprovider(
&señal,
BCRYPT_ECDSA_P256_ALGORITHM,
NULL,
0)))
{
wprintf(L "****Error 0x%x devuelto por BCryptOpenAlgorithmProvider\n", estado);
Ir a limpieza;
}
//Calcular el tamaño del buffer para guardar el objeto hash
If (!NT_SUCCESS(status = BCryptGetProperty(
hHashAlg,
BCRYPT_OBJECT_LENGTH
(PBYTE )&cbHashObject,
tamaño de(palabra doble),
&cbData,
0)))
{
wprintf(L"****Error 0x%x devuelto por BCryptGetProperty\n ", estado);
Ir a limpieza;
}
//Asignar objeto hash en el montón
pbHashObject = (PBYTE)heap alloc(GetProcessHeap(), 0, cbHashObject);
if(NULL == pbHashObject)
{
wprintf(L"****Error en la asignación de memoria\n ");
Ir a limpieza;
}
//Calcular la longitud del hash
If (!NT_SUCCESS(status = BCryptGetProperty(
hHashAlg,
BCRYPT_Hash_length,
(PBYTE)&cbHash,
tamaño de(dword),
&cbData,
0)))
{
wprintf(L"****Error 0x%x por BCryptGetProperty\n " return, status);
Ir a limpieza;
} p>
//Asignar búfer hash en el montón
Pb hash =(PBYTE)heap alloc(GetProcessHeap(), 0, CB hash);
if(NULL == pbHash)
{
wprintf(L" ****Error en la asignación de memoria\n ");
Ir a limpieza;
}
//Crear hash
if(! NT_SUCCESS(status = bcryptcreateshash(
hHashAlg,
& amphHash,
pbHashObject,
cbHashObject,
Vacío,
0,
0)))
{
wprintf(L"****Error 0x% x es devuelto por BCryptCreateHash \n ", estado);
Ir a la limpieza;
}
//Hash algunos datos
if(!NT_SUCCESS(estado = BCryptHashData(
hH
ceniza,
(PBYTE)rgbMsg,
tamañode(rgbMsg),
0)))
{
wprintf(L"****Error 0x%x devuelto por BCryptHashData\n ", estado);
Ir a limpieza;
}
//Desactivar el hashing
if (!NT_SUCCESS(status = BCryptFinishHash(
hHash,
pbHash,
cbHash, p>
0)))
{
wprintf(L"****Error 0x%x devuelto por BCryptFinishHash\n ", estado);
p>Ir a limpieza;
}
//Abrir el identificador de KSP
if(FAILED(sec status = NCryptOpenStorageProvider(
& amphProv,
MS_KEY_STORAGE_PROVIDER,
0)))
{
wprintf( L " * * * * NCryptOpenStorageProvider \ n "Error devuelto 0x%x ", estado de segundo);
Ir a limpieza
}
// Crear una clave persistente
if(FAILED(sec status = NCryptCreatePersistedKey(
hProv,
& amphKey,
NCRYPT_ECDSA_ P256 _Algoritmo,
l"Mi clave ecc",
0,
NCRYPT_OVERWRITE_KEY_FLAG)))
{ p>
wprintf(L"**** Error 0x%x devuelto por NCryptCreatePersistedKey\n ", secStatus);
Ir a limpieza;
}
CB test = NCRYPT _ ALLOW _ PLAINTEXT _ EXPORT _ FLAG;
if(FAILED(seg estado = NCryptSetProperty(hKey,
NCRYPT_EXPORT_POLICY_PROPERTY,
(PBYTE)&cbTest,
sizeof(palabra doble),
NCRYPT_PERSIST_FLAG)))
{
wprintf(L " * * * * NCryptSetProperty \ n "Error devuelto 0x%x ", estado de segundo);
Ir a limpieza;
}
//En Crear clave en el disco
if(FAILED( estado seg = ncryptpinalizekey(hKey, 0)))
{
wprintf(L"**** Error 0x%x devuelto por NCryptFinalizeKey\n", secStatus); p>
Ir a limpieza;
}
//Firmar el hash
if(FAILED(sec status = NCryptSignHash(
hKey,
vacío,
pbHash,
cbHash,
vacío,
0,
&c
bSignature,
0)))
{
wprintf(L " * * * * NCryptSignHash \ n "Error devuelto 0x%x ", estado de segundo) ;
Ir a limpieza;
}
//Asignar búfer de firma
Pb firma = (PBYTE)heap alloc( GetProcessHeap( ), 0, firma CB);
if(NULL == pbSignature)
{
wprintf(L"****Error en la asignación de memoria \n ");
Ir a limpieza;
}
if(FAILED(sec status = NCryptSignHash(
hKey,
Vacío,
pbHash,
cbHash,
pbSignature,
cbSignature,
&cbSignature ,
0)))
{
wprintf(L " * * * * NCryptSignHash \ n "Error devuelto 0x%x ", estado de segundo);
Ir a limpieza;
}
if(FAILED(sec status = NCryptExportKey(
hKey,
p>Vacío,
BCRYPT_ECCPRIVATE_BLOB,
Vacío,
Vacío,
0,
& ampcbBlob ,
0)))
{
wprintf(L"****Error 0x%x por NCryptExportKey\n ", secStatus devuelve);
Ir a limpieza;
}
Pb blob = (PBYTE)heap alloc(GetProcessHeap(), 0, CB blob);
if(NULL == pbBlob)
{
wprintf(L"****Error en la asignación de memoria\n ");
Ir a Limpieza;
}
if(FAILED(seg estado = NCryptExportKey(
hKey,
Vacío,
BCRYPT_ECCPRIVATE_BLOB ,
nulo,
pbBlob,
cbBlob,
&cbBlob,
0)) ) p>
{
wprintf(L"****Error 0x%x devuelto por NCryptExportKey\n ", secStatus);
Ir a limpieza
}
Si (! NT_SUCCESS(status = BCryptImportKeyPair(
señal,
nulo,
BCRYPT_ECCPRIVATE_BLOB,
& amphTmpKey,
p>
pbBlob,
cbBlob,
0)))
{
wprintf(L"**** Error 0x%x devuelto por BCryptImportKeyPair\n ", estado);
Ir a limpieza;
}
if (!NT_SUCCESS(status = BCrypt
VerifySignature(
hTmpKey,
null,
pbHash,
cbHash,
pbSignature,
cbSignature,
0)))
{
wprintf(L"****Error 0x%x devuelto por BCryptVerifySignature\n " , estado);
Ir a limpieza;
}
wprintf(L "Éxito!\n ");
Limpieza:
if(hHashAlg)
{
BCryptCloseAlgorithmProvider(hHashAlg, 0);
}
if( hSignAlg)
{
BCryptCloseAlgorithmProvider(hSignAlg, 0);
}
if (hHash)
{
BCryptDestroyHash(hHash);
}
if(pbHashObject)
{
HeapFree(GetProcessHeap (), 0, pbHashObject);
}
if(pbHash)
{
HeapFree(GetProcessHeap(), 0, Pb hash);
}
if(pbSignature)
{
HeapFree(GetProcessHeap(), 0, Pb firma);
}
if(pbBlob)
{
HeapFree(GetProcessHeap(), 0, Pb blob);
}
if (hTmpKey)
{
BCryptDestroyKey(hTmpKey);
}
if(hKey)
{
NCryptDeleteKey(hKey, 0);
}
Frecuencia intermedia (vehículo operado remotamente de alta presión ) p>
{
NCryptFreeObject(HP ROV);
}
}