/************************************************************** * * 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_DIGEST_H_ #define _RTL_DIGEST_H_ "$Revision$" #include #ifdef __cplusplus extern "C" { #endif /*======================================================================== * * rtlDigest. * *======================================================================*/ /** Digest Handle opaque type. */ typedef void* rtlDigest; /** Digest Algorithm enumeration. @see rtl_digest_create() */ enum __rtl_DigestAlgorithm { rtl_Digest_AlgorithmMD2, rtl_Digest_AlgorithmMD5, rtl_Digest_AlgorithmSHA, rtl_Digest_AlgorithmSHA1, rtl_Digest_AlgorithmHMAC_MD5, rtl_Digest_AlgorithmHMAC_SHA1, rtl_Digest_AlgorithmInvalid, rtl_Digest_Algorithm_FORCE_EQUAL_SIZE = SAL_MAX_ENUM }; /** Digest Algorithm type. */ typedef enum __rtl_DigestAlgorithm rtlDigestAlgorithm; /** Error Code enumeration. */ enum __rtl_DigestError { rtl_Digest_E_None, rtl_Digest_E_Argument, rtl_Digest_E_Algorithm, rtl_Digest_E_BufferSize, rtl_Digest_E_Memory, rtl_Digest_E_Unknown, rtl_Digest_E_FORCE_EQUAL_SIZE = SAL_MAX_ENUM }; /** Error Code type. */ typedef enum __rtl_DigestError rtlDigestError; /** Create a digest handle for the given algorithm. @see rtlDigestAlgorithm @param Algorithm [in] digest algorithm. @return Digest handle, or 0 upon failure. */ rtlDigest SAL_CALL rtl_digest_create ( rtlDigestAlgorithm Algorithm ) SAL_THROW_EXTERN_C(); /** Destroy a digest handle. @postcond Digest handle destroyed and invalid. @param Digest [in] digest handle to be destroyed. @return None. */ void SAL_CALL rtl_digest_destroy ( rtlDigest Digest ) SAL_THROW_EXTERN_C(); /** Query the algorithm of a given digest. @param Digest [in] digest handle. @return digest algorithm, or rtl_Digest_AlgorithmInvalid upon failure. */ rtlDigestAlgorithm SAL_CALL rtl_digest_queryAlgorithm ( rtlDigest Digest ) SAL_THROW_EXTERN_C(); /** Query the length of a given digest. @param Digest [in] digest handle. @return digest length, or 0 upon failure. */ sal_uInt32 SAL_CALL rtl_digest_queryLength ( rtlDigest Digest ) SAL_THROW_EXTERN_C(); /** Initialize a digest with given data. @param Digest [in] digest handle. @param pData [in] data buffer. @param nDatLen [in] data length. @return rtl_Digest_E_None upon success. */ rtlDigestError SAL_CALL rtl_digest_init ( rtlDigest Digest, const sal_uInt8 *pData, sal_uInt32 nDatLen ) SAL_THROW_EXTERN_C(); /** Update a digest with given data. @param Digest [in] digest handle. @param pData [in] data buffer. @param nDatLen [in] data length. @return rtl_Digest_E_None upon success. */ rtlDigestError SAL_CALL rtl_digest_update ( rtlDigest Digest, const void *pData, sal_uInt32 nDatLen ) SAL_THROW_EXTERN_C(); /** Finalize a digest and retrieve the digest value. @precond Digest value length must not be less than digest length. @postcond Digest initialized to accept another update sequence. @see rtl_digest_queryLength() @see rtl_digest_update() @param Digest [in] digest handle. @param pBuffer [in] digest value buffer. @param nBufLen [in] digest value length. @return rtl_Digest_E_None upon success. */ rtlDigestError SAL_CALL rtl_digest_get ( rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /*======================================================================== * * rtl_digest_MD2 interface. * *======================================================================*/ #define RTL_DIGEST_LENGTH_MD2 16 /** Create a MD2 digest handle. @descr The MD2 digest algorithm is specified in RFC 1319 (Informational) The MD2 Message-Digest Algorithm @see rtl_digest_create() */ rtlDigest SAL_CALL rtl_digest_createMD2 (void) SAL_THROW_EXTERN_C(); /** Destroy a MD2 digest handle. @see rtl_digest_destroy() */ void SAL_CALL rtl_digest_destroyMD2 ( rtlDigest Digest ) SAL_THROW_EXTERN_C(); /** Update a MD2 digest with given data. @see rtl_digest_update() */ rtlDigestError SAL_CALL rtl_digest_updateMD2 ( rtlDigest Digest, const void *pData, sal_uInt32 nDatLen ) SAL_THROW_EXTERN_C(); /** Finalize a MD2 digest and retrieve the digest value. @see rtl_digest_get() */ rtlDigestError SAL_CALL rtl_digest_getMD2 ( rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /** Evaluate a MD2 digest value from given data. @descr This function performs an optimized call sequence on a single data buffer, avoiding digest creation and destruction. @see rtl_digest_updateMD2() @see rtl_digest_getMD2() @param pData [in] data buffer. @param nDatLen [in] data length. @param pBuffer [in] digest value buffer. @param nBufLen [in] digest value length. @return rtl_Digest_E_None upon success. */ rtlDigestError SAL_CALL rtl_digest_MD2 ( const void *pData, sal_uInt32 nDatLen, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /*======================================================================== * * rtl_digest_MD5 interface. * *======================================================================*/ #define RTL_DIGEST_LENGTH_MD5 16 /** Create a MD5 digest handle. @descr The MD5 digest algorithm is specified in RFC 1321 (Informational) The MD5 Message-Digest Algorithm @see rtl_digest_create() */ rtlDigest SAL_CALL rtl_digest_createMD5 (void) SAL_THROW_EXTERN_C(); /** Destroy a MD5 digest handle. @see rtl_digest_destroy() */ void SAL_CALL rtl_digest_destroyMD5 ( rtlDigest Digest ) SAL_THROW_EXTERN_C(); /** Update a MD5 digest with given data. @see rtl_digest_update() */ rtlDigestError SAL_CALL rtl_digest_updateMD5 ( rtlDigest Digest, const void *pData, sal_uInt32 nDatLen ) SAL_THROW_EXTERN_C(); /** Finalize a MD5 digest and retrieve the digest value. @see rtl_digest_get() */ rtlDigestError SAL_CALL rtl_digest_getMD5 ( rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /** Retrieve the raw (not finalized) MD5 digest value. @descr This function is a non-standard replacement for rtl_digest_getMD5() and must be used with caution. @postcond Digest initialized to accept another update sequence. @see rtl_digest_get() */ rtlDigestError SAL_CALL rtl_digest_rawMD5 ( rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /** Evaluate a MD5 digest value from given data. @descr This function performs an optimized call sequence on a single data buffer, avoiding digest creation and destruction. @see rtl_digest_updateMD5() @see rtl_digest_getMD5() @param pData [in] data buffer. @param nDatLen [in] data length. @param pBuffer [in] digest value buffer. @param nBufLen [in] digest value length. @return rtl_Digest_E_None upon success. */ rtlDigestError SAL_CALL rtl_digest_MD5 ( const void *pData, sal_uInt32 nDatLen, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /*======================================================================== * * rtl_digest_SHA interface. * *======================================================================*/ #define RTL_DIGEST_LENGTH_SHA 20 /** Create a SHA digest handle. @descr The SHA digest algorithm is specified in FIPS PUB 180 (Superseded by FIPS PUB 180-1) Secure Hash Standard @see rtl_digest_create() */ rtlDigest SAL_CALL rtl_digest_createSHA (void) SAL_THROW_EXTERN_C(); /** Destroy a SHA digest handle. @see rtl_digest_destroy() */ void SAL_CALL rtl_digest_destroySHA ( rtlDigest Digest ) SAL_THROW_EXTERN_C(); /** Update a SHA digest with given data. @see rtl_digest_update() */ rtlDigestError SAL_CALL rtl_digest_updateSHA ( rtlDigest Digest, const void *pData, sal_uInt32 nDatLen ) SAL_THROW_EXTERN_C(); /** Finalize a SHA digest and retrieve the digest value. @see rtl_digest_get() */ rtlDigestError SAL_CALL rtl_digest_getSHA ( rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /** Evaluate a SHA digest value from given data. @descr This function performs an optimized call sequence on a single data buffer, avoiding digest creation and destruction. @see rtl_digest_updateSHA() @see rtl_digest_getSHA() @param pData [in] data buffer. @param nDatLen [in] data length. @param pBuffer [in] digest value buffer. @param nBufLen [in] digest value length. @return rtl_Digest_E_None upon success. */ rtlDigestError SAL_CALL rtl_digest_SHA ( const void *pData, sal_uInt32 nDatLen, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /*======================================================================== * * rtl_digest_SHA1 interface. * *======================================================================*/ #define RTL_DIGEST_LENGTH_SHA1 20 /** Create a SHA1 digest handle. @descr The SHA1 digest algorithm is specified in FIPS PUB 180-1 (Supersedes FIPS PUB 180) Secure Hash Standard @see rtl_digest_create() */ rtlDigest SAL_CALL rtl_digest_createSHA1 (void) SAL_THROW_EXTERN_C(); /** Destroy a SHA1 digest handle. @see rtl_digest_destroy() */ void SAL_CALL rtl_digest_destroySHA1 ( rtlDigest Digest ) SAL_THROW_EXTERN_C(); /** Update a SHA1 digest with given data. @see rtl_digest_update() */ rtlDigestError SAL_CALL rtl_digest_updateSHA1 ( rtlDigest Digest, const void *pData, sal_uInt32 nDatLen ) SAL_THROW_EXTERN_C(); /** Finalize a SHA1 digest and retrieve the digest value. @see rtl_digest_get() */ rtlDigestError SAL_CALL rtl_digest_getSHA1 ( rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /** Evaluate a SHA1 digest value from given data. @descr This function performs an optimized call sequence on a single data buffer, avoiding digest creation and destruction. @see rtl_digest_updateSHA1() @see rtl_digest_getSHA1() @param pData [in] data buffer. @param nDatLen [in] data length. @param pBuffer [in] digest value buffer. @param nBufLen [in] digest value length. @return rtl_Digest_E_None upon success. */ rtlDigestError SAL_CALL rtl_digest_SHA1 ( const void *pData, sal_uInt32 nDatLen, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /*======================================================================== * * rtl_digest_HMAC_MD5 interface. * *======================================================================*/ #define RTL_DIGEST_LENGTH_HMAC_MD5 RTL_DIGEST_LENGTH_MD5 /** Create a HMAC_MD5 digest handle. @descr The HMAC_MD5 digest algorithm is specified in RFC 2104 (Informational) HMAC: Keyed-Hashing for Message Authentication @see rtl_digest_create() */ rtlDigest SAL_CALL rtl_digest_createHMAC_MD5 (void) SAL_THROW_EXTERN_C(); /** Destroy a HMAC_MD5 digest handle. @see rtl_digest_destroy() */ void SAL_CALL rtl_digest_destroyHMAC_MD5 ( rtlDigest Digest ) SAL_THROW_EXTERN_C(); /** Initialize a HMAC_MD5 digest. @see rtl_digest_init() @param Digest [in] digest handle. @param pKeyData [in] key material buffer. @param nKeyLen [in] key material length. @return rtl_Digest_E_None upon success. */ rtlDigestError SAL_CALL rtl_digest_initHMAC_MD5 ( rtlDigest Digest, const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen ) SAL_THROW_EXTERN_C(); /** Update a HMAC_MD5 digest with given data. @see rtl_digest_update() */ rtlDigestError SAL_CALL rtl_digest_updateHMAC_MD5 ( rtlDigest Digest, const void *pData, sal_uInt32 nDatLen ) SAL_THROW_EXTERN_C(); /** Finalize a HMAC_MD5 digest and retrieve the digest value. @see rtl_digest_get() */ rtlDigestError SAL_CALL rtl_digest_getHMAC_MD5 ( rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /** Evaluate a HMAC_MD5 digest value from given data. @descr This function performs an optimized call sequence on a single data buffer, avoiding digest creation and destruction. @see rtl_digest_initHMAC_MD5() @see rtl_digest_updateHMAC_MD5() @see rtl_digest_getHMAC_MD5() @param pKeyData [in] key material buffer. @param nKeyLen [in] key material length. @param pData [in] data buffer. @param nDatLen [in] data length. @param pBuffer [in] digest value buffer. @param nBufLen [in] digest value length. @return rtl_Digest_E_None upon success. */ rtlDigestError SAL_CALL rtl_digest_HMAC_MD5 ( const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen, const void *pData, sal_uInt32 nDatLen, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /*======================================================================== * * rtl_digest_HMAC_SHA1 interface. * *======================================================================*/ #define RTL_DIGEST_LENGTH_HMAC_SHA1 RTL_DIGEST_LENGTH_SHA1 /** Create a HMAC_SHA1 digest handle. @descr The HMAC_SHA1 digest algorithm is specified in RFC 2104 (Informational) HMAC: Keyed-Hashing for Message Authentication RFC 2898 (Informational) PKCS #5: Password-Based Cryptography Specification Version 2.0 @see rtl_digest_create() */ rtlDigest SAL_CALL rtl_digest_createHMAC_SHA1 (void) SAL_THROW_EXTERN_C(); /** Destroy a HMAC_SHA1 digest handle. @see rtl_digest_destroy() */ void SAL_CALL rtl_digest_destroyHMAC_SHA1 ( rtlDigest Digest ) SAL_THROW_EXTERN_C(); /** Initialize a HMAC_SHA1 digest. @see rtl_digest_init() @param Digest [in] digest handle. @param pKeyData [in] key material buffer. @param nKeyLen [in] key material length. @return rtl_Digest_E_None upon success. */ rtlDigestError SAL_CALL rtl_digest_initHMAC_SHA1 ( rtlDigest Digest, const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen ) SAL_THROW_EXTERN_C(); /** Update a HMAC_SHA1 digest with given data. @see rtl_digest_update() */ rtlDigestError SAL_CALL rtl_digest_updateHMAC_SHA1 ( rtlDigest Digest, const void *pData, sal_uInt32 nDatLen ) SAL_THROW_EXTERN_C(); /** Finalize a HMAC_SHA1 digest and retrieve the digest value. @see rtl_digest_get() */ rtlDigestError SAL_CALL rtl_digest_getHMAC_SHA1 ( rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /** Evaluate a HMAC_SHA1 digest value from given data. @descr This function performs an optimized call sequence on a single data buffer, avoiding digest creation and destruction. @see rtl_digest_initHMAC_SHA1() @see rtl_digest_updateHMAC_SHA1() @see rtl_digest_getHMAC_SHA1() @param pKeyData [in] key material buffer. @param nKeyLen [in] key material length. @param pData [in] data buffer. @param nDatLen [in] data length. @param pBuffer [in] digest value buffer. @param nBufLen [in] digest value length. @return rtl_Digest_E_None upon success. */ rtlDigestError SAL_CALL rtl_digest_HMAC_SHA1 ( const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen, const void *pData, sal_uInt32 nDatLen, sal_uInt8 *pBuffer, sal_uInt32 nBufLen ) SAL_THROW_EXTERN_C(); /*======================================================================== * * rtl_digest_PBKDF2 interface. * *======================================================================*/ /** Password-Based Key Derivation Function. @descr The PBKDF2 key derivation function is specified in RFC 2898 (Informational) PKCS #5: Password-Based Cryptography Specification Version 2.0 @param pKeyData [out] derived key @param nKeyLen [in] derived key length @param pPassData [in] password @param nPassLen [in] password length @param pSaltData [in] salt @param nSaltLen [in] salt length @param nCount [in] iteration count @return rtl_Digest_E_None upon success. */ rtlDigestError SAL_CALL rtl_digest_PBKDF2 ( sal_uInt8 *pKeyData , sal_uInt32 nKeyLen, const sal_uInt8 *pPassData, sal_uInt32 nPassLen, const sal_uInt8 *pSaltData, sal_uInt32 nSaltLen, sal_uInt32 nCount ) SAL_THROW_EXTERN_C(); /*======================================================================== * * The End. * *======================================================================*/ #ifdef __cplusplus } #endif #endif /* _RTL_DIGEST_H_ */