Repository: randombit/botan
Pull request #3219 (2023-01-24 14:03:40)

Fix HKDF_Expand which did not allow a maximum length output
Fixes GH #3213


Patch:
diff --git a/doc/dev_ref/oids.rst b/doc/dev_ref/oids.rst
index 4a534c6a6..6c7d2aed0 100644
--- a/doc/dev_ref/oids.rst
+++ b/doc/dev_ref/oids.rst
@@ -14,17 +14,7 @@ Values currently assigned are::
   -- { publicKey 4 } previously used as private X25519
   -- { publicKey 5 } previously used for XMSS draft 6
   gost-3410-with-sha256 OBJECT IDENTIFIER ::= { publicKey 6 1 }
-
   kyber       OBJECT IDENTIFIER ::= { publicKey 7 }
-  kyber-90s   OBJECT IDENTIFIER ::= { publicKey 11 }
-
-  kyber-512      OBJECT IDENTIFIER ::= { kyber 1 }
-  kyber-768      OBJECT IDENTIFIER ::= { kyber 2 }
-  kyber-1024     OBJECT IDENTIFIER ::= { kyber 3 }
-  kyber-512-90s  OBJECT IDENTIFIER ::= { kyber-90s 1 }
-  kyber-768-90s  OBJECT IDENTIFIER ::= { kyber-90s 2 }
-  kyber-1024-90s OBJECT IDENTIFIER ::= { kyber-90s 3 }
-
   xmss        OBJECT IDENTIFIER ::= { publicKey 8 }
 
   -- The current dilithium implementation is compatible with the reference
diff --git a/src/build-data/oids.txt b/src/build-data/oids.txt
index e547e11b7..e048e6e1d 100644
--- a/src/build-data/oids.txt
+++ b/src/build-data/oids.txt
@@ -15,13 +15,15 @@
 1.3.101.110 = Curve25519
 1.3.101.112 = Ed25519
 
-# Kyber OIDs are currently in Botan's private arc
-1.3.6.1.4.1.25258.1.7.1 = Kyber-512-r3
-1.3.6.1.4.1.25258.1.7.2 = Kyber-768-r3
-1.3.6.1.4.1.25258.1.7.3 = Kyber-1024-r3
-1.3.6.1.4.1.25258.1.11.1 = Kyber-512-90s-r3
-1.3.6.1.4.1.25258.1.11.2 = Kyber-768-90s-r3
-1.3.6.1.4.1.25258.1.11.3 = Kyber-1024-90s-r3
+# Kyber OIDs are based on the following internet draft
+#   https://www.ietf.org/id/draft-uni-qsckeys-00.html#section-4.1
+# (the list contained some typos that were fixed, best effort)
+1.3.6.1.4.1.2.267.8.2.2 = Kyber-512-r3
+1.3.6.1.4.1.2.267.8.3.3 = Kyber-768-r3
+1.3.6.1.4.1.2.267.8.4.4 = Kyber-1024-r3
+1.3.6.1.4.1.2.267.10.2.2 = Kyber-512-90s-r3
+1.3.6.1.4.1.2.267.10.3.3 = Kyber-768-90s-r3
+1.3.6.1.4.1.2.267.10.4.4 = Kyber-1024-90s-r3
 
 # Dilithium OIDs are currently in Botan's private arc
 1.3.6.1.4.1.25258.1.9.1 = Dilithium-4x4-r3
diff --git a/src/lib/asn1/oid_maps.cpp b/src/lib/asn1/oid_maps.cpp
index 84be22b52..4b5f8aa5f 100644
--- a/src/lib/asn1/oid_maps.cpp
+++ b/src/lib/asn1/oid_maps.cpp
@@ -1,7 +1,7 @@
 /*
 * OID maps
 *
-* This file was automatically generated by src/scripts/oids.py on 2023-01-24
+* This file was automatically generated by src/scripts/oids.py on 2023-01-23
 *
 * All manual edits to this file will be lost. Edit the script
 * then regenerate this source file.
@@ -138,18 +138,18 @@ std::unordered_map<std::string, std::string> OIDS::load_oid2str_map()
       { "1.3.36.3.3.2.8.1.1.9", "brainpool320r1" },
       { "1.3.6.1.4.1.11591.15.1", "OpenPGP.Ed25519" },
       { "1.3.6.1.4.1.11591.4.11", "Scrypt" },
+      { "1.3.6.1.4.1.2.267.10.2.2", "Kyber-512-90s-r3" },
+      { "1.3.6.1.4.1.2.267.10.3.3", "Kyber-768-90s-r3" },
+      { "1.3.6.1.4.1.2.267.10.4.4", "Kyber-1024-90s-r3" },
+      { "1.3.6.1.4.1.2.267.8.2.2", "Kyber-512-r3" },
+      { "1.3.6.1.4.1.2.267.8.3.3", "Kyber-768-r3" },
+      { "1.3.6.1.4.1.2.267.8.4.4", "Kyber-1024-r3" },
       { "1.3.6.1.4.1.25258.1.10.1", "Dilithium-4x4-AES-r3" },
       { "1.3.6.1.4.1.25258.1.10.2", "Dilithium-6x5-AES-r3" },
       { "1.3.6.1.4.1.25258.1.10.3", "Dilithium-8x7-AES-r3" },
-      { "1.3.6.1.4.1.25258.1.11.1", "Kyber-512-90s-r3" },
-      { "1.3.6.1.4.1.25258.1.11.2", "Kyber-768-90s-r3" },
-      { "1.3.6.1.4.1.25258.1.11.3", "Kyber-1024-90s-r3" },
       { "1.3.6.1.4.1.25258.1.3", "McEliece" },
       { "1.3.6.1.4.1.25258.1.5", "XMSS-draft6" },
       { "1.3.6.1.4.1.25258.1.6.1", "GOST-34.10-2012-256/EMSA1(SHA-256)" },
-      { "1.3.6.1.4.1.25258.1.7.1", "Kyber-512-r3" },
-      { "1.3.6.1.4.1.25258.1.7.2", "Kyber-768-r3" },
-      { "1.3.6.1.4.1.25258.1.7.3", "Kyber-1024-r3" },
       { "1.3.6.1.4.1.25258.1.8", "XMSS-draft12" },
       { "1.3.6.1.4.1.25258.1.9.1", "Dilithium-4x4-r3" },
       { "1.3.6.1.4.1.25258.1.9.2", "Dilithium-6x5-r3" },
@@ -372,12 +372,12 @@ std::unordered_map<std::string, OID> OIDS::load_str2oid_map()
       { "KeyWrap.AES-256", OID({2,16,840,1,101,3,4,1,45}) },
       { "KeyWrap.CAST-128", OID({1,2,840,113533,7,66,15}) },
       { "KeyWrap.TripleDES", OID({1,2,840,113549,1,9,16,3,6}) },
-      { "Kyber-1024-90s-r3", OID({1,3,6,1,4,1,25258,1,11,3}) },
-      { "Kyber-1024-r3", OID({1,3,6,1,4,1,25258,1,7,3}) },
-      { "Kyber-512-90s-r3", OID({1,3,6,1,4,1,25258,1,11,1}) },
-      { "Kyber-512-r3", OID({1,3,6,1,4,1,25258,1,7,1}) },
-      { "Kyber-768-90s-r3", OID({1,3,6,1,4,1,25258,1,11,2}) },
-      { "Kyber-768-r3", OID({1,3,6,1,4,1,25258,1,7,2}) },
+      { "Kyber-1024-90s-r3", OID({1,3,6,1,4,1,2,267,10,4,4}) },
+      { "Kyber-1024-r3", OID({1,3,6,1,4,1,2,267,8,4,4}) },
+      { "Kyber-512-90s-r3", OID({1,3,6,1,4,1,2,267,10,2,2}) },
+      { "Kyber-512-r3", OID({1,3,6,1,4,1,2,267,8,2,2}) },
+      { "Kyber-768-90s-r3", OID({1,3,6,1,4,1,2,267,10,3,3}) },
+      { "Kyber-768-r3", OID({1,3,6,1,4,1,2,267,8,3,3}) },
       { "MD5", OID({1,2,840,113549,2,5}) },
       { "MGF1", OID({1,2,840,113549,1,1,8}) },
       { "McEliece", OID({1,3,6,1,4,1,25258,1,3}) },
diff --git a/src/lib/kdf/hkdf/hkdf.cpp b/src/lib/kdf/hkdf/hkdf.cpp
index 37b5298ab..237f13912 100644
--- a/src/lib/kdf/hkdf/hkdf.cpp
+++ b/src/lib/kdf/hkdf/hkdf.cpp
@@ -72,9 +72,7 @@ void HKDF_Expand::kdf(uint8_t key[], size_t key_len,
    if(key_len == 0)
       return;
 
-   const size_t blocks_required = key_len / m_prf->output_length();
-
-   if(blocks_required >= 0xFF)
+   if(key_len > m_prf->output_length() * 255)
       throw Invalid_Argument("HKDF-Expand maximum output length exceeeded");
 
    m_prf->set_key(secret, secret_len);


Test patch:
diff --git a/src/tests/data/kdf/hkdf.vec b/src/tests/data/kdf/hkdf.vec
index 999a416f1..3de19c54e 100644
--- a/src/tests/data/kdf/hkdf.vec
+++ b/src/tests/data/kdf/hkdf.vec
@@ -18,6 +18,10 @@ Output = 0AC1AF7002B3D761D1E55298DA9D0506B9AE52057220A306E07B6B87E8DF21D0EA00033
 Secret = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
 Output = 2C91117204D745F3500D636A62F64F0AB3BAE548AA53D423B0D1F27EBBA6F5E5673A081D70CCE7ACFC48
 
+# Testing the longest possible HKDF output with SHA-1, 255*20 bytes
+Secret = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+Output = 2C91117204D745F3500D636A62F64F0AB3BAE548AA53D423B0D1F27EBBA6F5E5673A081D70CCE7ACFC488A0DC93C1B3737F2DC25D2A85D4ADE9547E4384A4C8F2D4731040FA89CF505B01B342EE9C909A37D2024216050A6BA93F7D6F708467BF697106FE1260E282F420E055B0D7E55C44922B63D5BAA91EA19F855D9B1A167E6BE7328D47610E88207149B0FC1EA4EC5F7DED74DCC872A5AAC9361F5F2FA00178FF55B48FBB9B1FEA2ABCC7F7C43A5E91C308BE86B161C46FD661CD12ACEDCCFB0DDC2EF901E26DDCA2647C711BB6F8820580E0C514CBA5F3A144B2C024831270FDF6724F61DC8EB71052C547D043CB58C295751B34856384E0816867E1E77D226B41778AF3AA00D0710DE15CB11E96BD25DE2EE12869A9A4564AB9DA6EE12FF2895D551F8DD372FEA0589E0524CF80E9BF7BCB4678B08BE26AC49D17B9D0C9FB9E39DA66FCAAE10F740AE5C5867139CA7649EFA03BF8C2D8531B3A5E905A4ACA44C63FEAD60A32CE76EF1F682353FE1B851DCC8527EBB50FD3F31A8CE2B4950CAD9B2C3E6FFA4496CB33051E779218B2E2D3C41E293D73154F513076AC5ECCC134FDEE79D3DE7368DA961042EB1E745CCC4B164D1F83C51F8F59D3B86D4F54B4F37076B7908A5800475008F2C416FA9F9398E0BBE677936E3C51696A5AC110F65896880AE79C9B1CEF9CA16F63310C84485958587E7305BCC9F7157B45414AC4BC0339BC42EFC3A2DA19D1D5455EBD8D49773701796A9ADDF90F1AB2B4F9FA2D0D357245A4ED19226EE1B445A8B03067C78E74F5617AB36593D89C9F94EA8F66952DC0B4ACB89E273FD21B0884CA39A4584830214C502C23EE506EB7C295430582CA196C4A130F0B16CA7D4B48A7863062D8FF3984D4388DBA9F517552FF9D9E289ED19ED7B7E13BB00C2FC3C2F8A710D60810FC22A9878F599FE39D8018227CEE8A88E4E8431670D7F6432A782FB953C1FF1E8413C16A32133E7679B77D8C7BD506CBD5B89E7B7D5B90F0586064E07FBB55A113F208BE5A6678727E079EFC6BACD0612288EDFF6A443CA4CA2A807FCF4FEB50CE2AB1FC368F54D269FF945C3AF7393FAFB1213D20F2222CA5BC96308DAC5FEE44310E9415D6BCCDC9542863A6976F203719063FA8C22DB25C7F76869F7DE37DC8355B95CD696C5E51258DF38BACC4A3443DBF5CC4C676AF82E4F4E80CB73E78996ACD23EC7A09BA66C3109DC63F29730BE179AB192B77347D82980891AD07FD93114180919A1DACFE495540D4A4F95372BA11993306A054359ABFF784D2405F574E2A5F25CA8523F7191CBB5AB81AE99F27F5FD5440C39EB551F332AC98043A6F25018E5B4EE3CE3EEE12E23074536E12093E0DAA8E55F593CFA24DA319763B1E3B5925320C7B2D141BCB1909A0A7D47D57B3CF31D8297E96D001D202C5FF3D83364DD0A33775D02EFE9A0681EF36266FA2B36A79856BD4FEFD5C0B274EDAE7B667A1D4B8952A6D191162BA1A45E3F737A787CCAFDA164C47F01FCC689D8B6EA6653583D9D24783A92E7271C47722CBD0A4E407D8AF9E8641818926D3420668BE4A27831699382AC1381C79634B1B0B73110EBE7052C14A14523272D850874D1E7FB491B17F40BB25393B7F62A158D710470D4AF8DB14F9DB63C6A2C32953A38D40A0EE776DAA3E1114A0C9CCF85895DE9BA68D37F430F55A9A367775587704E89FAB814CB07DCBBB039882FCD0FA870662ECDA9A13C94B565A70DF3DF85C29F1F83696E6EFAD1A78F6F80A55A5187EA1E90D518C4D6CB933FE450ED23584ED01F4B4D37645DF6775017D0D5BABAF3E8BF2316D23C8092F0AB6EE80F73DBB1CDDA496D60DFFDDDBCD09E82480A275AD8C4BDCDDE5700530AD795C6F2C4D211AC45342354D289DCE3B0123397F924F1863EDD5D48F63C2DA949E8DBACB6879F21783A4AB14F4175558260CB896C4BA250BA69409E749761FA5CFA21DB5443C90531B4AE1A7D79910472CEDD13FC22B94CB7416B6F5A8946BEEE4F558173A8B97512E199A3266581C67F519E9462542090FD7095C8647E62FB32878AC3304167D4E1D107171BD55B6FFFCAEA69444E38FF17423984E99B3104D5906AE5B19EAAABAC9F18FF6368254F860AF16C166AA97179C91ECDE3C28F0C84D09E13BBDC60A4DB606297F4CFCAC91E0DDB0D77FA9E2E13535889CB47339ACCF52F179625229A81146F85D79F13D11AF3B68F1BB7049054D224C48EE4AD053D601113F919D4EE6FB0552EF7FF00A7BEE11F94FF2600883D4F0308A3948467AD44B9EA854D103F142A5776E4EDACCBE7A5977CCABB52F4BFA55F6C58FCBC6AE08948599D736DF90E4AE8A89AD6D1E231495162B42E1F98269E3ED6322CF6651CD3D3700C6DD8D632E8CC49FBD38230AB96A8CCC1DF203C41CAF08EF63DDDACF6B2EC49F94DA62AFBA689F0EB53099F44749149CD864128944F4E149410008C5A852FE2912C1555DEFC3FB85B9B1892A45F80A40F7B4F174F2680FA66ADD352D6628BA47D65C4BC57893ED4ABFB346A2FC1FC9A4B0F0257364FBFF9B4880A00BDF67DBBE8CF5599811BC61B3788E47890826527444290F6779E54D4D528684E4AB264F2470E2F0B253375C0FDC296D72697597B0F3223A24AD95AE43B9D894F18DC586B9652EA34332C100D709999931FEB0A3A4126096D3685C61CC4E14DD33666F25553D03B8B0293E97AC1B6BFE4D72B65879050D78152B04512B38B15DF0D0928B4EBC22E527C936B4FDF45987E7BB7D5556F65892706B2D2BD77125415390472448AE6569DC70DF331AA1D095F0CEEDFBD428C7FEFD3B3168EED72AF47304988749B1CC7F8F5725B6734809BC49F4577F34D081AE9FE305CB03DA81601C3A74D2005862B696AAD09F40E517BBB49524A3DC90035D7E7A744A13C3D59498711E7E764E5BC18BF4C7AEF61B1B518F6DCF69EA9E2A598CF413E7A6702439B4E959B5B5731D6A1DFE7AD3DF7B75E5A4279DBDCC462938B5DDA04174CB3C544F2F689D5DFA3D9BAF8459798D0473EE17C761A11626FB1DB62B709AD27DB8E53894980E42B47DF56FFEAFF14C09FB24E271A7F917A54D49C2841D4386BA0C92342DF6493E9FA00B631270734EE74C94873FDD360A162497710139516DB158D725AAE7A6CD9C6BEDA743D8B055274F8EDF38F873A15FA1FA0934D8216B8915A7A5FCF61F38717CF987C436485E866D10C2D5EC858CCF65CC4966C6C76B09943C2A5637BA66BE1E3698F854451C3BD06E36DC4BBC90FC4EAE4A96955CA46AFD80B4D5B2DF7A0AE1B3FF26EDA5D2E69F69BAC9C5DC565B6F3D42DC9D5E900482C3B3DFF0ACB7B12DE00C73544F24875A2870D6E96F2F61BA5BFC232D6F5D644D3362E7080C453AAF1A2B1C6A10E0C2D70C24A0A31C9D7DBEB5D24186D6EAD9C0F34A24A59F5D1CC84385F49B38AC4A0B97527FA1077724B999FF392B3B016DA554BDE873A084C7A1DC01A47BA275A34AC43D200467018CF5071A7CE7814F4DD894A595E2D50770286CA8D80985389A0C5A71DE4F297F62B5D079DFFD2F9518624ECBD89DED019BAC7A5CF35AEDE18097FCF8A2ACD6DA5380DEC5D8F5E973635E7BF37F352AEDE55EEBBDA83921951D9F8599D6AB8E912F601F6F596CF2BBBA10D15DA78E88640D7B4B6BC56A734B606544AE6AFCCC684AFB7230081E5165584400754ECF7DA6D2BCBFD574A0335103AC19F7AFB22BA465D19363022E500F75CB8343485F1CDF616C6C1CDA0A270604FB3AAA03426C469F9645C7698EB04928390D5CF9801733015672F7EAD1BBB27F3BFD222C1C1E6ED9734858C09F45E8108BA24934469A052379C4B7A572F214D7535B34195CA670AE8717EDA11CA7244275848F4713ADDFD61BA26FC327F333FBF2AD4032B72C6E678F6CB79638F79B0231AF6F39942401FDC41BD027D1F0A1E3EA88B0852C6AE49E6E8D01D22F07F4369AF96F0154FC389DBE92D75A714564DCAC6FCBE60DB3DC744A1C1324F9F23A0DE54A60392700271172CD3A8E54B2FCDDEF99F4054272DB5E5EE4E6D11BB349A0B5CD29BA9D7C90DBDA861B48853CFE6F23099278BA36F864329B01DBF8D22244E91397FAEAEAC9320A5A1F5B210C6E9E7EF5FC4DCF4EE1440072E98F4C7DCA601708B2D52A1D7F32D3F050AF50E8E68D1B46FF1B57B5E5F8D485B008E7D950A47D562F901B096C9F409C949A3B1891D51B8E00A1284ACE61C1ABA0EDB5A77369EAB074AB30AFECC8D3E86ED306F2971E411A84FCF5C9DF5A3194AE736F7DFD7EE31326B1FE197A5743D9F44BA4255571BEE880CC920531DAD222DDA0B6A7838460F3252DCEBFE48E976CD4459AD32E6B5205E1A2DD69DFDE3366599E46F51E34243E2AC464E2203E8AFCDB05B1B91FE097B8FED1E9A554EE7876C793077BB1FC044488E5B4D77E150753401D2219032B79828FEAD9A760E3AA2B24A462236CBFE3D0FF8EA9027A19262AF5DD1DC2F78935D6A89D3C07CB22781B47B89663BA54205DEC4CAD7DA56551606AB1D146086CFFBA64DC1DB9E86ECCAAEE909E9134B368EE03D9272D47B7CDAF9F90B9487E4869B8796AA7D9D6CBC16D28A0FC6C2EA1E9771B215895A8623ADDC2BB5CB29F9AA8E1EECE41642BA486E950830278C9320BD13CF9E89BF9EB0DE658C68AEC91833365BAE6BB68C7D75815ABA9C9F8EE86C70F1A884738BB3D492B30F551282455AADC662227963FAE28A0AC917CE08B6A2FC75F5DE2360C338D1BDBFED38BB2E08D993BF74B2D0878F4E09559F31676D75093D414076D8900DFBE37BF3C2ACEB2F2913251CDB59884E54890BFB35BECA7E4F05FFBE34A958FFB39FFA7F724AFE1E500C57044845A30D7E14775D3018B2091CEDF99ED8483A1E152EC09F2B57CF43545AB9781C857181B29EC862BA1382E84FDECDDB6C64D66AFFBEE679AB95D52A9B54F871E856173E75B3E25AAD4B60300466208D26ABFC36222000087DEA1DC9F03B3A17616BB0FE898CF01564035282EA87C44344147B7A6763A7600E8E29CD2297660B61AEF3B70D636B8328355FDDE56058473B4667ED0F57B519D872AE2F9B7F4B04DEB8A76325BA5D37D6478969B7412C4F4AE4FB8378BB7D5FF021EA2EAEECC69376B9FE09179D74B50DD437473FBAD3D5C5E876B7C1319CDEFB9977316E755D9E0ACA9C0B457320AC3FE671FD3A086FEBD1F8B5FDF1E3B57568CC9255C7E3A3A74D6E21BEE2E26E090F83BCF83D2AD21C31B56DD3DB6B1747C0B0840267AC31E53AA6A2CAB3D355A2C70775EC59856E3D1F9CA9D23ED7C98D97E874DEDAEDF5623D594A1A3CC6F27783F9ADD8E433B72EFB52FC9C0C8CD8C077A9B995E7453171944D0138325125172139CCD6F4A559586E68DD221B465B17F8E8A6F6BBBE0545C3B6EE9D8DA9A74832F42280382430016D64CC964BDF5291453A39D097CFB90E32D02D07B4DBAE5C77350106FA2D4D2A523240B5C39D6F429B8A39B286BB804CD373DE84127BC4DAF727863B86365CA470C96F4BB24365BB3153ACE43726507FC1C121B9425E6010664C43B991EC9996D924925D961555226FFFE30F4A3C9B80465F7BF9858790A1C9FC74EA830BEBE75AE0D18AC1077B518813AF8C881345F75A39CEB12DCE8EAF3B5E2CEAE94CDB5751C9701BB941C6E79A77B05B13AD6569B1B2E603B157E2BEE4476D691AE1C6A7770DF2A9F7F81589B10EFFB94F1CB677D86A71D9D70251F682F1594B070A6985713254E86B0EC0073F32F29C18F7CBD31EDF286CCFF8A18EC19AFB8C3A33259403701A43A0B4EEB8994F2B50EAC5512C45F90075FAA935C3AFF125C9161445F8DAEE7847BC108A82F5154F59653CD1C4042C067FE4C6BA0B98F36F43DBC60C5801DBF94D0BBF07C26969DEB0DE0A989EB423432493ABF51DBACF620FB12927FE507C9698238AAD98BF5F38023E5ACE6930168CA44300F97A6A4B408AFF60DE6163D6B52A025978A8798EE48FC5A06AE219327A88C60B9CC05AAC615724B9BD132DEE2A03E72EDAE32F9195C06EBCDE2D88138298D28870315FD62312C220F0DF4E17BC23EF68894F21807E97EE280AA4EB2E167B9BDD1C0FCBA5BC99807D53BD5395E7988E27BD68AC0F766AB1BE00D3290BD2AC3EC7C16D2B70B72F5014247B82FFF5908AB5F0C7565BC375F4385206D09F92AA4525CCB7A8C3BD9AE1A40590149CC3DA82A65F7A5316295128B028B40715BE74B5253E90B22DE2E720E484D53F7F499DB42B37F30E51A0C8F49A297EA6457895D00E0E19C258BB5024CCD2A4DF5BEC734E3668CD216BFC1FCEFC16FF895FA6DFCE233EDABCF73AD84569DC43A277A70291AAB37839F0D3291DF2DDB4AB0CFD1AC3C985F5CB2F831C9882035DEFD9AD7323E8A0DDCCB2B0E58BC630F6F1CB0E85400B8BC5E303E3B66E7B64014D1D86846BD7BCAE937193C49853912574CDDF67B9764B57EC4308A0DBCA0A6CEBB006770558822B276A5A33CAC0F5E16202D2FB9E27A57F258AF6198FBF59EE48B8CDFF1707E2CAD77938A66AEB9EB9F397BF53E7594E1970C178E2947E6722D8A630D7BAE714ADF080FC065A0EE99DEEA77996E9AB1A7B50A017D36242FBE6E9E1D1B7E2633D8F3456DFFF5826B7572194ACA22973773116AEC807967452F5659396C77DBD385D4D0A4D2CE6B5D6710C8E3DB5CA43C18D43EB1E030D41543B1A04AAD3A09AA0900444DC4053A538A7DB1B881494F6DD3CCAAC638426153A850922E5F069EA0C1C26EC32D5A483A441C448B8F6E0586F2CB85075663C0A399DDA97E2E687B09633D57F42644C3DC14C48E21FC63A7435DF197C3F7F1035DF164C19A3FD6C0FEBE4FA1E61C03DD15D80E29B16D28432619C55827C76087C5C57B3200494AA56780670F4384E6E3190E6EAC31868C1854BA5474C1EACC425758E8AB75FAB283FDF3718B3E190BCB32D2D61F7D6968E3D3189DFB9DDCC3B7FE94DE1A402E480C2B72ED819753F0F4A7FF1C010D4669AE6E36887F12C4436F2EA27A417E2D9EE7B25278B948C238BFEECC1492874800F1AD776B845F38BE98A390103269E71D0AD2E4C660424EAFEECC9706B447E7673F105A9115592EB6D030D019F8BA3A4D4FFB90FF64EEA4280B1449C51233AB808F296CEC7C12DC559C2C02BB11CFE84FEB025D97BB94A3AD9097D0678AB371735C3914797C27C891BCCAA7F1808C73BA20389C0A4767ACB053B3FD95380A256094F9A6CDE58550311
+
 [HKDF(HMAC(SHA-256))]
 Salt = 000102030405060708090A0B0C
 Label = F0F1F2F3F4F5F6F7F8F9