change format of TEE_ATTR_ECC_PRIVATE_VALUE 02/297102/5
authorDongsun Lee <ds73.lee@samsung.com>
Thu, 10 Aug 2023 07:44:20 +0000 (16:44 +0900)
committerDong Sun Lee <ds73.lee@samsung.com>
Fri, 11 Aug 2023 00:28:41 +0000 (00:28 +0000)
- from DER to binary

Change-Id: I7e6ebc27069416fd23f3735c13b700beed9db95b

ssflib/inc/ssf_crypto_openssl.h
ssflib/src/ssf_crypto.cpp
ssflib/src/ssf_crypto_openssl.cpp
ssflib/src/ssf_storage.cpp

index e945007ca9a590becb9452976a3e6dc92ff945be..07c0b925a59a2dcab0792f28315005ad1167a142 100644 (file)
@@ -41,8 +41,8 @@ int ossl_crypto_ae_enc_final(crypto_internal_operation *op, void *src, size_t sr
                                                        void *dst, size_t *dst_len, void *tag, size_t *tag_len);
 int ossl_crypto_ae_dec_final(crypto_internal_operation *op, void *src, size_t src_len,
                                                        void *dst, size_t *dst_len, void *tag, size_t tag_len);
-int ossl_ecdsa_sign(crypto_internal_keydata priv_key, const void *src, size_t src_len,
-                                                       void *sig, size_t *sig_len);
+int ossl_ecdsa_sign(uint32_t curve, crypto_internal_keydata priv_key,
+                                                       const void *src, size_t src_len, void *sig, size_t *sig_len);
 int ossl_ecdsa_verify(uint32_t curve, crypto_internal_keydata pub_x, crypto_internal_keydata pub_y,
                                                        const void *src, size_t src_len, const void *sig, size_t sig_len);
 int ossl_ecdh_derive(crypto_internal_keydata prv_key, uint32_t curve,
index 3506a4d12d7ee3a82f037260a4043141dd7654d2..6535cb70d095336e85ee649c32513388e766a5a7 100644 (file)
@@ -2750,7 +2750,7 @@ TEE_Result TEE_AsymmetricSignDigest( TEE_OperationHandle operation, const TEE_At
        }
 
        if (info.objectType == TEE_TYPE_ECDSA_KEYPAIR || info.objectType == TEE_TYPE_ECDH_KEYPAIR) {
-               ret = ossl_ecdsa_sign(key.ecc_private, digest, digestLen, signature, signatureLen);
+               ret = ossl_ecdsa_sign(key.ecc_curve, key.ecc_private, digest, digestLen, signature, signatureLen);
        } else {
                if (crypto_internal_init(op, &key, NULL, 0)) {
                        CRYPTO_PANIC;
index aac63e43de52245c44c1137ee6a0e2483d7203a8..fd556e9134984a11835b063daa7e2b14536ecaef 100644 (file)
@@ -297,21 +297,39 @@ int ossl_crypto_ae_dec_final(crypto_internal_operation *op, void *src, size_t sr
        return 0;
 }
 
-int ossl_ecdsa_sign(crypto_internal_keydata priv_key,
-                                       const void *src, size_t src_len,
-                                       void *sig, size_t *sig_len)
+int ossl_ecdsa_sign(uint32_t curve, crypto_internal_keydata priv_key,
+                                                       const void *src, size_t src_len, void *sig, size_t *sig_len)
 {
        EC_KEY* eckey = NULL;
-       BIO* bio = NULL;
+       BIGNUM *bn_priv = NULL;
+       int nid = 0;
        int ret = 0;
 
-       bio = BIO_new_mem_buf(priv_key.buffer, priv_key.size);
+       if (curve_to_nid(curve, &nid) != 0) {
+               LOGE(MODULE_SSF_LIB, "ossl_ecdsa_sign: to_nid() failed");
+               ret = -1;
+               goto clean;
+       }
 
-       if ((eckey = d2i_ECPrivateKey_bio(bio, NULL)) == NULL) {
-               LOGE(MODULE_SSF_LIB, "ossl_ecdsa_sign: d2i_ECPrivateKey_bio() failed");
+       eckey = EC_KEY_new_by_curve_name(nid);
+       if(eckey == NULL) {
+               LOGE(MODULE_SSF_LIB, "ossl_ecdsa_sign: EC_KEY_new_by_curve_name() failed");
                ret = -1;
                goto clean;
-    }
+       }
+       EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE);
+
+       bn_priv = BN_bin2bn(priv_key.buffer, priv_key.size, NULL);
+       if(bn_priv == NULL) {
+               LOGE(MODULE_SSF_LIB, "ossl_ecdsa_sign: BN_bin2bn() failed");
+               ret = -1;
+               goto clean;
+       }
+       if (!EC_KEY_set_private_key(eckey, bn_priv)) {
+               LOGE(MODULE_SSF_LIB, "ossl_ecdsa_sign: EC_KEY_set_private_key() failed");
+               ret = -1;
+               goto clean;
+       }
 
        if (ECDSA_sign(0, (unsigned char *)src, (int) src_len,
                                        (unsigned char *) sig, (unsigned int *)sig_len, eckey) == 0) {
@@ -322,7 +340,7 @@ int ossl_ecdsa_sign(crypto_internal_keydata priv_key,
 
 clean:
        EC_KEY_free(eckey);
-       BIO_free(bio);
+       BN_free(bn_priv);
        return ret;
 }
 
@@ -338,7 +356,7 @@ int ossl_ecdsa_verify(uint32_t curve,
        int ret = 0;
 
        if (curve_to_nid(curve, &nid) != 0) {
-               LOGE(MODULE_SSF_LIB, "ossl_ecdsa_sign: to_nid() failed");
+               LOGE(MODULE_SSF_LIB, "ossl_ecdsa_verify: to_nid() failed");
                ret = -2;
                goto clean;
        }
@@ -378,22 +396,34 @@ int ossl_ecdh_derive(crypto_internal_keydata priv_key,
                                        void *secret, size_t *secret_len)
 {      int nid = 0;
        EC_KEY *my_key = NULL, *peer_key = NULL;
-       BIGNUM *x = NULL, *y = NULL;
+       BIGNUM *bn_priv = NULL, *x = NULL, *y = NULL;
        int ret = 0;
 
-       BIO* bio = BIO_new_mem_buf(priv_key.buffer, priv_key.size);
-       if ((my_key = d2i_ECPrivateKey_bio(bio, NULL)) == NULL) {
-               LOGE(MODULE_SSF_LIB, "ossl_ecdh_derive: d2i_ECPrivateKey_bio() failed");
-               ret = -1;
+       if (curve_to_nid(curve, &nid) != 0) {
+               LOGE(MODULE_SSF_LIB, "ossl_ecdh_derive: to_nid() failed");
+               ret = -2;
                goto clean;
        }
 
-       if (curve_to_nid(curve, &nid) != 0) {
-               LOGE(MODULE_SSF_LIB, "ossl_ecdh_derive: to_nid() failed");
+       my_key = EC_KEY_new_by_curve_name(nid);
+       if(my_key == NULL) {
+               LOGE(MODULE_SSF_LIB, "ossl_ecdh_derive: EC_KEY_new_by_curve_name() failed");
                ret = -2;
                goto clean;
        }
 
+       bn_priv = BN_bin2bn(priv_key.buffer, priv_key.size, NULL);
+       if(bn_priv == NULL) {
+               LOGE(MODULE_SSF_LIB, "ossl_ecdh_derive: BN_bin2bn() failed");
+               ret = -1;
+               goto clean;
+       }
+       if (!EC_KEY_set_private_key(my_key, bn_priv)) {
+               LOGE(MODULE_SSF_LIB, "ossl_ecdh_derive: EC_KEY_set_private_key() failed");
+               ret = -1;
+               goto clean;
+       }
+
        peer_key = EC_KEY_new_by_curve_name(nid);
        if(peer_key == NULL) {
                LOGE(MODULE_SSF_LIB, "ossl_ecdh_derive: EC_KEY_new_by_curve_name() failed");
@@ -434,7 +464,7 @@ int ossl_ecdh_derive(crypto_internal_keydata priv_key,
 clean:
        EC_KEY_free(my_key);
        EC_KEY_free(peer_key);
-       BIO_free(bio);
+       BN_free(bn_priv);
        BN_free(x);
        BN_free(y);
        return ret;
index e54b5c389b36df8601267a473aaa0609d81beda9..344aea8256afac64f5db6b1f66a8755127ab0a69 100644 (file)
@@ -146,27 +146,6 @@ void free_attribute(TEE_Attribute* attr) {
        }
 }
 
-int to_buffer(BIO *bio, uint8_t **buffer, size_t *size) {
-       uint8_t tmp[1024*4];
-       uint8_t* tmp_buffer;
-       size_t read = 0;
-
-       BIO_seek(bio, 0);
-       read = BIO_read(bio, tmp, sizeof(tmp));
-       if (read >= sizeof(tmp)) { // Too Big Data
-               return -1;
-       }
-       tmp_buffer = (uint8_t*) malloc(read);
-       if(tmp_buffer == NULL) {
-               return -1;
-       }
-       memcpy(tmp_buffer, tmp, read);
-
-       *buffer = tmp_buffer;
-       *size = read;
-       return 0;
-}
-
 /////////////////////////////////////////////////////////////////////////////////////////////
 // Internal transient Object Operations
 /////////////////////////////////////////////////////////////////////////////////////////////
@@ -1864,12 +1843,14 @@ TEE_Result TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize,
                case TEE_TYPE_ECDH_KEYPAIR: {
                        size_t key_size = (keySize + 7) / 8;
                        int nid = 0;
+                       uint32_t curve = 0;
                        uint8_t *privKey = NULL, *pubX = NULL, *pubY = NULL;
                        size_t privSize = 0, pubXSize = 0, pubYSize = 0;
 
                        for (i = 0; i < paramCount; i++) {
                                if (params[i].attributeID == TEE_ATTR_ECC_CURVE) {
-                                       if (curve_to_nid(params[i].content.value.a, &nid) != 0)
+                                       curve = params[i].content.value.a;
+                                       if (curve_to_nid(curve, &nid) != 0)
                                                return TEE_ERROR_BAD_PARAMETERS;
                                        check |= 0x01;
                                }
@@ -1894,13 +1875,13 @@ TEE_Result TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize,
                                TEE_Panic(0);
                        }
 
-                       BIO *bio_pri = BIO_new(BIO_s_mem());
-                       i2d_ECPrivateKey_bio(bio_pri, ec_key);
-
-                       if(to_buffer(bio_pri, &privKey, &privSize) != 0) {
-                               TZ_ERROR("failed to convert private key to binary. line = %d,%s\n", __LINE__, __func__);
+                       const BIGNUM *priv_value = EC_KEY_get0_private_key(ec_key);
+                       privKey = (uint8_t *) malloc(BN_num_bytes(priv_value));
+                       if(privKey == NULL) {
+                               TZ_ERROR("malloc() operation error line = %d,%s\n", __LINE__, __func__);
                                TEE_Panic(0);
                        }
+                       privSize = BN_bn2bin(priv_value, privKey);
 
                        const EC_POINT *pubkey_pnt = EC_KEY_get0_public_key(ec_key);
                        BIGNUM *x = BN_new();
@@ -1909,17 +1890,18 @@ TEE_Result TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize,
                                TZ_ERROR("failed in EC_POINT_get_affine_coordinates_GFp(). line = %d,%s\n", __LINE__, __func__);
                                TEE_Panic(0);
                        }
-                       pubX = (uint8_t *) malloc(key_size);
-                       pubY = (uint8_t *) malloc(key_size);
+                       pubX = (uint8_t *) malloc(BN_num_bytes(x));
+                       pubY = (uint8_t *) malloc(BN_num_bytes(y));
                        pubXSize = BN_bn2bin(x, pubX);
                        pubYSize = BN_bn2bin(y, pubY);
-                       if (key_size < pubXSize || key_size < pubYSize) {
-                               TZ_ERROR("Too small key size. line = %d,%s. key_size=%d, pubXSize=%d, pubYSize=%d\n",
-                                               __LINE__, __func__, key_size, pubXSize, pubYSize);
+
+                       if (key_size < privSize || key_size < pubXSize || key_size < pubYSize) {
+                               TZ_ERROR("Too small key size. line = %d,%s. key_size=%d, privSize=%d, pubXSize=%d, pubYSize=%d\n",
+                                               __LINE__, __func__, key_size, privSize, pubXSize, pubYSize);
                                TEE_Panic(0);
                        }
 
-                       TEE_InitValueAttribute(&attrs[0], params[0].attributeID, params[0].content.value.a, params[0].content.value.b);
+                       TEE_InitValueAttribute(&attrs[0], TEE_ATTR_ECC_CURVE, curve, 0);
                        TEE_InitRefAttribute(&attrs[1], TEE_ATTR_ECC_PRIVATE_VALUE, privKey, privSize);
                        TEE_InitRefAttribute(&attrs[2], TEE_ATTR_ECC_PUBLIC_VALUE_X, pubX, pubXSize);
                        TEE_InitRefAttribute(&attrs[3], TEE_ATTR_ECC_PUBLIC_VALUE_Y, pubY, pubYSize);
@@ -1927,7 +1909,6 @@ TEE_Result TEE_GenerateKey(TEE_ObjectHandle object, uint32_t keySize,
 
                        EC_GROUP_free(ec_group);
                        EC_KEY_free(ec_key);
-                       BIO_free(bio_pri);
                        BN_free(x);
                        BN_free(y);
                        free(privKey);