Chaves DSS
- Gerando e recuperando chaves DSS
- Gerando assinaturas DSS
- Verificando uma assinatura DSS
- Exportando chaves DSS
Gerando e recuperando chaves DSS
Chaves DSS podem ser geradas por uma chamada para a função CryptGenKey . A chamada para CryptGenKey exige que AT_SIGNATURE ou CALG_DSS_SIGN sejam passados no argumento Argel . Essa chamada gerará os valores P (módulo prime), Q (prime), G (gerador), X (expoente secreto) e Y (chave pública) do zero e os persistirá em um BLOB de chave para o armazenamento local.
Para gerar um par de chaves de assinatura DSS
- Chame a função CryptAcquireContext para obter um identificador para o Provedor Criptográfico do Microsoft DSS.
- Chame CryptGenKey para gerar as chaves. AT_SIGNATURE ou CALG_DSS_SIGN deve ser passado para o argumento Argel e os 16 bits superiores do argumento dwFlags devem ser definidos como o tamanho da chave desejado. Se os 16 bits superiores forem zero, o tamanho da chave padrão de 1.024 bits será usado. Um identificador HCRYPTKEY é retornado no argumento hKey .
Para recuperar um ponteiro para chaves de assinatura geradas anteriormente
- Chame CryptAcquireContext para obter um identificador para o Provedor Criptográfico do Microsoft DSS.
- Chame a função CryptGetUserKey com o argumento dwKeySpec definido como AT_SIGNATURE ou CALG_DSS_SIGN.
Para recuperar os valores P, Q e G
- Chame CryptAcquireContext para obter um identificador para o Provedor Criptográfico do Microsoft DSS.
- Chame CryptGetUserKey com o argumento dwKeySpec definido como AT_SIGNATURE ou CALG_DSS_SIGN.
- Chame CryptGetKeyParam com o argumento hKey definido como o ponteiro recuperado na etapa anterior. O argumento dwParam deve ser definido como o sinalizador desejado; KP_P, KP_Q ou KP_G. O valor é retornado no argumento pbData e o comprimento dos dados é retornado no argumento pdwDataLen . O valor é retornado sem informações de cabeçalho e no formato little-endian .
Gerando assinaturas DSS
Os dados a serem assinados devem primeiro ser hash usando o algoritmo SHA . Depois que esses dados são hash, uma assinatura DSS é gerada chamando a função CryptSignHash .
Para gerar uma assinatura DSS
- Chame CryptAcquireContext para obter um identificador para o Provedor Criptográfico do Microsoft DSS.
- Chame CryptCreateHash com o argumento Argel definido como CALG_SHA para obter um identificador para um objeto hash SHA.
- Chame CryptHashData com o argumento hHash definido como o identificador recuperado na etapa anterior. Isso cria um hash dos dados e retorna um identificador para o hash no argumento phHash da chamada da função CryptCreateHash .
- Chame CryptSignHash com o argumento hHash definido como o identificador recuperado na etapa anterior. AT_SIGNATURE ou CALG_DSS_SIGN podem ser passados no parâmetro dwKeySpec . A assinatura é retornada ao endereço fornecido no argumento pbSignature e o comprimento da assinatura é retornado ao endereço fornecido no argumento pdwSigLen . Um ponteiro NULL pode ser passado no argumento pbSignature e, nesse caso, a assinatura não é gerada, mas o comprimento da assinatura é retornado para o endereço fornecido no parâmetro pdwSigLen .
Verificando uma assinatura DSS
Para verificar uma assinatura DSS, a chave pública DSS do signatário deve ser importada, os dados assinados devem ser hash e, em seguida, a assinatura pode ser verificada.
Para verificar uma assinatura DSS
Chame CryptAcquireContext para obter um identificador para o Provedor Criptográfico do Microsoft DSS.
Chame CryptImportKey para importar a chave pública DSS do signatário.
Chame CryptCreateHash com o argumento Argel definido como CALG_SHA para obter um identificador para um objeto hash SHA.
Chame CryptHashData com o argumento hHash definido como o identificador recuperado na etapa anterior e com pbData apontando para os dados assinados. Isso cria um hash dos dados e retorna um identificador para o hash no argumento phHash da chamada da função CryptCreateHash .
Chame CryptVerifySignature com as seguintes configurações:
hHash é definido como o identificador para o hash executado na etapa anterior.
pbSignature aponta para a assinatura a ser verificada.
dwSigLen é definido como o comprimento da assinatura.
hPubKey é definido como o identificador da chave pública importada na etapa 2.
dwFlags é definido como zero.
Exportando chaves DSS
Quando você envia dados assinados para alguém em que a assinatura precisará ser verificada pelo destinatário, a chave pública do signatário deve ser fornecida ao destinatário e geralmente é enviada junto com os dados assinados. Portanto, é necessário ser capaz de exportar as chaves DSS em um formato BLOB de chave .
Para exportar a chave pública DSS
- Chame CryptAcquireContext para obter um identificador para o Provedor Criptográfico do Microsoft DSS.
- Chame CryptGetUserKey com o argumento dwKeySpec definido como AT_SIGNATURE ou CALG_DSS_SIGN.
- Chame CryptExportKey com hKey definido como o identificador recuperado na etapa anterior, dwBlobType definido como PUBLICKEYBLOB e dwFlags definido como zero. O BLOB de chave pública DSS é retornado em pbData e o comprimento do BLOB de chave é retornado em pdwDataLen. Um ponteiro NULL pode ser passado em pbData e, nesse caso, apenas o comprimento do BLOB de chave DSS será retornado. O BLOB retornado ao fazer a chamada para CryptExportKey está no formato descrito em BLOBs de chave do provedor DSS.
Para exportar a chave privada DSS
- Siga o mesmo procedimento que para exportar uma chave pública DSS, exceto que ao fazer a chamada para CryptExportKey, dwBlobType é definido como PRIVATEKEYBLOB. O BLOB retornado ao fazer a chamada para CryptExportKey está no formato descrito em BLOBs de chave do provedor DSS.