cloudflare / circl

CIRCL: Cloudflare Interoperable Reusable Cryptographic Library
http://blog.cloudflare.com/introducing-circl
Other
1.22k stars 136 forks source link

Compatibility with npmjs.com/package/dilithium-crystals #435

Closed decentralgabe closed 1 year ago

decentralgabe commented 1 year ago

I'm trying to prove out compatibility for this IETF draft and am using your library as the basis of a JOSE signature.

Before I can do that I need to prove out simple signature compatability between this library's Dilithium 5 impl and a Javascript impl, which was used in the IETF draft to generate test vectors.

Here's what I'm using:

1. Generate Test Vectors in Go

func TestVectors(t *testing.T) {
    // Generate a new key pair
    pk, sk, err := dilithium.Mode5.GenerateKey(rand.Reader)
    assert.NoError(t, err)

    pkHex := hex.EncodeToString(pk.Bytes())

    println("pkHex:", pkHex)

    // Sign a message using the secret key
    msg := []byte("hello")
    sig := dilithium.Mode5.Sign(sk, msg)

    sigHex := hex.EncodeToString(sig)
    println("sigHex:", sigHex)

    // Verify the signature using the public key
    verified := dilithium.Mode5.Verify(pk, msg, sig)
    assert.True(t, verified)
}

Result:

pkHex: c35db53163b35cac897215ef9927a6216d21793e9df078f73434d68956f782f48ced90e05eb59f734efd0686d0c59b165a8d429a630e80bef2daa50be0d673cf5fe29ef966bf5aec5ad98b10753a03c34dbd76c40174a66fcece8968f3bad0e498a138040bcc706de554870ebc8462b4cc58326a45763c812efd08adcc7b246e60febace200a945a42cf5e5597f6a16d4a667d5ff299397282047d342cdea4e8af55294c4dca3157d9b06bff4de414bcddbb669cf30be041ea58a4f944b1fdf6b4b070d7ef746e47e0a97991ec903c55250a1069c230b26ded1699307e1eb984ee4c7f6537f2f6031293599cb32c15fd0a491f9d098e5fb9505d637b07d156cd42b4eed439212c429ec95a8b917b6f9e6f93cfb094f3fdf843e84b4f5e46921c7e2788e0b9c038be9ba44eb14c12c778781b5db5f6e2550fb424ec2236f49b4c6aa90346c6e0618249fc50a0392f78691e446399aa9b70e188b332a200045d97c9a72e609112b078b46c0e4224bb0afd80ad3c7cff07f78afd949482aa9cee1b966535236ef953a5d68bb6588addf971c4bd13702e246b869afb5c4dc93c38a1dfe2d425b3d9db0359aaae7ace244555ae56cc44449312a8738dfd73a9a296708c3a73900a32388d6fe5754f3ebdca02d3912d4eb7bfc3016b2e71b1cf1189fb244eefe0d1ff2a7369baca1e75f35951df5614a2a5eb07f171c830097f8551f0f298e5f73b35020691ddc5dc5499067b8813ba4f1541665589f8f8964b1a9e5c9aea05ee706a8e103b0cca0eb93e37d806d3411fa672e64eff86fccec76a52309bf20f3211a24959f0aa79eb38027d237e59e16819f284ccaebe645f5947bc25f54df3d40d4755aa4bb1e20ddeeb1c0b900aeef9d50f644ac428bf14709552f7b3358d8b79db97918e2e3025450d5e8371939a06e01adb01e91cd9271c1db5aa1d061fc581ca97f57d3bdcec7ae14a965df028f6c92587573d385b50c0af9cb2e454b62416667588d6bb6e328e895de2485fe397280d6e658b978102119d532c3914d6be41dcec3471ae78c04d4ce7f2f83e57abf8755d94297e5c23ae1e49c45c58251517a29934d30c626999723fd8acee800605809509853df2154afae52a809e8fbeae34e80b12b17ea3bc8649d507cc4815d646780aa106bf1f133d53df5759f3d5a69b157e3388cd866b38fa88d549003366cf18df91d31c29c050c1729f1785084bacf4035bce19ce4611875d43ae946a44f0655625d45664cc3680f7b223da8031a16e60b31ea77d40e407bd1521553443fe80fd078486da710979af9342aa576872a1512279abff626628410c8a9b9563a936f8f75c4d5268be2d678876a9894732f40f948c56432dbc0017cf8a397d3690149e83650206f32259731c417823906c625a3f4c7c15bf65c98245446e7f57bb6684e7c8eb59cf70b9ebdad3ad73beb6636fc6d711f216dcee33f8313ed14bdb8f6314b793bea8f5b36d9804b01b43a425cb6eb65be640412ed79d7ec9e0c71d6729c0d93e8f74df243252bfc8039eb406c8032a41685f273b6bebdf9f407d52a26c457a98b7c28622e94b01e2c0a200453fc2e83ed29faaabd7dc4f93791d14764b231260b77b6596971f47812d9176b19704d36e4073ec502306114cc8c7c68c32255562174a955dcda3b25a4d29ef5cfd40efc8f09b405237c75e8fbbecf9f3f41bdcabf1c8542556a4035e5be82cbc65dbef858bf2f335bce3843616c72c8196c5d41143bb06234121a10bfee60e3685938c6cf01fc3e1ef6d8c3e4a9e3b90fdf0d31c62c37cc546d45e5e848158600603d65038584529f5e6e646c1e94493d0b61a0c29ef7fe6f4a4de2033f26d585b8312d12859cc72385aa0b8835cc089ee2731ae240075e40c1eaa2f45c2e7f9430edde65d1a363df854ae7cd7913c9bfe95efc239f6c2d808578a22f600d8bcf0f17d6b66c835b5a9abea16e609f5de2357d740e8d83145f372e6af87e733495fd462955a53dffbcbf45b4bcaf21293674cecd84e582974c93964623eacc03cb60e86076723796e4edd4cbb62446262f6340bec8adcbbb3f8d3da60bd07d70fd7941c6aaa4defca4be8e9e0735095e028bb12b52af5f656bdef644017aa84e508fc0fd3f90cb9b8de0ce36f2fb0a0194ec772cb836a0e1855dad7a3b15e34f490f5d33754522ca8364046ec499565cea2baf15f187086f44cea360b344d27d8a8c246976d494bf006ff8e4593c386b7eaeb92dcc6b660fde640181fb20a88783fa40c3152a3569979fac59a5c02e32c434036e93f34c5e97a09e277fc4b547b5c22e95aec155b5721aabb4f983bafc9bbaba4c69d831455a70d3a1f349bb49288d0eb2dee1b11edafb4f80a1dd34bf87e2d770e6a19af0fda13f2cf7016c20835f9474796780ec95a0e00867b040797c42d147f7476fe7c7bd1ad423dd65549dbb6b8da119a4d3fb31099acec2f7fd9eaab2507461dbabd7be5c0383e607574513c3d9ae3b7f49d65feac24fa9d46061df573128d75b9aa766c008ba7c2fcc5c4314143d9360ec6c700a7c44985cc6907c548cb58ba9f6300a702f90824d3ebaaf9a4bff634b78ebe8d407ca9c2e4a4098061d504aaa85892d332764f1ca020572ba107b2e341d280aff160a6350738119a64734e2c8a76c834f732505caad16a2df65cf2a67e03ef7d963701e042fe6d30e662fafaead6be4abb217b98176bbf3433a50d4109568ebf69ba8d7caa9027f0fb5a8dac542c6ed21a8fd213d0ab23d25202a54c2913832bbfc20a0f9124906b3b3b9a33e2986f9120fc773d3fc205b1f0840ba3c54d91dfa0080eb24c240cefc8fad31a88197da3c3772049fd5e0a7d5124224b9d60d1af65dca6ffc86b60f98844ab508c81c7e4832c4f86973262d177b415e737e4cfd409e4dd3a06ddcf61a20208df8fa6b2cbc3ef3d1624f282d16d873e00bf3cff21a9debac26dc5fbbe4b7d16c4e76209fd2b44602008132c764349afb6bd5cc1de8cf6b5ba746e27955ca96f1f23ade29744273c5b003468609a178273d1f8ad4fc715b81acfbc826c0b337791d64c8ca48341d716b852a2748d6c1642377cce032cd26cc820e312b4cd771abd65a79ec619b716f7a7e4ced72da3162e3a85c7ed9dc2cb0d32637ef26f33d6d50fb21b9f8f92f4175ee6d6057b111e1a721c614a7733961fa8481294859b3f06eac0d916db33fa726fd0511f10a26938c8fa138866823085fdca36ce508d1b57025ae2b22622c0a2ef8a8dc030bba1edbb35bcf6e990dc4e6db3668f6aaab9b115153e6efd93376d3173497eca1c4c40e479d00484d17594a96cd54d0760a66517298c242529f0d5566c98c3608d4d44ffc80182fff4f576a59519facd2e29436663e137740fdbf9d896c3d938c9afa30a93b79d6b47f0e94698f6c36f3dfee4edabc8d9e68081c53a0c5a3be4aa6078f050a09a61f483c98e2efe420b7d353357a20ebc4d27ec195ae66d928fb13c60079e346b038ad86c9dbec92fd3cca08214d1fb5892b2f007dc5b9453d14e4617c3ae28ac5590028cf49917b9a22876d66d0d914097a9ea2db81e95ec8121d8be129b795efc707646c63c18e4ff167c0fbbb874a116b1fb40ad051d7d8c577f8d07b13471acabd2c18498b4cd9f541b958af69a
sigHex: 62e4a45b9d9ae2651ade678be38220122c4db0819c890c5efa3a27c7c505a60a67e3d3dde0cf8ad5fb9581db1f8864932b6e83fe7e2d0c14ef37933167757c944d68d061c753c0223049dba54e391bf6f7665f55ae82eb1eb01187c766ac12738a6142470602f83e4a1b61f27cbcd36b1c8937ecd4c62d71470494c81427dceab0c60c56ca742f3400fc2c8363a91a98fe3bd6806e3be1233a69de26b246be742428d98cb7da8922d61cd35451e5ad3d5e5266ca1b3ece724488c0ff9844e46cf8ffc2953bb00bfe0509156a2b6f95d0378e2f726e36de79452b64358e681fcc828fdb399c942a7d1e1b54cf655a5188aa1f8ac05a0f9e22bdc2a53396ab2fed099a01ebe981ad78cbb6f0fb8d7cbf58e3e82841fb334a0ff69aa658866ac1baa11bafbdb3b3e86604c6f91bcd855ab7a975aa567f0c035bbaf6af1d839eaf3051b4b521d72ade0b5b097cba4c1c788f77cc802c741d79c80abaac5d20035f4b4d579b4691055d61a58804bb35c9eb3f58b3ef220396593be2847e75e3d5598ffbf125b8388e21b75c34b6b87d6c48ef1697367dcdfd6b479b4ffb1ece28fdd023d8ac58d5426a3dca2874a3f69046cd81bddf6b39c5b36f908565d6a3434b7abadde4a600a0c4de4bb9356b2f2c6b7a9284d97d8388bce1c955fe56c63c8aa64214e89cf5fb677d63415971f9fa8c64165a2ea709d56d06dc97162fd937410da2f4aef59aeaef22d2d9f05ff660ae7201c3970329688c4b126eefe9ec407c59f2691a63d096aadf42914b9f6951933505ecef98b7487967e842e41be6d90c2f25d5a56de9a15925f8cae4aecf50f16fbfcc932a3fab2119ec887d2704db9f52df604887a7a0a4a6e7e3961b8bf0431ac2ef77034e78dc3e94a548dc07435f3b53aed175716227c8177a65a82897526ae5e64aa6b8d0a521211c4fc0054ee40491bcf0f1a47a10efe6c595e7e8f205c229bd631611ef03ea5d5a3e0a4a5f2dcfe88c9a60d2e9289a2c9018ef8df4215fed1ede08bd1d2eae4649513af2613aa7afb8bbef243686dcec8f50d2a750371cb6c41472bcf459cb26087a7d1fd63423b25f8ce425a0c8d2228169091e109f06bf29bf1efe2c43c611a30b9f12cca19e3b7f9a4e6e8e0132ed18ac86cdacad9bc923d2196275b4dbbc93fe5d9075e21beece6955947d14312eaa346121a54c2bb6579e637ce32717fead13ab95ef95284e07814429923249634fc02073523eb38761a0f3bd1c0015daba0db8c31713c17fb5cdf99943aeafda96516c9f9fd52a27eabc8200f2ca96a0fc6af1db3598e4559dbd772d59774692ec7f1d8f38cf86ae4f2c5ea115d93434040e07e50cc25e62cb5eb6516df9610887151394bf01d61e5ec80100e93f8cc8445dc0979ce798d834fcb6f825849eb89eca88573985bb4ee43417a370ba9c7edf836aaae7f87407ad4f765175e7e6a5db85b931941f12a567f75583b6b4ab33d81a7003be25c650145b3d2d2d3cda8bd14e05bd78ae9e1ba6b0ea26409dac574e93b6cfff9f853b5c94db29bb1d49f618aaf419905fb95598de2cecc6e0041e3c80043042f1547555d1bdfd0dba10b00a19f7bb332f041708a1ce1f2ede2efd8c4f0c0604405826ceaf9560beef7a98b4c807ced357f1e456f6fd4357fc6558ad6ab1f347180d042d6f3d07b913014329e90eae60bce1dc8942473b4d48de3e427ac18c800cc24db7c6e413fe4fc61a1b8c7e1b4dd1f0887e82385f0474aebbe46531d1186f14d57a1bd4a29c14b72d595e4035cc1010ef616a19050a1d1d58e1969a09feeccf0067510cd9c4053c8d1e5274fb5d6b072c97be1a258420eaa9cdf09b552f092badfed35227dee58b88c6270ef4b098d7e4b3acdc031ad8ef4fe561ba8f89966a87a6883fbe8f6b66280eeacf74648b1c593e558e60e05ad971ce08c017d252ccbb052520f56b7dcd7bef6a3dc9a8561e7f2b6a574c19418c2a057b2614121c23a4b2e9370564822b72334a341e1ec237ac24c978d938bd98465bc2607703b41ce6783f70701ea1075d62cf0c434f06debd827c8d2536eac5b3faf1adb878167f6984affb73007a1c43f625f397f59c43a2fdec7242e512a7198d8b56ce44c8934c4de3a57610511ff6f68ce4df1bb7ab72bd39c7fb2a284e82de7f0dbf3a3cc61daf9013be9a7636f59deb21af4625f807fa9d8c532e5ee98dbf0b0d088df7230c399920391b6443018302f7e05187a1d514d646d974018d6977972c65e1dd1f7863beec8cc972b3306027aad9fb2ea20f87980717c01e144f2cd5ffea24ef8f60fca3c6d7bce6e65411ae99ca9a8f6141d844642d55ceb2cf21c5f769f1f2f838b450fd2f39aaf73f978694b1038f7a682a90fdf7392f2aaa35cd834ad97607a5637f83cc07cc9e10a7ea3e93b7bbe3ad71330d051905aa914b979f7c1db6a6e12ce4e878b97424db61bce2751221299e731c3c1f63e64d203499b76a1e6b2911b043a5db62246b45b16a769f3dac5d531be539bca33e781d22f11eb7c50ab1f93ce83f6ebc6bb30ec42a83bfdea54df59b74f5757dd810dabf53971e679fc1eaf080c2f0bc57cc68dab87f4ab2f46ff29716ab2ceb7b21fed9a622c370d3005ab6d55c6530f9bff94135cc0b5ca4e1ad9d86b7b2f325788bb964dccf026b444662a4ed2f6c7dda8a76675fc1e94123ba76a3090689737c05e7a8e520a1f253218ed1472564d1b56f4cb4f0beec1683371fae957aa4f7070dacf820a4c2f1a0a1b4aab1735ab66f618eaf5065b71c143897d112ce998a37f993c20162bc632ee4b67eee49ab789cfb09ff3ffe4dcc9bdff4a9500d9471a5c328cc2777101425d336aecbc3f0f1e1d0e23d3f798779c9f1acb93ce82c4553e14f16f564a28cf743a878c488eaf68cb03fb96302da1108da3f4e4425031052b2152f9fdda2cdb2abf54a6658b3e6c261ca4003f29f359e5aaa7140535ad99932b993d850aa0d6a00c3fe365e0ea7ef15da749d76761bbe987e6c0122adcdf68a7bc8ed8aa3992e7b8965c75a79877292bf8bfcd32003c6df279c26d388bba5aeae4e573f0ceb00e8b5bd0bc1038d1d12c5bcb604e83b8e67cfe267338be9dd7e40907c5deead4c725327789fddba55dc24d7585adf591d6fa3b46d2e43b54eca423b0a4a47c12f3f0ce0deed74350c241c3a2beb5959e4b60873ec255a32804dde4a0b93f26e0471c1c709f48fdf27206046640672f7ce53846ebd27f70ad9adc66f322e36098bcdccd9735b746e48294fd50c3a33b2b4f8cffbfcd1e36171bde8f9375305091f5fabdc32dd6340f381407374f441d38b3e6c4a9a933521b7f627069bd7e01049fbef74de685605cbbb3d7ebbba56b75920c8967dff89a4e46da8bed424dffc111b7a9fa539d4b00deaaebe4175e4c30c6d6dd80b17ccb2ac8f9c92baad59ab75e0982ad657ac44e014e8b18669b746b2f0134ea62854645d921a40091adb10ce08b5e4b1dbda661225cdf94cd903b1e58560eb870dd4d7136e3933709d071b6fee8ca146212a0266c5b646ed2abf13fedb1eb27d0bf251e5e383012fa4f4bc039c32c698376ba81b6fcf214c3e6e6d5ceaab1f325a50a54fd5cf9b2842195671388bdd9d74002b7294a3dda60261e3d24f21740eac888f42f24c7d1fc8abafdd8f6354a460a4e7f8c0a869fc333347505463c7cf1f707d676d0127463bdcccd6a8fc775375e4cf481233f33a772699ab40d3e31e318fe936b4b4f410fd7e5619edeb6ed68316466f0556891506698a8cf7ede0c8ae1ed426468fae1fb0acc0882407ffd18129eb81419e43f15d16b7f00ddc669688fb8a149bd5d652e0de1b197dc614dd3505103e60029d092c778df3c6ea3e75720950a383ee9d9b923af202fe7b37b1a1088782bc566fe21afff5ae62be2f80fcbccf3cea09b1f3a83dd90d80758388ceb2dd16ee8d115966adf9aea85a9edfae354876ed0dd4b346d031837945c2db8cf0334f1fe4264283dcd4be24f80cd3d4b35e3f6f112660356d6068aac6bdd6772a732507a87a3f9448dd7a0f89eaf2e3311ce680ac4e1aaef4ce74e052bf7de881c650ac357d017ce1f2cfe7f359d82fc21757504cf41ff4b855f04f7cf7197debfb0b5cab9fed60765d76de1674f4cbf093f120c5ca2805e5eab327545caed72356ddf8a4d95cc21f210b904f4e382c59012936a9d1f1c2d06e401dfe900b6f0b7725bb362526577e9f15d518c7a7add39dc427d742bc1c8f243b26f2b49ec2d33c39d9b16b6d9fa84f33fc5a356d064b44c06e836e414d960c2b07acd19c0ed871b7fc541d9a12fb74c96f41ff79c3700624e975dcd2859beb99e04ce3d1b029b2ca6837d537d9ac894117d8ea58f65e9d30cd467870222c7abbf67d4a785ec8e4513984ccdc8e2cbc170aac38ca4eebd70b1f7b4a34d962d4539b9fbb9bf0a9887d1dc4cd55339c18551a486d4b794ed9b89311428daf8c4551e906ee0425471cb407ca77a546e8aa5dec22c5ba863815bff5731ea4b9e9a25cf963b6492d47c1bbbdb4e7d47dd6405e6dbb691c8c4ed2e233aa0ada3bdc614b7c5a91ac5f807d1b99d78ff6bbe43008f86493a69bb05323332181e40334a8d88287a3bac863c60a50cfd5eb05210fa0cc135ed46eee1e8818a80e088848054d1a1ecc35bf4c680736b1e7836c88301334284e7a37d2131bea910613656eb7e26892ed65b9bddc607c38ebc08a345fc45f6b5916d6116d4153fa12da7c9e8df2cc27adf8cd4c20af52a3dbd24700e531d7683a1ef521274bb33b18278fe30216148865b857a5d6e819993c5e0a243fde38b03814bbb13e6e11f4e791083c7c7643f561eccb4210c5c98e8ad8c59fd6546ab87cc82e40deba38154d0c97fba8dea88d390e2aadcc55463a8ebe4062135a79c4167bf574c100f48d071a37cc262dd2cbbdbf75930e1836f402775dcee01c7eaeb3c259e0e5d53dd9cd7514c126ac9ef17857189ab38da7c98982e5426a92c37e48401839105315795f2a6f20302bd399dc5257c908e31a1b3dced74db2864f397ea2ee4bcdfbb7219130933aa7ca4c87ee36b6e6fdca852094b85cf4e60604b099b4d797cd2553e29d62ef31f082e1f28e08edbde1834bb0dcd463cd30119134698f3211577e5d881ea41a053662cbb0d79a77fd567569649c93a507cad1b680008ba5e2ccb16d554b54cfa2bfa8307f4693c8e7751c73cf0e900498cc20535388fa16bfe807ab3b527e6626c65539f054cbd94aa981651e4ed16c0f422bc484cb1fc90cb52cd13fa6aeb065e24caeda0414cd2e94f2639cf80386a8df6b79d61f0cdb53f40ee42eef276c4a7ab45f63c5cff258b6cf6fbecf6ed1646aba1659d4254764404a7ac116cfb9937614fc64d83386963c56cdf6a339644207a16a75649be0568db32e0f036c6ea8b2ec0f0e487fab4f7acec85113d1cfd6eb7a8b661da79d52578c84dc83695640c5837ff225ee5d2eaf992a4379919347c869a91139ed73cb7809ba79e101b817c0e4fe1e1577ec356be2560e4b3248db562c33374ea67e827170d95d9a9ae4fa1892b770089224db46cc49fd2763ac26c8cf1d6d507a11741822055e1cebee0128b0d200e4d5902df993a5a63cbf96c70261ef426aebf84d95a56cd21d03c15f218d9a3e0dce9a06145678e70fabce3ade9f48b430b8b185da8edbd34b48f52889ee64ae446e2c1cd9f199622a8efaa40faed524c2ce140e1106e7206a71d83345c7c8086a3c2a44a45d0eda674a4f01b662aedeca6d707a19b90a9cceff5d9164a2376f24468a4e8d7b20ad88037ab85063074cd79400a11d97b0566d2c7ccebaaa5f842c0f1df2cced87a813a119b5611612d2ea0af1ec067f309946e32b6378e7093d2aad7a91085e277b0109288f7288ddee0b614e25eb5eb8c6b433fac62a44feda22c6c7be5553f352146502e3fb8d2f96d57905cc8c446f27b1506f8ac51c47f133e85563f9561f93ff50101a27f9c2399374a77c7bf577cae52c28c32ce52cf58df45b9f3b429c42bfa0748222af4308d0c0bc0e0d7d2a621dea712cd275cf15368050bc6bc4da093a7ba5f0a9a2724a532d95f1a4c42246f09a114a6d76889543ba9953acfbf4d04581f0b8e7a51cb72ad163611e6ef7ea8b5aa8c5322c43a9ee843a275e1f1363a6c5d79edc0d49660bc230386a8c43dd2fa427929b01a325b5825071bfb3f20d4f07c3512269d6d80ac6f145fdcd79fae7435b24c0a03fcc44ff0149508444677bf4255b49ef0fbf59fd0a5956a4d5427ff8c723653d9094e7ba329af083fb055e2cfbac5185c0a553afe7fd238bcdff20dfcf59a09142ce152133d37749a98e30ad7ddb5b69337b5ce887ad17c783a7286984773fa722232a5789aeee0535445498b23c4be5121f3569900f25466c7ec0e8f9033091dd174d515c89a1a2aff52a2f6d78bbe7000000000000000000000000000000000000000000000000000000070d10151d212a30

2. Verify in JS

const dilithium = require('dilithium-crystals');

const fromHexString = (hexString) =>
    Uint8Array.from(hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));

const toHexString = (bytes) =>
    bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '')

;(async () => {
  console.log('tests....');
  const message = new TextEncoder().encode('hello');
  const messageHex = toHexString(message);

  const pubKeyHex = 'c35db53163b35cac897215ef9927a6216d21793e9df078f73434d68956f782f48ced90e05eb59f734efd0686d0c59b165a8d429a630e80bef2daa50be0d673cf5fe29ef966bf5aec5ad98b10753a03c34dbd76c40174a66fcece8968f3bad0e498a138040bcc706de554870ebc8462b4cc58326a45763c812efd08adcc7b246e60febace200a945a42cf5e5597f6a16d4a667d5ff299397282047d342cdea4e8af55294c4dca3157d9b06bff4de414bcddbb669cf30be041ea58a4f944b1fdf6b4b070d7ef746e47e0a97991ec903c55250a1069c230b26ded1699307e1eb984ee4c7f6537f2f6031293599cb32c15fd0a491f9d098e5fb9505d637b07d156cd42b4eed439212c429ec95a8b917b6f9e6f93cfb094f3fdf843e84b4f5e46921c7e2788e0b9c038be9ba44eb14c12c778781b5db5f6e2550fb424ec2236f49b4c6aa90346c6e0618249fc50a0392f78691e446399aa9b70e188b332a200045d97c9a72e609112b078b46c0e4224bb0afd80ad3c7cff07f78afd949482aa9cee1b966535236ef953a5d68bb6588addf971c4bd13702e246b869afb5c4dc93c38a1dfe2d425b3d9db0359aaae7ace244555ae56cc44449312a8738dfd73a9a296708c3a73900a32388d6fe5754f3ebdca02d3912d4eb7bfc3016b2e71b1cf1189fb244eefe0d1ff2a7369baca1e75f35951df5614a2a5eb07f171c830097f8551f0f298e5f73b35020691ddc5dc5499067b8813ba4f1541665589f8f8964b1a9e5c9aea05ee706a8e103b0cca0eb93e37d806d3411fa672e64eff86fccec76a52309bf20f3211a24959f0aa79eb38027d237e59e16819f284ccaebe645f5947bc25f54df3d40d4755aa4bb1e20ddeeb1c0b900aeef9d50f644ac428bf14709552f7b3358d8b79db97918e2e3025450d5e8371939a06e01adb01e91cd9271c1db5aa1d061fc581ca97f57d3bdcec7ae14a965df028f6c92587573d385b50c0af9cb2e454b62416667588d6bb6e328e895de2485fe397280d6e658b978102119d532c3914d6be41dcec3471ae78c04d4ce7f2f83e57abf8755d94297e5c23ae1e49c45c58251517a29934d30c626999723fd8acee800605809509853df2154afae52a809e8fbeae34e80b12b17ea3bc8649d507cc4815d646780aa106bf1f133d53df5759f3d5a69b157e3388cd866b38fa88d549003366cf18df91d31c29c050c1729f1785084bacf4035bce19ce4611875d43ae946a44f0655625d45664cc3680f7b223da8031a16e60b31ea77d40e407bd1521553443fe80fd078486da710979af9342aa576872a1512279abff626628410c8a9b9563a936f8f75c4d5268be2d678876a9894732f40f948c56432dbc0017cf8a397d3690149e83650206f32259731c417823906c625a3f4c7c15bf65c98245446e7f57bb6684e7c8eb59cf70b9ebdad3ad73beb6636fc6d711f216dcee33f8313ed14bdb8f6314b793bea8f5b36d9804b01b43a425cb6eb65be640412ed79d7ec9e0c71d6729c0d93e8f74df243252bfc8039eb406c8032a41685f273b6bebdf9f407d52a26c457a98b7c28622e94b01e2c0a200453fc2e83ed29faaabd7dc4f93791d14764b231260b77b6596971f47812d9176b19704d36e4073ec502306114cc8c7c68c32255562174a955dcda3b25a4d29ef5cfd40efc8f09b405237c75e8fbbecf9f3f41bdcabf1c8542556a4035e5be82cbc65dbef858bf2f335bce3843616c72c8196c5d41143bb06234121a10bfee60e3685938c6cf01fc3e1ef6d8c3e4a9e3b90fdf0d31c62c37cc546d45e5e848158600603d65038584529f5e6e646c1e94493d0b61a0c29ef7fe6f4a4de2033f26d585b8312d12859cc72385aa0b8835cc089ee2731ae240075e40c1eaa2f45c2e7f9430edde65d1a363df854ae7cd7913c9bfe95efc239f6c2d808578a22f600d8bcf0f17d6b66c835b5a9abea16e609f5de2357d740e8d83145f372e6af87e733495fd462955a53dffbcbf45b4bcaf21293674cecd84e582974c93964623eacc03cb60e86076723796e4edd4cbb62446262f6340bec8adcbbb3f8d3da60bd07d70fd7941c6aaa4defca4be8e9e0735095e028bb12b52af5f656bdef644017aa84e508fc0fd3f90cb9b8de0ce36f2fb0a0194ec772cb836a0e1855dad7a3b15e34f490f5d33754522ca8364046ec499565cea2baf15f187086f44cea360b344d27d8a8c246976d494bf006ff8e4593c386b7eaeb92dcc6b660fde640181fb20a88783fa40c3152a3569979fac59a5c02e32c434036e93f34c5e97a09e277fc4b547b5c22e95aec155b5721aabb4f983bafc9bbaba4c69d831455a70d3a1f349bb49288d0eb2dee1b11edafb4f80a1dd34bf87e2d770e6a19af0fda13f2cf7016c20835f9474796780ec95a0e00867b040797c42d147f7476fe7c7bd1ad423dd65549dbb6b8da119a4d3fb31099acec2f7fd9eaab2507461dbabd7be5c0383e607574513c3d9ae3b7f49d65feac24fa9d46061df573128d75b9aa766c008ba7c2fcc5c4314143d9360ec6c700a7c44985cc6907c548cb58ba9f6300a702f90824d3ebaaf9a4bff634b78ebe8d407ca9c2e4a4098061d504aaa85892d332764f1ca020572ba107b2e341d280aff160a6350738119a64734e2c8a76c834f732505caad16a2df65cf2a67e03ef7d963701e042fe6d30e662fafaead6be4abb217b98176bbf3433a50d4109568ebf69ba8d7caa9027f0fb5a8dac542c6ed21a8fd213d0ab23d25202a54c2913832bbfc20a0f9124906b3b3b9a33e2986f9120fc773d3fc205b1f0840ba3c54d91dfa0080eb24c240cefc8fad31a88197da3c3772049fd5e0a7d5124224b9d60d1af65dca6ffc86b60f98844ab508c81c7e4832c4f86973262d177b415e737e4cfd409e4dd3a06ddcf61a20208df8fa6b2cbc3ef3d1624f282d16d873e00bf3cff21a9debac26dc5fbbe4b7d16c4e76209fd2b44602008132c764349afb6bd5cc1de8cf6b5ba746e27955ca96f1f23ade29744273c5b003468609a178273d1f8ad4fc715b81acfbc826c0b337791d64c8ca48341d716b852a2748d6c1642377cce032cd26cc820e312b4cd771abd65a79ec619b716f7a7e4ced72da3162e3a85c7ed9dc2cb0d32637ef26f33d6d50fb21b9f8f92f4175ee6d6057b111e1a721c614a7733961fa8481294859b3f06eac0d916db33fa726fd0511f10a26938c8fa138866823085fdca36ce508d1b57025ae2b22622c0a2ef8a8dc030bba1edbb35bcf6e990dc4e6db3668f6aaab9b115153e6efd93376d3173497eca1c4c40e479d00484d17594a96cd54d0760a66517298c242529f0d5566c98c3608d4d44ffc80182fff4f576a59519facd2e29436663e137740fdbf9d896c3d938c9afa30a93b79d6b47f0e94698f6c36f3dfee4edabc8d9e68081c53a0c5a3be4aa6078f050a09a61f483c98e2efe420b7d353357a20ebc4d27ec195ae66d928fb13c60079e346b038ad86c9dbec92fd3cca08214d1fb5892b2f007dc5b9453d14e4617c3ae28ac5590028cf49917b9a22876d66d0d914097a9ea2db81e95ec8121d8be129b795efc707646c63c18e4ff167c0fbbb874a116b1fb40ad051d7d8c577f8d07b13471acabd2c18498b4cd9f541b958af69a';
  const signatureHex = '62e4a45b9d9ae2651ade678be38220122c4db0819c890c5efa3a27c7c505a60a67e3d3dde0cf8ad5fb9581db1f8864932b6e83fe7e2d0c14ef37933167757c944d68d061c753c0223049dba54e391bf6f7665f55ae82eb1eb01187c766ac12738a6142470602f83e4a1b61f27cbcd36b1c8937ecd4c62d71470494c81427dceab0c60c56ca742f3400fc2c8363a91a98fe3bd6806e3be1233a69de26b246be742428d98cb7da8922d61cd35451e5ad3d5e5266ca1b3ece724488c0ff9844e46cf8ffc2953bb00bfe0509156a2b6f95d0378e2f726e36de79452b64358e681fcc828fdb399c942a7d1e1b54cf655a5188aa1f8ac05a0f9e22bdc2a53396ab2fed099a01ebe981ad78cbb6f0fb8d7cbf58e3e82841fb334a0ff69aa658866ac1baa11bafbdb3b3e86604c6f91bcd855ab7a975aa567f0c035bbaf6af1d839eaf3051b4b521d72ade0b5b097cba4c1c788f77cc802c741d79c80abaac5d20035f4b4d579b4691055d61a58804bb35c9eb3f58b3ef220396593be2847e75e3d5598ffbf125b8388e21b75c34b6b87d6c48ef1697367dcdfd6b479b4ffb1ece28fdd023d8ac58d5426a3dca2874a3f69046cd81bddf6b39c5b36f908565d6a3434b7abadde4a600a0c4de4bb9356b2f2c6b7a9284d97d8388bce1c955fe56c63c8aa64214e89cf5fb677d63415971f9fa8c64165a2ea709d56d06dc97162fd937410da2f4aef59aeaef22d2d9f05ff660ae7201c3970329688c4b126eefe9ec407c59f2691a63d096aadf42914b9f6951933505ecef98b7487967e842e41be6d90c2f25d5a56de9a15925f8cae4aecf50f16fbfcc932a3fab2119ec887d2704db9f52df604887a7a0a4a6e7e3961b8bf0431ac2ef77034e78dc3e94a548dc07435f3b53aed175716227c8177a65a82897526ae5e64aa6b8d0a521211c4fc0054ee40491bcf0f1a47a10efe6c595e7e8f205c229bd631611ef03ea5d5a3e0a4a5f2dcfe88c9a60d2e9289a2c9018ef8df4215fed1ede08bd1d2eae4649513af2613aa7afb8bbef243686dcec8f50d2a750371cb6c41472bcf459cb26087a7d1fd63423b25f8ce425a0c8d2228169091e109f06bf29bf1efe2c43c611a30b9f12cca19e3b7f9a4e6e8e0132ed18ac86cdacad9bc923d2196275b4dbbc93fe5d9075e21beece6955947d14312eaa346121a54c2bb6579e637ce32717fead13ab95ef95284e07814429923249634fc02073523eb38761a0f3bd1c0015daba0db8c31713c17fb5cdf99943aeafda96516c9f9fd52a27eabc8200f2ca96a0fc6af1db3598e4559dbd772d59774692ec7f1d8f38cf86ae4f2c5ea115d93434040e07e50cc25e62cb5eb6516df9610887151394bf01d61e5ec80100e93f8cc8445dc0979ce798d834fcb6f825849eb89eca88573985bb4ee43417a370ba9c7edf836aaae7f87407ad4f765175e7e6a5db85b931941f12a567f75583b6b4ab33d81a7003be25c650145b3d2d2d3cda8bd14e05bd78ae9e1ba6b0ea26409dac574e93b6cfff9f853b5c94db29bb1d49f618aaf419905fb95598de2cecc6e0041e3c80043042f1547555d1bdfd0dba10b00a19f7bb332f041708a1ce1f2ede2efd8c4f0c0604405826ceaf9560beef7a98b4c807ced357f1e456f6fd4357fc6558ad6ab1f347180d042d6f3d07b913014329e90eae60bce1dc8942473b4d48de3e427ac18c800cc24db7c6e413fe4fc61a1b8c7e1b4dd1f0887e82385f0474aebbe46531d1186f14d57a1bd4a29c14b72d595e4035cc1010ef616a19050a1d1d58e1969a09feeccf0067510cd9c4053c8d1e5274fb5d6b072c97be1a258420eaa9cdf09b552f092badfed35227dee58b88c6270ef4b098d7e4b3acdc031ad8ef4fe561ba8f89966a87a6883fbe8f6b66280eeacf74648b1c593e558e60e05ad971ce08c017d252ccbb052520f56b7dcd7bef6a3dc9a8561e7f2b6a574c19418c2a057b2614121c23a4b2e9370564822b72334a341e1ec237ac24c978d938bd98465bc2607703b41ce6783f70701ea1075d62cf0c434f06debd827c8d2536eac5b3faf1adb878167f6984affb73007a1c43f625f397f59c43a2fdec7242e512a7198d8b56ce44c8934c4de3a57610511ff6f68ce4df1bb7ab72bd39c7fb2a284e82de7f0dbf3a3cc61daf9013be9a7636f59deb21af4625f807fa9d8c532e5ee98dbf0b0d088df7230c399920391b6443018302f7e05187a1d514d646d974018d6977972c65e1dd1f7863beec8cc972b3306027aad9fb2ea20f87980717c01e144f2cd5ffea24ef8f60fca3c6d7bce6e65411ae99ca9a8f6141d844642d55ceb2cf21c5f769f1f2f838b450fd2f39aaf73f978694b1038f7a682a90fdf7392f2aaa35cd834ad97607a5637f83cc07cc9e10a7ea3e93b7bbe3ad71330d051905aa914b979f7c1db6a6e12ce4e878b97424db61bce2751221299e731c3c1f63e64d203499b76a1e6b2911b043a5db62246b45b16a769f3dac5d531be539bca33e781d22f11eb7c50ab1f93ce83f6ebc6bb30ec42a83bfdea54df59b74f5757dd810dabf53971e679fc1eaf080c2f0bc57cc68dab87f4ab2f46ff29716ab2ceb7b21fed9a622c370d3005ab6d55c6530f9bff94135cc0b5ca4e1ad9d86b7b2f325788bb964dccf026b444662a4ed2f6c7dda8a76675fc1e94123ba76a3090689737c05e7a8e520a1f253218ed1472564d1b56f4cb4f0beec1683371fae957aa4f7070dacf820a4c2f1a0a1b4aab1735ab66f618eaf5065b71c143897d112ce998a37f993c20162bc632ee4b67eee49ab789cfb09ff3ffe4dcc9bdff4a9500d9471a5c328cc2777101425d336aecbc3f0f1e1d0e23d3f798779c9f1acb93ce82c4553e14f16f564a28cf743a878c488eaf68cb03fb96302da1108da3f4e4425031052b2152f9fdda2cdb2abf54a6658b3e6c261ca4003f29f359e5aaa7140535ad99932b993d850aa0d6a00c3fe365e0ea7ef15da749d76761bbe987e6c0122adcdf68a7bc8ed8aa3992e7b8965c75a79877292bf8bfcd32003c6df279c26d388bba5aeae4e573f0ceb00e8b5bd0bc1038d1d12c5bcb604e83b8e67cfe267338be9dd7e40907c5deead4c725327789fddba55dc24d7585adf591d6fa3b46d2e43b54eca423b0a4a47c12f3f0ce0deed74350c241c3a2beb5959e4b60873ec255a32804dde4a0b93f26e0471c1c709f48fdf27206046640672f7ce53846ebd27f70ad9adc66f322e36098bcdccd9735b746e48294fd50c3a33b2b4f8cffbfcd1e36171bde8f9375305091f5fabdc32dd6340f381407374f441d38b3e6c4a9a933521b7f627069bd7e01049fbef74de685605cbbb3d7ebbba56b75920c8967dff89a4e46da8bed424dffc111b7a9fa539d4b00deaaebe4175e4c30c6d6dd80b17ccb2ac8f9c92baad59ab75e0982ad657ac44e014e8b18669b746b2f0134ea62854645d921a40091adb10ce08b5e4b1dbda661225cdf94cd903b1e58560eb870dd4d7136e3933709d071b6fee8ca146212a0266c5b646ed2abf13fedb1eb27d0bf251e5e383012fa4f4bc039c32c698376ba81b6fcf214c3e6e6d5ceaab1f325a50a54fd5cf9b2842195671388bdd9d74002b7294a3dda60261e3d24f21740eac888f42f24c7d1fc8abafdd8f6354a460a4e7f8c0a869fc333347505463c7cf1f707d676d0127463bdcccd6a8fc775375e4cf481233f33a772699ab40d3e31e318fe936b4b4f410fd7e5619edeb6ed68316466f0556891506698a8cf7ede0c8ae1ed426468fae1fb0acc0882407ffd18129eb81419e43f15d16b7f00ddc669688fb8a149bd5d652e0de1b197dc614dd3505103e60029d092c778df3c6ea3e75720950a383ee9d9b923af202fe7b37b1a1088782bc566fe21afff5ae62be2f80fcbccf3cea09b1f3a83dd90d80758388ceb2dd16ee8d115966adf9aea85a9edfae354876ed0dd4b346d031837945c2db8cf0334f1fe4264283dcd4be24f80cd3d4b35e3f6f112660356d6068aac6bdd6772a732507a87a3f9448dd7a0f89eaf2e3311ce680ac4e1aaef4ce74e052bf7de881c650ac357d017ce1f2cfe7f359d82fc21757504cf41ff4b855f04f7cf7197debfb0b5cab9fed60765d76de1674f4cbf093f120c5ca2805e5eab327545caed72356ddf8a4d95cc21f210b904f4e382c59012936a9d1f1c2d06e401dfe900b6f0b7725bb362526577e9f15d518c7a7add39dc427d742bc1c8f243b26f2b49ec2d33c39d9b16b6d9fa84f33fc5a356d064b44c06e836e414d960c2b07acd19c0ed871b7fc541d9a12fb74c96f41ff79c3700624e975dcd2859beb99e04ce3d1b029b2ca6837d537d9ac894117d8ea58f65e9d30cd467870222c7abbf67d4a785ec8e4513984ccdc8e2cbc170aac38ca4eebd70b1f7b4a34d962d4539b9fbb9bf0a9887d1dc4cd55339c18551a486d4b794ed9b89311428daf8c4551e906ee0425471cb407ca77a546e8aa5dec22c5ba863815bff5731ea4b9e9a25cf963b6492d47c1bbbdb4e7d47dd6405e6dbb691c8c4ed2e233aa0ada3bdc614b7c5a91ac5f807d1b99d78ff6bbe43008f86493a69bb05323332181e40334a8d88287a3bac863c60a50cfd5eb05210fa0cc135ed46eee1e8818a80e088848054d1a1ecc35bf4c680736b1e7836c88301334284e7a37d2131bea910613656eb7e26892ed65b9bddc607c38ebc08a345fc45f6b5916d6116d4153fa12da7c9e8df2cc27adf8cd4c20af52a3dbd24700e531d7683a1ef521274bb33b18278fe30216148865b857a5d6e819993c5e0a243fde38b03814bbb13e6e11f4e791083c7c7643f561eccb4210c5c98e8ad8c59fd6546ab87cc82e40deba38154d0c97fba8dea88d390e2aadcc55463a8ebe4062135a79c4167bf574c100f48d071a37cc262dd2cbbdbf75930e1836f402775dcee01c7eaeb3c259e0e5d53dd9cd7514c126ac9ef17857189ab38da7c98982e5426a92c37e48401839105315795f2a6f20302bd399dc5257c908e31a1b3dced74db2864f397ea2ee4bcdfbb7219130933aa7ca4c87ee36b6e6fdca852094b85cf4e60604b099b4d797cd2553e29d62ef31f082e1f28e08edbde1834bb0dcd463cd30119134698f3211577e5d881ea41a053662cbb0d79a77fd567569649c93a507cad1b680008ba5e2ccb16d554b54cfa2bfa8307f4693c8e7751c73cf0e900498cc20535388fa16bfe807ab3b527e6626c65539f054cbd94aa981651e4ed16c0f422bc484cb1fc90cb52cd13fa6aeb065e24caeda0414cd2e94f2639cf80386a8df6b79d61f0cdb53f40ee42eef276c4a7ab45f63c5cff258b6cf6fbecf6ed1646aba1659d4254764404a7ac116cfb9937614fc64d83386963c56cdf6a339644207a16a75649be0568db32e0f036c6ea8b2ec0f0e487fab4f7acec85113d1cfd6eb7a8b661da79d52578c84dc83695640c5837ff225ee5d2eaf992a4379919347c869a91139ed73cb7809ba79e101b817c0e4fe1e1577ec356be2560e4b3248db562c33374ea67e827170d95d9a9ae4fa1892b770089224db46cc49fd2763ac26c8cf1d6d507a11741822055e1cebee0128b0d200e4d5902df993a5a63cbf96c70261ef426aebf84d95a56cd21d03c15f218d9a3e0dce9a06145678e70fabce3ade9f48b430b8b185da8edbd34b48f52889ee64ae446e2c1cd9f199622a8efaa40faed524c2ce140e1106e7206a71d83345c7c8086a3c2a44a45d0eda674a4f01b662aedeca6d707a19b90a9cceff5d9164a2376f24468a4e8d7b20ad88037ab85063074cd79400a11d97b0566d2c7ccebaaa5f842c0f1df2cced87a813a119b5611612d2ea0af1ec067f309946e32b6378e7093d2aad7a91085e277b0109288f7288ddee0b614e25eb5eb8c6b433fac62a44feda22c6c7be5553f352146502e3fb8d2f96d57905cc8c446f27b1506f8ac51c47f133e85563f9561f93ff50101a27f9c2399374a77c7bf577cae52c28c32ce52cf58df45b9f3b429c42bfa0748222af4308d0c0bc0e0d7d2a621dea712cd275cf15368050bc6bc4da093a7ba5f0a9a2724a532d95f1a4c42246f09a114a6d76889543ba9953acfbf4d04581f0b8e7a51cb72ad163611e6ef7ea8b5aa8c5322c43a9ee843a275e1f1363a6c5d79edc0d49660bc230386a8c43dd2fa427929b01a325b5825071bfb3f20d4f07c3512269d6d80ac6f145fdcd79fae7435b24c0a03fcc44ff0149508444677bf4255b49ef0fbf59fd0a5956a4d5427ff8c723653d9094e7ba329af083fb055e2cfbac5185c0a553afe7fd238bcdff20dfcf59a09142ce152133d37749a98e30ad7ddb5b69337b5ce887ad17c783a7286984773fa722232a5789aeee0535445498b23c4be5121f3569900f25466c7ec0e8f9033091dd174d515c89a1a2aff52a2f6d78bbe7000000000000000000000000000000000000000000000000000000070d10151d212a30';

  const verified = await dilithium.open(
      fromHexString(signatureHex),
      fromHexString(pubKeyHex),
  );
  console.log('verified: ', toHexString(verified) === messageHex);
})();

which returns

RangeError: Invalid typed array length: 4597

I've tried the inverse: generating with JS and validating with Go, and it also does not work:

;(async () => {
  console.log('tests....');
  const {publicKey, privateKey} = await dilithium.keyPair();
  const message = new TextEncoder().encode('hello');
  const messageHex = toHexString(message);

  const signature = await dilithium.sign(
      fromHexString(messageHex),
      fromHexString(toHexString(privateKey)),
  );
  const hexString1 = toHexString(signature);
  const hexString2 = toHexString(publicKey);

  console.log('sig hex: \n', hexString1);
  console.log('pub key hex: ', hexString2);

  const verified = await dilithium.open(
      fromHexString(hexString1),
      fromHexString(hexString2),
  );
  console.log('verified: ', toHexString(verified) === messageHex);
})();

which outputs

sig hex:  f3116db24ace7314b24922ac57ccc62fb68a52aca17fef38e901b46e76cc1f33f87bdd45c674f221783fc30d9b15c59604256e766b42125a8d0b195502ae0c91ac47dbdd2dbd6d0f4f060f89da83e2aafa10428d17ad723c4aa274e506363cd814ec8b5630fe39d54fb2585dc571f76ad68cd0ce1e07e78fab4e552fba838263f153265ceeac7360ad8e0d14705632faa05986f47d72189dad23b47f5a2cfd55d631697d4f6c91e736c84fabf7768a73338ad360e53adf3f4dd692ab0d2650aef9525bc0784957b668c46377069171e8b156a231ac1547926d418327aeb16195df6a2530ca6d05b89bbda4b7b8c0594ad398b283bc4b2eff0a8e309b2ff0102a5e7c8281a985f1a1b7f1f7ffcdfcacdf0bd15dedb22f82bfecfa563b2ccfe5806d6d41b8649a4bcf95cdda6787bcd4c86e43940f521304e7fa1ea7c890666e7e6bd8e541c0d95061464899a36bae9576900544974e0acd094394c27667325829b16a6c90bfe510616ab2cbf5aa8aa027c4f2e1823dbc4826000034f8d49ae89ba4e39849db3cd601018a8698dc6af8fed158c0c5677807239a4eb10fd6c48c376b4dcee233a2149e2e8719281af2c0280899739a88517f40a5b1ef52a3f9d50b9bf298cae62afa15f6c93ec500eae3183aaf268cecfc9d2b85f1bbfa91342ead20055427c27a802dd615a6ff49ad9300a03d0f876c752e10232563653f1b981cb413b6ac823437ee29bfd5aea2c841e942579313fd58dd1e87ad67995b1f429c0572df265c03cca539feb47940afd7865a2927e75152d2d066ee16da8aa8ab22167be1ed39053be31aaa451e0114ee1f6bda4b2516b55da8d2e577deec95511acc40dcb47e1a2f9b74107562a9286b9811257239d9392c173590cd343da76799ee000c50c8b76afd53867a6258c78eed91aafb77630c3b13c290847c6e97010a097b3963fccf5959ed1ae2c0c13fb06ca28fcd1402f50443b3ef5332e2e8c64ca29af8f0ebf5395011cbbe4d0587c500e749decea4f4da3811a61dd71be023b29b2e6b36758bc268274b8e5ee35f241d203fdd33409847daa5481bb0403660b17fe67e68ea1030885c5555a5e0bc93f9a8873e802dd7dca0c59e39bf18ac86a6b18125a522836bbf1b675606d15699658801983620b9ef69bcd34794971215a687b0e107c753188c0a8d0c18554b002c0202304f6c8b4b2953c1a619ff4fd0d1a81e333e97385ffe54e0fa0b814e47596bf469d89a0afef247890fd3ae1849130172cf9c32daaff202cc2af9e62536739cbbd9556f068565f27aef36e88bbacddd6cf0d779e13e3b352c37bc80c1449480449fca16fdb0b79a275bf0eb0e55ee1b189157df7b134a46a08cffce6e780147fc3e36cd113384076ecad935e06ac4d5c5fa67d14ca06d2dac5596c54af9887ef223ac66f1549cccb196906cf9ee5d3c54acd8836067c0d650ba23cdeba5504400b950f25c7ac9e6e863ced580a1f9753828c835ef531a453cb09d3c2016d3d4be1cf4f4825a076c26815ca679caf28fc43a45c7245a0af8c6c6878f46c305b038101b3226825f506c1a43a0bc0d9ecfad5a320230cbcb3b338c77310b1b990e749ebf48fd654e9c4396ca9619383191ad13eb986b83ee590a752ea773633a7dac271bddb7ba0c582d18e000037ed890f40e5d5e1e82a80084552fd17554cb0ea10af43139e3882b9ad16592de4e55940a8de3f2de59a340029905325768e0c79b66ed9d4f8c13bd5dd43931774e12076abb1f3ce061ac078a7b9a4094762f6cdbc2734a40d2e6e0f2c35ea2b66f9adc3b2609b306aba1ff2ecdfbcc454366ba94446fe876633ee0f8f7460fdb82b1ab19e3ad012efc6484b55cdb7ebecf59fc53d5468853939d396ad431609c6ffcefa065e7420914da859b4fb0297c792e2d4333f8ecb2ecb0f9b89709d41f920d3dd32b0029bfaf83eec8d18803e734c04312c888183f64c0547ae82bd62308005cca30759a9d651edae200a3c32367da71e7e8445175d91d120d48f68b0fe05218d2c4bce522a0bf4e70b093b1c2e9f3f3fb65b0c0af860ea585863e0c8d8bef932c6d04dd96db17e5319c9954a10a9349373b49a7d1c8712eb5e4322b3310f1cdf042fd41437b64c32869d7e46f93aec9265f54f5a787c3c24af1e7f6a9aee0803fa958d978f3b6991f6de345aae188cb5fd83264296be826302d80ce848763a609bda95b3dc3729f36cb76067b1da6ed8b9cdac6c2b34c2effa0f7e89b4f5bc8586b82b285dce4d151085331c05c26e64482af0b9f3fb5eb0b3b85bf5a8ad377910a574cb9059e36b32509b9080a351a9e1a7aa9d5d53141d93787d348d5b9ae5940374cd6cb99d4394ddb54f168aec06b469bfdb2a9db5bf89eafb61751802d3cfb08b47bb9cc39a7d48cd426af22e7ef33dcf8dc5b719e69d91b0f17ebc10b1fe1d86c84409d2e281b41d79afb48831eb3ee80e93b5b0b180ebbf0ee227df3069ea3cc3b6b9fb5aa291e439732102f720ef89abf94c9b85483ac62c429eede8bfe7b03904fea1cb13717ee93b8142fa9bec09153b423b2a68ff315ae786d285282d769bb57045b856101d4d7285fd03489deceb93a556b820e6cbe7d2b3b0c91eaa0574ffe9350372853fcd5c8f42e6a36a9bb8d4d552f1a08acb65b6dda1de10fbd06495293b5f6b49f74b0749fca912ddf309559915c0c40a2a7e5ee1378f613988e799100b1105916169937914bcf26f0d9f238a835a4475432a88a694376d64bf231f625b49684d1813f9fbef8901c984cb585019dcbd060f4b41cad8c42fd182486454a187a1da6015001888e09ce697bc434f3396ff747e64cde9d537562fca2b1ac6b87b3a725fa538ea96e900c1377fa26ba66f5babeaf9192cafff3c8ea1d5a55232ccf00891b9e0deb4abfc90ece6848c1ba4401e5832654213c3e00b7f8fcd6572cbe67dc6d9c3a9f18bbf767c8f6276ae4c486e29cf0f0d1531fa53de840ed6037bf8f955b3713567ed5637e04f03fd6e602fb9aed293c204e1294445670be21969d3776b2cca38e2c9bad1dcd25e63a64727bbf0cb0c28a86c652287fe785ab00f453ae3306e2560bdde502c0452966c712f095cbd14b28be949dff6ad66428f67317adf3fe5794e96fad2265613e91bdf18d6050916a219e67e726e65df16207a5ed5b852a567c563d3470abaf1a0901a99dc3c93fd402a34cc9a72aad488c16719d32a372ae684c275fac0f8768235e159cd4cd29ee4adf9254c0a0f81b58ca11eff32f7ad5309b72619be663258fd7552fa552c984451dafad708e8dc9129144f9d6b0306efd17e70d526153e99ea08c072544f6e63aa7b327ccee7b49101603640804aa8cdbb2be8221e34aebcfe73e172210a4bc9021c02f7a927277b339ca78287d9a631c19a82a91af868d5e1591ae3d8ab79ff2bc820ad48afc677e5bea3d339d30d62e2f221af54bebfefdc701d7d1f8eeb1708062755b612e26c8f0160a11a03a0272c230a5ca82c403e30139c89437120a08f676129fc466bc616a6bfb10889ce4390aebb8c5992b762ff0fdff10c8cdd4e293e58980d3cfa874d4be5dae62b7a061c0ada361bb09494c3dbac99ce59f930ab552eb8bdac379531769f699f9ad7d10c75d246b348fc4d426c3761d998f61d6929028d1e7ae6457850227ac425471223e93404d23ebe3106b4feab76b4e6cdba259163177fcfa837a4c96ca3415400d3af86d01ce61e0efdced546a2924be2c3be950e7904676a17a622e73fe7c4d3325fcb0d0c3cff332fafa16fd7435ff76b4bbe59bfeed2d4e741c3070d27360cc68cd225ef1786c2358ae58a3c5e1b73d4047d5b468492b9f3976d7029f3a6c67bbcc6c0a61337d9f78e81c5793122998c268081ce9e8ba1d2e9e1d69047b712a113dbad291a1e069b7926833674ceedf47e3ca4f1185edec99ee2e78e7b1be5cc5f270ecd0041bb3c4f68bfb83f640576e3f48c0ce2931214c7e3afb5f7f28bc03c0f1eb56837016ad64f1937cf24f46b839e476ef060a338490041b144101e0f6eaa7351e33236b207445058373897a2a768a6d5bffcdedce5626b7b2a7a873401d714f8c70514bd25935d0271f04b1371c590934e9635bebcbcb0009d9a03f13001f2666d9d692a1f69c53e0b9bc764a6cf06d992e6e300a4b5f1d2750a5fd391c526e6c8d6cb317f32091dfd7e677fe2010125087995d63065645547d9cfb0aa258eb8a016efbaf5c224d97ae2868467af271fbe4fbee78a3c7b5ed77b23a2234e564c6f1202cafff62ee8873b663e4ead80522cacec672a9829984534ab78b10b5a2137bcda635b0d9e17e5c05ab411b69ebc86f42b26e8de3e14229f8d34428992db669c616d5f712b72858d7beea4c0c0b60cb8248474683555bb06d7eba58c0c696d3022d923ef8aa764194255de08c8c3b51173f81a87994bbea47251d52f0a591220b589df45a17ef58a1ab81b80b59a024920057f2eacb3685929f5f0fcc961ddb9f28f4a6f3486a95c6034da3d2235f83717de598ec41a4963abac2e5b114becb939f4c96ccc3b0e71e20aed3506e2ebe5598653eae33bee1bd66e6a3b70a7f76dfdc2cafa8ddffa946658dd8f8d6791d45364611ddc934efd1279b869dd08b2e3c783542029cccf0755d49e4f40fce0352b0d6a8490aea7ff7971f2a87e638e72058f4d72dff4f8c6ef0cda1b1a52852cd902db2b04b58111fcbe45545b4cb53470c9ecfa780080536ae93ee4a3429124c079b9f2f1cb8f2f44f24c3f35320df7dc4bc5ef3782d0257ce60de7efdcdab7dc9ec655a5a0a9535cc1c7af4507f811d32d9cd807fcc02634565769f7296804120342a0842141a800c4ea867eb5c6c7b1cec556e72e3e83af2b77e5a42febf14ecaf967fb0c1d38ea94c7e77ab0233ee4c90097240d3978833e5458f9e8959721c63c56dba02ba38019d0cfe98c8387b13e0651eea63671f755b2e643059049951fff1b940904a84eb196769b0aea82fe4dcc44b03dd380f83836b0e7370140be86545d37d7b55c9ddaea292a1a14679cf61d8e21e011ff0252fd1f6aa84c9c1360c0783648e87662fba0007854e4df6be52f00321e8dedd6d85275bffafaf12c19a1e385886dccff7493c95a840c6af434cda156111b2cf416c62c2be96ef7c0f24a56a03b855d2e1819eb978dde14310c4ed92f3380e71a95f50ff83363f8f86ec3eb0dced4a539eb13999fbd59b0ef924856f870b43ee3eef4bd00586304390a9df32feaeb5c8fe9cb3e7f3d93f34fdcfa6fbaabd4d25e6420f048812efda280bc9f51462d8aba0dc4d007509628d9868220653a72b53414f00fec2140af2d59ce0f6623d4e2272bf220bb33d8b897df328442130753c24e2bb48779333a077be633e3b1c009b6126a9fc9af80876649b940e9516851a0103e1b13d4ef103673bf5f632d27e9f40da4595bb42be6e71eec6187731909d71788ce3fb6f047850601804c8e019d5d159289e6f569e4cb6c9fe9d8bd57c9ae32fc05e3d8156108f255361a70b53997d675b718a551859d6c8f23b18d43a21a9cc21ebacaf85541049c0465fbdbd5b2bae6fdd5cb650d29b9ece1db76c19793f4ab53ee2fc94c8dc7e6042aa02bdd31bd78caade7677dfeaf3482c6fb09f3c450a7db8f7a0c1249a179cb67f65d1e67c4eea8639c8a7673b69acdb3be98cef42a29b4023fcfc2cb466aac4113d29887784d3d227db62cc27fd2ce83de12b7af06fa49418fc9d95fc63216d7227fac8fdf95f04fca35f2bf57776a07b5c5a231ec0cd65351ecbed448b2f676b961caebe01abe88bf2659fc8630dec3419dc81e3fb6f556c419b8c557e0d4d1a7a959d395d52cdc85a53aeda33b84013411b1952a9d99fb50009d3986e577a1ac7cf8d26f1bd40d04c21b221fccccdf50822d816c01ca3e8b9c8b34a3a769101dc8345990ea51d2e845d638842b91e16f410f568ca956fabf089258c5fee77535ba55f96290b4cbdd648c6d9493ebbec052a82f36a1958fbde66211b66d9fa9dee18d85705f4428d1646951684ed23c4487ac3c20bf71201d99baf5ebc013108a374e38fd0292028cc543aad898a61dcf1071ce8ead70ea8b45d593a9ca4775daee8e1a098a73a1efc0b195bb9868b8f83e01808fafef64e7535637df34d41f82f5df1aac72e564be17ac2891bc93fd17bfec0b41f5fc095036b05e1c0beb51130d507cea4a52c18ce3184578a49473db3c35af3934b4c598e38facefcccdf5a5238aca96ac563dc5a8f2e71c07678706004b7303c78e5b284f61eadbc76c89f682559570b8ec18a0dc34fa6557d1456f59914084d3d3497aeaf15d550d4ed7642e5fb719bbb3e4e438929e0f6c3fe4d773fe787f8d84a50699598c8d8dcf70456a1cbec19388b97e309101fc6dd01142b456770aaf301445d64868bbbe8f26879e8ff282b435673b3ea0000000000000000000000000000000000000000000000090e131820292d3468656c6c6f

pub key hex:  e14c8e3ac1959b09a352b2b1e5cb76c993faad62d3b1464fe151d75c19ce8d82cd2a9e679cf2706e1a2582bb9b5d27df6466c3a3082732ec3d0736cd5f546a0b5eaba2bf18f0256910ab5a7502e053a8866c759e1abb746e757ff07d3d2596817e546b9cc5dd7b31bd44c27ead80a169b0a16bcb0d0afc0c718bb5e65d91c98e1e16c7145c53e61a9f31c94657f3a3023dfd172e35d1f750a1f0d5836324e45e7c54d5c87a2e873bcc2c7bd07c66864e398a733c42539e773cb1420f632cb084b90dd1194f9f24c6ea55289b4d54442df954921946fda1de6fb42998b4c1c61ecdab2ffe770b2e17ffacf3dbac0df176d5c5b179970041f33f6cb7fdbb297b27115bf3f6e3d40042eb49ffa5ff5ba476903ec55782104e66b92b36dc63452bfa576449d4e17f5ad0d2b2124a9864bd928af4d44cc205c469167df46f6faa99c6bffe4e1b73ce90f4b160ae1792026fde7a6ed03f41b2b401f6ea4f7ef51dc4db55df4dbdc4c05a3fc4a84b201d5efc34076abed3306fcd0edcb23f6eba082df7b4d19c0e52f54efe193abfcc1d5b4a7f0b3178593bb4f40cd8e13f3727b8adee5e39a9d1d2ba458bef2cc6d94fa383aee285ec245e5c13592b8d0129573f654c0eb7f7c26740251873c69ed627cf663974b0ea1af6825b7a983896a53557a93b67762d691177e562a6a5b788d66694d20adec12bed74e2af6d2d220679fa9a90e65ff99ca319c374b5bafbd920ccac2bc842b3b77055e980f8dd8d0da881002543b0e99b461c8b6b597a44e9f8166bc9f249146923a03db88c96d1390e427af030ca3b51c0ee457a6165cf9ad2ec374d5a9eeecc503b5dd9eeea57cfbe3e4f73b63ea9694c6af14b57cdf9536ae026fccca1c33bc1bfa5ff6c3b6ac2df98c4a5eb4057581f3ae779ea2e063d646ba5f97df32fcc672b17de362d83db6034fa8a4e62071da57ed3479d543378b0dc347f460c0843a5f6b28e5142c79a9c4b10af4bf4e1710cfb3399bcbd6e17081263827fca4679f324f0c4ffc8a2d6d215517a2621d27a94c9c14a922c74d49929e73501ee0d38d56b922bc8b0797140acdf7983896af48cd830ed5e7064811ecf61c3800d8603bce54db766524b29d964c53a1b3e198bf097b78bc845ae399f08ab8e128427b6ff74af133bb76670d0eb509cde2ead3bd377c80e52425ebdbd88b7b0c14b7377d73da8a3a3da83ac0d2de26ea2f99287f481a7add1d5d87f5e95aade3414342ca67fb1ab712b5be55ce85573ecd0508a1c2d8bd977c4f794266cadaa43c797e39c17655df2743c9d033794ac307bf56bf46d65e2da3c69572e8ade131839ee5d203ac734d4d9b9653abe63b81fe6961485816399aef9d36a54f2fe0b46ad9d1b061832b2ce51f2218c2b7c1d0ad553769124abfd16269495b0536c49047986f132fbaa523edc7aff3e081e3e9b3ac1e9f355cedc8cbc8b398f1e86e86e5ddc2cb862feced7513cc15371bdfed2835d809e82a9bcfd21f17e72d6b967b2c684507ec9b965b06978ecff95b5013b5df86181ee2044253403c4ad6adf61bfb4bfcabc48e71469e1d879ab5b2ad7fff52c9ebca5d0f88c24e501244643cf586509efbf499d8e754c43ffb23d13ea20a8dc587ca40ce97fea7f5aa4576278fde9c3abf94d214a0eb589f37d8600a1625405cc33acf9b4ed46189e75d6720641d77b23fd85e46a66d669cd87257130f16108b5f1d7f287656ffb798f56d3dfa777c0022d0dcc56b2f24da2f14233ca5b7bfdf94b3171acac0afab8c15a17cd4424a843eaa804fabe8e9a8c03a04107da97f1d077fc1276288cdeb56ee233de38d6ba697b49ba2543ec479e35caef1c82537d0e94c02637589ba95a934586fc7833510e946afa3754334a08a56377b9c0053ff75b10c8b0d44055904e05163a5a0813acd708a40fe66b3d8ebe0025b8261afaee896dfd7849550f65c5219168cdc82028c7fba2412e1120190f33ee50a6a7dbf7814993dcc4080df0566a36301ae6f22bf1a103d9926696cbefb4cd436a39771ff37e43193bc92b365910b7e63927cfcad648ae51883e0b217c7e9fc34b917e4d96be58ae6573834d0503685b4982cb24733cf45b583234b9d1e1384be4be2b2a3308011a2f815222349968b0744df9e3f27d475e04f66e6963deb6a675cf703072c93fd7853c28d3dae46dc3b541497ba0390c3e4ccc5d6089ee82f4d27812ff07f2a553ae93c71ef72c15f1eaff2b2897a44bf06798b34c8bda79f7567d7a8d055733a0cd71eaa8635a9c29bb152de8dd5bc495266ffaa001033f3edd24df61124aea767dbcf64b01481de510a99873f98bc0d5c597bfa1d559d116baf22571ec5293b2266b3b066d389aeb9864668a0ed4ae222fbdd3e56e918c696ffe5beaa750938f7f26dd83b6206d26374fb4ff7b1ea9598e79a3107238d75185c3d62e65f9be13be89800a21561a6fb79144aabd45363f9f223e92058bd7493c449bdbc5b19cb799a5b72e222d47845914490e84ed8119255051ba7e0fd2e972f533ef3d6d4d21db64d505d0105ec1e4b82c23b0ff50c215bfeb4ec1d46a376b37cf6e7b217f3e60d053f89e24bfadc0ab17763805ebe1ac31c576831c3c291ec60ba667bc895296696c3d75703ab9362b5c72c172782a2d9bf6f35e4c8c5553f2cb37ca2440c2277b8d2d66e5ee7dd4a0ee0a109ad62af1e33d36ca1b5a68527d7ee94949fec90175bf2dbe99dcded9990aed23c512487bccb71951957eef482d7b0d16dcefa6042bf35ecd3c282c401d24ce9b1cea694575a86f7fb1d3181e23cce63097d7075588157a42b030b60ab77ca54f98fc178f34c0f9cedfdda30f60cf80f37f78da63dddc67b17769a25bca5698c7f0df7cd773d1068f59831a406a3808d79dbb06ead86f6a25a2d2f962d6448290902f3144c0f05b0c392ff95f368ee56ef9038ee99daec610a8901f4566835182a391a4db1dc1fffa77e59a396c405e3d45f7babf03ff96c67f00aa3c5052ab864367f37aacae2084388758e4ab1be9a5e205a5524aa0ff589769b2b38fa0e47502a54886514d079fadc372de8e4d72c0a81c4a96cc8599141680a4cc91bc3bee5c5a3b856656d52f9ccff3c10cf892fcd8bcebb5537a6c13e9d8a3484d017741af486cf2cdaf8244f081f56bbc12c288c35b23f88d97380c7caca474ced38b9056813a3e542b6f271fa46a9141b53063a14c06eae1b24a54a28b6eff26c800d64af853c40df25ee40ba25b80851330382956a4439c97aaacd2ac6b459127206edea9e2b4a4b0c1c9efcd7bab8d8901fbc3342e28e0c6aeafc8d1b75833b796bce1c22097ff372f92b33429216694af2662603d0d367f952b7d1ef4d5acc59dd67677a31dc320856ee67c49e968265c0d1ded75a1bc7afba678409e4045057adfc5b4ec98dfbb6424f0ec740fab4559fcc846f1bf82cd6974e73b4bd6b93081fa256bf915119e6801f17dd65686360d1c47af94a10cf6b6fa983f9c67ff32d5e59812e9bb8a06e9759a2ea42958013408b2b3d7f4b2c5cdf0ce991a2ceea2c0f2286219b7cb8fcfb2216f2b51592fadcc948ec8c271e14d5274224d3e555bf7455c2d7a980bac5fcff5d137eb48b0e423e92981d5755e677846d194861e808c3cc41e3471e8750398cd5cff

verified:  true

and the go code that fails:

func TestVectors(t *testing.T) {
    msgHex := "68656c6c6f"
    messageBytes, err := hex.DecodeString(msgHex)
    assert.NoError(t, err)

    pkHex := "e14c8e3ac1959b09a352b2b1e5cb76c993faad62d3b1464fe151d75c19ce8d82cd2a9e679cf2706e1a2582bb9b5d27df6466c3a3082732ec3d0736cd5f546a0b5eaba2bf18f0256910ab5a7502e053a8866c759e1abb746e757ff07d3d2596817e546b9cc5dd7b31bd44c27ead80a169b0a16bcb0d0afc0c718bb5e65d91c98e1e16c7145c53e61a9f31c94657f3a3023dfd172e35d1f750a1f0d5836324e45e7c54d5c87a2e873bcc2c7bd07c66864e398a733c42539e773cb1420f632cb084b90dd1194f9f24c6ea55289b4d54442df954921946fda1de6fb42998b4c1c61ecdab2ffe770b2e17ffacf3dbac0df176d5c5b179970041f33f6cb7fdbb297b27115bf3f6e3d40042eb49ffa5ff5ba476903ec55782104e66b92b36dc63452bfa576449d4e17f5ad0d2b2124a9864bd928af4d44cc205c469167df46f6faa99c6bffe4e1b73ce90f4b160ae1792026fde7a6ed03f41b2b401f6ea4f7ef51dc4db55df4dbdc4c05a3fc4a84b201d5efc34076abed3306fcd0edcb23f6eba082df7b4d19c0e52f54efe193abfcc1d5b4a7f0b3178593bb4f40cd8e13f3727b8adee5e39a9d1d2ba458bef2cc6d94fa383aee285ec245e5c13592b8d0129573f654c0eb7f7c26740251873c69ed627cf663974b0ea1af6825b7a983896a53557a93b67762d691177e562a6a5b788d66694d20adec12bed74e2af6d2d220679fa9a90e65ff99ca319c374b5bafbd920ccac2bc842b3b77055e980f8dd8d0da881002543b0e99b461c8b6b597a44e9f8166bc9f249146923a03db88c96d1390e427af030ca3b51c0ee457a6165cf9ad2ec374d5a9eeecc503b5dd9eeea57cfbe3e4f73b63ea9694c6af14b57cdf9536ae026fccca1c33bc1bfa5ff6c3b6ac2df98c4a5eb4057581f3ae779ea2e063d646ba5f97df32fcc672b17de362d83db6034fa8a4e62071da57ed3479d543378b0dc347f460c0843a5f6b28e5142c79a9c4b10af4bf4e1710cfb3399bcbd6e17081263827fca4679f324f0c4ffc8a2d6d215517a2621d27a94c9c14a922c74d49929e73501ee0d38d56b922bc8b0797140acdf7983896af48cd830ed5e7064811ecf61c3800d8603bce54db766524b29d964c53a1b3e198bf097b78bc845ae399f08ab8e128427b6ff74af133bb76670d0eb509cde2ead3bd377c80e52425ebdbd88b7b0c14b7377d73da8a3a3da83ac0d2de26ea2f99287f481a7add1d5d87f5e95aade3414342ca67fb1ab712b5be55ce85573ecd0508a1c2d8bd977c4f794266cadaa43c797e39c17655df2743c9d033794ac307bf56bf46d65e2da3c69572e8ade131839ee5d203ac734d4d9b9653abe63b81fe6961485816399aef9d36a54f2fe0b46ad9d1b061832b2ce51f2218c2b7c1d0ad553769124abfd16269495b0536c49047986f132fbaa523edc7aff3e081e3e9b3ac1e9f355cedc8cbc8b398f1e86e86e5ddc2cb862feced7513cc15371bdfed2835d809e82a9bcfd21f17e72d6b967b2c684507ec9b965b06978ecff95b5013b5df86181ee2044253403c4ad6adf61bfb4bfcabc48e71469e1d879ab5b2ad7fff52c9ebca5d0f88c24e501244643cf586509efbf499d8e754c43ffb23d13ea20a8dc587ca40ce97fea7f5aa4576278fde9c3abf94d214a0eb589f37d8600a1625405cc33acf9b4ed46189e75d6720641d77b23fd85e46a66d669cd87257130f16108b5f1d7f287656ffb798f56d3dfa777c0022d0dcc56b2f24da2f14233ca5b7bfdf94b3171acac0afab8c15a17cd4424a843eaa804fabe8e9a8c03a04107da97f1d077fc1276288cdeb56ee233de38d6ba697b49ba2543ec479e35caef1c82537d0e94c02637589ba95a934586fc7833510e946afa3754334a08a56377b9c0053ff75b10c8b0d44055904e05163a5a0813acd708a40fe66b3d8ebe0025b8261afaee896dfd7849550f65c5219168cdc82028c7fba2412e1120190f33ee50a6a7dbf7814993dcc4080df0566a36301ae6f22bf1a103d9926696cbefb4cd436a39771ff37e43193bc92b365910b7e63927cfcad648ae51883e0b217c7e9fc34b917e4d96be58ae6573834d0503685b4982cb24733cf45b583234b9d1e1384be4be2b2a3308011a2f815222349968b0744df9e3f27d475e04f66e6963deb6a675cf703072c93fd7853c28d3dae46dc3b541497ba0390c3e4ccc5d6089ee82f4d27812ff07f2a553ae93c71ef72c15f1eaff2b2897a44bf06798b34c8bda79f7567d7a8d055733a0cd71eaa8635a9c29bb152de8dd5bc495266ffaa001033f3edd24df61124aea767dbcf64b01481de510a99873f98bc0d5c597bfa1d559d116baf22571ec5293b2266b3b066d389aeb9864668a0ed4ae222fbdd3e56e918c696ffe5beaa750938f7f26dd83b6206d26374fb4ff7b1ea9598e79a3107238d75185c3d62e65f9be13be89800a21561a6fb79144aabd45363f9f223e92058bd7493c449bdbc5b19cb799a5b72e222d47845914490e84ed8119255051ba7e0fd2e972f533ef3d6d4d21db64d505d0105ec1e4b82c23b0ff50c215bfeb4ec1d46a376b37cf6e7b217f3e60d053f89e24bfadc0ab17763805ebe1ac31c576831c3c291ec60ba667bc895296696c3d75703ab9362b5c72c172782a2d9bf6f35e4c8c5553f2cb37ca2440c2277b8d2d66e5ee7dd4a0ee0a109ad62af1e33d36ca1b5a68527d7ee94949fec90175bf2dbe99dcded9990aed23c512487bccb71951957eef482d7b0d16dcefa6042bf35ecd3c282c401d24ce9b1cea694575a86f7fb1d3181e23cce63097d7075588157a42b030b60ab77ca54f98fc178f34c0f9cedfdda30f60cf80f37f78da63dddc67b17769a25bca5698c7f0df7cd773d1068f59831a406a3808d79dbb06ead86f6a25a2d2f962d6448290902f3144c0f05b0c392ff95f368ee56ef9038ee99daec610a8901f4566835182a391a4db1dc1fffa77e59a396c405e3d45f7babf03ff96c67f00aa3c5052ab864367f37aacae2084388758e4ab1be9a5e205a5524aa0ff589769b2b38fa0e47502a54886514d079fadc372de8e4d72c0a81c4a96cc8599141680a4cc91bc3bee5c5a3b856656d52f9ccff3c10cf892fcd8bcebb5537a6c13e9d8a3484d017741af486cf2cdaf8244f081f56bbc12c288c35b23f88d97380c7caca474ced38b9056813a3e542b6f271fa46a9141b53063a14c06eae1b24a54a28b6eff26c800d64af853c40df25ee40ba25b80851330382956a4439c97aaacd2ac6b459127206edea9e2b4a4b0c1c9efcd7bab8d8901fbc3342e28e0c6aeafc8d1b75833b796bce1c22097ff372f92b33429216694af2662603d0d367f952b7d1ef4d5acc59dd67677a31dc320856ee67c49e968265c0d1ded75a1bc7afba678409e4045057adfc5b4ec98dfbb6424f0ec740fab4559fcc846f1bf82cd6974e73b4bd6b93081fa256bf915119e6801f17dd65686360d1c47af94a10cf6b6fa983f9c67ff32d5e59812e9bb8a06e9759a2ea42958013408b2b3d7f4b2c5cdf0ce991a2ceea2c0f2286219b7cb8fcfb2216f2b51592fadcc948ec8c271e14d5274224d3e555bf7455c2d7a980bac5fcff5d137eb48b0e423e92981d5755e677846d194861e808c3cc41e3471e8750398cd5cff"
    pubKeyBytes, err := hex.DecodeString(pkHex)
    assert.NoError(t, err)

    pubKey := dilithium.Mode5.PublicKeyFromBytes(pubKeyBytes)
    assert.NotEmpty(t, pubKey)

    sigHex := "f3116db24ace7314b24922ac57ccc62fb68a52aca17fef38e901b46e76cc1f33f87bdd45c674f221783fc30d9b15c59604256e766b42125a8d0b195502ae0c91ac47dbdd2dbd6d0f4f060f89da83e2aafa10428d17ad723c4aa274e506363cd814ec8b5630fe39d54fb2585dc571f76ad68cd0ce1e07e78fab4e552fba838263f153265ceeac7360ad8e0d14705632faa05986f47d72189dad23b47f5a2cfd55d631697d4f6c91e736c84fabf7768a73338ad360e53adf3f4dd692ab0d2650aef9525bc0784957b668c46377069171e8b156a231ac1547926d418327aeb16195df6a2530ca6d05b89bbda4b7b8c0594ad398b283bc4b2eff0a8e309b2ff0102a5e7c8281a985f1a1b7f1f7ffcdfcacdf0bd15dedb22f82bfecfa563b2ccfe5806d6d41b8649a4bcf95cdda6787bcd4c86e43940f521304e7fa1ea7c890666e7e6bd8e541c0d95061464899a36bae9576900544974e0acd094394c27667325829b16a6c90bfe510616ab2cbf5aa8aa027c4f2e1823dbc4826000034f8d49ae89ba4e39849db3cd601018a8698dc6af8fed158c0c5677807239a4eb10fd6c48c376b4dcee233a2149e2e8719281af2c0280899739a88517f40a5b1ef52a3f9d50b9bf298cae62afa15f6c93ec500eae3183aaf268cecfc9d2b85f1bbfa91342ead20055427c27a802dd615a6ff49ad9300a03d0f876c752e10232563653f1b981cb413b6ac823437ee29bfd5aea2c841e942579313fd58dd1e87ad67995b1f429c0572df265c03cca539feb47940afd7865a2927e75152d2d066ee16da8aa8ab22167be1ed39053be31aaa451e0114ee1f6bda4b2516b55da8d2e577deec95511acc40dcb47e1a2f9b74107562a9286b9811257239d9392c173590cd343da76799ee000c50c8b76afd53867a6258c78eed91aafb77630c3b13c290847c6e97010a097b3963fccf5959ed1ae2c0c13fb06ca28fcd1402f50443b3ef5332e2e8c64ca29af8f0ebf5395011cbbe4d0587c500e749decea4f4da3811a61dd71be023b29b2e6b36758bc268274b8e5ee35f241d203fdd33409847daa5481bb0403660b17fe67e68ea1030885c5555a5e0bc93f9a8873e802dd7dca0c59e39bf18ac86a6b18125a522836bbf1b675606d15699658801983620b9ef69bcd34794971215a687b0e107c753188c0a8d0c18554b002c0202304f6c8b4b2953c1a619ff4fd0d1a81e333e97385ffe54e0fa0b814e47596bf469d89a0afef247890fd3ae1849130172cf9c32daaff202cc2af9e62536739cbbd9556f068565f27aef36e88bbacddd6cf0d779e13e3b352c37bc80c1449480449fca16fdb0b79a275bf0eb0e55ee1b189157df7b134a46a08cffce6e780147fc3e36cd113384076ecad935e06ac4d5c5fa67d14ca06d2dac5596c54af9887ef223ac66f1549cccb196906cf9ee5d3c54acd8836067c0d650ba23cdeba5504400b950f25c7ac9e6e863ced580a1f9753828c835ef531a453cb09d3c2016d3d4be1cf4f4825a076c26815ca679caf28fc43a45c7245a0af8c6c6878f46c305b038101b3226825f506c1a43a0bc0d9ecfad5a320230cbcb3b338c77310b1b990e749ebf48fd654e9c4396ca9619383191ad13eb986b83ee590a752ea773633a7dac271bddb7ba0c582d18e000037ed890f40e5d5e1e82a80084552fd17554cb0ea10af43139e3882b9ad16592de4e55940a8de3f2de59a340029905325768e0c79b66ed9d4f8c13bd5dd43931774e12076abb1f3ce061ac078a7b9a4094762f6cdbc2734a40d2e6e0f2c35ea2b66f9adc3b2609b306aba1ff2ecdfbcc454366ba94446fe876633ee0f8f7460fdb82b1ab19e3ad012efc6484b55cdb7ebecf59fc53d5468853939d396ad431609c6ffcefa065e7420914da859b4fb0297c792e2d4333f8ecb2ecb0f9b89709d41f920d3dd32b0029bfaf83eec8d18803e734c04312c888183f64c0547ae82bd62308005cca30759a9d651edae200a3c32367da71e7e8445175d91d120d48f68b0fe05218d2c4bce522a0bf4e70b093b1c2e9f3f3fb65b0c0af860ea585863e0c8d8bef932c6d04dd96db17e5319c9954a10a9349373b49a7d1c8712eb5e4322b3310f1cdf042fd41437b64c32869d7e46f93aec9265f54f5a787c3c24af1e7f6a9aee0803fa958d978f3b6991f6de345aae188cb5fd83264296be826302d80ce848763a609bda95b3dc3729f36cb76067b1da6ed8b9cdac6c2b34c2effa0f7e89b4f5bc8586b82b285dce4d151085331c05c26e64482af0b9f3fb5eb0b3b85bf5a8ad377910a574cb9059e36b32509b9080a351a9e1a7aa9d5d53141d93787d348d5b9ae5940374cd6cb99d4394ddb54f168aec06b469bfdb2a9db5bf89eafb61751802d3cfb08b47bb9cc39a7d48cd426af22e7ef33dcf8dc5b719e69d91b0f17ebc10b1fe1d86c84409d2e281b41d79afb48831eb3ee80e93b5b0b180ebbf0ee227df3069ea3cc3b6b9fb5aa291e439732102f720ef89abf94c9b85483ac62c429eede8bfe7b03904fea1cb13717ee93b8142fa9bec09153b423b2a68ff315ae786d285282d769bb57045b856101d4d7285fd03489deceb93a556b820e6cbe7d2b3b0c91eaa0574ffe9350372853fcd5c8f42e6a36a9bb8d4d552f1a08acb65b6dda1de10fbd06495293b5f6b49f74b0749fca912ddf309559915c0c40a2a7e5ee1378f613988e799100b1105916169937914bcf26f0d9f238a835a4475432a88a694376d64bf231f625b49684d1813f9fbef8901c984cb585019dcbd060f4b41cad8c42fd182486454a187a1da6015001888e09ce697bc434f3396ff747e64cde9d537562fca2b1ac6b87b3a725fa538ea96e900c1377fa26ba66f5babeaf9192cafff3c8ea1d5a55232ccf00891b9e0deb4abfc90ece6848c1ba4401e5832654213c3e00b7f8fcd6572cbe67dc6d9c3a9f18bbf767c8f6276ae4c486e29cf0f0d1531fa53de840ed6037bf8f955b3713567ed5637e04f03fd6e602fb9aed293c204e1294445670be21969d3776b2cca38e2c9bad1dcd25e63a64727bbf0cb0c28a86c652287fe785ab00f453ae3306e2560bdde502c0452966c712f095cbd14b28be949dff6ad66428f67317adf3fe5794e96fad2265613e91bdf18d6050916a219e67e726e65df16207a5ed5b852a567c563d3470abaf1a0901a99dc3c93fd402a34cc9a72aad488c16719d32a372ae684c275fac0f8768235e159cd4cd29ee4adf9254c0a0f81b58ca11eff32f7ad5309b72619be663258fd7552fa552c984451dafad708e8dc9129144f9d6b0306efd17e70d526153e99ea08c072544f6e63aa7b327ccee7b49101603640804aa8cdbb2be8221e34aebcfe73e172210a4bc9021c02f7a927277b339ca78287d9a631c19a82a91af868d5e1591ae3d8ab79ff2bc820ad48afc677e5bea3d339d30d62e2f221af54bebfefdc701d7d1f8eeb1708062755b612e26c8f0160a11a03a0272c230a5ca82c403e30139c89437120a08f676129fc466bc616a6bfb10889ce4390aebb8c5992b762ff0fdff10c8cdd4e293e58980d3cfa874d4be5dae62b7a061c0ada361bb09494c3dbac99ce59f930ab552eb8bdac379531769f699f9ad7d10c75d246b348fc4d426c3761d998f61d6929028d1e7ae6457850227ac425471223e93404d23ebe3106b4feab76b4e6cdba259163177fcfa837a4c96ca3415400d3af86d01ce61e0efdced546a2924be2c3be950e7904676a17a622e73fe7c4d3325fcb0d0c3cff332fafa16fd7435ff76b4bbe59bfeed2d4e741c3070d27360cc68cd225ef1786c2358ae58a3c5e1b73d4047d5b468492b9f3976d7029f3a6c67bbcc6c0a61337d9f78e81c5793122998c268081ce9e8ba1d2e9e1d69047b712a113dbad291a1e069b7926833674ceedf47e3ca4f1185edec99ee2e78e7b1be5cc5f270ecd0041bb3c4f68bfb83f640576e3f48c0ce2931214c7e3afb5f7f28bc03c0f1eb56837016ad64f1937cf24f46b839e476ef060a338490041b144101e0f6eaa7351e33236b207445058373897a2a768a6d5bffcdedce5626b7b2a7a873401d714f8c70514bd25935d0271f04b1371c590934e9635bebcbcb0009d9a03f13001f2666d9d692a1f69c53e0b9bc764a6cf06d992e6e300a4b5f1d2750a5fd391c526e6c8d6cb317f32091dfd7e677fe2010125087995d63065645547d9cfb0aa258eb8a016efbaf5c224d97ae2868467af271fbe4fbee78a3c7b5ed77b23a2234e564c6f1202cafff62ee8873b663e4ead80522cacec672a9829984534ab78b10b5a2137bcda635b0d9e17e5c05ab411b69ebc86f42b26e8de3e14229f8d34428992db669c616d5f712b72858d7beea4c0c0b60cb8248474683555bb06d7eba58c0c696d3022d923ef8aa764194255de08c8c3b51173f81a87994bbea47251d52f0a591220b589df45a17ef58a1ab81b80b59a024920057f2eacb3685929f5f0fcc961ddb9f28f4a6f3486a95c6034da3d2235f83717de598ec41a4963abac2e5b114becb939f4c96ccc3b0e71e20aed3506e2ebe5598653eae33bee1bd66e6a3b70a7f76dfdc2cafa8ddffa946658dd8f8d6791d45364611ddc934efd1279b869dd08b2e3c783542029cccf0755d49e4f40fce0352b0d6a8490aea7ff7971f2a87e638e72058f4d72dff4f8c6ef0cda1b1a52852cd902db2b04b58111fcbe45545b4cb53470c9ecfa780080536ae93ee4a3429124c079b9f2f1cb8f2f44f24c3f35320df7dc4bc5ef3782d0257ce60de7efdcdab7dc9ec655a5a0a9535cc1c7af4507f811d32d9cd807fcc02634565769f7296804120342a0842141a800c4ea867eb5c6c7b1cec556e72e3e83af2b77e5a42febf14ecaf967fb0c1d38ea94c7e77ab0233ee4c90097240d3978833e5458f9e8959721c63c56dba02ba38019d0cfe98c8387b13e0651eea63671f755b2e643059049951fff1b940904a84eb196769b0aea82fe4dcc44b03dd380f83836b0e7370140be86545d37d7b55c9ddaea292a1a14679cf61d8e21e011ff0252fd1f6aa84c9c1360c0783648e87662fba0007854e4df6be52f00321e8dedd6d85275bffafaf12c19a1e385886dccff7493c95a840c6af434cda156111b2cf416c62c2be96ef7c0f24a56a03b855d2e1819eb978dde14310c4ed92f3380e71a95f50ff83363f8f86ec3eb0dced4a539eb13999fbd59b0ef924856f870b43ee3eef4bd00586304390a9df32feaeb5c8fe9cb3e7f3d93f34fdcfa6fbaabd4d25e6420f048812efda280bc9f51462d8aba0dc4d007509628d9868220653a72b53414f00fec2140af2d59ce0f6623d4e2272bf220bb33d8b897df328442130753c24e2bb48779333a077be633e3b1c009b6126a9fc9af80876649b940e9516851a0103e1b13d4ef103673bf5f632d27e9f40da4595bb42be6e71eec6187731909d71788ce3fb6f047850601804c8e019d5d159289e6f569e4cb6c9fe9d8bd57c9ae32fc05e3d8156108f255361a70b53997d675b718a551859d6c8f23b18d43a21a9cc21ebacaf85541049c0465fbdbd5b2bae6fdd5cb650d29b9ece1db76c19793f4ab53ee2fc94c8dc7e6042aa02bdd31bd78caade7677dfeaf3482c6fb09f3c450a7db8f7a0c1249a179cb67f65d1e67c4eea8639c8a7673b69acdb3be98cef42a29b4023fcfc2cb466aac4113d29887784d3d227db62cc27fd2ce83de12b7af06fa49418fc9d95fc63216d7227fac8fdf95f04fca35f2bf57776a07b5c5a231ec0cd65351ecbed448b2f676b961caebe01abe88bf2659fc8630dec3419dc81e3fb6f556c419b8c557e0d4d1a7a959d395d52cdc85a53aeda33b84013411b1952a9d99fb50009d3986e577a1ac7cf8d26f1bd40d04c21b221fccccdf50822d816c01ca3e8b9c8b34a3a769101dc8345990ea51d2e845d638842b91e16f410f568ca956fabf089258c5fee77535ba55f96290b4cbdd648c6d9493ebbec052a82f36a1958fbde66211b66d9fa9dee18d85705f4428d1646951684ed23c4487ac3c20bf71201d99baf5ebc013108a374e38fd0292028cc543aad898a61dcf1071ce8ead70ea8b45d593a9ca4775daee8e1a098a73a1efc0b195bb9868b8f83e01808fafef64e7535637df34d41f82f5df1aac72e564be17ac2891bc93fd17bfec0b41f5fc095036b05e1c0beb51130d507cea4a52c18ce3184578a49473db3c35af3934b4c598e38facefcccdf5a5238aca96ac563dc5a8f2e71c07678706004b7303c78e5b284f61eadbc76c89f682559570b8ec18a0dc34fa6557d1456f59914084d3d3497aeaf15d550d4ed7642e5fb719bbb3e4e438929e0f6c3fe4d773fe787f8d84a50699598c8d8dcf70456a1cbec19388b97e309101fc6dd01142b456770aaf301445d64868bbbe8f26879e8ff282b435673b3ea0000000000000000000000000000000000000000000000090e131820292d3468656c6c6f"
    signatureBytes, err := hex.DecodeString(sigHex)
    assert.NoError(t, err)

    // Verify the signature using the public key
    verified := dilithium.Mode5.Verify(pubKey, messageBytes, signatureBytes)
    assert.True(t, verified)
}

Can you help me understand what the issue may be with my implementation, or if there could be a bug?

decentralgabe commented 1 year ago

To throw another wrench into the mix I've also tried verifying signatures generated from this java implementation which appears on the official Dilithium site.

The code this snippet outputs could not be verified by either this library or the JS one 😕 .

    public void vectors() throws Exception {
        DilithiumProvider pv = new DilithiumProvider();
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("Dilithium", pv);
        kpg.initialize(DilithiumParameterSpec.LEVEL5);
        KeyPair kp = kpg.generateKeyPair();

        Signature signature = Signature.getInstance("Dilithium", pv);
        signature.initSign(kp.getPrivate());
        byte[] text = new byte[]{0,1,2,3,4,5};
        signature.update(text);
        byte[] sig = signature.sign();

        // Check we can verify with the correct public key
        signature.initVerify(kp.getPublic());
        signature.update(text);
        assertTrue(signature.verify(sig));

        System.out.printf("Public Key: %s\n", bytesToHex(kp.getPublic().getEncoded()));
        System.out.printf("Signature: %s", bytesToHex(sig));
    }

    public static String bytesToHex(byte[] bytes) {
        StringBuilder hex = new StringBuilder();
        for (byte b : bytes) {
            hex.append(String.format("%02X", b));
        }
        return hex.toString();
    }
bwesterb commented 1 year ago

Here is a clue: the signature generated by javascript is 4602 bytes, whereas the one generated by CIRCL is 4595 bytes. The Dilithium spec lists the correct signature size to be 4595. We check test vectors against the reference implementation.

bwesterb commented 1 year ago

Looking at the source code of the JS package you are using:

long dilithiumjs_sign (
    uint8_t *sig,
    const uint8_t *m,
    unsigned long mlen,
    const uint8_t *sk
) {
    size_t siglen;

    int status  = PQCLEAN_DILITHIUM5_CLEAN_crypto_sign_signature(
        sig + sizeof(unsigned short),
        &siglen,
        m,
        mlen,
        sk
    );

    if (status == 0) {
        *((unsigned short*) sig)    = (unsigned short) siglen;
    }

    return status;
}

long dilithiumjs_verify (
    const uint8_t *m,
    unsigned long mlen,
    const uint8_t *sig,
    const uint8_t *pk
) {
    size_t siglen   = (size_t) *((unsigned short*) sig);

    return PQCLEAN_DILITHIUM5_CLEAN_crypto_sign_verify(
        sig + sizeof(unsigned short),
        siglen,
        m,
        mlen,
        pk
    );
}

I would not use that package.

decentralgabe commented 1 year ago

Thanks @bwesterb I'll close this issue. I did not notice that you're in compliance with existing test vectors.

armfazh commented 1 year ago

maybe this is something to raise to the back-end library to check whether that implementation is compliant with the latest test vectors.