void yaca_key_destroy(yaca_key_h key);
/**
+ * @brief Derives a key using Diffie-Helmann or EC Diffie-Helmann key exchange protocol.
+ *
+ * @since_tizen 3.0
+ *
+ * @remarks The @a sym_key should be released using yaca_key_destroy()
+ *
+ * @param[in] prv_key Our private key
+ * @param[in] pub_key Peer public key
+ * @param[out] sym_key Shared secret, that can be used as a symmetric key
+ *
+ * @return #YACA_ERROR_NONE on success, negative on error
+ * @retval #YACA_ERROR_NONE Successful
+ * @retval #YACA_ERROR_INVALID_PARAMETER Required parameters have incorrect values
+ * @retval #YACA_ERROR_OUT_OF_MEMORY Out of memory error
+ * @retval #YACA_ERROR_INTERNAL Internal error
+ *
+ * @see yaca_key_destroy()
+ */
+int yaca_key_derive_dh(const yaca_key_h prv_key,
+ const yaca_key_h pub_key,
+ yaca_key_h *sym_key);
+
+/**
* @brief Derives a key from user password (PKCS #5 a.k.a. pbkdf2 algorithm).
*
* @since_tizen 3.0
type = private ? YACA_KEY_TYPE_DSA_PRIV : YACA_KEY_TYPE_DSA_PUB;
break;
-// case EVP_PKEY_EC:
-// type = private ? YACA_KEY_TYPE_EC_PRIV : YACA_KEY_TYPE_EC_PUB;
-// break;
+ case EVP_PKEY_EC:
+ type = private ? YACA_KEY_TYPE_EC_PRIV : YACA_KEY_TYPE_EC_PUB;
+ break;
default:
ret = YACA_ERROR_INVALID_PARAMETER;
ret = PEM_write_bio_PUBKEY(mem, evp_key->evp);
break;
-// case YACA_KEY_TYPE_DH_PRIV:
-// case YACA_KEY_TYPE_DH_PUB:
-// case YACA_KEY_TYPE_EC_PRIV:
-// case YACA_KEY_TYPE_EC_PUB:
-// TODO NOT_IMPLEMENTED
+ case YACA_KEY_TYPE_DH_PRIV:
+ case YACA_KEY_TYPE_DH_PUB:
+ case YACA_KEY_TYPE_EC_PRIV:
+ case YACA_KEY_TYPE_EC_PUB:
+ //TODO NOT_IMPLEMENTED
default:
return YACA_ERROR_INVALID_PARAMETER;
}
ret = i2d_PUBKEY_bio(mem, evp_key->evp);
break;
-// case YACA_KEY_TYPE_DH_PRIV:
-// case YACA_KEY_TYPE_DH_PUB:
-// case YACA_KEY_TYPE_EC_PRIV:
-// case YACA_KEY_TYPE_EC_PUB:
-// TODO NOT_IMPLEMENTED
+ case YACA_KEY_TYPE_DH_PRIV:
+ case YACA_KEY_TYPE_DH_PUB:
+ case YACA_KEY_TYPE_EC_PRIV:
+ case YACA_KEY_TYPE_EC_PUB:
+ //TODO NOT_IMPLEMENTED
default:
return YACA_ERROR_INVALID_PARAMETER;
}
ret = PEM_write_bio_PKCS8PrivateKey_nid(mem, evp_key->evp, nid,
NULL, 0, NULL, (void*)password);
break;
-// case YACA_KEY_TYPE_DH_PRIV:
-// case YACA_KEY_TYPE_EC_PRIV:
-// TODO NOT_IMPLEMENTED
+ case YACA_KEY_TYPE_DH_PRIV:
+ case YACA_KEY_TYPE_EC_PRIV:
+ //TODO NOT_IMPLEMENTED
default:
/* Public keys are not supported by PKCS8 */
return YACA_ERROR_INVALID_PARAMETER;
NULL, 0, NULL, (void*)password);
break;
-// case YACA_KEY_TYPE_DH_PRIV:
-// case YACA_KEY_TYPE_EC_PRIV:
-// TODO NOT_IMPLEMENTED
+ case YACA_KEY_TYPE_DH_PRIV:
+ case YACA_KEY_TYPE_EC_PRIV:
+ //TODO NOT_IMPLEMENTED
default:
/* Public keys are not supported by PKCS8 */
return YACA_ERROR_INVALID_PARAMETER;
case YACA_KEY_TYPE_DSA_PUB:
case YACA_KEY_TYPE_DSA_PRIV:
return import_evp(key, key_type, password, data, data_len);
-// case YACA_KEY_TYPE_DH_PUB:
-// case YACA_KEY_TYPE_DH_PRIV:
-// case YACA_KEY_TYPE_EC_PUB:
-// case YACA_KEY_TYPE_EC_PRIV:
-// TODO NOT_IMPLEMENTED
+ case YACA_KEY_TYPE_DH_PUB:
+ case YACA_KEY_TYPE_DH_PRIV:
+ case YACA_KEY_TYPE_EC_PUB:
+ case YACA_KEY_TYPE_EC_PRIV:
+ //TODO NOT_IMPLEMENTED
default:
return YACA_ERROR_INVALID_PARAMETER;
}
case YACA_KEY_TYPE_DSA_PRIV:
ret = generate_evp_dsa(&nk_evp, key_bit_len);
break;
-// case YACA_KEY_TYPE_DH_PRIV:
-// case YACA_KEY_TYPE_EC_PRIV:
-// TODO NOT_IMPLEMENTED
+ case YACA_KEY_TYPE_DH_PRIV:
+ case YACA_KEY_TYPE_EC_PRIV:
+ //TODO NOT_IMPLEMENTED
default:
return YACA_ERROR_INVALID_PARAMETER;
}
case YACA_KEY_TYPE_DSA_PRIV:
nk->key.type = YACA_KEY_TYPE_DSA_PUB;
break;
-// case YACA_KEY_TYPE_EC_PRIV:
-// nk->key.type = YACA_KEY_TYPE_EC_PUB;
-// break;
+ case YACA_KEY_TYPE_EC_PRIV:
+ nk->key.type = YACA_KEY_TYPE_EC_PUB;
+ break;
default:
ret = YACA_ERROR_INVALID_PARAMETER;
goto exit;
}
}
+API int yaca_key_derive_dh(UNUSED const yaca_key_h prv_key,
+ UNUSED const yaca_key_h pub_key,
+ UNUSED yaca_key_h *sym_key)
+{
+ //TODO NOT_IMPLEMENTED
+ return YACA_ERROR_INVALID_PARAMETER;
+}
+
API int yaca_key_derive_pbkdf2(const char *password,
const char *salt,
size_t salt_len,