blob: 6a34199e489e6277c8ea0a847b9527bf6ae70950 [file] [log] [blame]
/**
* 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
*
* XSCryptCryptoBase64 := Internal implementation of a base64 encoder/decoder
*
* Author(s): Berin Lautenbach
*
* $Id$
*
*/
#ifndef XSCRYPTCRYPTOBASE64_INCLUDE
#define XSCRYPTCRYPTOBASE64_INCLUDE
#include <xsec/framework/XSECDefs.hpp>
#include <xsec/enc/XSECCryptoBase64.hpp>
#include <xsec/utils/XSECSafeBuffer.hpp>
/**
* @defgroup xscryptcrypto Internal Crypto API Interface
* @ingroup crypto
* The XSCrypt Interface provides cryptographic functions that are missing
* from other libraries.
*
* Currently this only provides Base64 functionality which is not
* available in the Windows Crypto API.
*
*/
class XSEC_EXPORT XSCryptCryptoBase64 : public XSECCryptoBase64 {
public :
// Constructors/Destructors
XSCryptCryptoBase64() : m_state(B64_UNINITIALISED) {};
virtual ~XSCryptCryptoBase64() {};
/** @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); // Setup
/**
* \brief Decode some passed in data.
*
* Decode the passed in data and place the data in the outData buffer
*
* @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 from previous decode operations and place
* 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.
*
* @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 from previous encode operations 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);
//@}
private :
enum b64state {
B64_UNINITIALISED,
B64_ENCODE,
B64_DECODE
};
safeBuffer m_inputBuffer; // Carry over buffer
safeBuffer m_outputBuffer; // Carry over output
unsigned int m_remainingInput; // Number of bytes in carry input buffer
unsigned int m_remainingOutput; // Number of bytes in carry output buffer
bool m_allDone; // End found (=)
b64state m_state; // What are we currently doing?
unsigned int m_charCount; // How many characters in current line?
// Private functions
void canonicaliseInput(const unsigned char *inData, unsigned int inLength);
};
#endif /* XSCRYPTCRYPTOBASE64_INCLUDE */