Update sm9 functions

This commit is contained in:
Zhi Guan
2018-12-07 16:32:12 +08:00
parent 6f5b7a4c96
commit 1c00e47681
11 changed files with 5613 additions and 14 deletions

View File

@@ -13,7 +13,7 @@ SOURCE[../../libcrypto]=\
e_old.c pmeth_lib.c pmeth_fn.c pmeth_gn.c m_sigver.c \
e_aes_cbc_hmac_sha1.c e_aes_cbc_hmac_sha256.c e_rc4_hmac_md5.c \
e_chacha20_poly1305.c cmeth_lib.c \
m_sm3.c \
m_sm3.c m_sm9hash2.c \
e_sms4.c e_sms4_ccm.c e_sms4_gcm.c e_sms4_ocb.c e_sms4_wrap.c e_sms4_xts.c \
e_zuc.c \
evp_ctxt.c names2.c

View File

@@ -85,17 +85,18 @@ static int final(EVP_MD_CTX *ctx, unsigned char *md)
}
static const EVP_MD sm3_md = {
NID_sm3,
NID_sm2sign_with_sm3,
SM3_DIGEST_LENGTH,
0, /* flags */
init,
update,
final,
NULL,
NULL,
SM3_BLOCK_SIZE,
sizeof(EVP_MD *) + sizeof(sm3_ctx_t),
NID_sm3, /* type */
NID_sm2sign_with_sm3, /* pkey_type */
SM3_DIGEST_LENGTH, /* md_size */
0, /* flags */
init, /* init */
update, /* update */
final, /* final */
NULL, /* copy */
NULL, /* cleanup */
SM3_BLOCK_SIZE, /* block_size */
sizeof(EVP_MD *) + sizeof(sm3_ctx_t), /* ctx_size */
NULL, /* md_ctrl */
};
const EVP_MD *EVP_sm3(void)

153
crypto/evp/m_sm9hash2.c Normal file
View File

@@ -0,0 +1,153 @@
/* ====================================================================
* Copyright (c) 2014 - 2018 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 <stdio.h>
#include "internal/cryptlib.h"
#ifndef OPENSSL_NO_SM9
# include <openssl/sm9.h>
# include <openssl/evp.h>
# include <openssl/x509.h>
# include <openssl/objects.h>
# include "internal/evp_int.h"
# ifndef OPENSSL_NO_SM3
# include <openssl/sm3.h>
static int sm9hash2_sm3_init(EVP_MD_CTX *ctx)
{
return 0;
}
static int sm9hash2_sm3_update(EVP_MD_CTX *ctx, const void *in, size_t inlen)
{
return 0;
}
static int sm9hash2_sm3_final(EVP_MD_CTX *ctx, unsigned char *md)
{
return 0;
}
int sm9hash2_sm3_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void *p2)
{
return 0;
}
# define SM9HASH2_SM3_CTX_SIZE (sizeof(EVP_MD *) + sizeof(sm3_ctx_t))
static const EVP_MD sm9hash2_sm3 = {
NID_sm9hash2_with_sm3, /* type */
NID_sm9sign_with_sm3, /* pkey_type */
SM3_DIGEST_LENGTH, /* md_size */
0, /* flags */
sm9hash2_sm3_init, /* init */
sm9hash2_sm3_update, /* update */
sm9hash2_sm3_final, /* final */
NULL, /* copy */
NULL, /* cleanup */
SM3_BLOCK_SIZE, /* block_size */
SM9HASH2_SM3_CTX_SIZE, /* ctx_size */
sm9hash2_sm3_ctrl, /* md_ctrl */
};
const EVP_MD *EVP_sm9hash2_sm3(void)
{
return &sm9hash2_sm3;
}
# endif /* OPENSSL_NO_SM3 */
# ifndef OPENSSL_NO_SHA256
# include <openssl/sha.h>
static int sm9hash2_sha256_init(EVP_MD_CTX *ctx)
{
return 0;
}
static int sm9hash2_sha256_update(EVP_MD_CTX *ctx, const void *in, size_t inlen)
{
return 0;
}
static int sm9hash2_sha256_final(EVP_MD_CTX *ctx, unsigned char *md)
{
return 0;
}
int sm9hash2_sha256_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void *p2)
{
return 0;
}
#define SM9HASH2_SHA256_CTX_SIZE (sizeof(EVP_MD *) + sizeof(SHA256_CTX))
static const EVP_MD sm9hash2_sha256 = {
NID_sm9hash2_with_sha256, /* type */
NID_sm9sign_with_sha256, /* pkey_type */
SHA256_DIGEST_LENGTH, /* md_size */
0, /* flags */
sm9hash2_sha256_init, /* init */
sm9hash2_sha256_update, /* update */
sm9hash2_sha256_final, /* final */
NULL, /* copy */
NULL, /* cleanup */
SHA256_CBLOCK, /* block_size */
SM9HASH2_SHA256_CTX_SIZE, /* ctx_size */
sm9hash2_sha256_ctrl, /* md_ctrl */
};
const EVP_MD *EVP_sm9hash2_sha256(void)
{
return &sm9hash2_sha256;
}
# endif /* OPENSSL_NO_SHA256 */
#endif /* OPENSSL_NO_SM9 */

View File

@@ -75,7 +75,7 @@ int SM2_ciphertext_size(const EC_KEY *ec_key, size_t inlen)
int len = 0, i;
if (inlen > SM2_MAX_PLAINTEXT_LENGTH) {
SM2err(SM2_F_SM2CIPHERTEXTVALUE_SIZE, SM2_R_PLAINTEXT_TOO_LONG);
SM2err(SM2_F_SM2_CIPHERTEXT_SIZE, SM2_R_PLAINTEXT_TOO_LONG);
return 0;
}
@@ -89,7 +89,7 @@ int SM2_ciphertext_size(const EC_KEY *ec_key, size_t inlen)
/* ASN1_INTEGER xCoordinate, yCoordinate */
if (!(i = EC_GROUP_order_bits(group))) {
SM2err(SM2_F_SM2CIPHERTEXTVALUE_SIZE, ERR_R_EC_LIB);
SM2err(SM2_F_SM2_CIPHERTEXT_SIZE, ERR_R_EC_LIB);
return 0;
}
a.length = (i + 7)/8;

View File

@@ -22,6 +22,7 @@ static ERR_STRING_DATA SM2_str_functs[] = {
{ERR_FUNC(SM2_F_I2O_SM2CIPHERTEXTVALUE), "i2o_SM2CiphertextValue"},
{ERR_FUNC(SM2_F_O2I_SM2CIPHERTEXTVALUE), "o2i_SM2CiphertextValue"},
{ERR_FUNC(SM2_F_SM2CIPHERTEXTVALUE_SIZE), "SM2CiphertextValue_size"},
{ERR_FUNC(SM2_F_SM2_CIPHERTEXT_SIZE), "SM2_ciphertext_size"},
{ERR_FUNC(SM2_F_SM2_DECRYPT), "SM2_decrypt"},
{ERR_FUNC(SM2_F_SM2_DO_DECRYPT), "SM2_do_decrypt"},
{ERR_FUNC(SM2_F_SM2_DO_ENCRYPT), "SM2_do_encrypt"},

View File

@@ -54,6 +54,39 @@
#include <openssl/bn_hash.h>
#include "sm9_lcl.h"
#if 0
typedef struct {
int nid;
int nid;
} sm9_algor_table;
static const sm9_algor_table sm9encrypt_scheme_table[] = {
{NID_sm9encrypt_with_sm3, NID_sm3},
{NID_sm9encrypt_with_sha256, NID_sha256},
};
static const sm9_algoro_table sm9sign_scheme_table[] = {
{NID_sm9sign_with_sm3, NID_sm3},
{NID_sm9sign_with_sha256, NID_sha256},
};
static const sm9_algor_table sm9_encrypt_table[] = {
{sm9encrypt-with-sm3-xor, NID_sm3, NID_undef},
{sm9encrypt-with-sm3-sms4-cbc, NID_sm3, NID_sms4_cbc},
{sm9encrypt-with-sm3-sms4-ctr, NID_sm3, NID_sms4_ctr},
};
static const sm9_algor sm9_hash1[] = {
{NID_sm9hash1_with_sm3, NID_sm3},
{NID_sm9hash1_with_sha256, NID_sha256},
{NID_sm9kdf_with_sm3, NID_sm3},
{NID_sm9kdf_with_sha256, NID_sha256},
};
#endif
SM9_MASTER_KEY *SM9_MASTER_KEY_new(void)
{
SM9_MASTER_KEY *ret = NULL;

View File

@@ -456,6 +456,9 @@ static int pkey_sm9_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, const char *va
return -2;
}
/* TODO: currently data instead of dgst is signed.
* we need to support to ctrl which to sign.
*/
const EVP_PKEY_METHOD sm9_pkey_meth = {
EVP_PKEY_SM9, /* pkey_id */
0, /* flags */