diff --git a/tools/gmssl.c b/tools/gmssl.c index cbf0d315..7dacd551 100644 --- a/tools/gmssl.c +++ b/tools/gmssl.c @@ -49,15 +49,9 @@ #include #include #include -#include -#include -#include -#include -#include -#include -#include +extern int version_main(int argc, char **argv); extern int rand_main(int argc, char **argv); extern int certgen_main(int argc, char **argv); extern int certparse_main(int argc, char **argv); @@ -67,14 +61,21 @@ extern int pbkdf2_main(int argc, char **argv); extern int reqgen_main(int argc, char **argv); extern int reqparse_main(int argc, char **argv); extern int reqsign_main(int argc, char **argv); -extern int sm2decrypt_main(int argc, char **argv); -extern int sm2encrypt_main(int argc, char **argv); extern int sm2keygen_main(int argc, char **argv); extern int sm2sign_main(int argc, char **argv); extern int sm2verify_main(int argc, char **argv); +extern int sm2encrypt_main(int argc, char **argv); +extern int sm2decrypt_main(int argc, char **argv); extern int sm3_main(int argc, char **argv); extern int sm3hmac_main(int argc, char **argv); extern int sm4_main(int argc, char **argv); +extern int zuc_main(int argc, char **argv); +extern int sm9setup_main(int argc, char **argv); +extern int sm9keygen_main(int argc, char **argv); +extern int sm9sign_main(int argc, char **argv); +extern int sm9verify_main(int argc, char **argv); +extern int sm9encrypt_main(int argc, char **argv); +extern int sm9decrypt_main(int argc, char **argv); extern int tlcp_client_main(int argc, char **argv); extern int tlcp_server_main(int argc, char **argv); extern int tls12_client_main(int argc, char **argv); @@ -84,59 +85,60 @@ extern int tls13_server_main(int argc, char **argv); static const char *options = - " commands:\n" - " help\n" - " version\n" - " rand\n" - " sm2keygen\n" - " sm2sign\n" - " sm2verify\n" - " sm2encrypt\n" - " sm2decrypt\n" - " sm3\n" - " sm3hmac\n" - " sm4\n" - " pbkdf2\n" - " reqgen\n" - " reqsign\n" - " reqparse\n" - " crlparse\n" - " certgen\n" - " certparse\n" - " certverify\n" - " tlcp_client\n" - " tlcp_server\n" - " tls12_client\n" - " tls12_server\n" - " tls13_client\n" - " tls13_server\n"; + "command [options]\n" + "\n" + "Commands:\n" + " help Print commands list or help for one command\n" + " version Print version\n" + " rand Generate random bytes\n" + " sm2keygen Generate SM2 keypair\n" + " sm2sign Generate SM2 signature\n" + " sm2verify Verify SM2 signature\n" + " sm2encrypt SM2 public key encryption\n" + " sm2decrypt SM2 decryption\n" + " sm3 Generate SM3 hash\n" + " sm3hmac Generate HMAC-SM3 MAC tag\n" + " sm4 Encrypt or decrypt data with SM4\n" + " zuc Encrypt or decrypt data with ZUC\n" + " sm9setup Generate SM9 master secret\n" + " sm9keygen Generate SM9 private key\n" + " sm9sign Generate SM9 signature\n" + " sm9verify Verify SM9 signature\n" + " sm9encrypt SM9 public key encryption\n" + " sm9decrypt SM9 decryption\n" + " pbkdf2 Generate key from password\n" + " reqgen Generate PKCS #10 certificate signing request (CSR)\n" + " reqsign Generate a certificate from PKCS #10 CSR\n" + " reqparse Parse and print a PKCS #10 CSR\n" + " crlparse Parse and print CRL\n" + " certgen Generate a self-signed X.509 certificate in PEM format\n" + " certparse Parse and print certificates in a PEM file\n" + " certverify Verify certificate chain in a PEM file\n" + " tlcp_client TLCP client\n" + " tlcp_server TLCP server\n" + " tls12_client TLS 1.2 client\n" + " tls12_server TLS 1.2 server\n" + " tls13_client TLS 1.3 client\n" + " tls13_server TLS 1.3 server\n"; -int version_main(int argc, char **argv) -{ - printf("%s\n", gmssl_version_str()); - return 0; -} - int main(int argc, char **argv) { int ret = 1; char *prog = argv[0]; - - if (argc < 2) { - printf("usage: %s\n %s\n", prog, options); - return 0; - } - argc--; argv++; + if (argc < 1) { + printf("Usage: %s %s\n", prog, options); + return 1; + } + while (argc > 0) { if (!strcmp(*argv, "help")) { -help: - printf("usage: %s\n %s\n", prog, options); + printf("usage: %s %s\n", prog, options); return 0; } else if (!strcmp(*argv, "version")) { return version_main(argc, argv); @@ -156,6 +158,8 @@ help: return reqsign_main(argc, argv); } else if (!strcmp(*argv, "pbkdf2")) { return pbkdf2_main(argc, argv); + } else if (!strcmp(*argv, "sm2keygen")) { + return sm2keygen_main(argc, argv); } else if (!strcmp(*argv, "sm2sign")) { return sm2sign_main(argc, argv); } else if (!strcmp(*argv, "sm2verify")) { @@ -164,14 +168,26 @@ help: return sm2encrypt_main(argc, argv); } else if (!strcmp(*argv, "sm2decrypt")) { return sm2decrypt_main(argc, argv); - } else if (!strcmp(*argv, "sm2keygen")) { - return sm2keygen_main(argc, argv); } else if (!strcmp(*argv, "sm3")) { return sm3_main(argc, argv); } else if (!strcmp(*argv, "sm3hmac")) { return sm3hmac_main(argc, argv); } else if (!strcmp(*argv, "sm4")) { return sm4_main(argc, argv); + } else if (!strcmp(*argv, "zuc")) { + return zuc_main(argc, argv); + } else if (!strcmp(*argv, "sm9setup")) { + return sm9setup_main(argc, argv); + } else if (!strcmp(*argv, "sm9keygen")) { + return sm9keygen_main(argc, argv); + } else if (!strcmp(*argv, "sm9sign")) { + return sm9sign_main(argc, argv); + } else if (!strcmp(*argv, "sm9verify")) { + return sm9verify_main(argc, argv); + } else if (!strcmp(*argv, "sm9encrypt")) { + return sm9encrypt_main(argc, argv); + } else if (!strcmp(*argv, "sm9decrypt")) { + return sm9decrypt_main(argc, argv); } else if (!strcmp(*argv, "tlcp_client")) { return tlcp_client_main(argc, argv); } else if (!strcmp(*argv, "tlcp_server")) { @@ -185,7 +201,6 @@ help: } else if (!strcmp(*argv, "tls13_server")) { return tls13_server_main(argc, argv); } else { -bad: fprintf(stderr, "%s: illegal option '%s'\n", prog, *argv); fprintf(stderr, "usage: %s %s\n", prog, options); return 1; diff --git a/tools/sm3.c b/tools/sm3.c index 412d6d54..674460ee 100644 --- a/tools/sm3.c +++ b/tools/sm3.c @@ -49,19 +49,26 @@ #include #include #include -#include #include +#include #include +static const char *options = "[-hex|-bin] [-pubkey pem [-id str]] [-in file]"; + + + int sm3_main(int argc, char **argv) { + int ret = 1; char *prog = argv[0]; + int bin = 0; char *pubkeyfile = NULL; char *infile = NULL; char *id = NULL; FILE *pubkeyfp = NULL; FILE *infp = stdin; + SM3_CTX sm3_ctx; uint8_t dgst[32]; uint8_t buf[4096]; @@ -73,26 +80,32 @@ int sm3_main(int argc, char **argv) while (argc > 0) { if (!strcmp(*argv, "-help")) { -help: - fprintf(stderr, "usage: %s [-pubkey pem [-id str]] [-in file]\n", prog); + fprintf(stderr, "usage: %s %s\n", prog, options); fprintf(stderr, "usage: echo -n \"abc\" | %s\n", prog); - return -1; - + return 0; + } else if (!strcmp(*argv, "-hex")) { + if (bin) { + error_print(); + goto end; + } + bin = 0; + } else if (!strcmp(*argv, "-bin")) { + bin = 1; } else if (!strcmp(*argv, "-pubkey")) { if (--argc < 1) goto bad; pubkeyfile = *(++argv); - } else if (!strcmp(*argv, "-id")) { if (--argc < 1) goto bad; id = *(++argv); - } else if (!strcmp(*argv, "-in")) { if (--argc < 1) goto bad; infile = *(++argv); - } else { fprintf(stderr, "%s: illegal option '%s'\n", prog, *argv); - goto help; + goto end; +bad: + fprintf(stderr, "%s: '%s' option value required\n", prog, *argv); + goto end; } argc--; @@ -107,11 +120,11 @@ help: if (!(pubkeyfp = fopen(pubkeyfile, "r"))) { error_print(); - return -1; + goto end; } if (sm2_public_key_info_from_pem(&sm2_key, pubkeyfp) != 1) { error_print(); - return -1; + goto end; } if (!id) { id = SM2_DEFAULT_ID; @@ -123,14 +136,14 @@ help: } else { if (id) { fprintf(stderr, "%s: option '-id' must be with '-pubkey'\n", prog); - goto help; + goto end; } } if (infile) { if (!(infp = fopen(infile, "r"))) { error_print(); - return -1; + goto end; } } while ((len = fread(buf, 1, sizeof(buf), infp)) > 0) { @@ -138,17 +151,19 @@ help: } sm3_finish(&sm3_ctx, dgst); - for (i = 0; i < sizeof(dgst); i++) { - printf("%02x", dgst[i]); - } - printf("\n"); - if (infile) { - fclose(infp); + if (bin) { + fwrite(dgst, 1, 32, stdout); + } else { + for (i = 0; i < sizeof(dgst); i++) { + printf("%02x", dgst[i]); + } + printf("\n"); } - return 0; -bad: - fprintf(stderr, "%s: '%s' option value required\n", prog, *argv); - return -1; + ret = 0; + +end: + if (infile) fclose(infp); + return ret; } diff --git a/tools/sm9decrypt.c b/tools/sm9decrypt.c new file mode 100644 index 00000000..7c5209d4 --- /dev/null +++ b/tools/sm9decrypt.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021 - 2021 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 + + +int sm9decrypt_main(int argc, char **argv) +{ + fprintf(stderr, "%s: not implemented\n", argv[0]); + return 1; +} diff --git a/tools/sm9encrypt.c b/tools/sm9encrypt.c new file mode 100644 index 00000000..767c4db7 --- /dev/null +++ b/tools/sm9encrypt.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021 - 2021 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 + + +int sm9encrypt_main(int argc, char **argv) +{ + fprintf(stderr, "%s: not implemented\n", argv[0]); + return 1; +} diff --git a/tools/sm9keygen.c b/tools/sm9keygen.c new file mode 100644 index 00000000..b3aa2e28 --- /dev/null +++ b/tools/sm9keygen.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021 - 2021 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 + + +int sm9keygen_main(int argc, char **argv) +{ + fprintf(stderr, "%s: not implemented\n", argv[0]); + return 1; +} diff --git a/tools/sm9setup.c b/tools/sm9setup.c new file mode 100644 index 00000000..fbac6424 --- /dev/null +++ b/tools/sm9setup.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021 - 2021 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 + + +int sm9setup_main(int argc, char **argv) +{ + fprintf(stderr, "%s: not implemented\n", argv[0]); + return 1; +} diff --git a/tools/sm9sign.c b/tools/sm9sign.c new file mode 100644 index 00000000..eb350939 --- /dev/null +++ b/tools/sm9sign.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021 - 2021 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 + + +int sm9sign_main(int argc, char **argv) +{ + fprintf(stderr, "%s: not implemented\n", argv[0]); + return 1; +} diff --git a/tools/sm9verify.c b/tools/sm9verify.c new file mode 100644 index 00000000..95c6fffc --- /dev/null +++ b/tools/sm9verify.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021 - 2021 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 + + +int sm9verify_main(int argc, char **argv) +{ + fprintf(stderr, "%s: not implemented\n", argv[0]); + return 1; +} diff --git a/tools/version.c b/tools/version.c new file mode 100644 index 00000000..9786609d --- /dev/null +++ b/tools/version.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2020 - 2021 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 + + +int version_main(int argc, char **argv) +{ + printf("%s\n", gmssl_version_str()); + return 0; +} diff --git a/tools/zuc.c b/tools/zuc.c new file mode 100644 index 00000000..e2013fc5 --- /dev/null +++ b/tools/zuc.c @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2014 - 2021 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 + + + +static const char *options = "-key hex -iv hex [-in file] [-out file]"; + + +int zuc_main(int argc, char **argv) +{ + char *prog = argv[0]; + char *keystr = NULL; + char *ivstr = NULL; + char *infile = NULL; + char *outfile = NULL; + uint8_t key[16]; + uint8_t iv[16]; + size_t keylen = sizeof(key); + size_t ivlen = sizeof(iv); + FILE *infp = stdin; + FILE *outfp = stdout; + ZUC_CTX zuc_ctx; + uint8_t inbuf[4096]; + size_t inlen; + uint8_t outbuf[4196]; + size_t outlen; + + if (argc < 2) { + fprintf(stderr, "usage: %s %s\n", prog, options); + return 1; + } + + argc--; + argv++; + + while (argc > 0) { + if (!strcmp(*argv, "-help")) { + fprintf(stderr, "usage: %s %s\n", prog, options); + return 0; + } else if (!strcmp(*argv, "-key")) { + if (--argc < 1) goto bad; + keystr = *(++argv); + } else if (!strcmp(*argv, "-iv")) { + if (--argc < 1) goto bad; + ivstr = *(++argv); + } else if (!strcmp(*argv, "-in")) { + if (--argc < 1) goto bad; + infile = *(++argv); + } else if (!strcmp(*argv, "-out")) { + if (--argc < 1) goto bad; + outfile = *(++argv); + } else { + fprintf(stderr, "%s: illegal option '%s'\n", prog, *argv); + return 1; +bad: + fprintf(stderr, "%s: no option value\n", prog); + return 1; + } + + argc--; + argv++; + } + + if (!keystr) { + error_print(); + return -1; + } + if (strlen(keystr) != 32) { + printf("keystr len = %d\n", strlen(keystr)); + error_print(); + return -1; + } + if (hex_to_bytes(keystr, strlen(keystr), key, &keylen) != 1) { + error_print(); + return -1; + } + + if (!ivstr) { + error_print(); + return -1; + } + if (strlen(ivstr) != 32) { + error_print(); + return -1; + } + if (hex_to_bytes(ivstr, strlen(ivstr), iv, &ivlen) != 1) { + error_print(); + return -1; + } + + if (infile) { + if (!(infp = fopen(infile, "r"))) { + error_print(); + return -1; + } + } + if (outfile) { + if (!(outfp = fopen(outfile, "w"))) { + error_print(); + return -1; + } + } + + if (zuc_encrypt_init(&zuc_ctx, key, iv) != 1) { + error_print(); + return -1; + } + while ((inlen = fread(inbuf, 1, sizeof(inbuf), infp)) > 0) { + if (zuc_encrypt_update(&zuc_ctx, inbuf, inlen, outbuf, &outlen) != 1) { + error_print(); + return -1; + } + if (fwrite(outbuf, 1, outlen, outfp) != outlen) { + error_print(); + return -1; + } + } + if (zuc_encrypt_finish(&zuc_ctx, outbuf, &outlen) != 1) { + error_print(); + return -1; + } + if (fwrite(outbuf, 1, outlen, outfp) != outlen) { + error_print(); + return -1; + } + + return 0; +}