Adjust and complete the documentation of the new "StructuringInfo" struct and the corresponding free_StructuringInfo() function and - for plugin developers - the corresponding init_StructuringInfo() function

This commit is contained in:
Karl-Heinz Zimmer 2001-12-23 22:37:51 +00:00
parent d088ff5626
commit 4ee79f2416

View File

@ -118,13 +118,23 @@ typedef char bool;
The following methods are used to maintain and query certificates.
*/
/*! \defgroup groupSignCryptAct Signing and Encrypting Actions
This section describes methods and structures
used for signing and/or encrypting your mails.
*/
/*! \defgroup groupSignAct Signature Actions
\ingroup groupSignCryptAct
This section describes methods that are used for working
with signatures.
*/
/*! \defgroup groupCryptAct Encryption and Decryption
\ingroup groupSignCryptAct
The following methods are used to encrypt and decrypt
email messages.
@ -140,8 +150,15 @@ typedef char bool;
This section describes functions for managing CRLs.
*/
/*! \defgroup groupAdUsoInterno Important functions to be used by plugin implementors ONLY.
This section describes functions that have to be used by
plugin implementors but should not be used by plugin users
directly.
If you are not planning to write your own cryptography
plugin <b>you should ignore this</b> section!
*/
// dummy values:
@ -221,6 +238,19 @@ typedef enum {
/*! \ingroup groupGeneral
\brief This function returns a URL to be used for reporting a bug that
you found (or suspect, resp.) in this cryptography plug-in.
If the plugins for some reason cannot specify an appropriate URL you
should at least be provided with a text giving you some advise on
how to report a bug.
\note This function <b>must</b> be implemented by each plug-in using
this API specification.
*/
const char* bugURL( void );
/*! \ingroup groupGeneral
\brief This function sets up all internal structures.
@ -310,7 +340,7 @@ const char* signatureConfigurationDialog( void );
/*! \ingroup groupConfigSign
\brief This function returns an XML representation of a
configuration dialog for selecting a signature key.
This will typically be used when the user wants to select a
signature key for one specific message only; the defaults
are set in the dialog returned by
@ -402,8 +432,8 @@ void setWarnSendUnsigned( bool );
\brief Returns whether a warning should be emitted when the user
tries to send an email message unsigned.
*/
bool warnSendUnsigned( void );
bool warnSendUnsigned( void );
/*! \ingroup groupConfigSign
\brief Specifies whether sent email messages should be stored
@ -561,14 +591,14 @@ void setRootCertificateExpiryNearInterval( int );
*/
int rootCertificateExpiryNearInterval( void );
/*! \ingroup groupConfigCrypt
\brief This function returns an XML representation of a
configuration dialog for configuring encryption
handling.
The syntax is that of <filename>.ui</filename>
files as specified in the <emphasis>Imhotep</emphasis>
documentation. This function does not execute or show the
@ -610,7 +640,7 @@ const char* encryptionHandlingDialog( void );
\brief This function returns an XML representation of a
dialog that lets the user select the certificate to use
for encrypting.
If it was not possible to determine the
correct certificate from the information in the email
message, the user is presented with a list of possible
@ -649,16 +679,16 @@ EncryptEmail encryptEmail( void );
\brief Specifies whether a warning should be emitted when the user
tries to send an email message unencrypted.
*/
void setWarnSendUnencrypted( bool );
void setWarnSendUnencrypted( bool );
/*! \ingroup groupConfigSign
\brief Returns whether a warning should be emitted when the user
tries to send an email message unencrypted.
*/
bool warnSendUnencrypted( void );
/*! \ingroup groupConfigCrypt
\brief Specifies whether encrypted email messages should be
stored encrypted or decrypted.
@ -712,7 +742,7 @@ void setReceiverCertificateExpiryNearWarning( bool );
*/
bool receiverCertificateExpiryNearWarning( void );
/*! \ingroup groupConfigCrypt
\brief Specifies the number of days which a receiver certificate
must be valid before it is considered to expire in the near future.
@ -724,7 +754,7 @@ void setReceiverCertificateExpiryNearWarningInterval( int );
must be valid before it is considered to expire in the near future.
*/
int receiverCertificateExpiryNearWarningInterval( void );
/*! \ingroup groupConfigCrypt
\brief Specifies whether a warning should be emitted if
a certificate in the chain expires in the near future.
@ -745,13 +775,13 @@ bool certificateInChainExpiryNearWarning( void );
must be valid before it is considered to expire in the near future.
*/
void setCertificateInChainExpiryNearWarningInterval( int );
/*! \ingroup groupConfigCrypt
\brief Returns the number of days which a certificate in the chain
must be valid before it is considered to expire in the near future.
*/
int certificateInChainExpiryNearWarningInterval( void );
/*! \ingroup groupConfigCrypt
\brief Specifies whether a warning is emitted if the email address
@ -763,9 +793,9 @@ void setReceiverEmailAddressNotInCertificateWarning( bool );
\brief Returns whether a warning is emitted if the email address
of the receiver does not appear in the certificate.
*/
bool receiverEmailAddressNotInCertificateWarning( void );
bool receiverEmailAddressNotInCertificateWarning( void );
/*! \ingroup groupConfigCrypt
\brief Specifies whether certificate revocation lists should
be used.
@ -888,7 +918,7 @@ CertificateSource crlSource( void );
\brief Returns \c true if and only if the
certificates in the certificate chain starting at
\c certificate are valid.
If \c level is non-null, the parameter contains
the degree of trust on a backend-specific scale. In an X.509
implementation, this will either be \c 1
@ -898,18 +928,434 @@ CertificateSource crlSource( void );
bool certificateValidity( const char* certificate, int* level );
/*! \ingroup groupSignCryptAct
\brief Information record returned by signing and by encrypting
functions - this record should be used together with a
corresponding \c free_StructuringInfo() function call.
Use this information to compose a MIME object containing signed
and/or encrypted content (or to build a text frame around your
flat non-MIME message body, resp.)
<b>If</b> value returned in \c makeMimeObject is <b>TRUE</b> the
text strings returned in \c contentTypeMain and \c contentDispMain
and \c contentTEncMain (and, if required, \c content[..]Version and
\c bodyTextVersion and \c content[..]Sig) should be used to compose
a respective MIME object.<br>
If <b>FALSE</b> the texts returned in \c flatTextPrefix and
\c flatTextSeparator and \c flatTextPostfix are to be used instead.<br>
Allways <b>either</b> the \c content[..] and \c bodyTextVersion
parameters <b>or</b> the \c flatText[..] parameters are holding
valid data - never both of them may be used simultaneously
as plugins will just ignore the parameters not matching their
\c makeMimeObject setting.
When creating your MIME object please observe these common rules:
\li Parameters named \c contentType[..] and \c contentDisp[..] and
\c contentTEnc[..] will return the values for the respective MIME
headers 'Content-Type' and 'Content-Disposition' and
'Content-Transfer-Encoding'. The following applies to these parameters:
\li The relevant MIME part may <b>only</b> be created if the respective
\c contentType[..] parameter is holding a non-zero-length string. If the
\c contentType[..] parameter value is invalid or holding an empty string
the respective \c contentDisp[..] and \c contentTEnc[..] parameters
should be ignored.
\li If the respective \c contentDisp[..] or \c contentTEnc[..] parameter
is NULL or holding a zero-length string it is up to you whether you want
to add the relevant MIME header yourself, but since it in in the
responsibility of the plugin implementors to provide you with all
neccessary 'Content-[..]' header information you should <b>not need</b>
to define them if they are not returned by the signing or encrypting
function - otherwise this may be considered as a bug in the plugin and
you could report the missing MIME header information to the address
returned by the \c bugURL() function.
If \c makeMultiMime returns FALSE the \c contentTypeMain returned must
not be altered but used to specify a single part mime object holding the
code bloc, e.g. this is used for 'enveloped-data' single part MIME
objects. In this case you should ignore both the \c content[..]Version
and \c content[..]Code parameters.
If \c makeMultiMime returns TRUE also the following rules apply:
\li If \c includeCleartext is TRUE you should include the cleartext
as first part of our multipart MIME object, typically this is TRUE
when signing mails but FALSE when encrypting.
\li The \c contentTypeMain returned typically starts with
"multipart/" while providing a "protocol" and a "micalg" parameter: just
add an appropriate \c "; boundary=[your \c boundary \c string]" to get
the complete Content-Type value to be used for the MIME object embedding
both the signed part and the signature part (or - in case of
encrypting - the version part and the code part, resp.).
\li If \c contentTypeVersion is holding a non-zero-length string an
additional MIME part must added immediately before the code part, this
version part's MIME headers must have the unaltered values of
\c contentTypeVersion and (if they are holding non-zero-length strings)
\c contentDispVersion and \c contentTEncVersion, the unaltered contents
of \c bodyTextVersion must be it's body.
\li The value returned in \c contentTypeCode is specifying the complete
Content-Type to be used for this multipart MIME object's signature part
(or - in case of encrypting - for the code part following after the
version part, resp.), you should not add/change/remove anything here
but just use it's unaltered value for specifying the Content-Type header
of the respective MIME part.
\li The same applies to the \c contentDispCode value: just use it's
unaltered value to specify the Content-Disposition header entry of
the respective MIME part.
\li The same applies to the \c contentTEncCode value: just use it's
unaltered value to specify the Content-Transfer-Encoding header of
the respective MIME part.
<b>If</b> value returned in \c makeMimeObject is <b>FALSE</b> the
text strings returned in \c flatTextPrefix and \c flatTextPostfix
should be used to build a frame around the cleartext and the code
bloc holding the signature (or - in case of encrypting - the encoded
data bloc, resp.).<br>
If \c includeCleartext is TRUE this frame should also include the
cleartext as first bloc, this bloc should be divided from the code bloc
by the contents of \c flatTextSeparator - typically this is used for
signing but not when encrypting.<br>
If \c includeCleartext is FALSE you should ignore both the cleartext
and the \c flatTextSeparator parameter.
<b>How to use StructuringInfo data in your program:</b>
\li To compose a signed message please act as described below.
\li For constructing an encrypted message just replace the
\c signMessage() call by the respective \c encryptMessage() call
and then proceed exactly the same way.
\li In any case make <b>sure</b> to free your \c ciphertext <b>and</b>
to call \c free_StructuringInfo() when you are done with processing
the data returned by the signing (or encrypting, resp.) function.
\verbatim
char* ciphertext;
StructuringInfo structInf;
if( ! signMessage( cleartext, &ciphertext, certificate,
&structuring ) ) {
myErrorDialog( "Error: could not sign the message!" );
} else {
if( structInf.makeMimeObject ) {
// Build the main MIME object.
// This is done by
// using the header values returned in
// structInf.contentTypeMain and in
// structInf.contentDispMain and in
// structInf.contentTEncMain.
..
if( ! structInf.makeMultiMime ) {
// Build the main MIME object's body.
// This is done by
// using the code bloc returned in
// ciphertext.
..
} else {
// Build the encapsulated MIME parts.
if( structInf.includeCleartext ) {
// Build a MIME part holding the cleartext.
// This is done by
// using the original cleartext's headers and by
// taking it's original body text.
..
}
if( structInf.contentTypeVersion
&& 0 < strlen( structInf.contentTypeVersion ) ) {
// Build a MIME part holding the version information.
// This is done by
// using the header values returned in
// structInf.contentTypeVersion and
// structInf.contentDispVersion and
// structInf.contentTEncVersion and by
// taking the body contents returned in
// structInf.bodyTextVersion.
..
}
if( structInf.contentTypeCode
&& 0 < strlen( structInf.contentTypeCode ) ) {
// Build a MIME part holding the code information.
// This is done by
// using the header values returned in
// structInf.contentTypeCode and
// structInf.contentDispCode and
// structInf.contentTEncCode and by
// taking the body contents returned in
// ciphertext.
..
} else {
// Plugin error!
myErrorDialog( "Error: Cryptography plugin returned a main"
"Content-Type=Multipart/.. but did not "
"specify the code bloc's Content-Type header."
"\nYou may report this bug:"
"\n" + cryptplug.bugURL() );
}
}
} else {
// Build a plain message body
// based on the values returned in structInf.
// Note: We do _not_ insert line breaks between the parts since
// it is the plugin job to provide us with ready-to-use
// texts containing all neccessary line breaks.
strcpy( myMessageBody, structInf.plainTextPrefix );
if( structInf.includeCleartext ) {
strcat( myMessageBody, cleartext );
strcat( myMessageBody, structInf.plainTextSeparator );
}
strcat( myMessageBody, *ciphertext );
strcat( myMessageBody, structInf.plainTextPostfix );
}
// free the memory that was allocated
// for the ciphertext
free( ciphertext );
// free the memory that was allocated
// for our StructuringInfo's char* members
free_StructuringInfo( &structuring );
}
\endverbatim
\note Make sure to call \c free_StructuringInfo() when you are done
with processing the StructuringInfo data!
\see free_StructuringInfo
\see signMessage, encryptMessage, encryptAndSignMessage
*/
struct StructuringInfo {
bool includeCleartext; /*!< specifies whether we should include the
cleartext as first part of our multipart
MIME object (or - for non-MIME
messages - as flat text to be set before
the ciphertext, resp.), typically this
is TRUE when signing mails but FALSE
when encrypting<br>
(this parameter is relevant no matter
whether \c makeMimeObject is TRUE or
FALSE) */
bool makeMimeObject; /*!< specifies whether we should create a MIME
object or a flat text message body */
// the following are used for MIME messages only
bool makeMultiMime; /*!< specifies whether we should create a
'Multipart' MIME object or a single part
object, if FALSE only \c contentTypeMain,
\c contentDispMain and \c contentTEncMain
may be used and all other parameters have
to be ignored<br>
(ignore this parameter if \c makeMimeObject
is FALSE) */
char* contentTypeMain; /*!< value of the main 'Content-Type'
header<br>
(ignore this parameter if \c makeMimeObject
is FALSE) */
char* contentDispMain; /*!< value of the main 'Content-Disposition'
header<br>
(ignore this parameter if \c makeMimeObject
is FALSE) */
char* contentTEncMain; /*!< value of the main
'Content-TransferEncoding' header<br>
(ignore this parameter if \c makeMimeObject
is FALSE) */
char* contentTypeVersion; /*!< 'Content-Type' of the additional version
part that might preceed the code part -
if NULL or zero length no version part
must be created<br>
(ignore this parameter if either
\c makeMimeObject or \c makeMultiMime
is FALSE) */
char* contentDispVersion; /*!< 'Content-Disposition' of the additional
preceeding the code part (only valid if
\c contentTypeVersion holds a
non-zero-length string)<br>
(ignore this parameter if either
\c makeMimeObject or \c makeMultiMime
is FALSE or if \c contentTypeVersion does
not return a non-zero-length string) */
char* contentTEncVersion; /*!< 'Content-Transfer-Encoding' of the
additional version part (only valid if
\c contentTypeVersion holds a
non-zero-length string)<br>
(ignore this parameter if either
\c makeMimeObject or \c makeMultiMime
is FALSE or if \c contentTypeVersion does
not return a non-zero-length string) */
char* bodyTextVersion; /*!< body text of the additional version part
(only valid if \c contentTypeVersion
holds a non-zero-length string)<br>
(ignore this parameter if either
\c makeMimeObject or \c makeMultiMime
is FALSE or if \c contentTypeVersion does
not return a non-zero-length string) */
char* contentTypeCode; /*!< 'Content-Type' of the code part holding
the signature code (or the encrypted
data, resp.)<br>
(ignore this parameter if either
\c makeMimeObject or \c makeMultiMime
is FALSE) */
char* contentDispCode; /*!< 'Content-Disposition' of the code part<br>
(ignore this parameter if either
\c makeMimeObject or \c makeMultiMime
is FALSE or if \c contentTypeCode does
not return a non-zero-length string) */
char* contentTEncCode; /*!< 'Content-Type' of the code part<br>
(ignore this parameter if either
\c makeMimeObject or \c makeMultiMime
is FALSE or if \c contentTypeCode does
not return a non-zero-length string) */
// the following are used for flat non-MIME messages only
char* flatTextPrefix; /*!< text to preceed the main text (or the
code bloc containing the encrypted main
text, resp.)<br>
(ignore this parameter if
\c makeMimeObject is TRUE) */
char* flatTextSeparator; /*!< text to be put between the main text and
the signature code bloc (not used when
encrypting)<br>
(ignore this parameter if
\c makeMimeObject is TRUE or if
\c includeCleartext is FALSE) */
char* flatTextPostfix; /*!< text to follow the signature code bloc
(or the encrypted data bloc, resp.)<br>
(ignore this parameter if
\c makeMimeObject is TRUE) */
};
/*! \ingroup groupAdUsoInterno
\brief If you are not planning to write your own cryptography
plugin <b>you should ignore this</b> function!
Usage of this function is depreciated for plugin users but highly
recommended for plugin implementors since this is an internal
function for initializing all char* members of a \c StructuringInfo
struct.<br>
This function <b>must</b> be called in <b>any</b> plugin's
implementations of the following functions:
\c signMessage() <br>
\c encryptMessage() <br>
\c encryptAndSignMessage()
Calling this function makes sure the corresponding
\c free_StructuringInfo() calls which will be embedded by
your plugin's users into their code will be able to
determine which of the char* members belonging to the
respective's StructuringInfo had been allocated memory
for during previous signing or encrypting actions.
\see free_StructuringInfo, StructuringInfo
\see signMessage, encryptMessage, encryptAndSignMessage
*/
void init_StructuringInfo( struct StructuringInfo* s )
{
if( ! s ) return;
s->includeCleartext = false;
s->makeMimeObject = false;
s->makeMultiMime = false;
s->contentTypeMain = 0;
s->contentDispMain = 0;
s->contentTEncMain = 0;
s->contentTypeVersion = 0;
s->contentDispVersion = 0;
s->contentTEncVersion = 0;
s->bodyTextVersion = 0;
s->contentTypeCode = 0;
s->contentDispCode = 0;
s->contentTEncCode = 0;
s->flatTextPrefix = 0;
s->flatTextSeparator = 0;
s->flatTextPostfix = 0;
}
/*! \ingroup groupSignCryptAct
\brief Important method for freeing all memory that was allocated
for the char* members of a \c StructuringInfo struct - use
this function after <b>each</b> signing or encrypting function
call.
\note Even when intending to call \c encryptMessage() immediately
after having called \c signMessage() you first <b>must</b> call
the \c free_StructuringInfo() function to make sure all memory is
set free that was allocated for your StructuringInfo's char* members
by the \c signMessage() function!
\see StructuringInfo
*/
void free_StructuringInfo( struct StructuringInfo* s )
{
if( ! s ) return;
if( s->contentTypeMain ) free( s->contentTypeMain );
if( s->contentDispMain ) free( s->contentDispMain );
if( s->contentTEncMain ) free( s->contentTEncMain );
if( s->contentTypeVersion ) free( s->contentTypeVersion );
if( s->contentDispVersion ) free( s->contentDispVersion );
if( s->contentTEncVersion ) free( s->contentTEncVersion );
if( s->bodyTextVersion ) free( s->bodyTextVersion );
if( s->contentTypeCode ) free( s->contentTypeCode );
if( s->contentDispCode ) free( s->contentDispCode );
if( s->contentTEncCode ) free( s->contentTEncCode );
if( s->flatTextPrefix ) free( s->flatTextPrefix );
if( s->flatTextSeparator ) free( s->flatTextSeparator );
if( s->flatTextPostfix ) free( s->flatTextPostfix );
}
/*! \ingroup groupSignAct
\brief Signs a message \c cleartext and returns
in \c ciphertext the message including
signature.
in \c *ciphertext the signature data bloc that
is to be added to the message.
The signature role is specified by
\c certificate. If \c certificate is \c NULL,
the default certificate is used.
The signature role is specified by \c certificate.
If \c certificate is \c NULL, the default certificate is used.
If the message could be signed, the function returns
\c true, otherwise
\c false.
Use the StructuringInfo data returned in parameter \c structuring
to find out how to build the respective MIME object (or the plain
text message body, resp.).
\note The function allocates memory for the \c *ciphertext, so
make sure you set free that memory when no longer needing
it (as shown in example code provided with documentation
of the struct \c StructuringInfo).
\note The function also allocates memory for some char* members
of the StructuringInfo* parameter that you are providing,
therefore you <b>must</b> call the \c free_StructuringInfo() function
to make sure all memory is set free that was allocated. This must be
done <b>before</b> calling the next cryptography function - even if
you intend to call \c encryptMessage() immediately after
\c signMessage().
\see StructuringInfo, free_StructuringInfo
*/
bool signMessage( const char* cleartext,
bool signMessage( const char* cleartext,
const char** ciphertext,
const char* certificate );
const char* certificate,
struct StructuringInfo* structuring );
/*! \ingroup groupSignAct
@ -956,17 +1402,36 @@ bool storeCertificatesFromMessage( const char* ciphertext );
/*! \ingroup groupCryptAct
\brief Encrypts an email message in
\c cleartext according to the current
settings (algorithm, etc.) and returns it in
\c ciphertext.
\c cleartext according to the \c addressee and
the current settings (algorithm, etc.) and
returns the encoded data bloc in \c *ciphertext.
If the message could be encrypted, the function returns
\c true, otherwise
\c false.
Use the StructuringInfo data returned in parameter \c structuring
to find out how to build the respective MIME object (or the plain
text message body, resp.).
\note The function allocates memory for the \c *ciphertext, so
make sure you set free that memory when no longer needing
it (as shown in example code provided with documentation
of the struct \c StructuringInfo).
\note The function also allocates memory for some char* members
of the StructuringInfo* parameter that you are providing,
therefore you <b>must</b> call the \c free_StructuringInfo() function
to make sure all memory is set free that was allocated. This must be
done <b>before</b> calling the next cryptography function!
\see StructuringInfo, free_StructuringInfo
*/
bool encryptMessage( const char* cleartext,
const char** ciphertext,
const char* addressee );
const char* addressee,
struct StructuringInfo* structuring );
/*! \ingroup groupCryptAct
\brief Combines the functionality of
@ -974,16 +1439,33 @@ bool encryptMessage( const char* cleartext,
\c signMessage().
If \c certificate is \c NULL,
the default certificate will be used. If
\c sigmeta is non-null, the
\c SignatureMetaData object pointed to will
contain meta information about the signature after the
function call.
the default certificate will be used.
If the message could be signed and encrypted, the function returns
\c true, otherwise
\c false.
Use the StructuringInfo data returned in parameter \c structuring
to find out how to build the respective MIME object (or the plain
text message body, resp.).
\note The function allocates memory for the \c *ciphertext, so
make sure you set free that memory when no longer needing
it (as shown in example code provided with documentation
of the struct \c StructuringInfo).
\note The function also allocates memory for some char* members
of the StructuringInfo* parameter that you are providing,
therefore you <b>must</b> call the \c free_StructuringInfo() function
to make sure all memory is set free that was allocated. This must be
done <b>before</b> calling the next cryptography function!
\see StructuringInfo, free_StructuringInfo
*/
bool encryptAndSignMessage( const char* cleartext,
const char** ciphertext,
const char* certificate,
struct SignatureMetaData* sigmeta );
struct StructuringInfo* structuring );
/*! \ingroup groupCryptAct
\brief Tries to decrypt an email message
@ -1004,11 +1486,10 @@ bool decryptMessage( const char* ciphertext, const
\c decryptMessage().
If \c certificate is \c NULL,
the default certificate will be used. If
\c sigmeta is non-null, the
\c SignatureMetaData object pointed to will
contain meta information about the signature after the
function call.
the default certificate will be used.
If \c sigmeta is non-null, the \c SignatureMetaData
object pointed to will contain meta information about
the signature after the function call.
*/
bool decryptAndCheckMessage( const char* ciphertext,
const char** cleartext,