Thanks for the prompt to get the details out wider to the TC - it has been a busy couple of weeks.
I don't see deterministic as separate mechanisms - I see those as parameters as to whether or not additional random is used. The input processing logic in terms of function calls for the user is identical.
The signatures are verified via an identical process and there are no separate OIDs defined for variations that are deterministic and hedged. Hedged is the recommended default with deterministic to only be used on platforms where there is no decent RNG available (i.e. effectively almost nowhere these days).
By contrast, the HASH versions have entirely separate OIDs and the function calls you use to process them will be different in application logic - you will have to perform the HASH operations before calling the signing (or verification) functions.
A deterministic hash based signature and a deterministic non-hash based signature have different signatures and for verification the user has to know which they are dealing with for the processing logic (verification will be done differently - in that for hash you have to go off and do the hashing first). Those to me are very different contexts and should be different mechanisms.
That you have a different OID and that they are treated differently in applications to me is a very clear indicator that we should have different mechanisms.
In KMIP we have HASH as separate, and we do not see deterministic as anything other than a parameter to the operation. The corresponding algorithm identifiers (when mapped into language specific naming using the KMIP english-to-identifier mapping rules are:
KMIP_CRYPTOGRAPHIC_ALGORITHM_ML_KEM_512
KMIP_CRYPTOGRAPHIC_ALGORITHM_ML_KEM_768
KMIP_CRYPTOGRAPHIC_ALGORITHM_ML_KEM_1024
KMIP_CRYPTOGRAPHIC_ALGORITHM_ML_DSA_44
KMIP_CRYPTOGRAPHIC_ALGORITHM_ML_DSA_65
KMIP_CRYPTOGRAPHIC_ALGORITHM_ML_DSA_87
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_ML_DSA_44_WITH_SHA512
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_ML_DSA_65_WITH_SHA512
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_ML_DSA_87_WITH_SHA512
KMIP_CRYPTOGRAPHIC_ALGORITHM_SLH_DSA_SHA2_128S
KMIP_CRYPTOGRAPHIC_ALGORITHM_SLH_DSA_SHA2_128F
KMIP_CRYPTOGRAPHIC_ALGORITHM_SLH_DSA_SHA2_192S
KMIP_CRYPTOGRAPHIC_ALGORITHM_SLH_DSA_SHA2_192F
KMIP_CRYPTOGRAPHIC_ALGORITHM_SLH_DSA_SHA2_256S
KMIP_CRYPTOGRAPHIC_ALGORITHM_SLH_DSA_SHA2_256F
KMIP_CRYPTOGRAPHIC_ALGORITHM_SLH_DSA_SHAKE_128S
KMIP_CRYPTOGRAPHIC_ALGORITHM_SLH_DSA_SHAKE_128F
KMIP_CRYPTOGRAPHIC_ALGORITHM_SLH_DSA_SHAKE_192S
KMIP_CRYPTOGRAPHIC_ALGORITHM_SLH_DSA_SHAKE_192F
KMIP_CRYPTOGRAPHIC_ALGORITHM_SLH_DSA_SHAKE_256S
KMIP_CRYPTOGRAPHIC_ALGORITHM_SLH_DSA_SHAKE_256F
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_SLH_DSA_SHA2_128S_WITH_SHA256
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_SLH_DSA_SHA2_128F_WITH_SHA256
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_SLH_DSA_SHA2_192S_WITH_SHA512
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_SLH_DSA_SHA2_192F_WITH_SHA512
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_SLH_DSA_SHA2_256S_WITH_SHA512
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_SLH_DSA_SHA2_256F_WITH_SHA512
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_SLH_DSA_SHAKE_128S_WITH_SHAKE128
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_SLH_DSA_SHAKE_128F_WITH_SHAKE128
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_SLH_DSA_SHAKE_192S_WITH_SHAKE256
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_SLH_DSA_SHAKE_192F_WITH_SHAKE256
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_SLH_DSA_SHAKE_256S_WITH_SHAKE256
KMIP_CRYPTOGRAPHIC_ALGORITHM_HASH_SLH_DSA_SHAKE_256F_WITH_SHAKE256
Note that these precisely match NISTs terminology (and that is also the KMIP philosophy to not introduce different naming schemes without compelling reasons).
In PKCS#11 we have made groups (ML-KEM, ML-DSA, SLH-DSA) and added parameter sets.
In API usage where the end user interacts in various programming languages it is mostly handled as entirely independent strings (i.e. the user does not ask for "ML-KEM" - they ask for "ML-KEM-512" - there is no concept of the "family" having any meaning - the family without the parameter set is non-usable.
Personally I see the NIST naming convention for SLH-DSA at odds with the approach taken in ML-DSA where they could have simply had a table of parameter sets rather than using the building block of the various constituent parts in the naming. But in KMIP terms, we follow whatever the convention of the origin specification is - inconsistencies and all.
There is also an interesting contrast in HPKE with DHKEM where the parameter sets have numeric identifiers but the names list the constituent parts.
And ML-DSA or ML-KEM based naming would have had given us:
DHKEM-16
DHKEM-17
DHKEM-18
DHKEM-32
DHKEM-33
But if we were following SLH-DSA naming we would get:
DHKEM-P256-HKDF-SHA256
DHKEM-P384-HKDF-SHA384
DHKEM-P521-HKDF-SHA512
DHKEM-X25519-HKDF-SHA256
DHKEM-X448-HKDF-SHA512
Again in HPKE there is no concept of combining arbitrary building blocks - the combination has to be known and there has to be a mapping to the identifiers used which come out in the encoding.
In OpenSSL terms for HPKE we see the parameter set as an identifier that has to be provided. They have been shortened to the following:
OSSL_HPKE_KEM_ID_P256
OSSL_HPKE_KEM_ID_P384
OSSL_HPKE_KEM_ID_P521
OSSL_HPKE_KEM_ID_X25519
OSSL_HPKE_KEM_ID_X448
So not as verbose as a SHL-DSA -like naming scheme but not as short as a ML-DSA-like or ML-KEM-like naming scheme. The ML-KEM being the approach which I expect other KEMs will start following going forward.
I'll be updating the KMIP specification for DHKEM handling as we currently haven't got the KEM parameter set handled for HPKE yet.
Tim.