mirror of
https://github.com/guanzhi/GmSSL.git
synced 2026-08-07 12:33:39 +08:00
more sm. tests
This commit is contained in:
13
demos/gmssl/cert.pem
Normal file
13
demos/gmssl/cert.pem
Normal file
@@ -0,0 +1,13 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIB9jCCAZ2gAwIBAgIJAI6saFfpzqpLMAoGCCqGSM49BAMCMFgxCzAJBgNVBAYT
|
||||
AkNOMQwwCgYDVQQIDANQS1UxDDAKBgNVBAcMA1BLVTEMMAoGA1UECgwDUEtVMQ0w
|
||||
CwYDVQQLDARERFNTMRAwDgYDVQQDDAdERFNTLUFTMB4XDTE2MDUxODExNTgyMVoX
|
||||
DTI2MDUxNjExNTgyMVowWDELMAkGA1UEBhMCQ04xDDAKBgNVBAgMA1BLVTEMMAoG
|
||||
A1UEBwwDUEtVMQwwCgYDVQQKDANQS1UxDTALBgNVBAsMBEREU1MxEDAOBgNVBAMM
|
||||
B0REU1MtQVMwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAATFBdPQp/tqJHjfL+eZ
|
||||
Jv1tUCMFpWCzoskQgDImhLP8+snkNSmZhRtHeerUr8oP6FtWAPnhUzwMOVb4JcNC
|
||||
CYSbo1AwTjAdBgNVHQ4EFgQUCz8gNn0NMxyIW/gRF13zl6ExeLUwHwYDVR0jBBgw
|
||||
FoAUCz8gNn0NMxyIW/gRF13zl6ExeLUwDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQD
|
||||
AgNHADBEAiARFx9dY1LE+ELs/SWIkMLxbikA3P4YE0JZZkAmXZVo/gIgEs8G6fJw
|
||||
8AEbDwMcMiLLyJ7RhcUhEX+oj3Ibm8JgQXo=
|
||||
-----END CERTIFICATE-----
|
||||
@@ -1,41 +1,27 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
#gmssl=/usr/local/bin/gmssl
|
||||
|
||||
gmssl=../../apps/gmssl
|
||||
paramfile=ecparam.pem
|
||||
keyfile=eckey.pem
|
||||
pubkeyfile=ecpubkey.pem
|
||||
pkeyopt="-pkeyopt ec_paramgen_curve:sm2p256v1"
|
||||
|
||||
|
||||
#echo -n abc | $gmssl dgst -sm3
|
||||
#echo -n abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd | gmssl dgst -sm3
|
||||
|
||||
$gmssl version
|
||||
$gmssl ecparam -list_curves | grep sm2
|
||||
$gmssl ecparam -text -noout -name sm2p256v1 -param_enc explicit
|
||||
#$gmssl version
|
||||
#$gmssl ecparam -list_curves | grep sm2
|
||||
#$gmssl ecparam -text -noout -name sm2p256v1 -param_enc explicit
|
||||
#$gmssl genpkey -genparam -algorithm EC -out sm2p256v1.pem -pkeyopt ec_paramgen_curve:sm2p256v1 -pkeyopt ec_param_enc:named_curve
|
||||
$gmssl genpkey -algorithm EC -out sm2key.pem -pkeyopt ec_paramgen_curve:sm2p256v1 -pkeyopt ec_param_enc:named_curve
|
||||
#$gmssl pkey -text -noout -in sm2key.pem
|
||||
#$gmssl pkey -in sm2key.pem -pubout -out sm2pubkey.pem
|
||||
#$gmssl pkey -text -noout -pubin -in $pubkeyfile
|
||||
#echo hello | $gmssl pkeyutl -sign -inkey sm2key.pem -pkeyopt ec_sign_algor:sm2 > sm2sig.der
|
||||
#echo hello | $gmssl pkeyutl -verify -inkey sm2key.pem -sigfile sm2sig.der -pkeyopt ec_sign_algor:sm2
|
||||
#echo hello | $gmssl pkeyutl -encrypt -inkey sm2key.pem -pkeyopt ec_encrypt_algor:sm2 > sm2ciphertext.bin
|
||||
#cat sm2ciphertext.bin | $gmssl pkeyutl -decrypt -inkey sm2key.pem -pkeyopt ec_encrypt_algor:sm2
|
||||
|
||||
gmssl genpkey -genparam -algorithm EC -out sm2p256v1.pem \
|
||||
-pkeyopt ec_paramgen_curve:sm2p256v1 \
|
||||
-pkeyopt ec_param_enc:named_curve
|
||||
|
||||
gmssl genpkey -algorithm EC -out sm2key.pem \
|
||||
-pkeyopt ec_paramgen_curve:sm2p256v1 \
|
||||
-pkeyopt ec_param_enc:named_curve
|
||||
|
||||
# print private key
|
||||
#gmssl pkey -text -noout -in sm2key.pem
|
||||
|
||||
# export public key
|
||||
gmssl pkey -in sm2key.pem -pubout -out sm2pubkey.pem
|
||||
#gmssl pkey -text -noout -pubin -in $pubkeyfile
|
||||
|
||||
echo hello | gmssl pkeyutl -sign -inkey sm2key.pem -pkeyopt ec_sign_algor:sm2 > sm2sig.der
|
||||
|
||||
|
||||
echo hello | \
|
||||
gmssl pkeyutl -verify -inkey sm2key.pem \
|
||||
-sigfile sm2sig.der -pkeyopt ec_sign_algor:sm2
|
||||
|
||||
|
||||
$gmssl req -new -x509 -days 3650 -key sm2key.pem -out cert.pem -pkeyopt ec_sign_algor:sm2
|
||||
#$gmssl x509 -text -noout -in $DIR/cacert.pem
|
||||
|
||||
38
demos/gmssl/listciphers.c
Normal file
38
demos/gmssl/listciphers.c
Normal file
@@ -0,0 +1,38 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/opensslv.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i;
|
||||
char *names[] = {
|
||||
"sms4-ecb",
|
||||
"sms4-cbc",
|
||||
"sms4-cfb",
|
||||
"sms4-ofb",
|
||||
"sms4-ctr",
|
||||
};
|
||||
const EVP_CIPHER *cipher;
|
||||
|
||||
OpenSSL_add_all_ciphers();
|
||||
|
||||
printf("%s new ciphers:\n\n", OPENSSL_VERSION_TEXT);
|
||||
|
||||
for (i = 0; i < sizeof(names)/sizeof(names[i]); i++) {
|
||||
if (!(cipher = EVP_get_cipherbyname(names[i]))) {
|
||||
fprintf(stderr, "cipher \"%s\" is not supported\n", names[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
printf(" cipher nid : %d\n", EVP_CIPHER_nid(cipher));
|
||||
printf(" cipher name : %s\n", EVP_CIPHER_name(cipher));
|
||||
printf(" block size : %d\n", EVP_CIPHER_block_size(cipher));
|
||||
printf(" key length : %d\n", EVP_CIPHER_key_length(cipher));
|
||||
printf(" iv length : %d\n", EVP_CIPHER_iv_length(cipher));
|
||||
printf(" flags : 0x%016lx\n", EVP_CIPHER_flags(cipher));
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,355 +0,0 @@
|
||||
/* demo/gmssl/sm2.c */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2015-2016 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 <string.h>
|
||||
#include <strings.h>
|
||||
#include <openssl/ec.h>
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/rand.h>
|
||||
#include <openssl/engine.h>
|
||||
#include <openssl/sm2.h>
|
||||
|
||||
#define NUM_PKEYS 4
|
||||
|
||||
int main()
|
||||
{
|
||||
int ret = -1;
|
||||
int verbose = 0;
|
||||
BIO *out = NULL;
|
||||
|
||||
int id = EVP_PKEY_SM2;
|
||||
const EVP_MD *md = EVP_sm3();
|
||||
ENGINE *engine = NULL;
|
||||
|
||||
EVP_PKEY_CTX *pkctx = NULL;
|
||||
EVP_PKEY *pkey = NULL;
|
||||
EVP_MD_CTX *mdctx = NULL;
|
||||
EVP_CIPHER_CTX *cpctx = NULL;
|
||||
|
||||
unsigned char dgst[EVP_MAX_MD_SIZE] = "hello world";
|
||||
size_t dgstlen = 32;
|
||||
unsigned char sig[256];
|
||||
size_t siglen = sizeof(sig);
|
||||
|
||||
unsigned char msg[] = "hello world this is the message";
|
||||
size_t msglen = sizeof(msg);
|
||||
unsigned char cbuf[512];
|
||||
size_t cbuflen = sizeof(cbuf);
|
||||
unsigned char mbuf[512];
|
||||
size_t mbuflen = sizeof(mbuf);
|
||||
|
||||
int len;
|
||||
unsigned int ulen;
|
||||
|
||||
ERR_load_crypto_strings();
|
||||
|
||||
out = BIO_new_fp(stdout, BIO_NOCLOSE);
|
||||
|
||||
if (!(pkctx = EVP_PKEY_CTX_new_id(id, engine))) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!EVP_PKEY_keygen_init(pkctx)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!EVP_PKEY_keygen(pkctx, &pkey)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
EVP_PKEY_CTX_free(pkctx);
|
||||
|
||||
if (0) {
|
||||
EVP_PKEY_print_public(out, pkey, 4, NULL);
|
||||
BIO_printf(out, "\n");
|
||||
EVP_PKEY_print_private(out, pkey, 4, NULL);
|
||||
BIO_printf(out, "\n");
|
||||
}
|
||||
|
||||
if (!(pkctx = EVP_PKEY_CTX_new(pkey, engine))) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* EVP_PKEY_sign() */
|
||||
|
||||
if (!EVP_PKEY_sign_init(pkctx)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
bzero(sig, sizeof(sig));
|
||||
siglen = sizeof(sig);
|
||||
dgstlen = 32;
|
||||
|
||||
if (!EVP_PKEY_sign(pkctx, sig, &siglen, dgst, dgstlen)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
size_t i;
|
||||
printf("signature (%zu bytes) = ", siglen);
|
||||
for (i = 0; i < siglen; i++) {
|
||||
printf("%02X", sig[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (!EVP_PKEY_verify_init(pkctx)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (EVP_PKEY_verify(pkctx, sig, siglen, dgst, dgstlen) != SM2_VERIFY_SUCCESS) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
printf("signature verification success!\n");
|
||||
}
|
||||
|
||||
/* EVP_PKEY_encrypt() */
|
||||
|
||||
if (!EVP_PKEY_encrypt_init(pkctx)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
cbuflen = sizeof(cbuf);
|
||||
if (!EVP_PKEY_encrypt(pkctx, cbuf, &cbuflen, msg, msglen)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
size_t i;
|
||||
printf("ciphertext (%zu bytes) = ", cbuflen);
|
||||
for (i = 0; i < cbuflen; i++) {
|
||||
printf("%02X", cbuf[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (!EVP_PKEY_decrypt_init(pkctx)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
bzero(mbuf, sizeof(mbuf));
|
||||
mbuflen = sizeof(mbuf);
|
||||
if (!EVP_PKEY_decrypt(pkctx, mbuf, &mbuflen, cbuf, cbuflen)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
printf("original message = %s\n", msg);
|
||||
printf("decrypted message = %s\n", mbuf);
|
||||
}
|
||||
|
||||
|
||||
/* EVP_PKEY_encrypt_old */
|
||||
|
||||
|
||||
if ((len = EVP_PKEY_encrypt_old(cbuf, msg, (int)msglen, pkey)) <= 0) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
int i;
|
||||
printf("ciphertext (%d bytes) = ", len);
|
||||
for (i = 0; i < len; i++) {
|
||||
printf("%02X", cbuf[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
bzero(mbuf, sizeof(mbuf));
|
||||
if ((len = EVP_PKEY_decrypt_old(mbuf, cbuf, len, pkey)) <= 0) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
printf("original message = %s\n", msg);
|
||||
printf("decrypted message = %s\n", mbuf);
|
||||
}
|
||||
|
||||
if (!(mdctx = EVP_MD_CTX_create())) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
|
||||
/* EVP_SignInit_ex/Update/Final_ex */
|
||||
|
||||
if (!EVP_SignInit_ex(mdctx, EVP_sm3(), engine)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!EVP_SignUpdate(mdctx, msg, msglen)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!EVP_SignFinal(mdctx, sig, &ulen, pkey)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
siglen = ulen;
|
||||
|
||||
if (verbose) {
|
||||
size_t i;
|
||||
printf("signature (%zu bytes) = ", siglen);
|
||||
for (i = 0; i < siglen; i++) {
|
||||
printf("%02X", sig[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (!EVP_VerifyInit_ex(mdctx, EVP_sm3(), engine)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!EVP_VerifyUpdate(mdctx, msg, msglen)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (EVP_VerifyFinal(mdctx, sig, ulen, pkey) != SM2_VERIFY_SUCCESS) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
|
||||
/* EVP_DigestSignInit/Update/Final() */
|
||||
// FIXME: return values might be different, not just 1 or 0
|
||||
if (!EVP_DigestSignInit(mdctx, &pkctx, md, engine, pkey)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!EVP_DigestSignUpdate(mdctx, msg, msglen)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
siglen = sizeof(sig);
|
||||
if (!EVP_DigestSignFinal(mdctx, sig, &siglen)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
pkctx = NULL;
|
||||
if (!EVP_DigestVerifyInit(mdctx, &pkctx, md, engine, pkey)) {
|
||||
ERR_print_errors_fp(stderr);
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!EVP_DigestVerifyUpdate(mdctx, msg, msglen)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!EVP_DigestVerifyFinal(mdctx, sig, siglen)) {
|
||||
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
|
||||
goto end;
|
||||
}
|
||||
|
||||
|
||||
/* EVP_SealInit/Update/Final() EVP_OpenInit/Update/Final() */
|
||||
/*
|
||||
EVP_PKEY *pk[NUM_PKEYS] = {0};
|
||||
unsigned char iv[16];
|
||||
unsigned char ek[NUM_PKEYS][256];
|
||||
int eklen[NUM_PKEYS];
|
||||
|
||||
RAND_pseudo_bytes(iv, sizeof(iv));
|
||||
|
||||
int i;
|
||||
for (i = 0; i < NUM_PKEYS; i++) {
|
||||
}
|
||||
|
||||
if (!(cpctx = EVP_CIPHER_CTX_new())) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!EVP_SealInit(cpctx, cipher, ek, &ekl, iv, pubk, npubk)) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!EVP_SealUpdate(cpctx, msg, msglen)) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!EVP_SealFinal(cpctx, cbuf, (int *)&cbuflen)) {
|
||||
goto end;
|
||||
}
|
||||
*/
|
||||
|
||||
printf("test success!\n");
|
||||
ret = 1;
|
||||
end:
|
||||
ERR_print_errors_fp(stderr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1,109 +0,0 @@
|
||||
/* demo/gmssl/sm3.c */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2014 - 2015 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 <stdlib.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/err.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ret = -1;
|
||||
FILE *fp = stdin;
|
||||
unsigned char buf[1024];
|
||||
size_t len;
|
||||
const EVP_MD *md;
|
||||
EVP_MD_CTX mdctx;
|
||||
unsigned char dgst[EVP_MAX_MD_SIZE];
|
||||
unsigned int dgstlen, i;
|
||||
|
||||
if (argc == 2) {
|
||||
if (!(fp = fopen(argv[1], "r"))) {
|
||||
fprintf(stderr, "open file %s failed\n", argv[1]);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
OpenSSL_add_all_digests();
|
||||
if (!(md = EVP_get_digestbyname("sm3"))) {
|
||||
ERR_print_errors_fp(stderr);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!EVP_DigestInit(&mdctx, md)) {
|
||||
ERR_print_errors_fp(stderr);
|
||||
goto end;
|
||||
}
|
||||
|
||||
while ((len = fread(buf, 1, sizeof(buf), fp))) {
|
||||
if (!EVP_DigestUpdate(&mdctx, buf, len)) {
|
||||
ERR_print_errors_fp(stderr);
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
if (!EVP_DigestFinal(&mdctx, dgst, &dgstlen)) {
|
||||
ERR_print_errors_fp(stderr);
|
||||
goto end;
|
||||
}
|
||||
|
||||
for (i = 0; i < dgstlen; i++) {
|
||||
printf("%02x", dgst[i]);
|
||||
}
|
||||
printf("\n");
|
||||
ret = 0;
|
||||
|
||||
end:
|
||||
fclose(fp);
|
||||
EVP_cleanup();
|
||||
return ret;
|
||||
}
|
||||
|
||||
5
demos/gmssl/sm2key.pem
Normal file
5
demos/gmssl/sm2key.pem
Normal file
@@ -0,0 +1,5 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIGHAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBG0wawIBAQQg2MM/g28XAEne6VG/
|
||||
cPYUhVq8H0D/5igtUw9CUaxr2KWhRANCAAQdCrdYHfnyeFhcFQuyRrCxuGH1/bnS
|
||||
wDKinlLUFyVa72SlAz5tBaA4TPY2m5259/55lTkdVkq6gtvyW7L/VFTg
|
||||
-----END PRIVATE KEY-----
|
||||
120
demos/gmssl/sm2selfsign.c
Normal file
120
demos/gmssl/sm2selfsign.c
Normal file
@@ -0,0 +1,120 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <openssl/pem.h>
|
||||
#include <openssl/conf.h>
|
||||
#include <openssl/x509v3.h>
|
||||
|
||||
int mkit(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days);
|
||||
|
||||
int main()
|
||||
{
|
||||
BIO *bio_err;
|
||||
X509 *x509 = NULL;
|
||||
EVP_PKEY *pkey = NULL;
|
||||
|
||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
|
||||
|
||||
bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
|
||||
|
||||
mkit(&x509, &pkey, 512, 0, 365);
|
||||
|
||||
EC_KEY_print_fp(stdout, pkey->pkey.ec, 0);
|
||||
X509_print_fp(stdout, x509);
|
||||
|
||||
PEM_write_PrivateKey(stdout, pkey, NULL, NULL, 0, NULL, NULL);
|
||||
PEM_write_X509(stdout, x509);
|
||||
|
||||
X509_free(x509);
|
||||
EVP_PKEY_free(pkey);
|
||||
|
||||
CRYPTO_mem_leaks(bio_err);
|
||||
BIO_free(bio_err);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int mkit(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days)
|
||||
{
|
||||
X509 *x;
|
||||
EVP_PKEY *pk;
|
||||
EC_KEY *ec_key;
|
||||
X509_NAME *name = NULL;
|
||||
X509_NAME_ENTRY *ne = NULL;
|
||||
X509_EXTENSION *ex = NULL;
|
||||
|
||||
if ((pkeyp == NULL) || (*pkeyp == NULL)) {
|
||||
if ((pk = EVP_PKEY_new()) == NULL) {
|
||||
abort();
|
||||
return (0);
|
||||
}
|
||||
} else
|
||||
pk = *pkeyp;
|
||||
|
||||
if ((x509p == NULL) || (*x509p == NULL)) {
|
||||
if ((x = X509_new()) == NULL)
|
||||
goto err;
|
||||
} else {
|
||||
x = *x509p;
|
||||
}
|
||||
|
||||
|
||||
ec_key = EC_KEY_new_by_curve_name(NID_sm2p256v1);
|
||||
EC_KEY_generate_key(ec_key);
|
||||
|
||||
if (!EVP_PKEY_assign_EC_KEY(pk, ec_key)) {
|
||||
abort();
|
||||
goto err;
|
||||
}
|
||||
ec_key = NULL;
|
||||
|
||||
X509_set_version(x, 3);
|
||||
ASN1_INTEGER_set(X509_get_serialNumber(x), serial);
|
||||
X509_gmtime_adj(X509_get_notBefore(x), 0);
|
||||
X509_gmtime_adj(X509_get_notAfter(x), (long)60 * 60 * 24 * days);
|
||||
X509_set_pubkey(x, pk);
|
||||
|
||||
name = X509_get_subject_name(x);
|
||||
|
||||
/*
|
||||
* This function creates and adds the entry, working out the correct
|
||||
* string type and performing checks on its length. Normally we'd check
|
||||
* the return value for errors...
|
||||
*/
|
||||
X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, "UK", -1, -1, 0);
|
||||
X509_NAME_add_entry_by_txt(name, "CN",
|
||||
MBSTRING_ASC, "OpenSSL Group", -1, -1, 0);
|
||||
|
||||
X509_set_issuer_name(x, name);
|
||||
|
||||
/*
|
||||
* Add extension using V3 code: we can set the config file as NULL
|
||||
* because we wont reference any other sections. We can also set the
|
||||
* context to NULL because none of these extensions below will need to
|
||||
* access it.
|
||||
*/
|
||||
|
||||
ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_cert_type, "server");
|
||||
X509_add_ext(x, ex, -1);
|
||||
X509_EXTENSION_free(ex);
|
||||
|
||||
ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_comment,
|
||||
"example comment extension");
|
||||
X509_add_ext(x, ex, -1);
|
||||
X509_EXTENSION_free(ex);
|
||||
|
||||
ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_ssl_server_name,
|
||||
"www.openssl.org");
|
||||
|
||||
X509_add_ext(x, ex, -1);
|
||||
X509_EXTENSION_free(ex);
|
||||
|
||||
|
||||
if (!X509_sign(x, pk, EVP_sm3()))
|
||||
goto err;
|
||||
|
||||
*x509p = x;
|
||||
*pkeyp = pk;
|
||||
return (1);
|
||||
err:
|
||||
return (0);
|
||||
}
|
||||
Reference in New Issue
Block a user