| /************************************************************** |
| * |
| * 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: 1.8 $" |
| |
| #include <sal/types.h> |
| |
| #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_ */ |
| |