/** @fn int soap_mec_begin(struct soap *soap, struct soap_mec_data *data, int alg, SOAP_MEC_KEY_TYPE *pkey, unsigned char *key, int *keylen) @brief Initialize the mecevp engine data and begin encryption or decryption message sequence using a private/public key or symmetric secret key. @param soap context @param[in,out] data mecevp engine context @param[in] alg encryption/decryption algorithm @param[in] pkey public/private key or NULL @param[in,out] key secret key or encrypted ephemeral secret key set with envelope encryption, or NULL @param[in,out] keylen secret key length @return SOAP_OK or error code */ int soap_mec_begin(struct soap *soap, struct soap_mec_data *data, int alg, SOAP_MEC_KEY_TYPE *pkey, unsigned char *key, int *keylen) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MEC Begin alg=%x\n", alg)); /* save and set the engine's 'data' field to pass data to the callbacks */ soap->data[1] = (void*)data; data->ctx = NULL; data->type = EVP_enc_null(); data->pkey = NULL; data->key = NULL; data->buf = NULL; /* save the mode flag */ data->mode = soap->mode; if (alg & SOAP_MEC_ENC) { /* clear the IO flags and DOM flag */ soap->mode &= ~(SOAP_IO | SOAP_IO_LENGTH | SOAP_ENC_ZLIB | SOAP_XML_DOM); /* clear the XML attribute store */ soap_clr_attr(soap); /* load the local XML namespaces store */ soap_set_local_namespaces(soap); if (soap->mode & SOAP_XML_CANONICAL) soap->ns = 0; /* for in c14n, we must have all xmlns bindings available */ } else { /* save and override the callbacks */ data->ffilterrecv = soap->ffilterrecv; soap->ffilterrecv = soap_mec_filterrecv; } /* init the soap_mec engine */ return soap_mec_init(soap, data, alg, pkey, key, keylen); }
/** @fn int soap_smd_begin(struct soap *soap, int alg, const void *key, int keylen) @brief Initiates a digest or signature computation. @param soap context @param[in] alg is the digest or signature (sign/verification) algorithm used @param[in] key is a HMAC key or pointer to EVP_PKEY object or NULL for digests @param[in] keylen is the length of the HMAC key or 0 @return SOAP_OK, SOAP_EOM, or SOAP_SSL_ERROR */ int soap_smd_begin(struct soap *soap, int alg, const void *key, int keylen) { struct soap_smd_data *data; data = (struct soap_smd_data*)SOAP_MALLOC(soap, sizeof(struct soap_smd_data)); if (!data) return soap->error = SOAP_EOM; /* save and set the engine's 'data' field to pass data to the callbacks */ soap->data[0] = (void*)data; /* save and override the send and recv callbacks */ data->fsend = soap->fsend; data->frecv = soap->frecv; soap->fsend = soap_smd_send; soap->frecv = soap_smd_recv; /* save the mode flag */ data->mode = soap->mode; /* clear the IO flags and DOM flag */ soap->mode &= ~(SOAP_IO | SOAP_IO_LENGTH | SOAP_ENC_ZLIB | SOAP_XML_DOM); /* clear the XML attribute store */ soap_clr_attr(soap); /* load the local XML namespaces store */ soap_set_local_namespaces(soap); if (soap->mode & SOAP_XML_CANONICAL) soap->ns = 0; /* for in c14n, we must have all xmlns bindings available */ else if (!(alg & SOAP_SMD_PASSTHRU)) soap->ns = 2; /* we don't want leading whitespace in serialized XML */ /* init the soap_smd engine */ return soap_smd_init(soap, data, alg, key, keylen); }