[PATCH 03/10] bench-slope: add RSA and DSA benchmarking

Jussi Kivilinna <[email protected]> Sun, 2 Aug 2026 12:55:08 +0300
Newsgroups gmane.comp.encryption.gpg.libgcrypt.devel
Message-ID <[email protected]>
* tests/bench-slope.c (bench_pk_algo, bench_pk_operation, bench_pk_oper)
(bench_pk_hd, sample_private_rsa_key_2048, sample_public_rsa_key_2048)
(sample_private_rsa_key_3072, sample_public_rsa_key_3072)
(sample_private_rsa_key_4096, sample_public_rsa_key_4096)
(sample_private_dsa_key_2048, sample_public_dsa_key_2048)
(sample_private_dsa_key_3072, sample_public_dsa_key_3072, pk_algos)
(pk_algo_name, pk_map_name, bench_pk_init, bench_pk_free)
(bench_pk_sign_do_bench, bench_pk_verify_do_bench, pk_sign_ops)
(pk_verify_ops, pk_operations, cipher_pk_one, _pk_bench, pk_bench): New.
(print_help): Add mention of 'pk'.
(main): Add "pk" tests.
--

Only ECC and post-quantum algorithms had slope benchmarking, so RSA and
DSA signing and verification were covered by 'benchmark' alone.

Keys are samples instead of being generated, because prime search time
varies too much for slope measurement to give stable result. Signing
repetitions are scaled down per key size, as RSA-4096 signing alone
would otherwise take longer than rest of the section.

$ tests/bench-slope pk
Public-key:
 RSA-2048       |  nanosecs/iter   cycles/iter
           sign |        1785756             -
         verify |          20737             -
                =
 RSA-3072       |  nanosecs/iter   cycles/iter
           sign |        4916490             -
         verify |          45286             -
                =
 RSA-4096       |  nanosecs/iter   cycles/iter
           sign |       10355002             -
         verify |          70476             -
                =
 DSA-2048       |  nanosecs/iter   cycles/iter
           sign |         544555             -
         verify |         518044             -
                =
 DSA-3072       |  nanosecs/iter   cycles/iter
           sign |        1165046             -
         verify |        1133774             -
                =

Signed-off-by: Jussi Kivilinna <[email protected]>
---
 tests/bench-slope.c | 654 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 653 insertions(+), 1 deletion(-)

diff --git a/tests/bench-slope.c b/tests/bench-slope.c
index 29760227..4b296f0b 100644
--- a/tests/bench-slope.c
+++ b/tests/bench-slope.c
@@ -2335,6 +2335,648 @@ kdf_bench (char **argv, int argc)
 }
 
 
+/************************************************************** PK benchmarks. */
+
+enum bench_pk_algo
+{
+#if USE_RSA
+  PK_ALGO_RSA2048 = 0,
+  PK_ALGO_RSA3072,
+  PK_ALGO_RSA4096,
+#endif
+#if USE_DSA
+  PK_ALGO_DSA2048,
+  PK_ALGO_DSA3072,
+#endif
+  __MAX_PK_ALGO
+};
+
+enum bench_pk_operation
+{
+  PK_OPER_SIGN = 0,
+  PK_OPER_VERIFY,
+  __MAX_PK_OPER
+};
+
+struct bench_pk_oper
+{
+  enum bench_pk_operation oper;
+  const char *name;
+  struct bench_ops *ops;
+
+  enum bench_pk_algo algo;
+};
+
+struct bench_pk_hd
+{
+  gcry_sexp_t pub_key;
+  gcry_sexp_t sec_key;
+  gcry_sexp_t data;
+  gcry_sexp_t sig;
+};
+
+static const char sample_private_rsa_key_2048[] =
+"(private-key \n"
+" (rsa \n"
+"  (n #00E11B35517B742D97078D46EC5FADC86E846436DBD852B1D83B80C0C629A1"
+"AA0F5DBEEFD74B5C8FF420BA5EB586C4EEED96C8A3517E4C4C01B4525B7312D68A34"
+"75B2FC78C87B33936260131F5A0AE3CFE2924E85D722C9FA0838F88C30BC8B5B0797"
+"735450DE5C3F89B877B0960D285FA76FE64D93C2CA679AB6E59C014D13DBF513A301"
+"B993E40C1AAF47171450690A8EA19E72C739C64D1CFCDA4FE0F165FA6F7AC8189C3F"
+"CC2AB8E13A009B6B7869842CEEA54C91B249DC7906C8D3FE8FBFEBA88F6E5284A215"
+"B2FCF28B31DC296EF26F7532D99EDEBC2D25D96AB3393702E7BAB7877285AA92324A"
+"6D4A32E5BAD25B0B67541F526E1AF17331ECBBD971A3#)\n"
+"  (e #010001#)\n"
+"  (d #16091CCEDA2651E42BEE7AB17878418ECB38282A9CC8AD2889DC36E922468E"
+"DB5F6C1CE2BD6CD53377AE4D2DEC4D374728BD4E1447282BA7C4A81F3A6ABBDE1191"
+"C7FD70FE33E60B98D3E7381BDC2BD7A263AEE14F94A0D6239B84E452B36BD9A6C465"
+"34C6C36738C03FF2BC4BF0D097F4830B8295C9537F5E0B3361A587C23EBB8564BA85"
+"81AF7B48B4F65FC29AB0E9140101ED6AE837166910D3BE56B9F5D2816F8130D532C7"
+"627C7AA8BF7F290B538B42C7F7BC5AB23F4001C6F5DB0FD8102491C80F1E275C3BD6"
+"A3AC87AEBF9E467820A9B4CB7B09021F8C468789102A1D01B359ED6DFE4E056EA2FC"
+"3B09F1E46890356D660BB33B479AB6981A445D1F89#)\n"
+"  (p #00EFA1B3F6348A80FB8041C97965985DDDF83B2FDB0AE8866C11F984E55C2E"
+"57A9DD03101B6DC5BC0C77AEED227B4F77FB62A4D9932ABFCFDC39C43FDEB06C7525"
+"0705B2F6D7F48E1C79891F74BBAD3A671F75FFBDA1478D565CF8A4AC3840429874EA"
+"87DABF688696BA7AE85341101BE3A8958D76B1021C439F27F49F82EB3ADD#)\n"
+"  (q #00F07B823CFBB5F8DFA439EC6CA63BB8E2AA30679DD2D67F42F40AF4777C0F"
+"154161E35CD5B789DD98DE7BF435F52EDB5A156F8840C45B00A341A2786A07C2FB37"
+"942B384E45FD7CBCCC84A017998ACEC4C90A832EBBF58CB66FDB3D7B8BB447EB8782"
+"551AF520281E6DF838013DA9AA1A7278801813ED9B24ADFA33AA9855567F#)\n"
+"  (u #5493CEDD291EBB5EFAB1911CA9BAE7C42D9F3FE303C25FBA6674047FCBEDB7"
+"7A14A3C8F7176B4BF46AE3C44D85017A4F71C0CAADE6B97507A913FA001D38262772"
+"12C78674C1FCC1273865DDA92A844269C086A769D5571D7E988E915339AC758E257F"
+"96AC7A073A8EF8D288DE0A9F7F1E5761304CBDFBEB8BF1783F0967484E#)\n"
+"  )\n"
+" )\n"
+;
+
+static const char sample_public_rsa_key_2048[] =
+"(public-key \n"
+" (rsa \n"
+"  (n #00E11B35517B742D97078D46EC5FADC86E846436DBD852B1D83B80C0C629A1"
+"AA0F5DBEEFD74B5C8FF420BA5EB586C4EEED96C8A3517E4C4C01B4525B7312D68A34"
+"75B2FC78C87B33936260131F5A0AE3CFE2924E85D722C9FA0838F88C30BC8B5B0797"
+"735450DE5C3F89B877B0960D285FA76FE64D93C2CA679AB6E59C014D13DBF513A301"
+"B993E40C1AAF47171450690A8EA19E72C739C64D1CFCDA4FE0F165FA6F7AC8189C3F"
+"CC2AB8E13A009B6B7869842CEEA54C91B249DC7906C8D3FE8FBFEBA88F6E5284A215"
+"B2FCF28B31DC296EF26F7532D99EDEBC2D25D96AB3393702E7BAB7877285AA92324A"
+"6D4A32E5BAD25B0B67541F526E1AF17331ECBBD971A3#)\n"
+"  (e #010001#)\n"
+"  )\n"
+" )\n"
+;
+
+static const char sample_private_rsa_key_3072[] =
+"(private-key \n"
+" (rsa \n"
+"  (n #00AC28969FBE9079BFFC90F55455E629D54E9125657C7543DB104F55001C9E"
+"92797333910372D00931C4886BE3DA195ED540E799D5C0AA1EFBBAFB6D687097A3C7"
+"FBC4430EFDDED910F66C67F4A11AE7A6925413394A4856426EA1B924849A88A459D2"
+"0C963F0FA13DEE3DA3BF41445881A49A03E2417EEF15207C0114E57F0639AAFF32ED"
+"92D2C51796F3601337EAB8E82036344F508972E560B57CBEB0413AB48885C9F20B6D"
+"AE6D946E2562B3E9B42D4D82B6E3E4CE714E9C7EF8DC35C851013F637C4D658E902D"
+"A85A3894C6CC2425D9C7979FD0482343B46B9543C4ACCA1A0FB34132E30F8654E583"
+"98D38749FBC63158EA79B73C6C87DDB2BD56A920DF7A4BDE2EF16E28D36A3D76B560"
+"7944A6804D4BBDFA92B52B7DADB80A6279D347D2D3124A4F0BAABD420882E00032E1"
+"9476AE9E195C2A0FD09A73ACE50757FF250DDDF8F511B222F9510C1F17DFAAD5C8C3"
+"F6198F511E69DEBE1257DF6692E9CB232A944F53521469224A3483CFC59AB7D59A5D"
+"B6FFF620CF6359914B1905286D03#)\n"
+"  (e #010001#)\n"
+"  (d #2322235F155649AA6F022C36DA52DEDDABAB7E5CC031F4379C13FC8E49C8E8"
+"AE855E942D067CC32B976699D2059BE0D917664C642D6DEA65C80A7090FC4D4DFCCD"
+"7A078F632ADBD494DD99B7783B53E40FFFBD6E9724BD09D0A70B7012E9B0920DCC8A"
+"8A0CF3851DECE5426A11094020B0F5476EA09C257183D01AAE67896D3D4E92C71369"
+"BFBEBE2A2D9FC13C4B9811B3252CB6B5025FE2C4C234E37B77CC61B46CCD422AA7E7"
+"0D70D9ABA28181E3A5CD282C67C4B586B51AC5E4C697E939F2780654FF2ED151B72F"
+"800EE7EFAC08B44E309BF93A3304927591F34A912618EBA58369C42AC2D5A58476F7"
+"A80C000A19278B4938C208294B8E1CEAA17941AF549CEC640C51BEDEA0D51A8C66E3"
+"6EAF1DC1F79EFFEFEFB47119A3E434E32EACBB9C75EAF669DD91B54C739BFCCA9504"
+"707EBAEA445673255160F3574EBAC5D257E52BF80C43F78D02DDC34CE291F30A9074"
+"D5A0E1624F7FDC72D8EB7A4499754BC8CD302B20D7C14920726899E30D2D571BFDF6"
+"B39A80CDBFF64DFB2F0E3CC891#)\n"
+"  (p #00CD37BD7DAE22FA808DC3CDCBE6A68AD444D692707C5BF564A97563193B30"
+"211636A46D1C7523DF06DBDCA83F7D19290F83B132C43BE02E882655ABE94261EC2B"
+"99BE4962875B3D8D78CE4A2F2F2B9FA006327E1E924E2AD9BBDC033F1521BA7E7FB8"
+"12944CD7DC23E3F26635C9B998974915947EB634607A7C74FE6BE21A07F37836F0FF"
+"F6DC44494B23E0098103EF12730D46B5D70A330690534BCF0359F252991A3D205F00"
+"A266D02DB68F3C7530F63F7D8052E9DDC8A16CEFA17BA5A23813#)\n"
+"  (q #00D6C2982A666A794F2CE1B0C603343994369B702AA01BB5DE28DC8CC009C9"
+"07F574875CEA31B8EC1E84AE38762FC33D531FB02EB01BA5D52B6AAD1287B18BA6B0"
+"B3B1AF16B8449638E11CF53F5C764A3BE9C78C115936A2C20D44F88745CEFB9AAF10"
+"C41557B3D4D7651E6A90E41A13DD9332142898795AD96AB0F3D783797688EAB1ACC8"
+"4247CEE427F4C8B015F094B0C470F5ED5C64850B2B34F2EDE4F467D99C484BB61CC2"
+"40B34F01B80C424E0CDA72D44B6ED87A56B91E54F989707C7551#)\n"
+"  (u #584ED527F71C163D8F552DCE5866CF8DF0FCC269BB0DBB992DFB4FA48C13B7"
+"8C984269C08928C211A243194D713FEB2B38134E91AB5F89180BC8A9845E9483561E"
+"B28006167DC0EAEDC11C57D9021347F71E4E7ED68E748865B9A55FAAE73DC0860F75"
+"6A98CD87C34D2882E1F0985341F6AD4134E749598DB1C696B95306A758C7B9BA8B7F"
+"14601117F7B67371DC8CC324F5B5C62AC333434A6752106F09E3699E94DEE5AB00F5"
+"D478FE6D002D6473EFBC9A02E4507135ED37EF3F26401D687A#)\n"
+"  )\n"
+" )\n"
+;
+
+static const char sample_public_rsa_key_3072[] =
+"(public-key \n"
+" (rsa \n"
+"  (n #00AC28969FBE9079BFFC90F55455E629D54E9125657C7543DB104F55001C9E"
+"92797333910372D00931C4886BE3DA195ED540E799D5C0AA1EFBBAFB6D687097A3C7"
+"FBC4430EFDDED910F66C67F4A11AE7A6925413394A4856426EA1B924849A88A459D2"
+"0C963F0FA13DEE3DA3BF41445881A49A03E2417EEF15207C0114E57F0639AAFF32ED"
+"92D2C51796F3601337EAB8E82036344F508972E560B57CBEB0413AB48885C9F20B6D"
+"AE6D946E2562B3E9B42D4D82B6E3E4CE714E9C7EF8DC35C851013F637C4D658E902D"
+"A85A3894C6CC2425D9C7979FD0482343B46B9543C4ACCA1A0FB34132E30F8654E583"
+"98D38749FBC63158EA79B73C6C87DDB2BD56A920DF7A4BDE2EF16E28D36A3D76B560"
+"7944A6804D4BBDFA92B52B7DADB80A6279D347D2D3124A4F0BAABD420882E00032E1"
+"9476AE9E195C2A0FD09A73ACE50757FF250DDDF8F511B222F9510C1F17DFAAD5C8C3"
+"F6198F511E69DEBE1257DF6692E9CB232A944F53521469224A3483CFC59AB7D59A5D"
+"B6FFF620CF6359914B1905286D03#)\n"
+"  (e #010001#)\n"
+"  )\n"
+" )\n"
+;
+
+static const char sample_private_rsa_key_4096[] =
+"(private-key \n"
+" (rsa \n"
+"  (n #00C13612FBA6DA535403677448ACA42C7601A556D08678DB1C1AB209D0341E"
+"B5D6F9FCA26EA57199471A7C07E5FF1CEEB91202241756E7B6EA55EFAEC44B17A897"
+"3337302AE96FE76142C110B1EBB7B40987BA9243D475B2739F75A444ED875384C84E"
+"0753178E88CFA2D674474D444098111E0F8931BCB30CA03BF40D6D4D56AFE256E777"
+"84DB66E258C1C6853E714DC1329D3441F5134F1F294C2A006C340A9D2AF824CFF457"
+"27C5830A0AF32B1EF5C2C3281B22B78DB79079CEB38B3F3E160C7D406B4FD1BC2D9D"
+"B8B52C67031D6A30464C1098450080779A87F961AA6E9952A78F8739C2AAD7ACA210"
+"AD8CA3D713BD612C770F10C50ACC6908EAD0A03FB988D9671A6F66A232FA1F5FE395"
+"8DEE13A69689C5FE9E2724E1AAC21E64FB9F7D95F58452074A33ECA1367B8CE90DFB"
+"04F4C4120BAEC00E25DAD6C4EC28C3B54C0F17D19DFB4AD6120412E3B2BC4965BC8D"
+"B402E69A0F53D2EE885C7C36CFA9683E42CDE2F261241F7D0528A61FA64E3D1C0180"
+"E9369F6329F1F4B04E868E8A28932346013DC3F3444D227553E8F7F90B99D4B807F5"
+"CF2675FA492D4C10764407FE2E0A71410401CFFCB6580270033206E0FDB55733E6AE"
+"AB32494726C136833D7A1C3AA5AA870825ACDBD707C86A1032E6064CB525B30945EE"
+"FF2E65FA6E560BB1C031CFE2C8828ACD226990BFC103FDDD8CD5C7F231E69B64BD97"
+"A50EE74877E1#)\n"
+"  (e #010001#)\n"
+"  (d #0AFCB70DF8CF8FE48655B2E9A7BE50499CFA038553D84F3C25127C77600CB7"
+"B2296B77408BDCF96699E2CABF86B1E500C0E83E982B2E28708C01821D3C8349BD8B"
+"6BE1D681898662B95D3EEF4C8F18F30A750ECDECFE37C4812165FD861FBCC7F4C211"
+"D83A4DE0897A379ACB8136813BD9E157E87E8668B783972A8A3C43252101B7326E26"
+"AFCEAFCEC9FA2EE7E84BE526D52F671422372222583D47E289FFBE84A131800D38E0"
+"3F4849366A874863EE6193081EAC747D27549DEF5CDAF45364536D148D289EA708C1"
+"E65F9CDE0850051317A3EBF22494A9A32FD9FBCBFED7C38E5972F5A869CC5E4F505B"
+"D0D47258778657F524A0AE012EB2F1B9B4B27587E889B1D107036C59DCE206409B5E"
+"92F157DE97EAF1C41076E6BB012744EE578E19B4F060714DC3131A867D52AF346270"
+"E58BE5536FDC48CD59C2062898181617648605600B749DB99BBA2D1E6787FC6F0F2C"
+"D6B1FA428C00ABD3B32C372949CB3C19E8D567F1DEEB3ACECFE05984040358E5ADDD"
+"921168445DBCFB480CDEE907A418F98003658ACCF041258DCCEA7102CF04CD5A1CD9"
+"EB62A7E825B386A0A9045E4E91E3013DAA4858295B092B74C261F4447DC5F1C3514F"
+"4FC47E6BA13C15B4C817E3AF087AFC638FA4635FCF7F0CE42BC76BF0A7E11DC029A2"
+"E2D70DFBAFFAA49AAD9B7199233A7B9F74D989182705A5C9F1FE35DF6ABDFB482FAA"
+"A273E29849#)\n"
+"  (p #00C57614F493C9B2FA39F8388DD775189F625FBAA9F310FE9B29050259B719"
+"D9601A070BE2CDDFFE29FB7C1EC8228D565330D2CC8DC8D8AB3B3BB52CFDC75700A5"
+"E9EBEF69ACDA308E5620F1626B20C84B3B28FC0ABE5BBCE3080196C66736D2BFDDA9"
+"17F179126D4C569C7EB48F9353DE62AE49A42A7C03F696D4666558C7A1E23EAA147D"
+"7C0621DA5612DCB324355811CE65341168A0FD4159A3B080BE2F96CCFD7B7DEE71B5"
+"6C04A68455736E35009D3BBF3231E027F7D5F67CDB57D81E215623B647160716920C"
+"90F9685C53197146A4A8ACDBF563C9F944D503AE1916AB481DCCA4E843926D5A5335"
+"871E8DC40181CD1453988539E7407EE5F2337A4EC535#)\n"
+"  (q #00FA7D71E8A70AA5CF33B125A29F1B8E15EB60B83F6E44879EBF33C7029ADE"
+"1BA565BF4862AECA2E4EA39CF8F9621AE6CF5094697CA43AFCE73F633B89DEBD026E"
+"218740089FEDE00E16004048216DBDF69F0D66BEAD543B4983ED512585E85D55A6C2"
+"7399157BB6B83AAFFA084C2599011A0F2E2228E85AC5457EC84DCB0E20E7B065AEC0"
+"CAD67DA1C9E3FC79120F9096A5F57B81D97B81961C85D158C6BF34C1922D8D8C4B6B"
+"4A138933A882C657AE94EB7B804BB973291D58DB40B541F02366B42C61AECBB22901"
+"0C17AA19E33682617C03B6B20D66335C79933CC25CA5594068BCC94F09BAC7955D79"
+"C84EF0F4821127D959286A0F30D06B3B7B760950197D#)\n"
+"  (u #3C322D5C68FDF8CF92A68E1EE596FE7ACD1E8287EAC36545036133D29A19FB"
+"341186FB83CA59FDEF7F9F25E97C3EB7843C2C7188019C910F1E68735D6FA29C8E04"
+"4F4E1D39008C0C52FFA76E271FDA096ADC6A67957A833ECC19E0D02C7336C8DA548A"
+"B66EFFE98D3429A8935EF62C56764939DE157BC264F3F37253AE3A86F253BD522A21"
+"4C4CD4D48EE639520C58C427F2E1A413BDF696F9335194E81D5FD9C46397AB566754"
+"2ADE3818A44818F0C037D5A9DA21CBF60C610AF44A32FF78D4DFC751878C77B8FE92"
+"AE40D67E0BC3C52CAE2DCC6AB8E35D93B235CCA908822A0A272A9D068E6FE0447BD0"
+"3D485565B133FF42E4BB780DD3EA819261B07F64A6#)\n"
+"  )\n"
+" )\n"
+;
+
+static const char sample_public_rsa_key_4096[] =
+"(public-key \n"
+" (rsa \n"
+"  (n #00C13612FBA6DA535403677448ACA42C7601A556D08678DB1C1AB209D0341E"
+"B5D6F9FCA26EA57199471A7C07E5FF1CEEB91202241756E7B6EA55EFAEC44B17A897"
+"3337302AE96FE76142C110B1EBB7B40987BA9243D475B2739F75A444ED875384C84E"
+"0753178E88CFA2D674474D444098111E0F8931BCB30CA03BF40D6D4D56AFE256E777"
+"84DB66E258C1C6853E714DC1329D3441F5134F1F294C2A006C340A9D2AF824CFF457"
+"27C5830A0AF32B1EF5C2C3281B22B78DB79079CEB38B3F3E160C7D406B4FD1BC2D9D"
+"B8B52C67031D6A30464C1098450080779A87F961AA6E9952A78F8739C2AAD7ACA210"
+"AD8CA3D713BD612C770F10C50ACC6908EAD0A03FB988D9671A6F66A232FA1F5FE395"
+"8DEE13A69689C5FE9E2724E1AAC21E64FB9F7D95F58452074A33ECA1367B8CE90DFB"
+"04F4C4120BAEC00E25DAD6C4EC28C3B54C0F17D19DFB4AD6120412E3B2BC4965BC8D"
+"B402E69A0F53D2EE885C7C36CFA9683E42CDE2F261241F7D0528A61FA64E3D1C0180"
+"E9369F6329F1F4B04E868E8A28932346013DC3F3444D227553E8F7F90B99D4B807F5"
+"CF2675FA492D4C10764407FE2E0A71410401CFFCB6580270033206E0FDB55733E6AE"
+"AB32494726C136833D7A1C3AA5AA870825ACDBD707C86A1032E6064CB525B30945EE"
+"FF2E65FA6E560BB1C031CFE2C8828ACD226990BFC103FDDD8CD5C7F231E69B64BD97"
+"A50EE74877E1#)\n"
+"  (e #010001#)\n"
+"  )\n"
+" )\n"
+;
+
+static const char sample_private_dsa_key_2048[] =
+"(private-key\n"
+"  (dsa\n"
+"   (p #00B54636673962B64F7DC23C71ACEF6E7331796F607560B194DFCC0CA370E858A365"
+       "A413152FB6EB8C664BD171AC316FE5B381CD084D07377571599880A068EF1382D85C"
+       "308B4E9DEAC12D66DE5C4A826EBEB5ED94A62E7301E18927E890589A2F230272A150"
+       "C118BC3DC2965AE0D05BE4F65C6137B2BA7EDABB192C3070D202C10AA3F534574970"
+       "71454DB8A73DDB6511A5BA98EF1450FD90DE5BAAFC9FD3AC22EBEA612DD075BB7405"
+       "D56866D125E33982C046808F7CEBA8E5C0B9F19A6FE451461660A1CBA9EF68891179"
+       "0256A573D3B8F35A5C7A0C6C31F2DB90E25A26845252AD9E485EF2D339E7B5890CD4"
+       "2F9C9F315ED409171EC35CA04CC06B275577B3#)\n"
+"   (q #00DA67989167FDAC4AE3DF9247A716859A30C0CF9C5A6DBA01EABA3481#)\n"
+"   (g #48E35DA584A089D05142AA63603FDB00D131B07A0781E2D5A8F9614D2B33D3E40A78"
+       "98A9E10CDBB612CF093F95A3E10D09566726F2C12823836B2D9CD974BB695665F3B3"
+       "5D219A9724B87F380BD5207EDA0AE38C79E8F18122C3F76E4CEB0ABED3250914987F"
+       "B30D4B9E19C04C28A5D4F45560AF586F6A1B41751EAD90AE7F044F4E2A4A50C1F508"
+       "4FC202463F478F678B9A19392F0D2961C5391C546EF365368BB46410C9C1CEE96E9F"
+       "0C953570C2ED06328B11C90E86E57CAA7FA5ABAA278E22A4C8C08E16EE59F484EC44"
+       "2CF55535BAA2C6BEA8833A555372BEFE1E665D3C7DAEF58061D5136331EF4EB61BC3"
+       "6EE4425A553AF8885FEA15A88135BE133520#)\n"
+"   (y #66E0D1A69D663466F8FEF2B7C0878DAC93C36A2FB2C05E0306A53B926021D4B92A1C"
+       "2FA6860061E88E78CBBBA49B0E12700F07DBF86F72CEB2927EDAC0C7E3969C3A47BB"
+       "4E0AE93D8BB3313E93CC7A72DFEEE442EFBC81B3B2AEC9D8DCBE21220FB760201D79"
+       "328C41C773866587A44B6954767D022A88072900E964089D9B17133603056C985C4F"
+       "8A0B648F297F8D2C3CB43E4371DC6002B5B12CCC085BDB2CFC5074A0587566187EE3"
+       "E11A2A459BD94726248BB8D6CC62938E11E284C2C183576FBB51749EB238C4360923"
+       "79C08CE1C8CD77EB57404CE9B4744395ACF721487450BADE3220576F2F816248B0A7"
+       "14A264330AECCB24DE2A1107847B23490897#)\n"
+"   (x #477BD14676E22563C5ABA68025CEBA2A48D485F5B2D4AD4C0EBBD6D0#)\n"
+"))\n";
+
+static const char sample_public_dsa_key_2048[] =
+"(public-key\n"
+"  (dsa\n"
+"   (p #00B54636673962B64F7DC23C71ACEF6E7331796F607560B194DFCC0CA370E858A365"
+       "A413152FB6EB8C664BD171AC316FE5B381CD084D07377571599880A068EF1382D85C"
+       "308B4E9DEAC12D66DE5C4A826EBEB5ED94A62E7301E18927E890589A2F230272A150"
+       "C118BC3DC2965AE0D05BE4F65C6137B2BA7EDABB192C3070D202C10AA3F534574970"
+       "71454DB8A73DDB6511A5BA98EF1450FD90DE5BAAFC9FD3AC22EBEA612DD075BB7405"
+       "D56866D125E33982C046808F7CEBA8E5C0B9F19A6FE451461660A1CBA9EF68891179"
+       "0256A573D3B8F35A5C7A0C6C31F2DB90E25A26845252AD9E485EF2D339E7B5890CD4"
+       "2F9C9F315ED409171EC35CA04CC06B275577B3#)\n"
+"   (q #00DA67989167FDAC4AE3DF9247A716859A30C0CF9C5A6DBA01EABA3481#)\n"
+"   (g #48E35DA584A089D05142AA63603FDB00D131B07A0781E2D5A8F9614D2B33D3E40A78"
+       "98A9E10CDBB612CF093F95A3E10D09566726F2C12823836B2D9CD974BB695665F3B3"
+       "5D219A9724B87F380BD5207EDA0AE38C79E8F18122C3F76E4CEB0ABED3250914987F"
+       "B30D4B9E19C04C28A5D4F45560AF586F6A1B41751EAD90AE7F044F4E2A4A50C1F508"
+       "4FC202463F478F678B9A19392F0D2961C5391C546EF365368BB46410C9C1CEE96E9F"
+       "0C953570C2ED06328B11C90E86E57CAA7FA5ABAA278E22A4C8C08E16EE59F484EC44"
+       "2CF55535BAA2C6BEA8833A555372BEFE1E665D3C7DAEF58061D5136331EF4EB61BC3"
+       "6EE4425A553AF8885FEA15A88135BE133520#)\n"
+"   (y #66E0D1A69D663466F8FEF2B7C0878DAC93C36A2FB2C05E0306A53B926021D4B92A1C"
+       "2FA6860061E88E78CBBBA49B0E12700F07DBF86F72CEB2927EDAC0C7E3969C3A47BB"
+       "4E0AE93D8BB3313E93CC7A72DFEEE442EFBC81B3B2AEC9D8DCBE21220FB760201D79"
+       "328C41C773866587A44B6954767D022A88072900E964089D9B17133603056C985C4F"
+       "8A0B648F297F8D2C3CB43E4371DC6002B5B12CCC085BDB2CFC5074A0587566187EE3"
+       "E11A2A459BD94726248BB8D6CC62938E11E284C2C183576FBB51749EB238C4360923"
+       "79C08CE1C8CD77EB57404CE9B4744395ACF721487450BADE3220576F2F816248B0A7"
+       "14A264330AECCB24DE2A1107847B23490897#)\n"
+"))\n";
+
+static const char sample_private_dsa_key_3072[] =
+"(private-key\n"
+"  (dsa\n"
+"   (p #00BA73E148AEA5E8B64878AF5BE712B8302B9671C5F3EEB7722A9D0D9868D048C938"
+       "877C91C335C7819292E69C7D34264F1578E32EC2DA8408DF75D0EB76E0D3030B84B5"
+       "62D8EF93AB53BAB6B8A5DE464F5CA87AEA43BDCF0FB0B7815AA3114CFC84FD916A83"
+       "B3D5FD78390189332232E9D037D215313FD002FF46C048B66703F87FAE092AAA0988"
+       "AC745336EBE672A01DEDBD52395783579B67CF3AE1D6F1602CCCB12154FA0E00AE46"
+       "0D9B289CF709194625BCB919B11038DEFC50ADBBA20C3F320078E4E9529B4F6848E2"
+       "AB5E6278DB961FE226F2EEBD201E071C48C5BEF98B4D9BEE42C1C7102D893EBF8902"
+       "D7A91266340AFD6CE1D09E52282FFF5B97EAFA3886A3FCF84FF76D1E06538D0D8E60"
+       "B3332145785E07D29A5965382DE3470D1D888447FA9C00A2373378FC3FA7B9F7D17E"
+       "95A6A5AE1397BE46D976EF2C96E89913AC4A09351CA661BF6F67E30407DA846946C7"
+       "62D9BAA6B77825097D3E7B886456BB32E3E74516BF3FD93D71B257AA8F723E01CE33"
+       "8015353D3778B02B892AF7#)\n"
+"   (q #00BFF3F3CC18FA018A5B8155A8695E1E4939660D5E4759322C39D50F3B93E5F68B#)\n"
+"   (g #6CCFD8219F5FCE8EF2BEF3262929787140847E38674B1EF8DB20255E212CB6330EC4"
+       "DFE8A26AB7ECC5760DEB9BBF59A2B2821D510F1868172222867558B8D204E889C474"
+       "7CA30FBF9D8CF41AE5D5BD845174641101593849FF333E6C93A6550931B2B9D56B98"
+       "9CAB01729D9D736FA6D24A74D2DDE1E9E648D141473E443DD6BBF0B3CAB64F9FE4FC"
+       "134B2EB57437789F75C744DF1FA67FA8A64603E5441BC7ECE29E00BDF262BDC81E8C"
+       "7330A18A412DE38E7546D342B89A0AF675A89E6BEF00540EB107A2FE74EA402B0D89"
+       "F5C02918DEEEAF8B8737AC866B09B50810AB8D8668834A1B9E1E53866E2B0A926FAB"
+       "120A0CDE5B3715FFFE6ACD1AB73588DCC1EC4CE9392FE57F8D1D35811200CB07A0E6"
+       "374E2C4B0AEB7E3D077B8545C0E438DCC0F1AE81E186930E99EBC5B91B77E92803E0"
+       "21602887851A4FFDB3A7896AC655A0901218C121C5CBB0931E7D5EAC243F37711B5F"
+       "D5A62B1B38A83F03D8F6703D8B98DF367FC8A76990335F62173A5391836F0F2413EC"
+       "4997AF9EB55C6660B01A#)\n"
+"   (y #2320B22434C5DB832B4EC267CC52E78DD5CCFA911E8F0804E7E7F32B186B2D4167AE"
+       "4AA6869822E76400492D6A193B0535322C72B0B7AA4A87E33044FDC84BE24C64A053"
+       "A37655EE9EABDCDC1FDF63F3F1C677CEB41595DF7DEFE9178D85A3D621B4E4775492"
+       "8C0A58D2458D06F9562E4DE2FE6129A64063A99E88E54485B97484A28188C4D33F15"
+       "DDC903B6CEA0135E3E3D27B4EA39319696305CE93D7BA7BE00367DBE3AAF43491E71"
+       "CBF254744A5567F5D70090D6139E0C990239627B3A1C5B20B6F9F6374B8D8D8A8997"
+       "437265BE1E3B4810D4B09254400DE287A0DFFBAEF339E48D422B1D41A37E642BC026"
+       "73314701C8FA9792845C129351A87A945A03E6C895860E51D6FB8B7340A94D1A8A7B"
+       "FA85AC83B4B14E73AB86CB96C236C8BFB0978B61B2367A7FE4F7891070F56C78D5DD"
+       "F5576BFE5BE4F333A4E2664E79528B3294907AADD63F4F2E7AA8147B928D8CD69765"
+       "3DB98C4297CB678046ED55C0DBE60BF7142C594603E4D705DC3D17270F9F086EC561"
+       "2703D518D8D49FF0EBE6#)\n"
+"   (x #00A9FFFC88E67D6F7B810E291C050BAFEA7FC4A75E8D2F16CFED3416FD77607232#)\n"
+"))\n";
+
+static const char sample_public_dsa_key_3072[] =
+"(public-key\n"
+"  (dsa\n"
+"   (p #00BA73E148AEA5E8B64878AF5BE712B8302B9671C5F3EEB7722A9D0D9868D048C938"
+       "877C91C335C7819292E69C7D34264F1578E32EC2DA8408DF75D0EB76E0D3030B84B5"
+       "62D8EF93AB53BAB6B8A5DE464F5CA87AEA43BDCF0FB0B7815AA3114CFC84FD916A83"
+       "B3D5FD78390189332232E9D037D215313FD002FF46C048B66703F87FAE092AAA0988"
+       "AC745336EBE672A01DEDBD52395783579B67CF3AE1D6F1602CCCB12154FA0E00AE46"
+       "0D9B289CF709194625BCB919B11038DEFC50ADBBA20C3F320078E4E9529B4F6848E2"
+       "AB5E6278DB961FE226F2EEBD201E071C48C5BEF98B4D9BEE42C1C7102D893EBF8902"
+       "D7A91266340AFD6CE1D09E52282FFF5B97EAFA3886A3FCF84FF76D1E06538D0D8E60"
+       "B3332145785E07D29A5965382DE3470D1D888447FA9C00A2373378FC3FA7B9F7D17E"
+       "95A6A5AE1397BE46D976EF2C96E89913AC4A09351CA661BF6F67E30407DA846946C7"
+       "62D9BAA6B77825097D3E7B886456BB32E3E74516BF3FD93D71B257AA8F723E01CE33"
+       "8015353D3778B02B892AF7#)\n"
+"   (q #00BFF3F3CC18FA018A5B8155A8695E1E4939660D5E4759322C39D50F3B93E5F68B#)\n"
+"   (g #6CCFD8219F5FCE8EF2BEF3262929787140847E38674B1EF8DB20255E212CB6330EC4"
+       "DFE8A26AB7ECC5760DEB9BBF59A2B2821D510F1868172222867558B8D204E889C474"
+       "7CA30FBF9D8CF41AE5D5BD845174641101593849FF333E6C93A6550931B2B9D56B98"
+       "9CAB01729D9D736FA6D24A74D2DDE1E9E648D141473E443DD6BBF0B3CAB64F9FE4FC"
+       "134B2EB57437789F75C744DF1FA67FA8A64603E5441BC7ECE29E00BDF262BDC81E8C"
+       "7330A18A412DE38E7546D342B89A0AF675A89E6BEF00540EB107A2FE74EA402B0D89"
+       "F5C02918DEEEAF8B8737AC866B09B50810AB8D8668834A1B9E1E53866E2B0A926FAB"
+       "120A0CDE5B3715FFFE6ACD1AB73588DCC1EC4CE9392FE57F8D1D35811200CB07A0E6"
+       "374E2C4B0AEB7E3D077B8545C0E438DCC0F1AE81E186930E99EBC5B91B77E92803E0"
+       "21602887851A4FFDB3A7896AC655A0901218C121C5CBB0931E7D5EAC243F37711B5F"
+       "D5A62B1B38A83F03D8F6703D8B98DF367FC8A76990335F62173A5391836F0F2413EC"
+       "4997AF9EB55C6660B01A#)\n"
+"   (y #2320B22434C5DB832B4EC267CC52E78DD5CCFA911E8F0804E7E7F32B186B2D4167AE"
+       "4AA6869822E76400492D6A193B0535322C72B0B7AA4A87E33044FDC84BE24C64A053"
+       "A37655EE9EABDCDC1FDF63F3F1C677CEB41595DF7DEFE9178D85A3D621B4E4775492"
+       "8C0A58D2458D06F9562E4DE2FE6129A64063A99E88E54485B97484A28188C4D33F15"
+       "DDC903B6CEA0135E3E3D27B4EA39319696305CE93D7BA7BE00367DBE3AAF43491E71"
+       "CBF254744A5567F5D70090D6139E0C990239627B3A1C5B20B6F9F6374B8D8D8A8997"
+       "437265BE1E3B4810D4B09254400DE287A0DFFBAEF339E48D422B1D41A37E642BC026"
+       "73314701C8FA9792845C129351A87A945A03E6C895860E51D6FB8B7340A94D1A8A7B"
+       "FA85AC83B4B14E73AB86CB96C236C8BFB0978B61B2367A7FE4F7891070F56C78D5DD"
+       "F5576BFE5BE4F333A4E2664E79528B3294907AADD63F4F2E7AA8147B928D8CD69765"
+       "3DB98C4297CB678046ED55C0DBE60BF7142C594603E4D705DC3D17270F9F086EC561"
+       "2703D518D8D49FF0EBE6#)\n"
+"))\n";
+
+/* Keys are kept as samples instead of being generated, as prime search
+   time varies too much for slope measurement.  */
+static const struct
+{
+  const char *name;
+  const char *sec_key;
+  const char *pub_key;
+  unsigned int value_bits;   /* Size of value to be signed. */
+  int sign_cost;             /* Scales down signing repetitions. */
+} pk_algos[] = {
+#if USE_RSA
+  { "RSA-2048", sample_private_rsa_key_2048, sample_public_rsa_key_2048,
+    2040, 4 },
+  { "RSA-3072", sample_private_rsa_key_3072, sample_public_rsa_key_3072,
+    3064, 8 },
+  { "RSA-4096", sample_private_rsa_key_4096, sample_public_rsa_key_4096,
+    4088, 16 },
+#endif
+#if USE_DSA
+  { "DSA-2048", sample_private_dsa_key_2048, sample_public_dsa_key_2048,
+    224, 1 },
+  { "DSA-3072", sample_private_dsa_key_3072, sample_public_dsa_key_3072,
+    256, 2 },
+#endif
+  { NULL, NULL, NULL, 0, 1 }
+};
+
+
+static const char *
+pk_algo_name (int algo)
+{
+  if (algo < 0 || algo >= __MAX_PK_ALGO)
+    return NULL;
+
+  return pk_algos[algo].name;
+}
+
+
+static int
+pk_map_name (const char *name)
+{
+  int i;
+
+  for (i = 0; i < __MAX_PK_ALGO; i++)
+    if (!strcmp (pk_algos[i].name, name))
+      return i;
+
+  return -1;
+}
+
+
+static int
+bench_pk_init (struct bench_obj *obj)
+{
+  struct bench_pk_oper *oper = obj->priv;
+  struct bench_pk_hd *hd;
+  gcry_mpi_t x;
+  gpg_error_t err;
+  int cost;
+
+  cost = oper->oper == PK_OPER_SIGN ? pk_algos[oper->algo].sign_cost : 1;
+
+  obj->min_bufsize = 1;
+  obj->max_bufsize = 4;
+  obj->step_size = 1;
+  obj->num_measure_repetitions =
+    num_measurement_repetitions / obj->max_bufsize / cost;
+  if (obj->num_measure_repetitions == 0)
+    obj->num_measure_repetitions = 1;
+
+  hd = calloc (1, sizeof(*hd));
+  if (!hd)
+    return -1;
+
+  err = gcry_sexp_sscan (&hd->sec_key, NULL, pk_algos[oper->algo].sec_key,
+			 strlen (pk_algos[oper->algo].sec_key));
+  if (!err)
+    err = gcry_sexp_sscan (&hd->pub_key, NULL, pk_algos[oper->algo].pub_key,
+			   strlen (pk_algos[oper->algo].pub_key));
+  if (err)
+    {
+      fprintf (stderr, PGM ": gcry_sexp_sscan failed: %s\n",
+	       gpg_strerror (err));
+      exit (1);
+    }
+
+  x = gcry_mpi_new (pk_algos[oper->algo].value_bits);
+  gcry_mpi_randomize (x, pk_algos[oper->algo].value_bits, GCRY_WEAK_RANDOM);
+  err = gcry_sexp_build (&hd->data, NULL, "(data (flags raw) (value %m))", x);
+  gcry_mpi_release (x);
+  if (err)
+    {
+      fprintf (stderr, PGM ": gcry_sexp_build failed: %s\n",
+	       gpg_strerror (err));
+      exit (1);
+    }
+
+  err = gcry_pk_sign (&hd->sig, hd->data, hd->sec_key);
+  if (err)
+    {
+      fprintf (stderr, PGM ": gcry_pk_sign failed: %s\n",
+	       gpg_strerror (err));
+      exit (1);
+    }
+
+  obj->hd = hd;
+  return 0;
+}
+
+
+static void
+bench_pk_free (struct bench_obj *obj)
+{
+  struct bench_pk_hd *hd = obj->hd;
+
+  gcry_sexp_release (hd->sig);
+  gcry_sexp_release (hd->data);
+  gcry_sexp_release (hd->pub_key);
+  gcry_sexp_release (hd->sec_key);
+  free (hd);
+  obj->hd = NULL;
+}
+
+
+static void
+bench_pk_sign_do_bench (struct bench_obj *obj, void *buf, size_t num_iter)
+{
+  struct bench_pk_hd *hd = obj->hd;
+  gcry_sexp_t sig;
+  gpg_error_t err;
+  size_t i;
+
+  (void)buf;
+
+  for (i = 0; i < num_iter; i++)
+    {
+      err = gcry_pk_sign (&sig, hd->data, hd->sec_key);
+      if (err)
+	{
+	  fprintf (stderr, PGM ": gcry_pk_sign failed: %s\n",
+		   gpg_strerror (err));
+	  exit (1);
+	}
+      gcry_sexp_release (sig);
+    }
+}
+
+
+static void
+bench_pk_verify_do_bench (struct bench_obj *obj, void *buf, size_t num_iter)
+{
+  struct bench_pk_hd *hd = obj->hd;
+  gpg_error_t err;
+  size_t i;
+
+  (void)buf;
+
+  for (i = 0; i < num_iter; i++)
+    {
+      err = gcry_pk_verify (hd->sig, hd->data, hd->pub_key);
+      if (err)
+	{
+	  fprintf (stderr, PGM ": gcry_pk_verify failed: %s\n",
+		   gpg_strerror (err));
+	  exit (1);
+	}
+    }
+}
+
+
+static struct bench_ops pk_sign_ops = {
+  &bench_pk_init,
+  &bench_pk_free,
+  &bench_pk_sign_do_bench
+};
+
+static struct bench_ops pk_verify_ops = {
+  &bench_pk_init,
+  &bench_pk_free,
+  &bench_pk_verify_do_bench
+};
+
+static struct bench_pk_oper pk_operations[] = {
+  { PK_OPER_SIGN,   "sign",   &pk_sign_ops },
+  { PK_OPER_VERIFY, "verify", &pk_verify_ops },
+  { 0, NULL, NULL }
+};
+
+
+static void
+cipher_pk_one (enum bench_pk_algo algo, struct bench_pk_oper *poper)
+{
+  struct bench_pk_oper oper = *poper;
+  struct bench_obj obj = { 0 };
+  double result;
+
+  oper.algo = algo;
+
+  bench_print_mode (14, oper.name);
+
+  obj.ops = oper.ops;
+  obj.priv = &oper;
+
+  result = do_slope_benchmark (&obj);
+  bench_print_result_nsec_per_iteration (result);
+}
+
+
+static void
+_pk_bench (int algo)
+{
+  int i;
+
+  bench_print_header_nsec_per_iteration (14, pk_algo_name (algo));
+
+  for (i = 0; pk_operations[i].name; i++)
+    cipher_pk_one (algo, &pk_operations[i]);
+
+  bench_print_footer (14);
+}
+
+
+void
+pk_bench (char **argv, int argc)
+{
+  int i, algo;
+
+  bench_print_section ("pk", "Public-key");
+
+  if (argv && argc)
+    {
+      for (i = 0; i < argc; i++)
+	{
+	  algo = pk_map_name (argv[i]);
+	  if (algo >= 0)
+	    _pk_bench (algo);
+	}
+    }
+  else
+    {
+      for (i = 0; i < __MAX_PK_ALGO; i++)
+	_pk_bench (i);
+    }
+}
+
+
 /************************************************************ ECC benchmarks. */
 
 #if USE_ECC
@@ -3854,7 +4496,8 @@ void
 print_help (void)
 {
   static const char *help_lines[] = {
-    "usage: bench-slope [options] [hash|mac|cipher|kdf|ecc|pq|mpi [algonames]]",
+    "usage: bench-slope [options] [hash|mac|cipher|kdf|pk|ecc|pq|mpi",
+    "                              [algonames]]",
     "",
     " options:",
     "   --cpu-mhz <mhz>           Set CPU speed for calculating cycles",
@@ -4067,6 +4710,7 @@ main (int argc, char **argv)
       mac_bench (NULL, 0);
       cipher_bench (NULL, 0);
       kdf_bench (NULL, 0);
+      pk_bench (NULL, 0);
       ecc_bench (NULL, 0);
       pq_bench (NULL, 0);
       mpi_bench (NULL, 0);
@@ -4103,6 +4747,14 @@ main (int argc, char **argv)
       warm_up_cpu ();
       kdf_bench ((argc == 0) ? NULL : argv, argc);
     }
+  else if (!strcmp (*argv, "pk"))
+    {
+      argc--;
+      argv++;
+
+      warm_up_cpu ();
+      pk_bench ((argc == 0) ? NULL : argv, argc);
+    }
   else if (!strcmp (*argv, "ecc"))
     {
       argc--;
-- 
2.53.0