Este caso de uso implementa o processo de realização de uma assinatura digital de um documento eletrônico.
Qualquer arquivo armazenado em disco pode ser digitalmente assinado. Seu conteúdo é previamente convertido para um formato MIME de transporte. O produto da operação de assinatura é armazenado num envelope de transporte e salvo em disco para uso pelo operador.
Operador
O CSP para acesso à chave privada do operador deve estar instalado apropriadamente.
O operador seleciona o documento a ser digitalmente assinado. | O sistema obtém nas definições de configuração: a política de assinatura a ser utilizada (ver R-1), o algoritmo de assinatura (ver R3), a definição de verificação da conformidade do certificado, a definição de verificação da revogação do certificado, o formato de envelopamento do documento assinado e o endereço web da TSA. O sistema carrega o documento em memória e converte seu formato para um tipo MIME reconhecível. |
O operador seleciona um tipo de comprometimento. | O sistema armazena a seleção do operador. A lista exibida é dependente da política de assinatura, conforme definido em R-2. |
O operador indica que deseja incluir sua localização na assinatura digital. | O sistema armazena as definições de localização do usuário, conforme R10. |
O operador indica que deseja incluir o instante corrente na assinatura digital. | O sistema armazena a data, hora e segundos correntes para a composição do atributo assinado SigningTime. |
O operador seleciona o certificado digital para assinatura. | O sistema executa o Caso de uso: Verificar validade e o Caso de uso: Verificar revogação. |
O operador informa o PIN de acesso à chave privada. | O sistema assina digitalmente o documento MIME selecionado conforme R7, obtém o(s) Time-Stamp Token(s) necessários conforme R9, compõe um envelope de transporte, conforme R8, salvo o resultado em disco como definido em R6 e informa ao operador o sucesso da operação e a localização do documento assinado. |
O operador cancela a seleção do documento a ser assinado. | O caso de uso é encerrado. |
Não existe um repositório de certificados digitais disponível. | O sistema exibe mensagem de alerta ao operador, solicitando a inserção da mídia de armazenamento do certificado. |
Uma definição de política de assinatura não está disponível na configuração. | O sistema seleciona a política CAdES-BES. |
Uma definição de algoritmo de assinatura não está disponível, caso a política escolhida seja CAdES-BES ou CAdES-T. | O sistema seleciona o algoritmo DSA com SHA-1. |
Uma definição de algoritmo de assinatura não está disponível, caso a política escolhida seja da ICP-Brasil. | O sistema seleciona o algoritmo RSA com SHA-1 |
A configuração define que não seja verificada a conformidade do certificado ou (que seja verificada somente uma vez por sessão e existe disponível produto da última verificação). | O sistema não verifica a conformidade do certificado. |
A configuração define que não seja verificada a revogação do certificado ou (que seja verificada somente uma vez por sessão e existe disponível produto da última verificação). | O sistema não verifica a revogação do certificado. |
A configuração não forneceu o endereço de uma TSA e uma política de assinatura que exige um TST foi selecionada. | O sistema informa o problema ao operador e o caso de uso é encerrado. |
Ocorre uma falha na verificação do certificado ou na verificação da revogação | O sistema fornece feedback completo ao operador, recomendando que o documento não seja assinado. |
O certificado digital do operador está inconforme | O sistema fornece feedback completo ao operador, recomendando que o documento não seja assinado. |
O certificado digital do operador está expirado ou foi revogado. | O sistema fornece feedback completo ao operador e o caso de uso é encerrado. |
Um dos perfis CAdES-BES ou AD-CP foi selecionado. | O sistema obtém a data e hora corrente do sistema operacional e não obtém o TST. |
Ocorreu uma falha na verificação do carimbo de tempo obtido. | O sistema emite um alerta ao operador, informando que o carimbo poderá não ser válido como evidência. |
Políticas genéricas: CAdES-BES e CAdES-T;
Políticas ICP-Brasil: AD-CP, AD-T, AD-R, AD-C e AD-A.
Para políticas de assinatura genéricas, são válidos somente os tipos definidos na RFC 5126: Prova de origem, Prova de recebimento, Prova de envio e Prova de aprovação. Para políticas de assinatura da ICP-Brasil são válidos também os tipos definidos no DOC-ICP-15: Concordância, Autorização, Testemunho, Autoria, Conferência, Revisão, Ciência, Publicação, Teste. Tipo default: Prova de origem.
Políticas genéricas: DSA com SHA-1, RSA com SHA-1 ou RSA com MD5;
Políticas ICP-Brasil: RSA com SHA-1.
Opções disponíveis na configuração: não verificar, verificar uma única vez por sessão e verificar sempre a cada assinatura. A cada verificação, o produto da operação do Caso de uso: Verificar validade (um relatório de validação e a cadeia de certificados utilizada) deve ficar disponível.
Opções disponíveis na configuração: não verificar, verificar uma única vez por sessão e verificar sempre a cada assinatura. A cada verificação, o produto da operação do Caso de uso: Verificar revogação (um relatório de validação e as LCR's obtidas durante o processo) deve ficar disponível.
Presentemente a aplicação suporta somente o formato CMS codificado em DER; o formato XMLDSig não é suportado. O arquivo produzido é salvo em disco no mesmo local que o documento eletrônico, com o mesmo nome deste e extensão .p7s adicionada.
Entram na composição do hash do conteúdo assinado os seguintes elementos: o documento eletrônico a ser assinado e o conteúdo codificado em DER de todos os atributos assinados.
CAdES-BES:
SignedData.version = 3;
SignedData.eContentType = id-data;
SignedData.eContent = conteúdo do documento assinado;
SignedData.certificate = cadeia de certificados do assinante;
SignedData.crls = LCR's coletadas durante a verificação da revogação;
SignedData.digestAlgorithms = algoritmo de hash utilizado;
SignerInfo.version = 1;
SignerInfo.signature = buffer assinado;
SignerInfo.sid = DN do emissor do certificado e seu número serial;
SignerInfo.signatureAlgorithm = algoritmo de assinatura utilizado;
SignerInfo.signedAttrs = MessageDigest, ContentType, SigningTime, SigningCertificateV2, CommitmentTypeIndication.
CAdES-T:
SignedData.version = 3;
SignedData.eContentType = id-data;
SignedData.eContent = conteúdo do documento assinado;
SignedData.certificate = cadeia de certificados do assinante;
SignedData.crls = LCR's coletadas durante a verificação da revogação;
SignedData.digestAlgorithms = algoritmo de hash utilizado;
SignerInfo.version = 1;
SignerInfo.signature = buffer assinado;
SignerInfo.sid = DN do emissor do certificado e seu número serial;
SignerInfo.signatureAlgorithm = algoritmo de assinatura utilizado;
SignerInfo.signedAttrs = MessageDigest, ContentType, SigningCertificateV2, CommitmentTypeIndication;
SignerInfo.unsignedAttrs = SignatureTimeStamp.
AD-CP:
SignedData.version = 3;
SignedData.eContentType = id-data;
SignedData.eContent = conteúdo do documento assinado;
SignedData.certificate = cadeia de certificados do assinante;
SignedData.crls = LCR's coletadas durante a verificação da revogação;
SignedData.digestAlgorithms = algoritmo de hash utilizado;
SignerInfo.version = 1;
SignerInfo.signature = buffer assinado;
SignerInfo.sid = DN do emissor do certificado e seu número serial;
SignerInfo.signatureAlgorithm = algoritmo de assinatura utilizado;
SignerInfo.signedAttrs = MessageDigest, ContentType, SigningTime, SigningCertificateV2, CommitmentTypeIndication, SignaturePolicy.
AD-T:
SignedData.version = 3;
SignedData.eContentType = id-data;
SignedData.eContent = conteúdo do documento assinado;
SignedData.certificate = cadeia de certificados do assinante;
SignedData.crls = LCR's coletadas durante a verificação da revogação;
SignedData.digestAlgorithms = algoritmo de hash utilizado;
SignerInfo.version = 1;
SignerInfo.signature = buffer assinado;
SignerInfo.sid = DN do emissor do certificado e seu número serial;
SignerInfo.signatureAlgorithm = algoritmo de assinatura utilizado;
SignerInfo.signedAttrs = MessageDigest, ContentType, SigningCertificateV2, CommitmentTypeIndication, SignaturePolicy;
SignerInfo.unsignedAttrs = SignatureTimeStamp.
AD-R:
SignedData.version = 3;
SignedData.eContentType = id-data;
SignedData.eContent = conteúdo do documento assinado;
SignedData.certificate = cadeia de certificados do assinante;
SignedData.crls = LCR's coletadas durante a verificação da revogação;
SignedData.digestAlgorithms = algoritmo de hash utilizado;
SignerInfo.version = 1;
SignerInfo.signature = buffer assinado;
SignerInfo.sid = DN do emissor do certificado e seu número serial;
SignerInfo.signatureAlgorithm = algoritmo de assinatura utilizado;
SignerInfo.signedAttrs = MessageDigest, ContentType, SigningCertificateV2, CommitmentTypeIndication, SignaturePolicy;
SignerInfo.unsignedAttrs = SignatureTimeStamp, ESCTimeStampToken, CompleteRevocationReferences, CompleteCertificateReferences.
AD-C:
SignedData.version = 3;
SignedData.eContentType = id-data;
SignedData.eContent = conteúdo do documento assinado;
SignedData.digestAlgorithms = algoritmo de hash utilizado;
SignerInfo.version = 1;
SignerInfo.signature = buffer assinado;
SignerInfo.sid = DN do emissor do certificado e seu número serial;
SignerInfo.signatureAlgorithm = algoritmo de assinatura utilizado;
SignerInfo.signedAttrs = MessageDigest, ContentType, SigningCertificateV2, CommitmentTypeIndication, SignaturePolicy;
SignerInfo.unsignedAttrs = SignatureTimeStamp, ESCTimeStampToken, CompleteRevocationReferences, CompleteCertificateReferences, CertificateValues, RevocationValues.
AD-A:
SignedData.version = 3;
SignedData.eContentType = id-data;
SignedData.eContent = conteúdo do documento assinado;
SignedData.digestAlgorithms = algoritmo de hash utilizado;
SignerInfo.version = 1;
SignerInfo.signature = buffer assinado;
SignerInfo.sid = DN do emissor do certificado e seu número serial;
SignerInfo.signatureAlgorithm = algoritmo de assinatura utilizado;
SignerInfo.signedAttrs = MessageDigest, ContentType, SigningCertificateV2, CommitmentTypeIndication, SignaturePolicy;
SignerInfo.unsignedAttrs = SignatureTimeStamp, ESCTimeStampToken, CompleteRevocationReferences, CompleteCertificateReferences, CertificateValues, RevocationValues, ArchiveTimeStampToken.
Como definido na RFC 3161, o campo messageImprint da requisição TSP para obtenção do carimbo de tempo deve ter a forma:
MessageImprint ::= SEQUENCE { hashAlgorithm AlgorithmIdentifier, hashedMessage OCTET STRING },
onde hashedMessage é o resumo criptográfico do dado a ser carimbado. Este campo é o produto do hash calculado segundo o algoritmo especificado da concatenação dos seguintes valores componentes (não incluídos o tipo e o indicador DER de tamanho):
SignatureTimeStamp: o buffer assinado digitalmente;
ESCTimeStampToken: o buffer assinado digitalmente, o valor do atributo SignatureTimeStamp, o valor do atributo CompleteCertificateReferences, o valor do atributo CompleteRevocationReferences;
ArchiveTimeStampToken: o buffer assinado digitalmente, o valor do atributo SignatureTimeStamp, o valor do atributo CompleteCertificateReferences, o valor do atributo CompleteRevocationReferences, o valor do atributo CertificateValues, o valor do atributo RevocationValues.
Como definido na RFC 5126, a localização do usuário é incluída na assinatura como um atributo assinado SignerLocation, que deve incluir um ou mais dos campos a seguir:
O envelope de transporte do documento assinado está disponível para o operador. O produto das verificações de conformidade e revogação do certificado do operador estão disponíveis para a próxima operação.
Caso de uso: Verificar validade e Verificar revogação.
Operação realizada (assinatura); data da operação; hash do arquivo; identificação do certificado do signatário (campos subject, issuer, serialNumber e campo policyIdentifier da extensão CertificatePolicies), relatório de validação da conformidade do certificado (se realizada ou indicação de não execução da verificação) e relatório de verificação da revogação do certificado (se realizada ou indicação de não execução da verificação).