264 lines
9.4 KiB
C
264 lines
9.4 KiB
C
|
/*
|
||
|
*
|
||
|
* Copyright (C) 1998-2011, OFFIS e.V.
|
||
|
* All rights reserved. See COPYRIGHT file for details.
|
||
|
*
|
||
|
* This software and supporting documentation were developed by
|
||
|
*
|
||
|
* OFFIS e.V.
|
||
|
* R&D Division Health
|
||
|
* Escherweg 2
|
||
|
* D-26121 Oldenburg, Germany
|
||
|
*
|
||
|
*
|
||
|
* Module: dcmsign
|
||
|
*
|
||
|
* Author: Marco Eichelberg
|
||
|
*
|
||
|
* Purpose:
|
||
|
* classes: DcmSignature
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef DCMSIGN_H
|
||
|
#define DCMSIGN_H
|
||
|
|
||
|
#include "dcmtk/config/osconfig.h"
|
||
|
#include "dcmtk/dcmsign/sitypes.h"
|
||
|
|
||
|
#ifdef WITH_OPENSSL
|
||
|
|
||
|
#include "dcmtk/dcmdata/dcxfer.h" /* for E_TransferSyntax */
|
||
|
|
||
|
#define INCLUDE_CSTDIO
|
||
|
#include "dcmtk/ofstd/ofstdinc.h"
|
||
|
|
||
|
class DcmItem;
|
||
|
class DcmStack;
|
||
|
class DcmSequenceOfItems;
|
||
|
class DcmAttributeTag;
|
||
|
class SiPrivateKey;
|
||
|
class SiCertificate;
|
||
|
class SiSecurityProfile;
|
||
|
class SiMAC;
|
||
|
class SiTimeStamp;
|
||
|
|
||
|
/** this class provides the main interface to the dcmsign module - it allows
|
||
|
* to create, examine and verify digital signatures in DICOM datasets or
|
||
|
* items. The methods in this class do not handle digital signatures
|
||
|
* embedded in sequence items within the dataset, other than providing
|
||
|
* helper functions that allow to locate and attach the sub-items
|
||
|
* separately.
|
||
|
*/
|
||
|
class DCMTK_DCMSIGN_EXPORT DcmSignature
|
||
|
{
|
||
|
public:
|
||
|
/** initializes the dcmsign library including the underlying OpenSSL library.
|
||
|
* this method should be called by main() before any object of the dcmsign
|
||
|
* library is created or used.
|
||
|
*/
|
||
|
static void initializeLibrary();
|
||
|
|
||
|
/// default constructor
|
||
|
DcmSignature();
|
||
|
|
||
|
/// destructor
|
||
|
virtual ~DcmSignature();
|
||
|
|
||
|
/** attaches a DICOM dataset or item to the signature object.
|
||
|
* The dataset is detached by a call to detach() or by destruction
|
||
|
* of the signature object. This object may modify but never deletes
|
||
|
* an attached dataset.
|
||
|
* @param dataset dataset or item to be attached
|
||
|
*/
|
||
|
void attach(DcmItem *dataset);
|
||
|
|
||
|
/** detaches an attached DICOM dataset from the signature object.
|
||
|
*/
|
||
|
void detach();
|
||
|
|
||
|
/** creates a new digital signature in the current dataset.
|
||
|
* Checks whether private and public key match and whether
|
||
|
* all requirements of the given security profile are fulfilled.
|
||
|
* @param key private key for signature creation
|
||
|
* @param cert certificate with public key
|
||
|
* @param mac MAC algorithm to be used for signature creation
|
||
|
* @param profile security profile for signature creation
|
||
|
* @param xfer transfer syntax to use when serializing DICOM data
|
||
|
* @param tagList pointer to list of attribute tags to sign, may be NULL.
|
||
|
* If this parameter is nonzero, it contains a list of attribute sign.
|
||
|
* The real list of attributes signed is derived from this parameter plus the
|
||
|
* requirements of the security profile. If NULL, a universal match is assumed,
|
||
|
* i.e. all signable attributes in the data set are signed.
|
||
|
* @param timeStamp pointer to time stamp client used to create timestamps
|
||
|
* for the digital signature.
|
||
|
* @return status code
|
||
|
*/
|
||
|
OFCondition createSignature(
|
||
|
SiPrivateKey& key,
|
||
|
SiCertificate& cert,
|
||
|
SiMAC& mac,
|
||
|
SiSecurityProfile& profile,
|
||
|
E_TransferSyntax xfer=EXS_LittleEndianExplicit,
|
||
|
const DcmAttributeTag *tagList=NULL,
|
||
|
SiTimeStamp *timeStamp=NULL);
|
||
|
|
||
|
/** returns the number of signatures in the dataset. Does not count
|
||
|
* signatures embedded in sequence items within the dataset.
|
||
|
*/
|
||
|
unsigned long numberOfSignatures();
|
||
|
|
||
|
/** removes a signature from the dataset.
|
||
|
* @param i index, must be < numberOfSignatures().
|
||
|
* @return status code
|
||
|
*/
|
||
|
OFCondition removeSignature(unsigned long i);
|
||
|
|
||
|
/** selects one of the digital signatures from the attached dataset for reading.
|
||
|
* @param i index, must be < numberOfSignatures()
|
||
|
* @return status code
|
||
|
*/
|
||
|
OFCondition selectSignature(unsigned long i);
|
||
|
|
||
|
/** verifies the current signature.
|
||
|
* Current signature must be selected with selectSignature().
|
||
|
* @return SI_EC_Normal if signature is complete and valid, an error code
|
||
|
* describing the type of verification failure otherwise.
|
||
|
*/
|
||
|
OFCondition verifyCurrent();
|
||
|
|
||
|
/** returns the MAC ID of the current signature.
|
||
|
* Current signature must be selected with selectSignature().
|
||
|
* @param macID MAC ID returned in this parameter upon success
|
||
|
* @return status code
|
||
|
*/
|
||
|
OFCondition getCurrentMacID(Uint16& macID);
|
||
|
|
||
|
/** returns the MAC Calculation Transfer Syntax of the current signature.
|
||
|
* If the transfer syntax is well-known, the UID is replaced by the
|
||
|
* transfer syntax name preceded by '='.
|
||
|
* Current signature must be selected with selectSignature().
|
||
|
* @param str transfer syntax name or UID returned in this parameter upon success
|
||
|
* @return status code
|
||
|
*/
|
||
|
OFCondition getCurrentMacXferSyntaxName(OFString& str);
|
||
|
|
||
|
/** returns the MAC Algorithm Name of the current signature.
|
||
|
* Current signature must be selected with selectSignature().
|
||
|
* @param str MAC algorithm name returned in this parameter upon success
|
||
|
* @return status code
|
||
|
*/
|
||
|
OFCondition getCurrentMacName(OFString& str);
|
||
|
|
||
|
/** returns the Digital Signature UID of the current signature.
|
||
|
* Current signature must be selected with selectSignature().
|
||
|
* @param str signature UID returned in this parameter upon success
|
||
|
* @return status code
|
||
|
*/
|
||
|
OFCondition getCurrentSignatureUID(OFString& str);
|
||
|
|
||
|
/** returns the Signature Date/Time of the current signature.
|
||
|
* Current signature must be selected with selectSignature().
|
||
|
* @param str signature date/time returned in this parameter upon success
|
||
|
* @return status code
|
||
|
*/
|
||
|
OFCondition getCurrentSignatureDateTime(OFString& str);
|
||
|
|
||
|
/** returns the Data Elements Signed attribute of the current signature if present.
|
||
|
* Current signature must be selected with selectSignature().
|
||
|
* If a valid signature is selected but the signature does not contain
|
||
|
* the Data Elements Signed element (i.e. all attributes are signed), this method
|
||
|
* returns an error code.
|
||
|
* @param desig data elements signed returned in this parameter upon success
|
||
|
* @return status code
|
||
|
*/
|
||
|
OFCondition getCurrentDataElementsSigned(DcmAttributeTag& desig);
|
||
|
|
||
|
/** returns the certificate of the current signature if present.
|
||
|
* Current signature must be selected with selectSignature().
|
||
|
* May return NULL if certificate is unavailable.
|
||
|
* @return pointer to current certificate, NULL if unavailable.
|
||
|
*/
|
||
|
SiCertificate *getCurrentCertificate();
|
||
|
|
||
|
/** dump all data that is fed into the MAC algorithm into the given file,
|
||
|
* which must be opened and closed by caller.
|
||
|
* @param f pointer to file already opened for writing; may be NULL.
|
||
|
*/
|
||
|
void setDumpFile(FILE *f);
|
||
|
|
||
|
/** recursively browses through the given dataset and searches the first
|
||
|
* occurence of the DigitalSignaturesSequence. If found, returns
|
||
|
* a pointer to the Item in which the sequence is contained.
|
||
|
* @param item dataset to be browsed
|
||
|
* @param stack search stack, must be passed to findNextSignatureItem() later on.
|
||
|
* @return pointer to Item containing a DigitalSignatureSequence if found, NULL otherwise.
|
||
|
*/
|
||
|
static DcmItem *findFirstSignatureItem(DcmItem& item, DcmStack& stack);
|
||
|
|
||
|
/** recursively browses through the given dataset and searches the next
|
||
|
* occurence of the DigitalSignaturesSequence. If found, returns
|
||
|
* a pointer to the Item in which the sequence is contained.
|
||
|
* @param item dataset to be browsed
|
||
|
* @param stack search stack as returned by findFirstSignatureItem() or the last call to this method.
|
||
|
* @return pointer to Item containing a DigitalSignatureSequence if found, NULL otherwise.
|
||
|
*/
|
||
|
static DcmItem *findNextSignatureItem(DcmItem& item, DcmStack& stack);
|
||
|
|
||
|
private:
|
||
|
|
||
|
/// private undefined copy constructor
|
||
|
DcmSignature(DcmSignature& arg);
|
||
|
|
||
|
/// private undefined copy assignment operator
|
||
|
DcmSignature& operator=(DcmSignature& arg);
|
||
|
|
||
|
/// removes the selection of a current signature if present
|
||
|
void deselect();
|
||
|
|
||
|
/** allocates a new mac ID number for a new signature.
|
||
|
* examines all mac ID numbers in the digital signatures sequence
|
||
|
* and in the mac parameters sequence and returns an unused number.
|
||
|
* @param newID upon successful return, new number is passed in this parameter
|
||
|
* @return status code
|
||
|
*/
|
||
|
OFCondition allocateMACID(Uint16& newID);
|
||
|
|
||
|
/** searches a given item for the DCM_MACIDnumber element and returns
|
||
|
* its value if present, otherwise returns 0.
|
||
|
* @param item item to be searched
|
||
|
* @return MAC ID number in item or zero if absent.
|
||
|
*/
|
||
|
static Uint16 getMACIDnumber(DcmItem &item);
|
||
|
|
||
|
/** returns the current date and time as a DICOM DT string.
|
||
|
* @param str date/time returned in this string.
|
||
|
*/
|
||
|
static void currentDateTime(OFString &str);
|
||
|
|
||
|
/// pointer to current item if attached, NULL otherwise
|
||
|
DcmItem *currentItem;
|
||
|
|
||
|
/// pointer to mac parameters sequence of attached item, may be NULL if not attached or not yet present
|
||
|
DcmSequenceOfItems *macParametersSq;
|
||
|
|
||
|
/// pointer to digital signatures sequence of attached item, may be NULL if not attached or not yet present
|
||
|
DcmSequenceOfItems *signatureSq;
|
||
|
|
||
|
/// if nonzero, the data fed to the MAC algorithm is also stored in this file.
|
||
|
FILE *dumpFile;
|
||
|
|
||
|
/// pointer to currently selected signature item
|
||
|
DcmItem *selectedSignatureItem;
|
||
|
|
||
|
/// pointer to currently selected mac parameters item
|
||
|
DcmItem *selectedMacParametersItem;
|
||
|
|
||
|
/// pointer to certificate for currently selected signature item
|
||
|
SiCertificate *selectedCertificate;
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
#endif
|