From 6c122e31a61be7416f419608b928e9290f58f427 Mon Sep 17 00:00:00 2001 From: Zhi Guan Date: Thu, 4 Apr 2019 10:41:38 +0800 Subject: [PATCH] Add ECSCHNORR --- crypto/schnorr/ecschnorr_asn1.c | 71 ++++++++++++++++++++++++++++ crypto/schnorr/ecschnorr_lcl.h | 53 +++++++++++++++++++++ crypto/schnorr/ecschnorr_lib.c | 77 +++++++++++++++++++++++++++++++ include/openssl/ecschnorr.h | 82 +++++++++++++++++++++++++++++++++ 4 files changed, 283 insertions(+) create mode 100644 crypto/schnorr/ecschnorr_asn1.c create mode 100644 crypto/schnorr/ecschnorr_lcl.h create mode 100644 crypto/schnorr/ecschnorr_lib.c create mode 100644 include/openssl/ecschnorr.h diff --git a/crypto/schnorr/ecschnorr_asn1.c b/crypto/schnorr/ecschnorr_asn1.c new file mode 100644 index 00000000..2949312f --- /dev/null +++ b/crypto/schnorr/ecschnorr_asn1.c @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2015 - 2017 The GmSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE GmSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include "ecschnorr_lcl.h" + + +ASN1_SEQUENCE(ECSCHNORR_SIG) = { + ASN1_SIMPLE(ECSCHNORR_SIG, R, ASN1_OCTET_STRING), + ASN1_SIMPLE(ECSCHNORR_SIG, s, BIGNUM), +} ASN1_SEQUENCE_END(ECSCHNORR_SIG) +IMPLEMENT_ASN1_FUNCTIONS(ECSCHNORR_SIG) +IMPLEMENT_ASN1_DUP_FUNCTION(ECSCHNORR_SIG) + +int ECSCHNORR_size(const EC_KEY *ec_key) +{ + return 0; +} diff --git a/crypto/schnorr/ecschnorr_lcl.h b/crypto/schnorr/ecschnorr_lcl.h new file mode 100644 index 00000000..196cf1e1 --- /dev/null +++ b/crypto/schnorr/ecschnorr_lcl.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2015 - 2019 The GmSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE GmSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +struct ECSCHNORR_SIG_st { + ASN1_OCTET_STRING *R; /* R = [k]G */ + BIGNUM *s; /* s = k + e * x, e = H(R || P || M) */ +}; + diff --git a/crypto/schnorr/ecschnorr_lib.c b/crypto/schnorr/ecschnorr_lib.c new file mode 100644 index 00000000..96cb65e2 --- /dev/null +++ b/crypto/schnorr/ecschnorr_lib.c @@ -0,0 +1,77 @@ +/* ==================================================================== + * Copyright (c) 2015 - 2019 The GmSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE GmSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#include +#include "ecschnorr_lcl.h" + + +ECSCHNORR_SIG *ECSCHNORR_do_sign(const EVP_MD *md, + const unsigned char *dgst, int dgst_len, EC_KEY *ec_key) +{ + return NULL; +} + +int ECSCHNORR_do_verify(const EVP_MD *md, + const unsigned char *dgst, int dgstlen, + const ECSCHNORR_SIG *sig, EC_KEY *ec_key) +{ + return -1; +} + +int ECSCHNORR_sign(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, EC_KEY *eckey) +{ + return 0; +} + +int ECSCHNORR_verify(int type, const unsigned char *dgst, int dgstlen, + const unsigned char *sig, int siglen, EC_KEY *ec_key) +{ + return -1; +} diff --git a/include/openssl/ecschnorr.h b/include/openssl/ecschnorr.h new file mode 100644 index 00000000..ee854730 --- /dev/null +++ b/include/openssl/ecschnorr.h @@ -0,0 +1,82 @@ +/* ==================================================================== + * Copyright (c) 2015 - 2019 The GmSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the GmSSL Project. + * (http://gmssl.org/)" + * + * 4. The name "GmSSL Project" must not be used to endorse or promote + * products derived from this software without prior written + * permission. For written permission, please contact + * guanzhi1980@gmail.com. + * + * 5. Products derived from this software may not be called "GmSSL" + * nor may "GmSSL" appear in their names without prior written + * permission of the GmSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the GmSSL Project + * (http://gmssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE GmSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE GmSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#ifndef HEADER_ECSCHNORR_H +#define HEADER_ECSCHNORR_H + +#include +#ifndef OPENSSL_NO_ECSCHNORR + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ECSCHNORR_SIG_st ECSCHNORR_SIG; +DECLARE_ASN1_FUNCTIONS(ECSCHNORR_SIG) + +/* return the maximum ec schnorr signature size */ +int ECSCHNORR_size(const EC_KEY *ec_key); + +ECSCHNORR_SIG *ECSCHNORR_do_sign(const EVP_MD *md, + const unsigned char *dgst, int dgst_len, EC_KEY *ec_key); +int ECSCHNORR_do_verify(const EVP_MD *md, + const unsigned char *dgst, int dgstlen, + const ECSCHNORR_SIG *sig, EC_KEY *ec_key); + +int ECSCHNORR_sign(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, EC_KEY *eckey); +int ECSCHNORR_verify(int type, const unsigned char *dgst, int dgstlen, + const unsigned char *sig, int siglen, EC_KEY *ec_key); + + +/* BEGIN ERROR CODES */