Red de conocimiento informático - Problemas con los teléfonos móviles - Código fuente de Signal.h

Código fuente de Signal.h

/* Copyright (c) Microsoft Corporation.

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[] =

{

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

PBYTE pbHash = NULL,

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;

}

//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,

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)))

{

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);

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)) )

{

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 )

{

NCryptFreeObject(HP ROV);

}

}