Codificação de dados assinados
Os dados assinados consistem em conteúdo de qualquer tipo e hashes de mensagem criptografados do conteúdo por zero ou mais signatários. O hash resultante pode confirmar que a mensagem original não foi modificada desde a assinatura e que determinadas pessoas ou entidades assinaram os dados.
A ilustração a seguir ilustra o procedimento para codificar uma mensagem assinada. A lista que segue a ilustração descreve as etapas.
Uma mensagem pode ter vários signatários, algoritmos de hash e certificados. Embora a ilustração mostre apenas certificados, CRLs e CTLs podem usar o mesmo processo. Eles se encaixariam na ilustração onde quer que os certificados sejam mostrados.
O processo geral para codificar dados assinados é o seguinte.
Para codificar dados assinados
- Os dados são criados (se necessário) e um ponteiro para ele é recuperado.
- Um repositório de certificados é aberto que contém o certificado do signatário.
- A chave privada do certificado é recuperada. Há duas propriedades que devem ser definidas no certificado antes de usá-lo. Um deles é usado para vincular um certificado a um CSP específico e, dentro desse CSP, a um contêiner de chave privada específico. O outro é usado para indicar qual algoritmo de hash deve ser usado quando uma operação de hash é chamada. Eles só precisam ser definidos uma vez.
- A propriedade de um certificado determina o algoritmo de hash.
- Um hash dos dados é criado enviando os dados por meio da função de hash.
- A assinatura é criada criptografando o hash usando a chave privada, obtida por meio de uma propriedade no certificado.
- Os seguintes dados estão incluídos na mensagem assinada concluída:
- Os dados originais a serem assinados
- Os algoritmos de hash
- As assinaturas
- As estruturas de informações do signatário, que incluem o identificador do signatário (emissor do certificado e número de série)
- Certificados do signatário (opcional)
Este procedimento ilustra um caso simples. Casos mais complexos envolvem atributos autenticados incluídos na mensagem. Quando o tipo de conteúdo é tudo menos uma cadeia de caracteres BYTE ou há pelo menos um atributo autenticado junto com qualquer tipo de dados, há dois atributos autenticados padrão necessários: o tipo de conteúdo (dados) e o hash do conteúdo. Nessas circunstâncias, o CryptoAPI fornece automaticamente esses dois atributos necessários. As funções de mensagem de baixo nível hash dos atributos autenticados, criptografam o hash com a chave privada e fornecem isso como a assinatura.
Use as funções de mensagem de baixo nível para realizar as tarefas listadas apenas usando o procedimento a seguir.
Para codificar uma mensagem assinada
Crie ou recupere o conteúdo.
Obter um provedor criptográfico.
Obtenha os certificados do signatário.
Inicialize a estrutura de CMSG_SIGNER_ENCODE_INFO .
Inicialize a estrutura de CMSG_SIGNED_ENCODE_INFO .
Chame CryptMsgCalculateEncodedLength para obter o tamanho do BLOB de mensagem codificado. Alocar memória para ele.
Chame CryptMsgOpenToEncode, passando CMSG_SIGNED para dwMsgType e um ponteiro para CMSG_SIGNED_ENCODE_INFO para pvMsgEncodeInfo obter um identificador para a mensagem aberta.
Chame CryptMsgUpdate, passando o identificador recuperado na etapa 7 e um ponteiro para os dados que devem ser assinados e codificados. Essa função pode ser chamada quantas vezes forem necessárias para concluir o processo de codificação.
Chame CryptMsgGetParam, passando o identificador recuperado na etapa 7 e os tipos de parâmetro apropriados para acessar os dados desejados e codificados. Por exemplo, passe CMSG_CONTENT_PARAM para obter um ponteiro para toda a mensagem PKCS nº 7 .
Se o resultado dessa codificação for usado como os dados internos de outra mensagem codificada, como uma mensagem em envelope, o parâmetro CMSG_BARE_CONTENT_PARAM deverá ser passado. Para obter um exemplo mostrando isso, consulte Código alternativo para codificar uma mensagem enveloped.
Feche a mensagem chamando CryptMsgClose.
O resultado desse procedimento é uma mensagem codificada que contém os dados originais, o hash criptografado desses dados (assinatura) e as informações do signatário. Há também um ponteiro para o BLOB codificado desejado.
Para obter detalhes de codificação C, consulte Exemplo de Programa C: Assinatura, Codificação, Decodificação e Verificação de uma Mensagem.