GenerateSignature
(Engine-Level Function)
Description: | Generates a digital signature of a handle returned from Hash(). |
Returns: | Text |
Usage: | Script Only. |
Function Groups: | Cryptography |
Related to: | CheckSignature | Hash |
Format: | GenerateSignature(HashObj [, Key, PaddingType, PadHashAlgorithm, SaltLength) |
Parameters: |
HashObj |
Required. Handle returned from a call to Hash() |
Key |
Optional. CNG (Cryptography New Generation) only. The cryptographic key to be used to sign the data. This must be an asymmetric private key. |
PaddingType |
Optional integer. Can be one of the following values: Value~Meaning 0~No padding is to added to the plaintext data before signing. 1~Padding is added to the data before signing in accordance with the RSASSA-PKCS1-v1_5 scheme. 2~Padding is added to the data before signing in accordance with the RSASSA-PSS scheme. |
PadHashAlgorithm |
Optional text value. The algorithm to be used for padding the data. The hash is then signed. |
SaltLength |
Optional integer. Only required for RSASSA-PSS padding. This is the length of the salt used by that scheme. |
Comments | Using an asymmetric key for signing is quite expensive compared to an HMAC with a symmetric key. For this reason, the data itself is not signed, but hashed and then the hash signed. This is much more efficient. |
Examples
< {========================== GenerateSignatureSample ==========================} { Sample code using GenerateSignature(). } {=============================================================================} GenerateSignatureSample ( Message { Message to sign }; pPublicKeyBlob { Output, set to exported public key blob }; ) [ Protected Constant CALG_RSA_SIGN = 0x2400 { Key type }; Protected Constant PROV_RSA_AES = 24 { Enhanced RSA/AES provider }; Protected Constant KEY_SIZE = 2048 { 2048 bit keys }; Protected Constant PUBLICKEYBLOB = 6 { PUBLICKEYBLOB }; Protected Constant CRYPT_VERIFYCONTEXT = 0xF0000000 { CRYPT_VERIFYCONTEXT }; Protected CSP { Cryptographic context }; Protected HashObj { Intermediate handle returned from Hash() }; Protected Key { Handle to signing key pair }; Protected Signature { RSASSA-PKCS1-v1_5 signature }; ] Sign [ If 1; [ { Get cryptographic context } CSP = GetCryptoProvider(PROV_RSA_AES, Invalid, Invalid, CRYPT_VERIFYCONTEXT); { Generate a RSA key pair for signing } Key = GenerateKey(CSP, CALG_RSA_SIGN, (KEY_SIZE << 16)); { Export the public key } *pPublicKeyBlob = ExportKey(Key, PUBLICKEYBLOB); { Compute a SHA-256 hash of the message } Hash(Message, 2 {SHA-256}, Invalid, HashObj, CSP); { Generate RSASSA-PKCS1-v1_5 signature } Signature = GenerateSignature(HashObj); Return(Signature); ] ] { End of GenerateSignatureSample } >
Hash(HeaderBuffer, 2, Invalid, HashHandle); { Hash the header } Hash(PayloadBuffer, 2, Invalid, HashHandle); { then the payload } Signature = GenerateSignature(HashHandle, { Hash to sign } Certificate.PrivateKey, { Private key to use } 2, { Use PSS padding } "SHA256", { Padding algorithm } 32); { PSS salt length }