fix(keygen): forward symmetric algorithms to HAL and add missing JCA mappings
Symmetric keys (AES/HMAC/3DES) don't have KeyPairs or attestation certs, routing them through doSoftwareKeyGen crashes with "Unsupported algorithm: 32". Skip the software path entirely and let the real HAL handle them. Also adds CTR block mode, RSA_PKCS1_1_5_SIGN cipher padding, and RSA_PSS signature padding to JcaAlgorithmMapper.
This commit is contained in:
+9
@@ -286,6 +286,15 @@ class KeyMintSecurityLevelInterceptor(
|
|||||||
return InterceptorUtils.createErrorReply(KEYMINT_CANNOT_ATTEST_IDS)
|
return InterceptorUtils.createErrorReply(KEYMINT_CANNOT_ATTEST_IDS)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val isSymmetric = parsedParams.algorithm == Algorithm.AES ||
|
||||||
|
parsedParams.algorithm == Algorithm.HMAC ||
|
||||||
|
parsedParams.algorithm == Algorithm.TRIPLE_DES
|
||||||
|
|
||||||
|
if (isSymmetric) {
|
||||||
|
SystemLogger.debug("[TX_ID: $txId] Symmetric algorithm ${parsedParams.algorithm} → forwarding to HAL")
|
||||||
|
return TransactionResult.ContinueAndSkipPost
|
||||||
|
}
|
||||||
|
|
||||||
val keyId = KeyIdentifier(callingUid, keyDescriptor.alias)
|
val keyId = KeyIdentifier(callingUid, keyDescriptor.alias)
|
||||||
val isAttestKeyRequest = parsedParams.isAttestKey()
|
val isAttestKeyRequest = parsedParams.isAttestKey()
|
||||||
|
|
||||||
|
|||||||
+14
-11
@@ -34,16 +34,17 @@ private object JcaAlgorithmMapper {
|
|||||||
Digest.SHA_2_512 -> "SHA512"
|
Digest.SHA_2_512 -> "SHA512"
|
||||||
else -> "NONE"
|
else -> "NONE"
|
||||||
}
|
}
|
||||||
val keyAlgo =
|
return when (params.algorithm) {
|
||||||
when (params.algorithm) {
|
Algorithm.EC -> "${digest}withECDSA"
|
||||||
Algorithm.EC -> "ECDSA"
|
Algorithm.RSA -> {
|
||||||
Algorithm.RSA -> "RSA"
|
val isPss = params.padding.firstOrNull() == PaddingMode.RSA_PSS
|
||||||
else ->
|
if (isPss) "${digest}withRSA/PSS" else "${digest}withRSA"
|
||||||
throw IllegalArgumentException(
|
|
||||||
"Unsupported signature algorithm: ${params.algorithm}"
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
return "${digest}with${keyAlgo}"
|
else ->
|
||||||
|
throw IllegalArgumentException(
|
||||||
|
"Unsupported signature algorithm: ${params.algorithm}"
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun mapCipherAlgorithm(params: KeyMintAttestation): String {
|
fun mapCipherAlgorithm(params: KeyMintAttestation): String {
|
||||||
@@ -60,16 +61,18 @@ private object JcaAlgorithmMapper {
|
|||||||
when (params.blockMode.firstOrNull()) {
|
when (params.blockMode.firstOrNull()) {
|
||||||
BlockMode.ECB -> "ECB"
|
BlockMode.ECB -> "ECB"
|
||||||
BlockMode.CBC -> "CBC"
|
BlockMode.CBC -> "CBC"
|
||||||
|
BlockMode.CTR -> "CTR"
|
||||||
BlockMode.GCM -> "GCM"
|
BlockMode.GCM -> "GCM"
|
||||||
else -> "ECB" // Default for RSA
|
else -> "ECB"
|
||||||
}
|
}
|
||||||
val padding =
|
val padding =
|
||||||
when (params.padding.firstOrNull()) {
|
when (params.padding.firstOrNull()) {
|
||||||
PaddingMode.NONE -> "NoPadding"
|
PaddingMode.NONE -> "NoPadding"
|
||||||
PaddingMode.PKCS7 -> "PKCS7Padding"
|
PaddingMode.PKCS7 -> "PKCS7Padding"
|
||||||
PaddingMode.RSA_PKCS1_1_5_ENCRYPT -> "PKCS1Padding"
|
PaddingMode.RSA_PKCS1_1_5_ENCRYPT -> "PKCS1Padding"
|
||||||
|
PaddingMode.RSA_PKCS1_1_5_SIGN -> "PKCS1Padding"
|
||||||
PaddingMode.RSA_OAEP -> "OAEPPadding"
|
PaddingMode.RSA_OAEP -> "OAEPPadding"
|
||||||
else -> "NoPadding" // Default for GCM
|
else -> "NoPadding"
|
||||||
}
|
}
|
||||||
return "$keyAlgo/$blockMode/$padding"
|
return "$keyAlgo/$blockMode/$padding"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user