Index: trunk/include/iprt/crypto/x509.h
===================================================================
--- trunk/include/iprt/crypto/x509.h	(revision 85601)
+++ trunk/include/iprt/crypto/x509.h	(revision 85614)
@@ -152,4 +152,8 @@
 #define RTCRX509ALGORITHMIDENTIFIERID_SHA512T224        "2.16.840.1.101.3.4.2.5"
 #define RTCRX509ALGORITHMIDENTIFIERID_SHA512T256        "2.16.840.1.101.3.4.2.6"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_224          "2.16.840.1.101.3.4.2.7"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_256          "2.16.840.1.101.3.4.2.8"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_384          "2.16.840.1.101.3.4.2.9"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_512          "2.16.840.1.101.3.4.2.10"
 #define RTCRX509ALGORITHMIDENTIFIERID_WHIRLPOOL         "1.0.10118.3.0.55"
 /** @} */
@@ -170,4 +174,8 @@
 #define RTCRX509ALGORITHMIDENTIFIERID_SHA512T224_WITH_RSA   "1.2.840.113549.1.1.15"
 #define RTCRX509ALGORITHMIDENTIFIERID_SHA512T256_WITH_RSA   "1.2.840.113549.1.1.16"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_224_WITH_RSA     "2.16.840.1.101.3.4.3.13"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_256_WITH_RSA     "2.16.840.1.101.3.4.3.14"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_384_WITH_RSA     "2.16.840.1.101.3.4.3.15"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_512_WITH_RSA     "2.16.840.1.101.3.4.3.16"
 /** @} */
 
Index: trunk/include/iprt/mangling.h
===================================================================
--- trunk/include/iprt/mangling.h	(revision 85601)
+++ trunk/include/iprt/mangling.h	(revision 85614)
@@ -2048,5 +2048,40 @@
 # define RTSha512t256Init                               RT_MANGLER(RTSha512t256Init)
 # define RTSha512t256ToString                           RT_MANGLER(RTSha512t256ToString)
-# define RTSha512t256Update                             RT_MANGLER(RTSha512t256Update)
+# define RTSha3t224                                     RT_MANGLER(RTSha3t224)
+# define RTSha3t224Check                                RT_MANGLER(RTSha3t224Check
+# define RTSha3t224Cleanup                              RT_MANGLER(RTSha3t224Cleanup
+# define RTSha3t224Clone                                RT_MANGLER(RTSha3t224Clone
+# define RTSha3t224Init                                 RT_MANGLER(RTSha3t224Init
+# define RTSha3t224Final                                RT_MANGLER(RTSha3t224Final
+# define RTSha3t224FromString                           RT_MANGLER(RTSha3t224FromString
+# define RTSha3t224ToString                             RT_MANGLER(RTSha3t224ToString
+# define RTSha3t224Update                               RT_MANGLER(RTSha3t224Update
+# define RTSha3t256                                     RT_MANGLER(RTSha3t256)
+# define RTSha3t256Check                                RT_MANGLER(RTSha3t256Check
+# define RTSha3t256Cleanup                              RT_MANGLER(RTSha3t256Cleanup
+# define RTSha3t256Clone                                RT_MANGLER(RTSha3t256Clone
+# define RTSha3t256Init                                 RT_MANGLER(RTSha3t256Init
+# define RTSha3t256Final                                RT_MANGLER(RTSha3t256Final
+# define RTSha3t256FromString                           RT_MANGLER(RTSha3t256FromString
+# define RTSha3t256ToString                             RT_MANGLER(RTSha3t256ToString
+# define RTSha3t256Update                               RT_MANGLER(RTSha3t256Update
+# define RTSha3t384                                     RT_MANGLER(RTSha3t384)
+# define RTSha3t384Check                                RT_MANGLER(RTSha3t384Check
+# define RTSha3t384Cleanup                              RT_MANGLER(RTSha3t384Cleanup
+# define RTSha3t384Clone                                RT_MANGLER(RTSha3t384Clone
+# define RTSha3t384Init                                 RT_MANGLER(RTSha3t384Init
+# define RTSha3t384Final                                RT_MANGLER(RTSha3t384Final
+# define RTSha3t384FromString                           RT_MANGLER(RTSha3t384FromString
+# define RTSha3t384ToString                             RT_MANGLER(RTSha3t384ToString
+# define RTSha3t384Update                               RT_MANGLER(RTSha3t384Update
+# define RTSha3t512                                     RT_MANGLER(RTSha3t512)
+# define RTSha3t512Check                                RT_MANGLER(RTSha3t512Check
+# define RTSha3t512Cleanup                              RT_MANGLER(RTSha3t512Cleanup
+# define RTSha3t512Clone                                RT_MANGLER(RTSha3t512Clone
+# define RTSha3t512Init                                 RT_MANGLER(RTSha3t512Init
+# define RTSha3t512Final                                RT_MANGLER(RTSha3t512Final
+# define RTSha3t512FromString                           RT_MANGLER(RTSha3t512FromString
+# define RTSha3t512ToString                             RT_MANGLER(RTSha3t512ToString
+# define RTSha3t512Update                               RT_MANGLER(RTSha3t512Update
 # define RTShMemClose                                   RT_MANGLER(RTShMemClose)
 # define RTShMemDelete                                  RT_MANGLER(RTShMemDelete)
Index: trunk/include/iprt/sha.h
===================================================================
--- trunk/include/iprt/sha.h	(revision 85601)
+++ trunk/include/iprt/sha.h	(revision 85614)
@@ -514,4 +514,66 @@
 
 
+/**
+ * SHA3 context.
+ */
+typedef union RTSHA3CONTEXT
+{
+    uint64_t                a64Padding[26];
+    uint8_t                 abPadding[208];
+#ifdef RT_SHA3_PRIVATE_CONTEXT
+    RTSHA3PRIVATECTX        Private;
+#endif
+#ifdef RT_SHA3_PRIVATE_ALT_CONTEXT
+    RTSHA3ALTPRIVATECTX     AltPrivate;
+#endif
+} RTSHA3CONTEXT;
+/** Pointer to an SHA3 context. */
+typedef RTSHA3CONTEXT *PRTSHA3CONTEXT;
+
+/** Macro for declaring the interface for a SHA3 variation.
+ *
+ * @note The interface differes slightly from the older checksums:
+ *          - Must call Final and/or Cleanup method.
+ *          - Must use Clone instead of memcpy'ing the context.
+ *          - Status codes are returned, Init may really fail.
+ *
+ * @internal */
+#define RTSHA3_DECLARE_VARIANT(a_Bits) \
+    typedef struct RT_CONCAT3(RTSHA3T,a_Bits,CONTEXT) { RTSHA3CONTEXT Sha3; } RT_CONCAT3(RTSHA3T,a_Bits,CONTEXT); \
+    typedef RT_CONCAT3(RTSHA3T,a_Bits,CONTEXT) *RT_CONCAT3(PRTSHA3T,a_Bits,CONTEXT); \
+    RTDECL(int)  RT_CONCAT(RTSha3t,a_Bits)(const void *pvBuf, size_t cbBuf, uint8_t pabHash[RT_CONCAT3(RTSHA3_,a_Bits,_HASH_SIZE)]); \
+    RTDECL(bool) RT_CONCAT3(RTSha3t,a_Bits,Check)(const void *pvBuf, size_t cbBuf, uint8_t const pabHash[RT_CONCAT3(RTSHA3_,a_Bits,_HASH_SIZE)]); \
+    RTDECL(int)  RT_CONCAT3(RTSha3t,a_Bits,Init)(RT_CONCAT3(PRTSHA3T,a_Bits,CONTEXT) pCtx); \
+    RTDECL(int)  RT_CONCAT3(RTSha3t,a_Bits,Update)(RT_CONCAT3(PRTSHA3T,a_Bits,CONTEXT) pCtx, const void *pvBuf, size_t cbBuf); \
+    RTDECL(int)  RT_CONCAT3(RTSha3t,a_Bits,Final)(RT_CONCAT3(PRTSHA3T,a_Bits,CONTEXT) pCtx, uint8_t pabHash[RT_CONCAT3(RTSHA3_,a_Bits,_HASH_SIZE)]); \
+    RTDECL(int)  RT_CONCAT3(RTSha3t,a_Bits,Cleanup)(RT_CONCAT3(PRTSHA3T,a_Bits,CONTEXT) pCtx); \
+    RTDECL(int)  RT_CONCAT3(RTSha3t,a_Bits,Clone)(RT_CONCAT3(PRTSHA3T,a_Bits,CONTEXT) pCtx, RT_CONCAT3(RTSHA3T,a_Bits,CONTEXT) const *pCtxSrc); \
+    RTDECL(int)  RT_CONCAT3(RTSha3t,a_Bits,ToString)(uint8_t const pabHash[RT_CONCAT3(RTSHA3_,a_Bits,_HASH_SIZE)], char *pszDigest, size_t cchDigest); \
+    RTDECL(int)  RT_CONCAT3(RTSha3t,a_Bits,FromString)(char const *pszDigest, uint8_t pabHash[RT_CONCAT3(RTSHA3_,a_Bits,_HASH_SIZE)])
+
+/** The size of a SHA-224 hash. */
+#define RTSHA3_224_HASH_SIZE     28
+/** The length of a SHA-224 digest string. The terminator is not included. */
+#define RTSHA3_224_DIGEST_LEN    56
+RTSHA3_DECLARE_VARIANT(224);
+
+/** The size of a SHA-256 hash. */
+#define RTSHA3_256_HASH_SIZE     32
+/** The length of a SHA-256 digest string. The terminator is not included. */
+#define RTSHA3_256_DIGEST_LEN    64
+RTSHA3_DECLARE_VARIANT(256);
+
+/** The size of a SHA-384 hash. */
+#define RTSHA3_384_HASH_SIZE     48
+/** The length of a SHA-384 digest string. The terminator is not included. */
+#define RTSHA3_384_DIGEST_LEN    96
+RTSHA3_DECLARE_VARIANT(384);
+
+/** The size of a SHA-512 hash. */
+#define RTSHA3_512_HASH_SIZE     64
+/** The length of a SHA-512 digest string. The terminator is not included. */
+#define RTSHA3_512_DIGEST_LEN    128
+RTSHA3_DECLARE_VARIANT(512);
+
 /** @} */
 
Index: trunk/include/iprt/types.h
===================================================================
--- trunk/include/iprt/types.h	(revision 85601)
+++ trunk/include/iprt/types.h	(revision 85614)
@@ -2982,4 +2982,18 @@
     /** SHA-512/256 checksum. */
     RTDIGESTTYPE_SHA512T256,
+    /** SHA3-224 checksum. */
+    RTDIGESTTYPE_SHA3_224,
+    /** SHA3-256 checksum. */
+    RTDIGESTTYPE_SHA3_256,
+    /** SHA3-384 checksum. */
+    RTDIGESTTYPE_SHA3_384,
+    /** SHA3-512 checksum. */
+    RTDIGESTTYPE_SHA3_512,
+#if 0
+    /** SHAKE128 checksum. */
+    RTDIGESTTYPE_SHAKE128,
+    /** SHAKE256 checksum. */
+    RTDIGESTTYPE_SHAKE256,
+#endif
     /** End of valid types. */
     RTDIGESTTYPE_END,
