/************************************************************** * * 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. * *************************************************************/ #ifndef _RTL_CIPHER_H_ #define _RTL_CIPHER_H_ "$Revision$" #include #ifdef __cplusplus extern "C" { #endif /*======================================================================== * * rtlCipher interface. * *======================================================================*/ /** Cipher Handle opaque type. */ typedef void* rtlCipher; /** Cipher Algorithm enumeration. @see rtl_cipher_create() */ enum __rtl_CipherAlgorithm { rtl_Cipher_AlgorithmBF, rtl_Cipher_AlgorithmARCFOUR, rtl_Cipher_AlgorithmInvalid, rtl_Cipher_Algorithm_FORCE_EQUAL_SIZE = SAL_MAX_ENUM }; /** Cipher Algorithm type. */ typedef enum __rtl_CipherAlgorithm rtlCipherAlgorithm; /** Cipher Mode enumeration. @see rtl_cipher_create() */ enum __rtl_CipherMode { rtl_Cipher_ModeECB, rtl_Cipher_ModeCBC, rtl_Cipher_ModeStream, rtl_Cipher_ModeInvalid, rtl_Cipher_Mode_FORCE_EQUAL_SIZE = SAL_MAX_ENUM }; /** Cipher Mode type. */ typedef enum __rtl_CipherMode rtlCipherMode; /** Cipher Direction enumeration. @see rtl_cipher_init() */ enum __rtl_CipherDirection { rtl_Cipher_DirectionBoth, rtl_Cipher_DirectionDecode, rtl_Cipher_DirectionEncode, rtl_Cipher_DirectionInvalid, rtl_Cipher_Direction_FORCE_EQUAL_SIZE = SAL_MAX_ENUM }; /** Cipher Direction type. */ typedef enum __rtl_CipherDirection rtlCipherDirection; /** Error Code enumeration. */ enum __rtl_CipherError { rtl_Cipher_E_None, rtl_Cipher_E_Argument, rtl_Cipher_E_Algorithm, rtl_Cipher_E_Direction, rtl_Cipher_E_Mode, rtl_Cipher_E_BufferSize, rtl_Cipher_E_Memory, rtl_Cipher_E_Unknown, rtl_Cipher_E_FORCE_EQUAL_SIZE = SAL_MAX_ENUM }; /** Error Code type. */ typedef enum __rtl_CipherError rtlCipherError; /** Create a cipher handle for the given algorithm and mode. @see rtlCipherAlgorithm @see rtlCipherMode @param Algorithm [in] cipher algorithm. @param Mode [in] cipher mode. @return Cipher handle, or 0 upon failure. */ rtlCipher SAL_CALL rtl_cipher_create ( rtlCipherAlgorithm Algorithm, rtlCipherMode Mode ) SAL_THROW_EXTERN_C(); /** Inititialize a cipher for the given direction. @see rtlCipherDirection @param Cipher [in] cipher handle. @param Direction [in] cipher direction. @param pKeyData [in] key material buffer. @param nKeyLen [in] key material length in bytes. @param pArgData [in] initialization vector buffer. @param nArgLen [in] initialization vector length in bytes. @return rtl_Cipher_E_None upon success. */ rtlCipherError SAL_CALL rtl_cipher_init ( rtlCipher Cipher, rtlCipherDirection Direction, const sal_uInt8 *pKeyData, sal_Size nKeyLen, const sal_uInt8 *pArgData, sal_Size nArgLen ) SAL_THROW_EXTERN_C(); /** Encode a buffer under a given cipher algorithm. @precond Initialized for a compatible cipher direction. @see rtl_cipher_init() @param Cipher [in] cipher handle. @param pData [in] plaintext buffer. @param nDatLen [in] plaintext length in bytes. @param pBuffer [out] ciphertext buffer. @param nBufLen [in] ciphertext length in bytes. @return rtl_Cipher_E_None upon success. */ rtlCipherError SAL_CALL rtl_cipher_encode ( rtlCipher Cipher, const void *pData, sal_Size nDatLen, sal_uInt8 *pBuffer, sal_Size nBufLen ) SAL_THROW_EXTERN_C(); /** Decode a buffer under a given cipher algorithm. @precond Initialized for a compatible cipher direction. @see rtl_cipher_init() @param Cipher [in] cipher handle. @param pData [in] ciphertext buffer. @param nDatLen [in] ciphertext length in bytes. @param pBuffer [out] plaintext buffer. @param nBufLen [in] plaintext length in bytes. @return rtl_Cipher_E_None upon success. */ rtlCipherError SAL_CALL rtl_cipher_decode ( rtlCipher Cipher, const void *pData, sal_Size nDatLen, sal_uInt8 *pBuffer, sal_Size nBufLen ) SAL_THROW_EXTERN_C(); /** Destroy a cipher handle. @param Cipher [in] cipher handle to be destroyed. @return None. Cipher handle destroyed and invalid. */ void SAL_CALL rtl_cipher_destroy ( rtlCipher Cipher ) SAL_THROW_EXTERN_C(); /*======================================================================== * * rtl_cipherBF (Blowfish) interface. * *======================================================================*/ /** Create a Blowfish cipher handle for the given mode. @descr The Blowfish block cipher algorithm is specified in Bruce Schneier: Applied Cryptography, 2nd edition, ch. 14.3 @see rtl_cipher_create() */ rtlCipher SAL_CALL rtl_cipher_createBF ( rtlCipherMode Mode ) SAL_THROW_EXTERN_C(); /** Inititialize a Blowfish cipher for the given direction. @see rtl_cipher_init() */ rtlCipherError SAL_CALL rtl_cipher_initBF ( rtlCipher Cipher, rtlCipherDirection Direction, const sal_uInt8 *pKeyData, sal_Size nKeyLen, const sal_uInt8 *pArgData, sal_Size nArgLen ) SAL_THROW_EXTERN_C(); /** Encode a buffer under the Blowfish cipher algorithm. @see rtl_cipher_encode() */ rtlCipherError SAL_CALL rtl_cipher_encodeBF ( rtlCipher Cipher, const void *pData, sal_Size nDatLen, sal_uInt8 *pBuffer, sal_Size nBufLen ) SAL_THROW_EXTERN_C(); /** Decode a buffer under the Blowfish cipher algorithm. @see rtl_cipher_decode() */ rtlCipherError SAL_CALL rtl_cipher_decodeBF ( rtlCipher Cipher, const void *pData, sal_Size nDatLen, sal_uInt8 *pBuffer, sal_Size nBufLen ) SAL_THROW_EXTERN_C(); /** Destroy a Blowfish cipher handle. @see rtl_cipher_destroy() */ void SAL_CALL rtl_cipher_destroyBF ( rtlCipher Cipher ) SAL_THROW_EXTERN_C(); /*======================================================================== * * rtl_cipherARCFOUR (RC4) interface. * *======================================================================*/ /** Create a RC4 cipher handle for the given mode. @descr The RC4 symmetric stream cipher algorithm is specified in Bruce Schneier: Applied Cryptography, 2nd edition, ch. 17.1 @see rtl_cipher_create() @param Mode [in] cipher mode. Must be rtl_Cipher_ModeStream. @return Cipher handle, or 0 upon failure. */ rtlCipher SAL_CALL rtl_cipher_createARCFOUR ( rtlCipherMode Mode ) SAL_THROW_EXTERN_C(); /** Inititialize a RC4 cipher for the given direction. @see rtl_cipher_init() */ rtlCipherError SAL_CALL rtl_cipher_initARCFOUR ( rtlCipher Cipher, rtlCipherDirection Direction, const sal_uInt8 *pKeyData, sal_Size nKeyLen, const sal_uInt8 *pArgData, sal_Size nArgLen ) SAL_THROW_EXTERN_C(); /** Encode a buffer under the RC4 cipher algorithm. @see rtl_cipher_encode() */ rtlCipherError SAL_CALL rtl_cipher_encodeARCFOUR ( rtlCipher Cipher, const void *pData, sal_Size nDatLen, sal_uInt8 *pBuffer, sal_Size nBufLen ) SAL_THROW_EXTERN_C(); /** Decode a buffer under the RC4 cipher algorithm. @see rtl_cipher_decode() */ rtlCipherError SAL_CALL rtl_cipher_decodeARCFOUR ( rtlCipher Cipher, const void *pData, sal_Size nDatLen, sal_uInt8 *pBuffer, sal_Size nBufLen ) SAL_THROW_EXTERN_C(); /** Destroy a RC4 cipher handle. @see rtl_cipher_destroy() */ void SAL_CALL rtl_cipher_destroyARCFOUR ( rtlCipher Cipher ) SAL_THROW_EXTERN_C(); /*======================================================================== * * The End. * *======================================================================*/ #ifdef __cplusplus } #endif #endif /* !_RTL_CIPHER_H_ */