From 477f87afb5ee0d5f3f74a42ae2c15872108b8bb5 Mon Sep 17 00:00:00 2001 From: Lukasz Pawelczyk Date: Tue, 26 Apr 2016 15:04:30 +0200 Subject: [PATCH] key_import/key_export example Change-Id: Ia638fdc60c88684163dc6afe3aa3e83d65684950 --- examples/CMakeLists.txt | 1 + examples/key_import_export.c | 231 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 232 insertions(+) create mode 100644 examples/key_import_export.c diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 9048331..fe238d2 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -50,6 +50,7 @@ BUILD_EXAMPLE("yaca-example-encrypt-gcm" encrypt_aes_gcm.c) BUILD_EXAMPLE("yaca-example-sign" sign.c) BUILD_EXAMPLE("yaca-example-key-exchange" key_exchange.c) BUILD_EXAMPLE("yaca-example-test" test.c) +BUILD_EXAMPLE("yaca-example-key-impexp" key_import_export.c) INSTALL(FILES ${COMMON_SOURCES} DESTINATION ${EXAMPLES_DIR}) diff --git a/examples/key_import_export.c b/examples/key_import_export.c new file mode 100644 index 0000000..fba4664 --- /dev/null +++ b/examples/key_import_export.c @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved + * + * Contact: Krzysztof Jackiewicz + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +/** + * @file key_import_export.c + * @brief + */ + +#include + +#include "misc.h" + +#include +#include +#include +#include +#include + +void key_import_export_sym(yaca_key_h sym) +{ + int ret; + + char *raw = NULL; + size_t raw_len; + char *b64= NULL; + size_t b64_len; + + yaca_key_h raw_imported = YACA_KEY_NULL; + yaca_key_h b64_imported = YACA_KEY_NULL; + + + ret = yaca_key_export(sym, YACA_KEY_FORMAT_DEFAULT, YACA_KEY_FILE_FORMAT_BASE64, &b64, &b64_len); + if (ret != 0) + return; + ret = yaca_key_import(&b64_imported, YACA_KEY_TYPE_SYMMETRIC, b64, b64_len); + if (ret != 0) + goto free; + + printf("\n\t***** BASE64 exported key: *****\n%*s\n", (int)b64_len, b64); + yaca_free(b64); + b64 = NULL; + + ret = yaca_key_export(b64_imported, YACA_KEY_FORMAT_DEFAULT, YACA_KEY_FILE_FORMAT_BASE64, &b64, &b64_len); + if (ret != 0) + goto free; + + printf("\t***** BASE64 imported key: *****\n%*s\n", (int)b64_len, b64); + + + ret = yaca_key_export(sym, YACA_KEY_FORMAT_DEFAULT, YACA_KEY_FILE_FORMAT_RAW, &raw, &raw_len); + if (ret != 0) + goto free; + ret = yaca_key_import(&raw_imported, YACA_KEY_TYPE_SYMMETRIC, raw, raw_len); + if (ret != 0) + goto free; + + dump_hex(raw, raw_len, "\n\t***** RAW exported key: *****"); + yaca_free(raw); + raw = NULL; + + ret = yaca_key_export(raw_imported, YACA_KEY_FORMAT_DEFAULT, YACA_KEY_FILE_FORMAT_RAW, &raw, &raw_len); + if (ret != 0) + goto free; + + dump_hex(raw, raw_len, "\t***** RAW imported key: *****"); + +free: + yaca_key_free(raw_imported); + yaca_key_free(b64_imported); + yaca_free(raw); + yaca_free(b64); +} + +void key_import_export_rsa(yaca_key_h priv, yaca_key_h pub) +{ + int ret; + + char *pem_prv = NULL; + size_t pem_prv_len; + char *der_prv = NULL; + size_t der_prv_len; + + char *pem_pub = NULL; + size_t pem_pub_len; + char *der_pub = NULL; + size_t der_pub_len; + + yaca_key_h pem_prv_imported = YACA_KEY_NULL; + yaca_key_h der_prv_imported = YACA_KEY_NULL; + yaca_key_h pem_pub_imported = YACA_KEY_NULL; + yaca_key_h der_pub_imported = YACA_KEY_NULL; + + + /* PEM private */ + + ret = yaca_key_export(priv, YACA_KEY_FORMAT_DEFAULT, YACA_KEY_FILE_FORMAT_PEM, &pem_prv, &pem_prv_len); + if (ret != 0) + return; + ret = yaca_key_import(&pem_prv_imported, YACA_KEY_TYPE_RSA_PRIV, pem_prv, pem_prv_len); + if (ret != 0) + goto free; + + printf("\n\t***** PEM exported private key: *****\n%*s", (int)pem_prv_len, pem_prv); + yaca_free(pem_prv); + pem_prv = NULL; + + ret = yaca_key_export(pem_prv_imported, YACA_KEY_FORMAT_DEFAULT, YACA_KEY_FILE_FORMAT_PEM, &pem_prv, &pem_prv_len); + if (ret != 0) + goto free; + + printf("\t***** PEM imported private key: *****\n%*s", (int)pem_prv_len, pem_prv); + + + /* DER private */ + + ret = yaca_key_export(priv, YACA_KEY_FORMAT_DEFAULT, YACA_KEY_FILE_FORMAT_DER, &der_prv, &der_prv_len); + if (ret != 0) + goto free; + ret = yaca_key_import(&der_prv_imported, YACA_KEY_TYPE_RSA_PRIV, der_prv, der_prv_len); + if (ret != 0) + goto free; + + dump_hex(der_prv, der_prv_len, "\n\t***** DER exported private key: *****"); + yaca_free(der_prv); + der_prv = NULL; + + ret = yaca_key_export(der_prv_imported, YACA_KEY_FORMAT_DEFAULT, YACA_KEY_FILE_FORMAT_DER, &der_prv, &der_prv_len); + if (ret != 0) + goto free; + + dump_hex(der_prv, der_prv_len, "\t***** DER imported private key: *****"); + + + /* PEM public */ + + ret = yaca_key_export(pub, YACA_KEY_FORMAT_DEFAULT, YACA_KEY_FILE_FORMAT_PEM, &pem_pub, &pem_pub_len); + if (ret != 0) + goto free; + ret = yaca_key_import(&pem_pub_imported, YACA_KEY_TYPE_RSA_PUB, pem_pub, pem_pub_len); + if (ret != 0) + goto free; + + printf("\n\t***** PEM exported public key: *****\n%*s", (int)pem_pub_len, pem_pub); + yaca_free(pem_pub); + pem_pub = NULL; + + ret = yaca_key_export(pem_pub_imported, YACA_KEY_FORMAT_DEFAULT, YACA_KEY_FILE_FORMAT_PEM, &pem_pub, &pem_pub_len); + if (ret != 0) + goto free; + + printf("\t***** PEM imported public key: *****\n%*s", (int)pem_pub_len, pem_pub); + + + /* DER public */ + + ret = yaca_key_export(pub, YACA_KEY_FORMAT_DEFAULT, YACA_KEY_FILE_FORMAT_DER, &der_pub, &der_pub_len); + if (ret != 0) + goto free; + ret = yaca_key_import(&der_pub_imported, YACA_KEY_TYPE_RSA_PUB, der_pub, der_pub_len); + if (ret != 0) + goto free; + + dump_hex(der_pub, der_pub_len, "\n\t***** DER exported public key: *****"); + yaca_free(der_pub); + der_pub = NULL; + + ret = yaca_key_export(der_pub_imported, YACA_KEY_FORMAT_DEFAULT, YACA_KEY_FILE_FORMAT_DER, &der_pub, &der_pub_len); + if (ret != 0) + goto free; + + dump_hex(der_pub, der_pub_len, "\t***** DER imported public key: *****"); + +free: + yaca_key_free(der_pub_imported); + yaca_key_free(pem_pub_imported); + yaca_key_free(der_prv_imported); + yaca_key_free(pem_prv_imported); + yaca_free(der_pub); + yaca_free(pem_pub); + yaca_free(der_prv); + yaca_free(pem_prv); +} + +int main() +{ + yaca_key_h sym; + yaca_key_h rsa_priv; + yaca_key_h rsa_pub; + int ret; + + ret = yaca_init(); + if (ret != 0) + return ret; + + yaca_error_set_debug_func(debug_func); + + ret = yaca_key_gen(&sym, YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_1024BIT); + if (ret != 0) + goto exit; + + ret = yaca_key_gen_pair(&rsa_priv, &rsa_pub, YACA_KEY_TYPE_PAIR_RSA, YACA_KEY_1024BIT); + if (ret != 0) + goto free_sym; + + key_import_export_sym(sym); + key_import_export_rsa(rsa_priv, rsa_pub); + + yaca_key_free(rsa_priv); + yaca_key_free(rsa_pub); +free_sym: + yaca_key_free(sym); +exit: + yaca_exit(); + + return ret; +} -- 2.7.4