@@ -51,6 +51,8 @@ static std::string mechanismToString(CK_MECHANISM_TYPE mechanism)
5151 return " CKM_ECDSA_SHA384" ;
5252 case CKM_ECDSA_SHA512:
5353 return " CKM_ECDSA_SHA512" ;
54+ case CKM_EDDSA:
55+ return " CKM_EDDSA" ;
5456 default :
5557 debug (" Unknown mechanism type: %#lx" , mechanism);
5658 return std::string (" CKM_AS_VALUE_" ) + std::to_string (mechanism);
@@ -578,6 +580,9 @@ static CK_RV extractKeyAttributeValue(
578580 case EVP_PKEY_EC:
579581 key_type = CKK_ECDSA;
580582 break ;
583+ case EVP_PKEY_ED25519:
584+ key_type = CKK_EC_EDWARDS;
585+ break ;
581586 default :
582587 return CKR_ATTRIBUTE_TYPE_INVALID;
583588 }
@@ -613,7 +618,7 @@ static CK_RV extractKeyAttributeValue(
613618 if (pkey == nullptr ) {
614619 return CKR_FUNCTION_FAILED;
615620 }
616- if (EVP_PKEY_base_id (pkey.get ()) != EVP_PKEY_EC) {
621+ if (auto id = EVP_PKEY_base_id (pkey.get ()); id != EVP_PKEY_EC && id != EVP_PKEY_ED25519 ) {
617622 return CKR_ATTRIBUTE_TYPE_INVALID;
618623 }
619624
@@ -639,23 +644,31 @@ static CK_RV extractKeyAttributeValue(
639644 if (pkey == nullptr ) {
640645 return CKR_FUNCTION_FAILED;
641646 }
642- if (EVP_PKEY_base_id (pkey.get ()) != EVP_PKEY_EC) {
643- return CKR_ATTRIBUTE_TYPE_INVALID;
644- }
647+ auto id = EVP_PKEY_base_id (pkey.get ());
648+ if (id == EVP_PKEY_EC) {
649+ char group_name[256 ];
650+ size_t group_name_len = sizeof (group_name);
651+ if (!EVP_PKEY_get_utf8_string_param (
652+ pkey.get (), OSSL_PKEY_PARAM_GROUP_NAME, group_name, sizeof (group_name), &group_name_len)) {
653+ return CKR_FUNCTION_FAILED;
654+ }
645655
646- char group_name[256 ];
647- size_t group_name_len = sizeof (group_name);
648- if (!EVP_PKEY_get_utf8_string_param (
649- pkey.get (), OSSL_PKEY_PARAM_GROUP_NAME, group_name, sizeof (group_name), &group_name_len)) {
650- return CKR_FUNCTION_FAILED;
651- }
656+ auto group = std::shared_ptr<EC_GROUP>(EC_GROUP_new_by_curve_name (OBJ_txt2nid (group_name)), EC_GROUP_free);
657+ if (!group) {
658+ return CKR_FUNCTION_FAILED;
659+ }
652660
653- auto group = std::shared_ptr<EC_GROUP>(EC_GROUP_new_by_curve_name (OBJ_txt2nid (group_name)), EC_GROUP_free);
654- if (!group) {
655- return CKR_FUNCTION_FAILED;
656- }
661+ return read_safe (i2d_ECPKParameters, group.get (), pValueDest, pValueDestLen);
662+ } else if (id == EVP_PKEY_ED25519) {
663+ auto ed25519_oid = std::shared_ptr<ASN1_OBJECT>(OBJ_nid2obj (EVP_PKEY_ED25519), ASN1_OBJECT_free);
664+ if (!ed25519_oid) {
665+ return CKR_FUNCTION_FAILED;
666+ }
657667
658- return read_safe (i2d_ECPKParameters, group.get (), pValueDest, pValueDestLen);
668+ return read_safe (i2d_ASN1_OBJECT, ed25519_oid.get (), pValueDest, pValueDestLen);
669+ } else {
670+ return CKR_ATTRIBUTE_TYPE_INVALID;
671+ }
659672 }
660673 default :
661674 return extractCommonAttributeValue (session, attr, pValueDest, pValueDestLen);
0 commit comments