diff --git a/src/algo_suite.cpp b/src/algo_suite.cpp index 2de614a..6df2f2b 100644 --- a/src/algo_suite.cpp +++ b/src/algo_suite.cpp @@ -23,21 +23,15 @@ void fill_algorithm_suite (algorithm_suite&s) { - static algo_mceqd128 mce128; - mce128.register_into_suite (s); - - static algo_mceqd192 mce192; - mce192.register_into_suite (s); - - static algo_mceqd256 mce256; - mce256.register_into_suite (s); - - static algo_fmtseq128 fmt128; - fmt128.register_into_suite (s); - - static algo_fmtseq192 fmt192; - fmt192.register_into_suite (s); - - static algo_fmtseq256 fmt256; - fmt256.register_into_suite (s); +#define do_alg(x) static x var_##x ; var_##x.register_into_suite(s); + do_alg (algo_mceqd128); + do_alg (algo_mceqd192); + do_alg (algo_mceqd256); + do_alg (algo_fmtseq128); + do_alg (algo_fmtseq192); + do_alg (algo_fmtseq256); + do_alg (algo_fmtseq128h20); + do_alg (algo_fmtseq192h20); + do_alg (algo_fmtseq256h20); +#undef do_alg } diff --git a/src/algos_sig.cpp b/src/algos_sig.cpp index 41ba3c6..a1ae9c1 100644 --- a/src/algos_sig.cpp +++ b/src/algos_sig.cpp @@ -270,3 +270,115 @@ int algo_fmtseq256::create_keypair (sencode**pub, sencode**priv, prng&rng) return 0; } +/* + * h=20 variants for signature count 1048576. + * + * Chosen were parameters h=4,l=5 over the h=5,l=4 variant for smaller runtime + * space needed, as signature time is not really a concern here. + */ + +int algo_fmtseq128h20::sign (const bvector&msg, + bvector&sig, + sencode**privkey, + bool&dirty, + prng&rng) +{ + return fmtseq_generic_sign + <4, 5, 256, sha256hash, rmd128hash> + (msg, sig, privkey, dirty, rng); +} + +int algo_fmtseq128h20::verify (const bvector&sig, + const bvector&msg, + sencode*pubkey) +{ + return fmtseq_generic_verify + <4, 5, 256, sha256hash, rmd128hash> + (sig, msg, pubkey); +} + +int algo_fmtseq192h20::sign (const bvector&msg, + bvector&sig, + sencode**privkey, + bool&dirty, + prng&rng) +{ + return fmtseq_generic_sign + <4, 5, 384, sha384hash, tiger192hash> + (msg, sig, privkey, dirty, rng); +} + +int algo_fmtseq192h20::verify (const bvector&sig, + const bvector&msg, + sencode*pubkey) +{ + return fmtseq_generic_verify + <4, 5, 384, sha384hash, tiger192hash> + (sig, msg, pubkey); +} + +int algo_fmtseq256h20::sign (const bvector&msg, + bvector&sig, + sencode**privkey, + bool&dirty, + prng&rng) +{ + return fmtseq_generic_sign + <4, 5, 512, sha512hash, sha256hash> + (msg, sig, privkey, dirty, rng); +} + +int algo_fmtseq256h20::verify (const bvector&sig, + const bvector&msg, + sencode*pubkey) +{ + return fmtseq_generic_verify + <4, 5, 512, sha512hash, sha256hash> + (sig, msg, pubkey); +} + +int algo_fmtseq128h20::create_keypair (sencode**pub, sencode**priv, prng&rng) +{ + fmtseq::pubkey Pub; + fmtseq::privkey Priv; + + rmd128hash hf; + + if (fmtseq::generate (Pub, Priv, rng, hf, 256, 4, 5) ) + return 1; + + *pub = Pub.serialize(); + *priv = Priv.serialize(); + return 0; +} + +int algo_fmtseq192h20::create_keypair (sencode**pub, sencode**priv, prng&rng) +{ + fmtseq::pubkey Pub; + fmtseq::privkey Priv; + + tiger192hash hf; + + if (fmtseq::generate (Pub, Priv, rng, hf, 384, 4, 5) ) + return 1; + + *pub = Pub.serialize(); + *priv = Priv.serialize(); + return 0; +} + +int algo_fmtseq256h20::create_keypair (sencode**pub, sencode**priv, prng&rng) +{ + fmtseq::pubkey Pub; + fmtseq::privkey Priv; + + sha256hash hf; + + if (fmtseq::generate (Pub, Priv, rng, hf, 512, 4, 5) ) + return 1; + + *pub = Pub.serialize(); + *priv = Priv.serialize(); + return 0; +} + diff --git a/src/algos_sig.h b/src/algos_sig.h index c696d1e..42c966a 100644 --- a/src/algos_sig.h +++ b/src/algos_sig.h @@ -87,5 +87,71 @@ public: int create_keypair (sencode**pub, sencode**priv, prng&rng); }; +class algo_fmtseq128h20 : public algorithm +{ +public: + bool provides_signatures() { + return true; + } + + bool provides_encryption() { + return false; + } + + std::string get_alg_id() { + return "FMTSEQ128H20-SHA256-RIPEMD128"; + } + + virtual int sign (const bvector&msg, bvector&sig, + sencode** privkey, bool&dirty, prng&rng); + virtual int verify (const bvector&sig, const bvector&msg, + sencode* pubkey); + int create_keypair (sencode**pub, sencode**priv, prng&rng); +}; + +class algo_fmtseq192h20 : public algorithm +{ +public: + bool provides_signatures() { + return true; + } + + bool provides_encryption() { + return false; + } + + std::string get_alg_id() { + return "FMTSEQ192H20-SHA384-TIGER192"; + } + + virtual int sign (const bvector&msg, bvector&sig, + sencode** privkey, bool&dirty, prng&rng); + virtual int verify (const bvector&sig, const bvector&msg, + sencode* pubkey); + int create_keypair (sencode**pub, sencode**priv, prng&rng); +}; + +class algo_fmtseq256h20 : public algorithm +{ +public: + bool provides_signatures() { + return true; + } + + bool provides_encryption() { + return false; + } + + std::string get_alg_id() { + return "FMTSEQ256H20-SHA512-SHA256"; + } + + virtual int sign (const bvector&msg, bvector&sig, + sencode** privkey, bool&dirty, prng&rng); + virtual int verify (const bvector&sig, const bvector&msg, + sencode* pubkey); + int create_keypair (sencode**pub, sencode**priv, prng&rng); +}; + #endif