X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/80e2389990082500d76eb566d4946be3e786c3ef..d8f41ccd20de16f8ebe2ccc84d47bf1cb2b26bbb:/Security/libsecurity_transform/lib/Digest.h?ds=inline diff --git a/Security/libsecurity_transform/lib/Digest.h b/Security/libsecurity_transform/lib/Digest.h new file mode 100644 index 00000000..1b5900a2 --- /dev/null +++ b/Security/libsecurity_transform/lib/Digest.h @@ -0,0 +1,202 @@ +#include "Transform.h" +#include "TransformFactory.h" + +#include +#include + + +// set up an abstraction for digest. We have to do this because +// CommonCrypto doesn't support a unified digest model + +class Digest +{ +protected: + CFStringRef mDigestType; + size_t mDigestLength; + +public: + Digest(CFStringRef digestType, size_t digestLength); + + virtual ~Digest(); + + virtual void Update(const void* buffer, size_t length) = 0; + virtual size_t DigestLength() = 0; + virtual const void* Finalize() = 0; + + virtual CFDictionaryRef CopyState(); + + static int LengthForType(CFStringRef type); +}; + + + +class MD2Digest : public Digest +{ +protected: + CC_MD2_CTX mContext; + u_int8_t mDigestBuffer[CC_MD2_DIGEST_LENGTH]; + +public: + MD2Digest(); + + void Update(const void* buffer, size_t length); + size_t DigestLength(); + const void* Finalize(); +}; + + + +class MD4Digest : public Digest +{ +protected: + CC_MD4_CTX mContext; + u_int8_t mDigestBuffer[CC_MD4_DIGEST_LENGTH]; + +public: + MD4Digest(); + + void Update(const void* buffer, size_t length); + size_t DigestLength(); + const void* Finalize(); +}; + + + +class MD5Digest : public Digest +{ +protected: + CC_MD5_CTX mContext; + u_int8_t mDigestBuffer[CC_MD5_DIGEST_LENGTH]; + +public: + MD5Digest(); + + void Update(const void* buffer, size_t length); + size_t DigestLength(); + const void* Finalize(); +}; + + + +class SHA1Digest : public Digest +{ +protected: + CC_SHA1_CTX mContext; + u_int8_t mDigestBuffer[CC_SHA1_DIGEST_LENGTH]; + +public: + SHA1Digest(); + + void Update(const void* buffer, size_t length); + size_t DigestLength(); + const void* Finalize(); +}; + + + +class SHA256Digest : public Digest +{ +protected: + CC_SHA256_CTX mContext; + u_int8_t mDigestBuffer[CC_SHA256_DIGEST_LENGTH]; + +public: + SHA256Digest(); + + void Update(const void* buffer, size_t length); + size_t DigestLength(); + const void* Finalize(); +}; + + + +class SHA224Digest : public Digest +{ +protected: + CC_SHA256_CTX mContext; + u_int8_t mDigestBuffer[CC_SHA256_DIGEST_LENGTH]; + +public: + SHA224Digest(); + + void Update(const void* buffer, size_t length); + size_t DigestLength(); + const void* Finalize(); +}; + + + +class SHA512Digest : public Digest +{ +protected: + CC_SHA512_CTX mContext; + u_int8_t mDigestBuffer[CC_SHA512_DIGEST_LENGTH]; + +public: + SHA512Digest(); + + void Update(const void* buffer, size_t length); + size_t DigestLength(); + const void* Finalize(); +}; + + + +class SHA384Digest : public Digest +{ +protected: + CC_SHA512_CTX mContext; + u_int8_t mDigestBuffer[CC_SHA512_DIGEST_LENGTH]; + +public: + SHA384Digest(); + + void Update(const void* buffer, size_t length); + size_t DigestLength(); + const void* Finalize(); +}; + + + +class Hmac : public Digest +{ +protected: + bool mInitialized; + CCHmacContext mHMACContext; + u_int8_t *mDigestBuffer; + CFDataRef mKey; + Transform* mParentTransform; + CCHmacAlgorithm mAlg; + + void Initialize(); + +public: + Hmac(Transform* parentTransform, CFStringRef digestType, CCHmacAlgorithm alg, size_t length); + virtual ~Hmac(); + void Update(const void* buffer, size_t length); + size_t DigestLength(); + const void* Finalize(); +}; + + +class DigestTransform : public Transform +{ +protected: + Digest* mDigest; + + DigestTransform(); + +public: + static CFTypeRef Make(); + virtual ~DigestTransform(); + + CFErrorRef Setup(CFTypeRef digestType, CFIndex length); + + virtual void AttributeChanged(CFStringRef name, CFTypeRef value); + + static TransformFactory* MakeTransformFactory(); + + CFDictionaryRef CopyState(); + void RestoreState(CFDictionaryRef state); + static CFTypeID GetCFTypeID(); +};