| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /* |
| * XSEC |
| * |
| * OpenSSLCryptoBase64 := Base virtual class to define a base64 encoder/decoder |
| * |
| * Author(s): Berin Lautenbach |
| * |
| * $Id$ |
| * |
| */ |
| |
| #ifndef OPENSSLCRYPTOBASE64_INCLUDE |
| #define OPENSSLCRYPTOBASE64_INCLUDE |
| |
| #include <xsec/framework/XSECDefs.hpp> |
| #include <xsec/enc/XSECCryptoBase64.hpp> |
| #include <xsec/enc/OpenSSL/OpenSSLSupport.hpp> |
| |
| // OpenSSL |
| #if defined (XSEC_HAVE_OPENSSL) |
| # include <openssl/evp.h> |
| |
| /** |
| * @ingroup opensslcrypto |
| */ |
| /*\@{*/ |
| |
| /** |
| * \brief Base64 encode/decode handler interface class. |
| * |
| * The XSEC library will use implementations of this interface |
| * for translating bytes to/from base64 encoding. |
| * |
| * Uses the EVP decode/encode routines in OpenSSL to perform the |
| * work. |
| * |
| * |
| * |
| * @note Requires implementation of OpenSSL > 0.9.6e as there was a bug |
| * in the Base64 decoding routines in this version and prior. |
| * |
| */ |
| |
| |
| class XSEC_EXPORT OpenSSLCryptoBase64 : public XSECCryptoBase64 { |
| |
| |
| public : |
| |
| |
| OpenSSLCryptoBase64(); |
| virtual ~OpenSSLCryptoBase64(); |
| |
| /** @name Decoding Functions */ |
| //@{ |
| |
| /** |
| * \brief Initialise the base64 object. |
| * |
| * Initialises the OpenSSL decode context and gets ready for data |
| * to be decoded. |
| * |
| */ |
| |
| virtual void decodeInit(void); |
| |
| /** |
| * \brief Decode some passed in data. |
| * |
| * Pass the encoded data through the OpenSSL base64 decode function |
| * and place the data in the outData buffer. |
| * |
| * @note The OpenSSL library is very unkind if the output buffer is |
| * not large enough. It is the responsibility of the caller to ensure |
| * the buffer will take the data. |
| * |
| * @param inData Pointer to the buffer holding encoded data. |
| * @param inLength Length of the encoded data in the buffer |
| * @param outData Buffer to place decoded data into |
| * @param outLength Maximum amount of data that can be placed in |
| * the buffer. |
| * @returns The number of bytes placed in the outData buffer. |
| */ |
| |
| virtual unsigned int decode(const unsigned char * inData, |
| unsigned int inLength, |
| unsigned char * outData, |
| unsigned int outLength); |
| |
| |
| /** |
| * \brief Finish off a decode. |
| * |
| * Clean out any extra data in the OpenSSL decode context |
| * variable into the outData buffer. |
| * |
| * @param outData Buffer to place any remaining decoded data |
| * @param outLength Max amount of data to be placed in the buffer. |
| * @returns Amount of data placed in the outData buffer |
| */ |
| |
| virtual unsigned int decodeFinish(unsigned char * outData, |
| unsigned int outLength); |
| |
| //@} |
| |
| /** @name Encoding Functions */ |
| //@{ |
| |
| /** |
| * \brief Initialise the base64 object for encoding |
| * |
| * Get the context variable ready for a base64 decode |
| * |
| */ |
| |
| virtual void encodeInit(void); |
| |
| /** |
| * \brief Encode some passed in data. |
| * |
| * Pass the data through the OpenSSL Base64 encoder and place |
| * the output in the outData buffer. Will keep any "overhang" |
| * data in the context buffer ready for the next pass of input |
| * data. |
| * |
| * @param inData Pointer to the buffer holding data to be encoded. |
| * @param inLength Length of the data in the buffer |
| * @param outData Buffer to place encoded data into |
| * @param outLength Maximum amount of data that can be placed in |
| * the buffer. |
| * @returns The number of bytes placed in the outData buffer. |
| */ |
| |
| virtual unsigned int encode(const unsigned char * inData, |
| unsigned int inLength, |
| unsigned char * outData, |
| unsigned int outLength); |
| |
| /** |
| * \brief Finish off an encode. |
| * |
| * Take any data left in the context variable, and create the |
| * tail of the base64 encoding. |
| * |
| * @param outData Buffer to place any remaining encoded data |
| * @param outLength Max amount of data to be placed in the buffer. |
| * @returns Amount of data placed in the outData buffer |
| */ |
| |
| virtual unsigned int encodeFinish(unsigned char * outData, |
| unsigned int outLength); // Finish |
| |
| |
| //@} |
| |
| /** @name Library Specific Functions */ |
| //@{ |
| |
| /** |
| * \brief Translate a base64 encoded BN to a bignum |
| * |
| * Take a ds:CryptoBinary number and translate to an OpenSSL |
| * representation of a "big number" BIGNUM. |
| * |
| */ |
| |
| static BIGNUM * b642BN(char * b64in, unsigned int len); |
| |
| /** |
| * \brief Get OpenSSL encode context structure |
| */ |
| |
| EVP_ENCODE_CTX * getOpenSSLEncodeEVP_ENCODE_CTX(void) {return mp_ectx;} |
| |
| /** |
| * \brief Get OpenSSL encode context structure |
| */ |
| |
| EVP_ENCODE_CTX * getOpenSSLDecodeEVP_ENCODE_CTX(void) {return mp_dctx;} |
| |
| //@} |
| |
| private : |
| |
| EVP_ENCODE_CTX *mp_ectx; // Encode context |
| EVP_ENCODE_CTX *mp_dctx; // Decode context |
| |
| #if (OPENSSL_VERSION_NUMBER < 0x10100000L) || defined(LIBRESSL_VERSION_NUMBER) |
| EVP_ENCODE_CTX m_ectx_store; |
| EVP_ENCODE_CTX m_dctx_store; |
| #endif |
| }; |
| |
| /*\@}*/ |
| |
| #endif /* XSEC_HAVE_OPENSSL */ |
| #endif /* OPENSSLCRYPTOBASE64_INCLUDE */ |