{"id":99,"date":"2020-06-27T16:00:46","date_gmt":"2020-06-27T16:00:46","guid":{"rendered":"https:\/\/michaeljohnsteiner.com\/?p=99"},"modified":"2020-06-27T16:00:46","modified_gmt":"2020-06-27T16:00:46","slug":"sha3modint-cs","status":"publish","type":"post","link":"https:\/\/michaeljohnsteiner.com\/index.php\/2020\/06\/27\/sha3modint-cs\/","title":{"rendered":"SHA3ModInt.cs"},"content":{"rendered":"\n<p>Modified Sha3 used with <a href=\"https:\/\/michaeljohnsteiner.com\/index.php\/2020\/06\/04\/jittercacherng-cs\/\" target=\"_blank\" rel=\"noreferrer noopener\">JitterCacheRng.cs<\/a><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\n[Serializable]\npublic class SHA3ModInt : HashAlgorithmEx\n{\n    private readonly KeccakSpongeManaged _sponge;\n    public SHA3ModInt(int size, int rounds = 24, ulong[] seed = null)\n    {\n        if (rounds > 24)\n            throw new Exception($\"Maximum rounds allowed is {24}\");\n        var MaxBR     = (64 >> 3) * 25;\n        var sizeBytes = size >> 3;\n        var rateBytes = MaxBR - (sizeBytes &lt;&lt; 1);\n        var MaxSize   = ((MaxBR - 8)       >> 1) &lt;&lt; 3;\n        if (rateBytes &lt; 8)\n            throw new Exception($\"Maximum size allowed is {MaxSize} Bits with {64} bit Width specified. Specified Size is {size} Bits.\");\n        var outputLength = size >> 3;\n        _sponge        = new KeccakSpongeManaged(rateBytes, 200 - rateBytes, KeccakSpongeManaged.KeccakDelimiter, outputLength, seed);\n        _sponge.Rounds = rounds;\n        HashSizeValue  = size;\n    }\n    public override void Initialize()\n    {\n        _sponge.Initialize();\n    }\n    protected override void HashCore(byte[] array, int ibStart, int cbSize)\n    {\n        Initialize();\n        _sponge.Absorb(array, ibStart, cbSize);\n    }\n    protected override byte[] HashFinal()\n    {\n        return _sponge.Squeeze();\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Modified Sha3 used with JitterCacheRng.cs<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/99"}],"collection":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/comments?post=99"}],"version-history":[{"count":1,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/99\/revisions"}],"predecessor-version":[{"id":100,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/99\/revisions\/100"}],"wp:attachment":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/media?parent=99"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/categories?post=99"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/tags?post=99"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}