⚠️ Este é um site de tradução não oficial, sem relação com o DCMTK / OFFIS. Para informações oficiais, consulte a página original (https://support.dcmtk.org/docs/mod_dcmsign.html).

dcmsign: biblioteca de assinatura digital e aplicativos utilitários

Este módulo contém classes para criar assinaturas digitais em conjuntos de dados DICOM, verificá-las e removê-las. As assinaturas estão em conformidade com a extensão DICOM "Digital Signatures" (anteriormente Supplement 41). Este módulo requer a biblioteca externa OpenSSL.

As principais classes de interface são:

Ferramentas

Este módulo contém a seguinte ferramenta de linha de comando:

Exemplos

O exemplo a seguir mostra como verificar todas as assinaturas em um arquivo DICOM:

DcmFileFormat fileformat;

if (fileformat.loadFile("test.dcm").good())

{

// Load a root Certification Authority certificate from "ca_cert.pem"

// and declare it as trusted. All certificates issued by this CA will

// be considered trustworthy (if within their validity time).

SiCertificateVerifier certVerifier;

if (certVerifier.addTrustedCertificateFile("ca_cert.pem",

X509_FILETYPE_PEM).bad())

{

cerr << "unable to load CA certificate" << endl;

return;

}

// Verify all signatures in the dataset, and verify the signer

// certificate against the root CA defined above.

// Fail if no signature is present in the dataset, but do not require

// any specific DICOM signature profile. Verify a secure timestamp

// if present, but do not fail signature verification if no timestamp

// is there.

int result = DcmSignatureHelper::do_verify(fileformat.getDataset(),

certVerifier, ESVP_requireSignature, ETVP_verifyTSIfPresent);

if (result == 0)

std::cerr << "signature(s) found and successfully verified" << endl;

else

std::cerr << "signature absent or verification failed" << endl;

}

O exemplo a seguir mostra como assinar um arquivo DICOM:

DcmFileFormat fileformat;

if (fileformat.loadFile("test.dcm").good())

{

// dataset to be signed

DcmDataset *dataset = fileformat.getDataset();

// select transfer syntax in which digital signature will be created

E_TransferSyntax xfer = dataset->getOriginalXfer();

// use Little Endian Explicit for uncompressed files

if ((xfer == EXS_LittleEndianImplicit) ||

(xfer == EXS_BigEndianExplicit))

xfer = EXS_LittleEndianExplicit;

SiCreatorProfile profile; // use the "RSA Creator Profile"

SiRIPEMD160 mac; // use RIPEMD160 as MAC algorithm

SiCertificate cert; // our certificate

if (cert.loadCertificate("certificate.pem", X509_FILETYPE_PEM).bad())

{

cerr << "unable to load certificate" << endl;

return;

}

SiPrivateKey key; // private key, must be unencrypted here

if (key.loadPrivateKey("privkey.pem", X509_FILETYPE_PEM).bad())

{

cerr << "unable to load private key" << endl;

return;

}

// list of attributes to be signed. It can remain empty here

// since we're using the RSA Creator Profile to determine the

// list of attributes that needs to be signed

DcmAttributeTag tags;

// now create the signature

int result = DcmSignatureHelper::do_sign(dataset,

key, cert, &mac, &profile, &tags, xfer, NULL,

SiSignaturePurpose::ESP_none, NULL);

if (result == 0)

std::cerr << "signature successfully created" << endl;

else

std::cerr << "signature creation failed" << endl;

}