EXTERN_C BOOL PALAPI CryptSignHashA( HCRYPTHASH hHash, DWORD dwKeySpec, LPCSTR szDescription, DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen) { _ASSERTE(szDescription == NULL); return CryptSignHashW(hHash, dwKeySpec, NULL, dwFlags, pbSignature, pdwSigLen); }
QByteArray QCSP::sign( int method, const QByteArray &digest ) { ALG_ID alg = 0; switch( method ) { case NID_sha1: alg = CALG_SHA1; break; case NID_sha256: alg = CALG_SHA_256; break; case NID_sha384: alg = CALG_SHA_384; break; case NID_sha512: alg = CALG_SHA_512; break; case NID_sha224: default: return QByteArray(); } HCRYPTHASH hash = 0; if( !CryptCreateHash( d->h, alg, 0, 0, &hash ) ) return QByteArray(); if( !CryptSetHashParam( hash, HP_HASHVAL, (BYTE*)digest.constData(), 0 ) ) { CryptDestroyHash( hash ); return QByteArray(); } DWORD size = 256; QByteArray sig; sig.resize( size ); if( !CryptSignHashW( hash, AT_SIGNATURE, 0, 0, (BYTE*)sig.data(), &size ) ) sig.clear(); CryptDestroyHash( hash ); QByteArray reverse; for( QByteArray::const_iterator i = sig.constEnd(); i != sig.constBegin(); ) { --i; reverse += *i; } return reverse; }
QByteArray QCSP::sign( int method, const QByteArray &digest ) { ALG_ID alg = 0; switch( method ) { case NID_sha1: alg = CALG_SHA1; break; case NID_sha256: alg = CALG_SHA_256; break; case NID_sha384: alg = CALG_SHA_384; break; case NID_sha512: alg = CALG_SHA_512; break; case NID_sha224: default: return QByteArray(); } HCRYPTHASH hash = 0; if( !CryptCreateHash( d->h, alg, 0, 0, &hash ) ) return QByteArray(); if( !CryptSetHashParam( hash, HP_HASHVAL, LPBYTE(digest.constData()), 0 ) ) { CryptDestroyHash( hash ); return QByteArray(); } DWORD size = 256; QByteArray sig( size, 0 ); if( CryptSignHashW( hash, AT_SIGNATURE, 0, 0, LPBYTE(sig.data()), &size ) ) sig.resize( size ); else sig.clear(); switch( GetLastError() ) { case ERROR_CANCELLED: d->error = PinCanceled; break; default: break; } CryptDestroyHash( hash ); return reverse( sig ); }