amagovpt / autenticacao.gov

Middleware Oficial de Identificação Eletrónica em Portugal - Cartão de Cidadão, da Chave Móvel Digital e Sistema de Certificação de atributos profissionais
https://www.autenticacao.gov.pt
European Union Public License 1.2
164 stars 33 forks source link

Integração com esig/dss #109

Closed rodykings closed 2 years ago

rodykings commented 2 years ago

Estou a desenvolver um software que lista os vários certificados da KeyStore do Windows recorrendo ao esig/dss (MSCAPI). Se o utilizador escolher assinar um documento PDF com o Cartão de Cidadão recorro ao vosso SDK através do exemplo da vossa documentação. Contudo a única informação, por questões de segurança, que disponho do certificado escolhido pelo utilizador (listado pelo esig/dss) é o DSS Id.

Infelizmente as informações do Certificado de Assinatura listadas recorrendo ao esig/dss não correspondem às informações que é possível listar através do vosso SDK.

É possível dar cast do Certificado de Assinatura (PTEID_Certificate) para X509Certificate? Como consigo gerar um DSS Id através do vosso SDK para poder garantir que o Cartão de Cidadão escolhido é o que assinará o documento PDF?

agrr commented 2 years ago

Boa tarde,

pelo que pude investigar na framework DSS o DSS Id de um certificado é uma string no formato: "C-" + SHA-256(certificado em formato DER)

Se assumirmos que já temos o objecto PTEID_Certificate para o certificado do cartão inserido é possível gerar o DSS Id da seguinte forma:


//Método auxiliar para gerar uma representação em String hexadecimal de um array de bytes
static String hexEncodeUsingBigInteger(byte[] bytes) {
    BigInteger bigInteger = new BigInteger(1, bytes);
    return String.format(
    "%0" + (bytes.length << 1) + "X", bigInteger);
}

PTEID_ByteArray der_data = new PTEID_ByteArray();
//signature_certificate: objeto da classe PTEID_Certificate
signature_certificate.getFormattedData(der_data);

MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(der_data.GetBytes());
byte[] certDigest = md.digest();

String dss_id = "C-"+ hexEncodeUsingBigInteger(certDigest);
rodykings commented 2 years ago

Bom dia @agrr. Obrigado pela ajuda e prontidão na resposta. A funcionar na perfeição 💯