diff --git a/docs/examples/zencode_cookbook/mlkem512/Alice_mlkem512_privatekey.keys b/docs/examples/zencode_cookbook/mlkem512/Alice_mlkem512_privatekey.keys new file mode 100644 index 000000000..7a2c6e61b --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/Alice_mlkem512_privatekey.keys @@ -0,0 +1 @@ +{"keyring":{"mlkem512":"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"}} diff --git a/docs/examples/zencode_cookbook/mlkem512/Alice_mlkem512_pubkey.json b/docs/examples/zencode_cookbook/mlkem512/Alice_mlkem512_pubkey.json new file mode 100644 index 000000000..a18b347e7 --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/Alice_mlkem512_pubkey.json @@ -0,0 +1 @@ +{"Alice":{"mlkem512_public_key":"DtxnHcsUepAkFKNzKlkFkXafoTyFHdFpwJcjfKK27VdsvjSnigxNW5GPqLpeb7UnWzZizJon9/N11LlbW8Vy/jpkpsZrvUmw7HBBrMfD5za+Tzm7r/VX56jABiBXNVkl2OwMvOtz8Pp/fQWxQsifWyY9poUEp9Q2JtTJCyBOa7onM5Gci5Uk7CdTwPjITaA+zAAbt4UuTAzJ8oU2jkuLSxaD0oKA8ih3FUqgJyeB62GN0hYAN/XLBxpK09I/fDCms3lzYwxUkMu4hySX1OKM+dhu7NwBmWMwC+k5EGdFx4FlkvO3apIEPcpifrUAkBmW7jU5iyq2H/V4WemSW+yiRHIHGmaWWvjB3dKEqlJvOSe2YSlD5qdaj/ByvOw4pTwpjMdD84CATpoNt3k0pwmxb/bFzceKvSzMCMQbmNYu28wJKWioP0M4IhoSZRW4gDejg7CFB3eH3oFY1bV+Z3sHBpWrwhpELrwjg9EjEIUBhmRjdmMuH+EZDzt65rdP5pYs0wta7nSIRyKACPU5y5A14Ws17TYi1uXAFVSlglrOg0JUuvG5E1G/liQLL1uUwiQBd8LMZ7wdboMWKxpfAnZy/DJPidVAillY96NuxHLITBdw9IUAVumn9elEDeEKlipV+AQ2S5ptXUpv+zyY2VZHWpc7zzudcZGZhBhHuEtwC7Ctj+W7F7K5XzxSdwo/yHYXISUi7gpzCrPEvfa7Owl4BxGGpmheQzrJzfN3D5cl7BWdOnnPYjJUrtVIcPdGKxUjzefPe+uuknBL9ZJQvrmzYBhpSAI0LFGMbpGhJ4Sl0JKIEaPGIEkPv3WtFCkzvWUyLFATagyFobmSQnUh0dTCDJcp5Emcf9d+YOExs2e2rWfIPBhNtjSMTjxABDMIQ2Bj5zdZXnJRhBw56TCTLWA04/GF/ew/sKWjwsUI7sgQDexJpwkK0RgbdMhBkuCzu2lhEgdKpsAqGReBRgKIPKeUxAYfVoFLAalx2SqVgJDBYMfPi4oLcFG/tXrDKtVlB+AM44tUBROulSniFeI7P47VfvZYP8cdtMJxO1QinTG5cek="}} diff --git a/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_dec.out b/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_dec.out new file mode 100644 index 000000000..3e2423c9d --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_dec.out @@ -0,0 +1 @@ +{"output":["Success!!!"]} diff --git a/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_dec.zen b/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_dec.zen new file mode 100644 index 000000000..281233fda --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_dec.zen @@ -0,0 +1,18 @@ +Rule check version 2.0.0 +Scenario ecdh : Carl decrypts the secret message from Bob using ECDH +Scenario qp : Carl creates the mlkem512 secret +Given that I am known as 'Carl' +and I have my 'keyring' +and I have a 'ecdh public key' from 'Bob' +and I have a 'secret message' +and I have a 'string' named 'message' +and I have a 'mlkem512 ciphertext' +and I have a 'mlkem512 secret' +When I rename the 'mlkem512 secret' to 'Bob mlkem512 secret' +and I rename the 'message' to 'Dave message' +and I decrypt the text of 'secret message' from 'Bob' +and I create the mlkem512 secret from 'mlkem512 ciphertext' +If I verify 'Bob mlkem512 secret' is equal to 'mlkem512 secret' +If I verify 'Dave message' is equal to 'text' +Then print string 'Success!!!' +Endif diff --git a/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_enc.zen b/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_enc.zen new file mode 100644 index 000000000..8f3d11fbc --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_enc.zen @@ -0,0 +1,18 @@ +Rule check version 2.0.0 +Scenario ecdh : Bob encrypts a secret message for Carl +Scenario qp : Bob creates a secret and its ciphertext for Carl +Given I am 'Bob' +and I have a 'mlkem512 public key' from 'Carl' +and I have a 'ecdh public key' from 'Carl' +When I create the mlkem512 kem for 'Carl' +and I create the ecdh key +and I write string 'This is my secret message.' in 'message' +and I write string 'This is the header' in 'header' +and I encrypt the secret message of 'message' for 'Carl' +and I rename the 'ecdh public key' to 'Carl ecdh public key' +and I create the ecdh public key +Then print the 'secret message' +and print the 'message' +and print my 'ecdh public key' +and print the 'mlkem512 ciphertext' from 'mlkem512 kem' +and print the 'mlkem512 secret' from 'mlkem512 kem' diff --git a/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_pubkeys.zen b/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_pubkeys.zen new file mode 100644 index 000000000..bf410a06b --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_pubkeys.zen @@ -0,0 +1,9 @@ +Rule check version 2.0.0 +Scenario ecdh : Create the public key +Scenario qp : Create the public key +Given I am known as 'Carl' +and I have my 'keyring' +When I create the ecdh public key +and I create the mlkem512 public key +Then print my 'mlkem512 public key' +and print my 'ecdh public key' diff --git a/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_secretkeys.zen b/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_secretkeys.zen new file mode 100644 index 000000000..ac3ea894b --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/Carl_ECDH_mlkem512_secretkeys.zen @@ -0,0 +1,7 @@ +Rule check version 2.0.0 +Scenario ecdh : Create the private key +Scenario qp : Create the private key +Given I am known as 'Carl' +When I create the ecdh key +and I create the mlkem512 key +Then print my 'keyring' diff --git a/docs/examples/zencode_cookbook/mlkem512/Carl_pubkeys_ECDH_mlkem512.json b/docs/examples/zencode_cookbook/mlkem512/Carl_pubkeys_ECDH_mlkem512.json new file mode 100644 index 000000000..59d0d63e9 --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/Carl_pubkeys_ECDH_mlkem512.json @@ -0,0 +1 @@ +{"Carl":{"ecdh_public_key":"BHdrWMNBRclVO1I1/iEaYjfEi5C0eEvG2GZgsCNq87qy8feZ74JEvnKK9FC07ThhJ8s4ON2ZQcLJ+8HpWMfKPww=","mlkem512_public_key":"6ahOEnyhnNtpL5ei6DEpNiVuSkAFIkm7LPLN1QZYmPqV32NohIuYism+TmUSFDBpOAN5gCZ7pnCq/LdY3XBA7kRIBiNpMbYlo2ejEiU2xWx+x+PLgAFJkrQZAVG/CAY21alQcTscYeyjMSoo24HPGLIBkjgVttWTH5kGDOOfrRe3YKmRwykG30IrInjLlHq6/gWP85EO70CZQ5uHkxUPwRc//wRWcpiIE1AaHticIRWob/Fu2/M0+0mBpScAthJccDNJRdhbIyogdjJrHkY7HDpgnqEZk4i9mOgBSCEXtUsF+4uS0fo26XNwPfghtRBa2vRstYoz+YZe0DSv+TWEh8Ni6byvonjCniNSiBCcjpsl+6O+FJgJA7lXtthB05yRCmhdndZm+kiIsdqTL2o26JkRMpcCr6koW6a07Dc1vaCz05IcgNOR+MiuNvlZDHU6KsWzRXxlvytYTEQK3xuy8KRcoHkuhxYQwxWKYpXMHkxAl7d8RPU81IHI1wOhPhIVvdSqh+uvaztsSOqkaThaWxaEnzaCLqEcAmuhc+y3D4M/UHBuxnRBbpAsqRCjRpDFI5EisKp75aKFZ/TBV4xerZghN2gKgaJ6cGRHyvUVf7aE9iaJnqNplCKy+bijNMEToftq87MdgdoYQIBVCAsVmctKR3dVYouHwXETR9iTwIufk5ReQOcl1UgCXFS0PIrHWkIhI3YlC9TMBCFKutNFFUcUTVSCi6qTVmusTfEVYCFqt6df7LtrkKivE7J8WSSkBWdUmWoIeaLPh6iB7yd1puO421Y/SJhOHdei6ZxKbwoVsQey0wSEKrom8kYGA4bBT8Z1K6ZP3ISumhmArzATvdN10oJ3Bdlzrru9/FqKNTlPY0IL7NuFJgJOyJgCV4WUXUEv/XzLcEEIUyh+dSWn2Msjv4IaOfSPYlIBMVrAu4Yq7WRapYfIoJc8r3unLePPmKS4rtPG8+M1OiUif8tXO+OLAdpMF2wccXCoIwoMVsXLSWhvjofK1gdY9Jlq8jmw3DpKkJsIFJlDNJD/FJdJdIE98lm8mxdVeVgj38VQj2c="}} diff --git a/docs/examples/zencode_cookbook/mlkem512/Carl_secretkeys_ECDH_mlkem512.keys b/docs/examples/zencode_cookbook/mlkem512/Carl_secretkeys_ECDH_mlkem512.keys new file mode 100644 index 000000000..19f2fc55c --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/Carl_secretkeys_ECDH_mlkem512.keys @@ -0,0 +1 @@ +{"Carl":{"keyring":{"ecdh":"B4rYTWx6UMbc2YPWRNpl4w2M6gY9jqSa637n8Kr2pPc=","mlkem512":"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"}}} diff --git a/docs/examples/zencode_cookbook/mlkem512/Ciphertexts_ECDH_mlkem512.json b/docs/examples/zencode_cookbook/mlkem512/Ciphertexts_ECDH_mlkem512.json new file mode 100644 index 000000000..1492671b3 --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/Ciphertexts_ECDH_mlkem512.json @@ -0,0 +1 @@ +{"Bob":{"ecdh_public_key":"BFuMmKpzD6nEn5IavxRH6/EIZfsPh0Y4hSvSYHbhdSugtDLydRNlxaTTGIBEAXWdzyLgtEPNxc9ZbFoEdR8G9g8="},"message":"This_is_my_secret_message.","mlkem512_ciphertext":"iqfm77Xi6y6Pt9cHKu29k0NluH9vwmzyuip+Tig9R01zD8qbGnb8mOKDiB30jiwpoZsU9Nv4HiFj5ZlAuysJUmo/R3SOHoDu3x5jBn4Dq1tnd/F3/ZERGGXLbPwvpxjwXVsOmR1yutRFMIX46jlHFwZYOqdaig7GU2XiRdjLUgRcmJsQSrwCUjWFIqp0EZbPDwxxvgy0SlYSLei8/zi60RfefBGuBor487BBbTNYU8fJZSRX2zzfquxePjxy6H0ISqDCFcY1P+a+hhc88zdI17VegTlLyuinUFNGUbbznyCY3s34SajxW0N62kd0bL20uBEN7y7LpQJdXEdDJDKMssvjh1yn6ZkXlQOnQD5AZ3/tUnAx8QP8YwizRvJwPKf6YCudbPiZup5H922gJFCICcnyb8O0dbZGP0agIEaD08pTA1rSIyD1TB1ov9yDH6x+8xuhFsxKOCFIA+07vNwiJMTQsj3E5Ituk1DAuQMFQHnmmmu8uwIAOoHnbidKXOR4I7iD/CA2f4pr0BNB+UYTxccx8Q6b8R0s9kd4JQfOmiWK8exnDUXb2OlO4YhRXQXor/oiIFDst6YIYMgNKYciktuKL/JNozOhe4+4+CJQmmma1ucONGvW+pZP/9R970DMBdvGG+T0AFNymA0N3AQiinCuEyt6Um9AHocxpc7UWPDH4LzbgerzrIiCaRbh3R7OoDnCEH6f/sUYlpS7rhbTvhV5ffmof3jWtw/aoGFJx4sm7nRc3ibqTUkJnQGRDFRLNxLXUlDOHmNwp6B6hCWoZxkANFyis+5GWissD70hsPRuzUBLVWVe6jJ1ucIskObUb3JpSSObl3SS4qQLu+W/ncO9UR+8a/J1lBcwYk+QGA1ee05uiab8jpftevL9Q32BhnVCD+Dyp5fQuZGoAcpC2gqNfdm+lZBDfPNpztA3/uhnS/xFdi/ReemHTCzsVGZWWlyHZeSLfoc6sd9ZB2td6ht6wL7znY8/499ETBRTQh+ccOlkRysLqzCpmeMS6OE/","mlkem512_secret":"ONpvYcHtpqQEfdEbP6/DWPzZiOoiDa1pT4XKng+HRQY=","secret_message":{"checksum":"mfml95jUDjF61Q9yQ+kowg==","header":"VGhpc19pc190aGVfaGVhZGVy","iv":"6UasczRKmme8SOUwelXq2y5du448E+Ms3dIvuzRnWQM=","text":"OKwc/cnIAQ6RVKX59J/fVMb7GhQar5BpWa0="}} diff --git a/docs/examples/zencode_cookbook/mlkem512/mlkem512_Kem.json b/docs/examples/zencode_cookbook/mlkem512/mlkem512_Kem.json new file mode 100644 index 000000000..c54a8c3dc --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/mlkem512_Kem.json @@ -0,0 +1 @@ +{"mlkem512_ciphertext":"lA3nTU1AhMl1Q6+FM7raihOGOmc6I8MZiDkCcNnK1lAaU2hUGfnA8m7AdwDmbeNmI4QEItDLFHvzjZGyrCmvzebqeNC1WGTJo27ga9/AMJ+wFgLp58chzBt+/YDDbk9aqz/T5FJgvjy2E3x4t/Kg2DYw/LaA20NxTgJFpwcbIOc63NLw/jJ+ztHuosCsV4ejDqWIufAqUHZS5iFEAhsScxiuxTzSKsh2SIRh4jDxwxbCjCV/PNIOaDeqUQmXzm12ffVkXztW5+qdh8N7ELH6MnygMXFZxq3JaBHyqeJy0CJKhl99LMqXEzniz05pUND6iD1ilHbLyGF7hdXuzacjEPZIYCAng1gZ/vXNoi9r2P4qcU/6VIh+oyR4YOn3t+TphaRusvsstJj6Klns8ZIwd3GkgOYu1A1HU8knL/o1nHuUs3ZkVD2ktcgaCcXEcsivbGP3KlnLPrhwQ58Uv6lyLzVwpUFOmIt/hstoTFyMKN0iZeO7T0N2mqKY2+/eUKZTIHiuB4rTjrpsjfhqXKNicIC5IAeJR9HGonJqwLYkqnHsghqH72u/O8EoV4gEnyjqW6pveOFQi3NjmrNYpW7gVPe9M0cT9U9HKaJ587Jv/MitFWx998ST4gFrqoeDAP0pQA2GINFNpaP2FjlaIMPOQr9xGQ7XcFU9hWBj80r9j4Yb/rOQf9aGu25n4qs4VbG5z7Vc7m6rpVtsl12o1XLp+0CjcR0wkYezu1C7inOV+Fn2Jbdi4aOMPkpWwdsR0b828jhAg8oUIBH5tSMvWDz0InuYi0a5bUaBvf8kFrFJPfLzpG8yMaUPlxbqXG+qUIFEMed+yGqcOMQB3hjRUNoZZJQWHsiWJO3FWQCVQx9+IiMrbBohi6PxZRC+rTXyPV2mzSHbKmY4xFcC+pIUd6t4AGettaSODHrtL+cvw7jWMI4PWSJhBl5lqF5+3dBts/wQSIZzuyPQuXoDK+Nt37aZLuoMECYptwE31eQ4e6mLIHJmKzp23rgsnS8q6EvrzwSA","mlkem512_secret":"8X4nkGBMabBgyai1TgpoBZLeXK/AG4vv2/GbQfgXiC4="} diff --git a/docs/examples/zencode_cookbook/mlkem512/mlkem512_ciphertext.json b/docs/examples/zencode_cookbook/mlkem512/mlkem512_ciphertext.json new file mode 100644 index 000000000..cbc574a8c --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/mlkem512_ciphertext.json @@ -0,0 +1,3 @@ +{ + "mlkem512_ciphertext": "lA3nTU1AhMl1Q6+FM7raihOGOmc6I8MZiDkCcNnK1lAaU2hUGfnA8m7AdwDmbeNmI4QEItDLFHvzjZGyrCmvzebqeNC1WGTJo27ga9/AMJ+wFgLp58chzBt+/YDDbk9aqz/T5FJgvjy2E3x4t/Kg2DYw/LaA20NxTgJFpwcbIOc63NLw/jJ+ztHuosCsV4ejDqWIufAqUHZS5iFEAhsScxiuxTzSKsh2SIRh4jDxwxbCjCV/PNIOaDeqUQmXzm12ffVkXztW5+qdh8N7ELH6MnygMXFZxq3JaBHyqeJy0CJKhl99LMqXEzniz05pUND6iD1ilHbLyGF7hdXuzacjEPZIYCAng1gZ/vXNoi9r2P4qcU/6VIh+oyR4YOn3t+TphaRusvsstJj6Klns8ZIwd3GkgOYu1A1HU8knL/o1nHuUs3ZkVD2ktcgaCcXEcsivbGP3KlnLPrhwQ58Uv6lyLzVwpUFOmIt/hstoTFyMKN0iZeO7T0N2mqKY2+/eUKZTIHiuB4rTjrpsjfhqXKNicIC5IAeJR9HGonJqwLYkqnHsghqH72u/O8EoV4gEnyjqW6pveOFQi3NjmrNYpW7gVPe9M0cT9U9HKaJ587Jv/MitFWx998ST4gFrqoeDAP0pQA2GINFNpaP2FjlaIMPOQr9xGQ7XcFU9hWBj80r9j4Yb/rOQf9aGu25n4qs4VbG5z7Vc7m6rpVtsl12o1XLp+0CjcR0wkYezu1C7inOV+Fn2Jbdi4aOMPkpWwdsR0b828jhAg8oUIBH5tSMvWDz0InuYi0a5bUaBvf8kFrFJPfLzpG8yMaUPlxbqXG+qUIFEMed+yGqcOMQB3hjRUNoZZJQWHsiWJO3FWQCVQx9+IiMrbBohi6PxZRC+rTXyPV2mzSHbKmY4xFcC+pIUd6t4AGettaSODHrtL+cvw7jWMI4PWSJhBl5lqF5+3dBts/wQSIZzuyPQuXoDK+Nt37aZLuoMECYptwE31eQ4e6mLIHJmKzp23rgsnS8q6EvrzwSA" +} diff --git a/docs/examples/zencode_cookbook/mlkem512/mlkem512_createprivatekey.zen b/docs/examples/zencode_cookbook/mlkem512/mlkem512_createprivatekey.zen new file mode 100644 index 000000000..46da13cc5 --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/mlkem512_createprivatekey.zen @@ -0,0 +1,5 @@ +Rule check version 2.0.0 +Scenario qp : Create the mlkem512 private key +Given I am 'Alice' +When I create the mlkem512 key +Then print the 'keyring' diff --git a/docs/examples/zencode_cookbook/mlkem512/mlkem512_createpublickey.zen b/docs/examples/zencode_cookbook/mlkem512/mlkem512_createpublickey.zen new file mode 100644 index 000000000..ddbcaae74 --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/mlkem512_createpublickey.zen @@ -0,0 +1,6 @@ +Rule check version 2.0.0 +Scenario qp : Create the mlkem512 public key +Given I am 'Alice' +and I have the 'keyring' +When I create the mlkem512 public key +Then print my 'mlkem512 public key' diff --git a/docs/examples/zencode_cookbook/mlkem512/mlkem512_createpublickey2.out b/docs/examples/zencode_cookbook/mlkem512/mlkem512_createpublickey2.out new file mode 100644 index 000000000..aa5bce658 --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/mlkem512_createpublickey2.out @@ -0,0 +1 @@ +{"Alice":{"mlkem512_public_key":"xlodnUeXd+aQWpGlyyRVHIseUqPHe2MxP/yLWBeBUlmmrbWWRdxLsUNtUeYqCWg0r0N3JRDE7fNM3gpbV8FF5ofLhxYvABwhyeGTSsEar6cP+BBzJlCzKjAYp8UM1zZ5YiLIq4IakoO+HMIEw/FjDTzM2wqaPRdVK5FYwGZOXWoEsPo23kWGKkajnsWXrkLDEcSsIkpy1vJTu1I196K4sPJNE3avWIdG87uOA2UHh2HKuYOkpqlAo9mXBHqPNqcx6JZSNsN78gAIL4IdyncWxESpC+xTB0u6WMEyv7mirOLOyapljqwSMszKPIF6ksEZXAXA4dZjn9Kt5TFgfUiLdKdHz/R/ylyLIWPKA8VF7RAyeEMMYLI4GglCf9Ew+Fm/Xbd22gldylgE+mOw19h/qUFccvtRhyqYn0ZsmEvHTCm4YyAZygQMnKNeImCNqnA1euLDrYNjH6oXTgrN9du/PPaKBbZUOrYmjhpRsJMsF7AKE3Gy2rJB+SpD/7RW0KjIhgqOKKYaITB8wEVtpCQpBcsdPQu9gbuO4nSkPHbDEAGVFfzBQEZ8MzcMhoCOyqWOO6k6LBGQRhwd+hEwIAG7q0yx42Qu+MsmMJtgUjvCGIewf4mM5WKmyneOoBUFhRN4zqi7f8CdEZYbbFlvk1QqmQSGTrEM0KcD26mJIYYah7BWUlxxqENVPmQAd3Q3yVzMgIXMDEd9ZlpEeQGdTNRC90o82BafQmK4JxtdWmfIwWEarns9BTTAhZcW/fC7aJSQlMBqG3PJqhy98zFUPeACqMBvlOiBClyzc4MnRdcgaDtXSHWmZpRtApaJPytZ6QdIjYyEidR02SmgWlc+1mdJA3GkbUVWy7aKqnnMPsZlNBNXbCKON5oUy5C3t1kbGae9N6HE03hZiSIZRCuwubm6Z7o7wNCVyIA86+l6/wscFTV4oTDNgVfPdFlGwvVybZwRJzV1UFKRNGUo7gusBHzJhFOLl7ur/MNX3Lipj7hXycUtG3hnScphiSsJdZmAUgCRubR3xw5sRlhrHM6+h7z23wPCsnywn6A/YxYJWDg75jY="}} diff --git a/docs/examples/zencode_cookbook/mlkem512/mlkem512_createpublickey2.zen b/docs/examples/zencode_cookbook/mlkem512/mlkem512_createpublickey2.zen new file mode 100644 index 000000000..70a9e0428 --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/mlkem512_createpublickey2.zen @@ -0,0 +1,7 @@ +Rule check version 2.0.0 +Scenario qp : Create and publish the mlkem512 public key +Given I am 'Alice' +#and I have a 'mlkem512 private key' +and I have a 'hex' named 'private key' +When I create the mlkem512 public key with secret key 'private key' +Then print my 'mlkem512 public key' diff --git a/docs/examples/zencode_cookbook/mlkem512/mlkem512_dec.zen b/docs/examples/zencode_cookbook/mlkem512/mlkem512_dec.zen new file mode 100644 index 000000000..a4a091abd --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/mlkem512_dec.zen @@ -0,0 +1,13 @@ +Rule check version 2.0.0 +Scenario qp : Alice create the mlkem512 secret + +# Here I declare my identity +Given that I am known as 'Alice' +# Here I load my keyring and the ciphertext +and I have the 'keyring' +and I have a 'mlkem512 ciphertext' + +# Here I recreate the secret starting from the ciphertext +When I create the mlkem512 secret from 'mlkem512 ciphertext' + +Then print the 'mlkem512 secret' diff --git a/docs/examples/zencode_cookbook/mlkem512/mlkem512_enc.zen b/docs/examples/zencode_cookbook/mlkem512/mlkem512_enc.zen new file mode 100644 index 000000000..ad6bb7d24 --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/mlkem512_enc.zen @@ -0,0 +1,18 @@ +Rule check version 2.0.0 +Scenario qp : Bob create the mlkem512 secret for Alice + +# Here I declare my identity +Given I am 'Bob' +# Here I load the receiver public key +# that will be needed to create the ciphertext +and I have a 'mlkem512 public key' from 'Alice' + +# Here we create the KEM (key encapsulation mechanism) +# The kem contains the 'mlkem512_cyphertext' that will be sent to other party +# and the 'mlkem512_secret' which is random number of a defined length +# the 'mlkem512_secret' needs to be stored separately +When I create the mlkem512 kem for 'Alice' + + +Then print the 'mlkem512 ciphertext' from 'mlkem512 kem' +Then print the 'mlkem512 secret' from 'mlkem512 kem' diff --git a/docs/examples/zencode_cookbook/mlkem512/mlkem512_readkeys.out b/docs/examples/zencode_cookbook/mlkem512/mlkem512_readkeys.out new file mode 100644 index 000000000..d03c189cd --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/mlkem512_readkeys.out @@ -0,0 +1 @@ +{"Alice":{"keyring":{"mlkem512":"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"}}} diff --git a/docs/examples/zencode_cookbook/mlkem512/mlkem512_readkeys.zen b/docs/examples/zencode_cookbook/mlkem512/mlkem512_readkeys.zen new file mode 100644 index 000000000..27f1f01b3 --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/mlkem512_readkeys.zen @@ -0,0 +1,6 @@ +Rule check version 2.0.0 +Scenario qp : Upload the mlkem512 private key +Given I am 'Alice' +and I have the 'keyring' +Then print my data +Then print my 'keyring' diff --git a/docs/examples/zencode_cookbook/mlkem512/mlkem512_readsecretkeys.keys b/docs/examples/zencode_cookbook/mlkem512/mlkem512_readsecretkeys.keys new file mode 100644 index 000000000..94b75f0b0 --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/mlkem512_readsecretkeys.keys @@ -0,0 +1,3 @@ +{ +"private_key":"37EC477E217BFB40384C850E51C1837158BDBC23A31832BC25C91B3121444AD4533733BAFF07CA817B64B2CA4299AA26454CBAFB35B6ABE1185CB47C4CD61AF98383C4814B20AB8754FC514F23074114C3E5A810A453B855AA7F1310C74B0B01E5AAB2E871738FAC2786C7A05D6B3B32A050D0FB223956C95CA0C2C1D54154A77BD33737A49A0065D1424A2ABAFD52AA934C9804939208F05CCF8B8B8086316E0943A08710500C918A2B218D37B85AE28022CB0134FB49F5C45D98D3C04B755A60880422668E2B301B18D5194DE991B265BF94697E6A4B8150C8B852033915635E30665BDA2191DAA505D43344FD29C9FCC1C507691D475B617C948FCC84B1B08A1C638C3E13580CE359789A9860E5469CC754B08EE33F0921BDEF15A906969F2DC57A25E80CE4C45F11E04A519AB08B9B927C3A13A081CFFA110FACCC5E8DC29495978B5553104D473A175918AD5B5487BBA69712AE93F615C60A8D387BCE3F651E56880A522B2DB86351CAB65D13B4693DB0B2C80936FAD1CE67925E6BB7C110C43E83247D22608D8C1023431CB69290A4F8A9593BF1241D737C0CD16D75EB50C6842CE0A21DCE494036824CE63252E9325F05B734452B129132B196084A3788BBB1F20A37D2C2B3F90E0DD7A274C9B1A9F02EC7E721F4A43D409A25FBC99A44D4763107C787620941761ED48C932924BA620986CF277A23471C7B13333D936C0DD49E0FF34CA3AB8234C42AEBE459C612052B9716E96B20BEC718126040A9091F6BA9445F45806AEB6E3816710F7CBFED1101461284DD962B7B12047C0A0A906A0589B4A9A426469BDA3946091A375B1952A91C231C0FE6B57F7CC97EFED0BC1001367823BE1886308B3A21452B7E455066719CCCEAF6A726FC22BC8399F54BBFCAF7CA63BA73173C7AA8619A3F485C3E330421006766746F4EF6653E440E5CDC59534018C352C023584CBB374EB7A9B7836832BE53AF272A069755CE2FF29CD8B394C52422B3470E27415F41B397535959F160003B452CF49697B7A53689852BBE6CCFDFB40B48E9328DE11522D0A431B115A5C0C2F4307D9862C0DD1B40C65A1D9D479777E6905A91A5CB24551C8B1E52A3C77B63313FFC8B5817815259A6ADB59645DC4BB1436D51E62A096834AF43772510C4EDF34CDE0A5B57C145E687CB87162F001C21C9E1934AC11AAFA70FF810732650B32A3018A7C50CD736796222C8AB821A9283BE1CC204C3F1630D3CCCDB0A9A3D17552B9158C0664E5D6A04B0FA36DE45862A46A39EC597AE42C311C4AC224A72D6F253BB5235F7A2B8B0F24D1376AF588746F3BB8E0365078761CAB983A4A6A940A3D997047A8F36A731E8965236C37BF200082F821DCA7716C444A90BEC53074BBA58C132BFB9A2ACE2CEC9AA658EAC1232CCCA3C817A92C1195C05C0E1D6639FD2ADE531607D488B74A747CFF47FCA5C8B2163CA03C545ED103278430C60B2381A09427FD130F859BF5DB776DA095DCA5804FA63B0D7D87FA9415C72FB51872A989F466C984BC74C29B8632019CA040C9CA35E22608DAA70357AE2C3AD83631FAA174E0ACDF5DBBF3CF68A05B6543AB6268E1A51B0932C17B00A1371B2DAB241F92A43FFB456D0A8C8860A8E28A61A21307CC0456DA4242905CB1D3D0BBD81BB8EE274A43C76C310019515FCC140467C33370C86808ECAA58E3BA93A2C1190461C1DFA11302001BBAB4CB1E3642EF8CB26309B60523BC21887B07F898CE562A6CA778EA01505851378CEA8BB7FC09D11961B6C596F93542A9904864EB10CD0A703DBA98921861A87B056525C71A843553E6400777437C95CCC8085CC0C477D665A4479019D4CD442F74A3CD8169F4262B8271B5D5A67C8C1611AAE7B3D0534C0859716FDF0BB68949094C06A1B73C9AA1CBDF331543DE002A8C06F94E8810A5CB373832745D720683B574875A666946D0296893F2B59E907488D8C8489D474D929A05A573ED667490371A46D4556CBB68AAA79CC3EC6653413576C228E379A14CB90B7B7591B19A7BD37A1C4D37859892219442BB0B9B9BA67BA3BC0D095C8803CEBE97AFF0B1C153578A130CD8157CF745946C2F5726D9C11273575505291346528EE0BAC047CC984538B97BBABFCC357DCB8A98FB857C9C52D1B786749CA61892B09759980520091B9B477C70E6C46586B1CCEBE87BCF6DF03C2B27CB09FA03F63160958383BE636C0ECC8DDAE8B594A14037868BEC0B22300DEFDFAA1D973AC5CEC84AE4386B8FBCD119AFDC8559442424A87C13EA101E29FCA11881869077E4092E751BEDCA8BC" +} diff --git a/docs/examples/zencode_cookbook/mlkem512/mlkem512_secret.json b/docs/examples/zencode_cookbook/mlkem512/mlkem512_secret.json new file mode 100644 index 000000000..ee1cfa554 --- /dev/null +++ b/docs/examples/zencode_cookbook/mlkem512/mlkem512_secret.json @@ -0,0 +1 @@ +{"mlkem512_secret":"8X4nkGBMabBgyai1TgpoBZLeXK/AG4vv2/GbQfgXiC4="} diff --git a/lib/pqclean/fips202.c b/lib/pqclean/fips202.c index bc9df33b5..ad244a69f 100644 --- a/lib/pqclean/fips202.c +++ b/lib/pqclean/fips202.c @@ -599,7 +599,7 @@ void shake256_inc_ctx_release(shake256incctx *state) { } // aux function added by jrml, needs init first (malloc) -void shake256_inc_ctx_reset(shake128incctx *state) { //Should here be shake256incctx? +void shake256_inc_ctx_reset(shake256incctx *state) { keccak_inc_init(state->ctx); } diff --git a/lib/pqclean/fips202.h b/lib/pqclean/fips202.h index 63e3fd5a9..3bca48260 100644 --- a/lib/pqclean/fips202.h +++ b/lib/pqclean/fips202.h @@ -119,7 +119,7 @@ void shake256_inc_ctx_clone(shake256incctx* dest, const shake256incctx *src); /* Free the state */ void shake256_inc_ctx_release(shake256incctx *state); /* Re-initialize the state */ -void shake256_inc_ctx_reset(shake128incctx *state); +void shake256_inc_ctx_reset(shake256incctx *state); /* One-stop SHAKE128 call */ void shake128(uint8_t *output, size_t outlen, diff --git a/src/lua/zencode_keyring.lua b/src/lua/zencode_keyring.lua index cc7d828e2..76e3b938e 100644 --- a/src/lua/zencode_keyring.lua +++ b/src/lua/zencode_keyring.lua @@ -66,6 +66,7 @@ local keytypes = { mldsa44 = true, schnorr = true, kyber = true, + mlkem512 = true, ntrup = true, eddsa = true, fsp = true, @@ -95,6 +96,12 @@ local function kyber_f(o) end return o end +local function mlkem512_f(o) + if #o ~= 1632 then + error('ML-KEM-512 key length is not correct: '..#o, 3) + end + return o +end local function ntrup_f(o) if #o ~= 1763 then error('Ntrup key length is not correct: '..#o, 3) @@ -162,6 +169,9 @@ local function import_keyring(obj) if obj.kyber then res.kyber = schema_get(obj, 'kyber', kyber_f, O.from_base64) end + if obj.mlkem512 then + res.mlkem512 = schema_get(obj, 'mlkem512', mlkem512_f, O.from_base64) + end if obj.schnorr then res.schnorr = schema_get(obj, 'schnorr', nop, O.from_base64) end @@ -206,6 +216,7 @@ function export_keyring(obj) if obj.dilithium then res.dilithium = CONF.output.encoding.fun(obj.dilithium) end if obj.mldsa44 then res.mldsa44 = CONF.output.encoding.fun(obj.mldsa44) end if obj.kyber then res.kyber = CONF.output.encoding.fun(obj.kyber) end + if obj.mlkem512 then res.mlkem512 = CONF.output.encoding.fun(obj.mlkem512) end if obj.schnorr then res.schnorr = CONF.output.encoding.fun(obj.schnorr) end if obj.ntrup then res.ntrup = CONF.output.encoding.fun(obj.ntrup) end if obj.eddsa then res.eddsa = O.to_base58(obj.eddsa) end diff --git a/src/lua/zencode_qp.lua b/src/lua/zencode_qp.lua index 6dce8d0bf..da125347f 100644 --- a/src/lua/zencode_qp.lua +++ b/src/lua/zencode_qp.lua @@ -74,6 +74,40 @@ local function kyber_import_kem(obj) return res end +local function mlkem512_public_key_f(obj) + local res = schema_get(obj, '.') + zencode_assert( + QP.mlkem512_pubcheck(res), + 'ML-KEM-512 public key length is not correct' + ) + return res + end + + local function mlkem512_secret_f(obj) + local res = schema_get(obj, '.') + zencode_assert( + QP.mlkem512_sscheck(res), + 'ML-KEM-512 secret lentgth is not correct' + ) + return res + end + + local function mlkem512_ciphertext_f(obj) + local res = schema_get(obj, '.') + zencode_assert( + QP.mlkem512_ctcheck(res), + 'ML-KEM-512 ciphertext length is not correct' + ) + return res + end + + local function mlkem512_import_kem(obj) + local res = {} + res.mlkem512_secret = mlkem512_secret_f(obj.mlkem512_secret) + res.mlkem512_ciphertext = mlkem512_ciphertext_f(obj.mlkem512_ciphertext) + return res + end + local function ntrup_public_key_f(obj) local res = schema_get(obj, '.') zencode_assert( @@ -134,6 +168,10 @@ ZEN:add_schema( kyber_secret = {import=kyber_secret_f}, kyber_ciphertext = {import=kyber_ciphertext_f}, kyber_kem = {import=kyber_import_kem}, + mlkem512_public_key = {import=mlkem512_public_key_f}, + mlkem512_secret = {import=mlkem512_secret_f}, + mlkem512_ciphertext = {import=mlkem512_ciphertext_f}, + mlkem512_kem = {import=mlkem512_import_kem}, ntrup_public_key = {import=ntrup_public_key_f}, ntrup_secret = {import=ntrup_secret_f}, ntrup_ciphertext = {import=ntrup_ciphertext_f}, @@ -227,6 +265,48 @@ When("create kyber secret from ''",function(secret) new_codec('kyber secret') end) +--# ML-KEM-512 #-- + +-- generate the private key +When("create mlkem512 key",function() + initkeyring'mlkem512' + ACK.keyring.mlkem512 = QP.mlkem512_keygen().private +end) + +-- generate public key +When("create mlkem512 public key",function() + empty'mlkem512 public key' + local sk = havekey'mlkem512' + ACK.mlkem512_public_key = QP.mlkem512_pubgen(sk) + new_codec('mlkem512 public key') +end) + +When("create mlkem512 public key with secret key ''",function(sec) + local sk = have(sec) + empty'mlkem512 public key' + ACK.mlkem512_public_key = QP.mlkem512_pubgen(sk) + new_codec('mlkem512 public key') +end) + +-- create a secret message and its ciphertext +When("create mlkem512 kem for ''",function(pub) + local pk = load_pubkey_compat(pub, 'mlkem512') + empty'mlkem512 kem' + ACK.mlkem512_kem = {} + local enc = QP.mlkem512_enc(pk) + ACK.mlkem512_kem.mlkem512_ciphertext = enc.cipher + ACK.mlkem512_kem.mlkem512_secret = enc.secret + new_codec('mlkem512 kem') +end) +-- create the secret starting from a ciphertext +When("create mlkem512 secret from ''",function(secret) + local sk = havekey'mlkem512' + local sec = have(secret) + empty 'mlkem512 secret' + ACK.mlkem512_secret = QP.mlkem512_dec(sk, sec) + new_codec('mlkem512 secret') +end) + --# NTRUP #-- -- generate the private key diff --git a/src/zen_qp.c b/src/zen_qp.c index 5ceb3e9e7..9dacf6a43 100644 --- a/src/zen_qp.c +++ b/src/zen_qp.c @@ -583,7 +583,7 @@ static int qp_ml_kem_512_keygen(lua_State *L) { octet *public = o_new(L, pqcrystals_ml_kem_512_ipd_ref_PUBLICKEYBYTES); SAFE(public); lua_setfield(L, -2, "public"); - pqcrystals_ml_kem_512_ipd_ref_keypair((unsigned char*)public->val, (unsigned char*)private->val); + pqcrystals_ml_kem_512_ipd_ref_keypair_derand((unsigned char*)public->val, (unsigned char*)private->val, randbytes); public->len = pqcrystals_ml_kem_512_ipd_ref_PUBLICKEYBYTES; private->len = pqcrystals_ml_kem_512_ipd_ref_SECRETKEYBYTES; end: @@ -637,10 +637,44 @@ static int qp_ml_kem_512_pubcheck(lua_State *L) { END(1); } +// checks the shared secret length +static int qp_ml_kem_512_sscheck(lua_State *L) { + BEGIN(); + octet *ss = o_arg(L, 1); + if(ss == NULL) { + THROW("Could not allocate kem secret"); + } else { + if(ss->len == pqcrystals_ml_kem_512_ipd_ref_BYTES) + lua_pushboolean(L, 1); + else + lua_pushboolean(L, 0); + o_free(L, ss); + } + END(1); +} + +// check the ciphertext length +static int qp_ml_kem_512_ctcheck(lua_State *L) { + BEGIN(); + octet *ct = o_arg(L, 1); + if(ct == NULL) { + THROW("Could not allocate kem ciphertext"); + } else { + if(ct->len == pqcrystals_ml_kem_512_ipd_ref_CIPHERTEXTBYTES) + lua_pushboolean(L, 1); + else + lua_pushboolean(L, 0); + o_free(L, ct); + } + END(1); +} + static int qp_ml_kem_512_enc(lua_State *L) { BEGIN(); uint8_t randbytes[32]; char *failed_msg = NULL; + octet *pk = NULL, *ss = NULL, *ct = NULL; + pk = o_arg(L, 1); void *ud = luaL_testudata(L, 2, "zenroom.octet"); if (ud){ octet *rnd = (octet *) ud; SAFE(rnd); @@ -654,8 +688,6 @@ static int qp_ml_kem_512_enc(lua_State *L) { Z(L); for(uint8_t i = 0; i < 32; i++) randbytes[i] = RAND_byte(Z -> random_generator); } - octet *pk = NULL, *ss = NULL, *ct = NULL; - pk = o_arg(L, 1); if(pk == NULL) { failed_msg = "Cuold not allocate public key"; goto end; @@ -1169,6 +1201,12 @@ int luaopen_qp(lua_State *L) { {"dec", qp_dec}, // ML-KEM-512 {"mlkem512_keygen", qp_ml_kem_512_keygen}, + {"mlkem512_pubgen",qp_ml_kem_512_pubgen}, + {"mlkem512_pubcheck",qp_ml_kem_512_pubcheck}, + {"mlkem512_sscheck",qp_ml_kem_512_sscheck}, + {"mlkem512_ctcheck",qp_ml_kem_512_ctcheck}, + {"mlkem512_enc",qp_ml_kem_512_enc}, + {"mlkem512_dec",qp_ml_kem_512_dec}, // SNTRUP761 {"ntrup_keygen", qp_sntrup_kem_keygen}, {"ntrup_pubgen", qp_sntrup_kem_pubgen}, diff --git a/test/zencode/mlkem512.bats b/test/zencode/mlkem512.bats new file mode 100644 index 000000000..da5611a48 --- /dev/null +++ b/test/zencode/mlkem512.bats @@ -0,0 +1,190 @@ +load ../bats_setup +load ../bats_zencode +SUBDOC=mlkem512 + +@test "When I create the mlkem512 key" { + cat <