1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2014, STMicroelectronics International N.V. 4 * Copyright (c) 2020, Linaro Limited 5 */ 6 7 #include <assert.h> 8 #include <bitstring.h> 9 #include <compiler.h> 10 #include <config.h> 11 #include <crypto/crypto.h> 12 #include <kernel/tee_ta_manager.h> 13 #include <kernel/user_access.h> 14 #include <mm/vm.h> 15 #include <stdlib_ext.h> 16 #include <string_ext.h> 17 #include <string.h> 18 #include <sys/queue.h> 19 #include <tee_api_defines_extensions.h> 20 #include <tee_api_types.h> 21 #include <tee/tee_cryp_utl.h> 22 #include <tee/tee_obj.h> 23 #include <tee/tee_svc_cryp.h> 24 #include <tee/tee_svc.h> 25 #include <trace.h> 26 #include <utee_defines.h> 27 #include <util.h> 28 #if defined(CFG_CRYPTO_HKDF) 29 #include <tee/tee_cryp_hkdf.h> 30 #endif 31 #if defined(CFG_CRYPTO_CONCAT_KDF) 32 #include <tee/tee_cryp_concat_kdf.h> 33 #endif 34 #if defined(CFG_CRYPTO_PBKDF2) 35 #include <tee/tee_cryp_pbkdf2.h> 36 #endif 37 38 enum cryp_state { 39 CRYP_STATE_INITIALIZED = 0, 40 CRYP_STATE_UNINITIALIZED 41 }; 42 43 typedef void (*tee_cryp_ctx_finalize_func_t) (void *ctx); 44 struct tee_cryp_state { 45 TAILQ_ENTRY(tee_cryp_state) link; 46 uint32_t algo; 47 uint32_t mode; 48 vaddr_t key1; 49 vaddr_t key2; 50 void *ctx; 51 tee_cryp_ctx_finalize_func_t ctx_finalize; 52 enum cryp_state state; 53 }; 54 55 struct tee_cryp_obj_secret { 56 uint32_t key_size; 57 uint32_t alloc_size; 58 59 /* 60 * Pseudo code visualize layout of structure 61 * Next follows data, such as: 62 * uint8_t data[alloc_size] 63 * key_size must never exceed alloc_size 64 */ 65 }; 66 67 #define TEE_TYPE_ATTR_OPTIONAL BIT(0) 68 #define TEE_TYPE_ATTR_REQUIRED BIT(1) 69 #define TEE_TYPE_ATTR_OPTIONAL_GROUP BIT(2) 70 #define TEE_TYPE_ATTR_SIZE_INDICATOR BIT(3) 71 #define TEE_TYPE_ATTR_GEN_KEY_OPT BIT(4) 72 #define TEE_TYPE_ATTR_GEN_KEY_REQ BIT(5) 73 #define TEE_TYPE_ATTR_BIGNUM_MAXBITS BIT(6) 74 75 /* Handle storing of generic secret keys of varying lengths */ 76 #define ATTR_OPS_INDEX_SECRET 0 77 /* Convert to/from big-endian byte array and provider-specific bignum */ 78 #define ATTR_OPS_INDEX_BIGNUM 1 79 /* Convert to/from value attribute depending on direction */ 80 #define ATTR_OPS_INDEX_VALUE 2 81 82 struct tee_cryp_obj_type_attrs { 83 uint32_t attr_id; 84 uint16_t flags; 85 uint16_t ops_index; 86 uint16_t raw_offs; 87 uint16_t raw_size; 88 }; 89 90 #define RAW_DATA(_x, _y) \ 91 .raw_offs = offsetof(_x, _y), .raw_size = MEMBER_SIZE(_x, _y) 92 93 static const struct tee_cryp_obj_type_attrs 94 tee_cryp_obj_secret_value_attrs[] = { 95 { 96 .attr_id = TEE_ATTR_SECRET_VALUE, 97 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_SIZE_INDICATOR, 98 .ops_index = ATTR_OPS_INDEX_SECRET, 99 .raw_offs = 0, 100 .raw_size = 0 101 }, 102 }; 103 104 static const struct tee_cryp_obj_type_attrs tee_cryp_obj_rsa_pub_key_attrs[] = { 105 { 106 .attr_id = TEE_ATTR_RSA_MODULUS, 107 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_SIZE_INDICATOR, 108 .ops_index = ATTR_OPS_INDEX_BIGNUM, 109 RAW_DATA(struct rsa_public_key, n) 110 }, 111 112 { 113 .attr_id = TEE_ATTR_RSA_PUBLIC_EXPONENT, 114 .flags = TEE_TYPE_ATTR_REQUIRED, 115 .ops_index = ATTR_OPS_INDEX_BIGNUM, 116 RAW_DATA(struct rsa_public_key, e) 117 }, 118 }; 119 120 static const struct tee_cryp_obj_type_attrs tee_cryp_obj_rsa_keypair_attrs[] = { 121 { 122 .attr_id = TEE_ATTR_RSA_MODULUS, 123 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_SIZE_INDICATOR, 124 .ops_index = ATTR_OPS_INDEX_BIGNUM, 125 RAW_DATA(struct rsa_keypair, n) 126 }, 127 128 { 129 .attr_id = TEE_ATTR_RSA_PUBLIC_EXPONENT, 130 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_GEN_KEY_OPT, 131 .ops_index = ATTR_OPS_INDEX_BIGNUM, 132 RAW_DATA(struct rsa_keypair, e) 133 }, 134 135 { 136 .attr_id = TEE_ATTR_RSA_PRIVATE_EXPONENT, 137 .flags = TEE_TYPE_ATTR_REQUIRED, 138 .ops_index = ATTR_OPS_INDEX_BIGNUM, 139 RAW_DATA(struct rsa_keypair, d) 140 }, 141 142 { 143 .attr_id = TEE_ATTR_RSA_PRIME1, 144 .flags = TEE_TYPE_ATTR_OPTIONAL_GROUP, 145 .ops_index = ATTR_OPS_INDEX_BIGNUM, 146 RAW_DATA(struct rsa_keypair, p) 147 }, 148 149 { 150 .attr_id = TEE_ATTR_RSA_PRIME2, 151 .flags = TEE_TYPE_ATTR_OPTIONAL_GROUP, 152 .ops_index = ATTR_OPS_INDEX_BIGNUM, 153 RAW_DATA(struct rsa_keypair, q) 154 }, 155 156 { 157 .attr_id = TEE_ATTR_RSA_EXPONENT1, 158 .flags = TEE_TYPE_ATTR_OPTIONAL_GROUP, 159 .ops_index = ATTR_OPS_INDEX_BIGNUM, 160 RAW_DATA(struct rsa_keypair, dp) 161 }, 162 163 { 164 .attr_id = TEE_ATTR_RSA_EXPONENT2, 165 .flags = TEE_TYPE_ATTR_OPTIONAL_GROUP, 166 .ops_index = ATTR_OPS_INDEX_BIGNUM, 167 RAW_DATA(struct rsa_keypair, dq) 168 }, 169 170 { 171 .attr_id = TEE_ATTR_RSA_COEFFICIENT, 172 .flags = TEE_TYPE_ATTR_OPTIONAL_GROUP, 173 .ops_index = ATTR_OPS_INDEX_BIGNUM, 174 RAW_DATA(struct rsa_keypair, qp) 175 }, 176 }; 177 178 static const struct tee_cryp_obj_type_attrs tee_cryp_obj_dsa_pub_key_attrs[] = { 179 { 180 .attr_id = TEE_ATTR_DSA_PRIME, 181 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_BIGNUM_MAXBITS, 182 .ops_index = ATTR_OPS_INDEX_BIGNUM, 183 RAW_DATA(struct dsa_public_key, p) 184 }, 185 186 { 187 .attr_id = TEE_ATTR_DSA_SUBPRIME, 188 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_SIZE_INDICATOR, 189 .ops_index = ATTR_OPS_INDEX_BIGNUM, 190 RAW_DATA(struct dsa_public_key, q) 191 }, 192 193 { 194 .attr_id = TEE_ATTR_DSA_BASE, 195 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_BIGNUM_MAXBITS, 196 .ops_index = ATTR_OPS_INDEX_BIGNUM, 197 RAW_DATA(struct dsa_public_key, g) 198 }, 199 200 { 201 .attr_id = TEE_ATTR_DSA_PUBLIC_VALUE, 202 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_BIGNUM_MAXBITS, 203 .ops_index = ATTR_OPS_INDEX_BIGNUM, 204 RAW_DATA(struct dsa_public_key, y) 205 }, 206 }; 207 208 static const struct tee_cryp_obj_type_attrs tee_cryp_obj_dsa_keypair_attrs[] = { 209 { 210 .attr_id = TEE_ATTR_DSA_PRIME, 211 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_GEN_KEY_REQ | 212 TEE_TYPE_ATTR_BIGNUM_MAXBITS, 213 .ops_index = ATTR_OPS_INDEX_BIGNUM, 214 RAW_DATA(struct dsa_keypair, p) 215 }, 216 217 { 218 .attr_id = TEE_ATTR_DSA_SUBPRIME, 219 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_SIZE_INDICATOR | 220 TEE_TYPE_ATTR_GEN_KEY_REQ, 221 .ops_index = ATTR_OPS_INDEX_BIGNUM, 222 RAW_DATA(struct dsa_keypair, q) 223 }, 224 225 { 226 .attr_id = TEE_ATTR_DSA_BASE, 227 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_GEN_KEY_REQ | 228 TEE_TYPE_ATTR_BIGNUM_MAXBITS, 229 .ops_index = ATTR_OPS_INDEX_BIGNUM, 230 RAW_DATA(struct dsa_keypair, g) 231 }, 232 233 { 234 .attr_id = TEE_ATTR_DSA_PRIVATE_VALUE, 235 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_BIGNUM_MAXBITS, 236 .ops_index = ATTR_OPS_INDEX_BIGNUM, 237 RAW_DATA(struct dsa_keypair, x) 238 }, 239 240 { 241 .attr_id = TEE_ATTR_DSA_PUBLIC_VALUE, 242 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_BIGNUM_MAXBITS, 243 .ops_index = ATTR_OPS_INDEX_BIGNUM, 244 RAW_DATA(struct dsa_keypair, y) 245 }, 246 }; 247 248 static const struct tee_cryp_obj_type_attrs tee_cryp_obj_dh_keypair_attrs[] = { 249 { 250 .attr_id = TEE_ATTR_DH_PRIME, 251 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_SIZE_INDICATOR | 252 TEE_TYPE_ATTR_GEN_KEY_REQ, 253 .ops_index = ATTR_OPS_INDEX_BIGNUM, 254 RAW_DATA(struct dh_keypair, p) 255 }, 256 257 { 258 .attr_id = TEE_ATTR_DH_BASE, 259 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_GEN_KEY_REQ, 260 .ops_index = ATTR_OPS_INDEX_BIGNUM, 261 RAW_DATA(struct dh_keypair, g) 262 }, 263 264 { 265 .attr_id = TEE_ATTR_DH_PUBLIC_VALUE, 266 .flags = TEE_TYPE_ATTR_REQUIRED, 267 .ops_index = ATTR_OPS_INDEX_BIGNUM, 268 RAW_DATA(struct dh_keypair, y) 269 }, 270 271 { 272 .attr_id = TEE_ATTR_DH_PRIVATE_VALUE, 273 .flags = TEE_TYPE_ATTR_REQUIRED, 274 .ops_index = ATTR_OPS_INDEX_BIGNUM, 275 RAW_DATA(struct dh_keypair, x) 276 }, 277 278 { 279 .attr_id = TEE_ATTR_DH_SUBPRIME, 280 .flags = TEE_TYPE_ATTR_OPTIONAL_GROUP | TEE_TYPE_ATTR_GEN_KEY_OPT, 281 .ops_index = ATTR_OPS_INDEX_BIGNUM, 282 RAW_DATA(struct dh_keypair, q) 283 }, 284 285 { 286 .attr_id = TEE_ATTR_DH_X_BITS, 287 .flags = TEE_TYPE_ATTR_GEN_KEY_OPT, 288 .ops_index = ATTR_OPS_INDEX_VALUE, 289 RAW_DATA(struct dh_keypair, xbits) 290 }, 291 }; 292 293 #if defined(CFG_CRYPTO_HKDF) 294 static const struct tee_cryp_obj_type_attrs 295 tee_cryp_obj_hkdf_ikm_attrs[] = { 296 { 297 .attr_id = TEE_ATTR_HKDF_IKM, 298 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_SIZE_INDICATOR, 299 .ops_index = ATTR_OPS_INDEX_SECRET, 300 .raw_offs = 0, 301 .raw_size = 0 302 }, 303 }; 304 #endif 305 306 #if defined(CFG_CRYPTO_CONCAT_KDF) 307 static const struct tee_cryp_obj_type_attrs 308 tee_cryp_obj_concat_kdf_z_attrs[] = { 309 { 310 .attr_id = TEE_ATTR_CONCAT_KDF_Z, 311 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_SIZE_INDICATOR, 312 .ops_index = ATTR_OPS_INDEX_SECRET, 313 .raw_offs = 0, 314 .raw_size = 0 315 }, 316 }; 317 #endif 318 319 #if defined(CFG_CRYPTO_PBKDF2) 320 static const struct tee_cryp_obj_type_attrs 321 tee_cryp_obj_pbkdf2_passwd_attrs[] = { 322 { 323 .attr_id = TEE_ATTR_PBKDF2_PASSWORD, 324 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_SIZE_INDICATOR, 325 .ops_index = ATTR_OPS_INDEX_SECRET, 326 .raw_offs = 0, 327 .raw_size = 0 328 }, 329 }; 330 #endif 331 332 static const struct tee_cryp_obj_type_attrs tee_cryp_obj_ecc_pub_key_attrs[] = { 333 { 334 .attr_id = TEE_ATTR_ECC_PUBLIC_VALUE_X, 335 .flags = TEE_TYPE_ATTR_REQUIRED, 336 .ops_index = ATTR_OPS_INDEX_BIGNUM, 337 RAW_DATA(struct ecc_public_key, x) 338 }, 339 340 { 341 .attr_id = TEE_ATTR_ECC_PUBLIC_VALUE_Y, 342 .flags = TEE_TYPE_ATTR_REQUIRED, 343 .ops_index = ATTR_OPS_INDEX_BIGNUM, 344 RAW_DATA(struct ecc_public_key, y) 345 }, 346 347 { 348 .attr_id = TEE_ATTR_ECC_CURVE, 349 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_SIZE_INDICATOR, 350 .ops_index = ATTR_OPS_INDEX_VALUE, 351 RAW_DATA(struct ecc_public_key, curve) 352 }, 353 }; 354 355 static const struct tee_cryp_obj_type_attrs tee_cryp_obj_ecc_keypair_attrs[] = { 356 { 357 .attr_id = TEE_ATTR_ECC_PRIVATE_VALUE, 358 .flags = TEE_TYPE_ATTR_REQUIRED, 359 .ops_index = ATTR_OPS_INDEX_BIGNUM, 360 RAW_DATA(struct ecc_keypair, d) 361 }, 362 363 { 364 .attr_id = TEE_ATTR_ECC_PUBLIC_VALUE_X, 365 .flags = TEE_TYPE_ATTR_REQUIRED, 366 .ops_index = ATTR_OPS_INDEX_BIGNUM, 367 RAW_DATA(struct ecc_keypair, x) 368 }, 369 370 { 371 .attr_id = TEE_ATTR_ECC_PUBLIC_VALUE_Y, 372 .flags = TEE_TYPE_ATTR_REQUIRED, 373 .ops_index = ATTR_OPS_INDEX_BIGNUM, 374 RAW_DATA(struct ecc_keypair, y) 375 }, 376 377 { 378 .attr_id = TEE_ATTR_ECC_CURVE, 379 .flags = TEE_TYPE_ATTR_REQUIRED | TEE_TYPE_ATTR_SIZE_INDICATOR | 380 TEE_TYPE_ATTR_GEN_KEY_REQ, 381 .ops_index = ATTR_OPS_INDEX_VALUE, 382 RAW_DATA(struct ecc_keypair, curve) 383 }, 384 }; 385 386 struct tee_cryp_obj_type_props { 387 TEE_ObjectType obj_type; 388 uint16_t min_size; /* may not be smaller than this */ 389 uint16_t max_size; /* may not be larger than this */ 390 uint16_t alloc_size; /* this many bytes are allocated to hold data */ 391 uint8_t quanta; /* may only be an multiple of this */ 392 393 uint8_t num_type_attrs; 394 const struct tee_cryp_obj_type_attrs *type_attrs; 395 }; 396 397 #define PROP(obj_type, quanta, min_size, max_size, alloc_size, type_attrs) \ 398 { (obj_type), (min_size), (max_size), (alloc_size), (quanta), \ 399 ARRAY_SIZE(type_attrs), (type_attrs) } 400 401 static const struct tee_cryp_obj_type_props tee_cryp_obj_props[] = { 402 PROP(TEE_TYPE_AES, 64, 128, 256, /* valid sizes 128, 192, 256 */ 403 256 / 8 + sizeof(struct tee_cryp_obj_secret), 404 tee_cryp_obj_secret_value_attrs), 405 PROP(TEE_TYPE_DES, 64, 64, 64, 406 /* Valid size 64 with parity */ 407 64 / 8 + sizeof(struct tee_cryp_obj_secret), 408 tee_cryp_obj_secret_value_attrs), 409 PROP(TEE_TYPE_DES3, 64, 128, 192, 410 /* Valid sizes 128, 192 with parity */ 411 192 / 8 + sizeof(struct tee_cryp_obj_secret), 412 tee_cryp_obj_secret_value_attrs), 413 PROP(TEE_TYPE_SM4, 128, 128, 128, 414 128 / 8 + sizeof(struct tee_cryp_obj_secret), 415 tee_cryp_obj_secret_value_attrs), 416 PROP(TEE_TYPE_HMAC_MD5, 8, 64, 512, 417 512 / 8 + sizeof(struct tee_cryp_obj_secret), 418 tee_cryp_obj_secret_value_attrs), 419 PROP(TEE_TYPE_HMAC_SHA1, 8, 80, 512, 420 512 / 8 + sizeof(struct tee_cryp_obj_secret), 421 tee_cryp_obj_secret_value_attrs), 422 PROP(TEE_TYPE_HMAC_SHA224, 8, 112, 512, 423 512 / 8 + sizeof(struct tee_cryp_obj_secret), 424 tee_cryp_obj_secret_value_attrs), 425 PROP(TEE_TYPE_HMAC_SHA256, 8, 192, 1024, 426 1024 / 8 + sizeof(struct tee_cryp_obj_secret), 427 tee_cryp_obj_secret_value_attrs), 428 PROP(TEE_TYPE_HMAC_SHA384, 8, 256, 1024, 429 1024 / 8 + sizeof(struct tee_cryp_obj_secret), 430 tee_cryp_obj_secret_value_attrs), 431 PROP(TEE_TYPE_HMAC_SHA512, 8, 256, 1024, 432 1024 / 8 + sizeof(struct tee_cryp_obj_secret), 433 tee_cryp_obj_secret_value_attrs), 434 PROP(TEE_TYPE_HMAC_SM3, 8, 80, 1024, 435 512 / 8 + sizeof(struct tee_cryp_obj_secret), 436 tee_cryp_obj_secret_value_attrs), 437 PROP(TEE_TYPE_GENERIC_SECRET, 8, 0, 4096, 438 4096 / 8 + sizeof(struct tee_cryp_obj_secret), 439 tee_cryp_obj_secret_value_attrs), 440 #if defined(CFG_CRYPTO_HKDF) 441 PROP(TEE_TYPE_HKDF_IKM, 8, 0, 4096, 442 4096 / 8 + sizeof(struct tee_cryp_obj_secret), 443 tee_cryp_obj_hkdf_ikm_attrs), 444 #endif 445 #if defined(CFG_CRYPTO_CONCAT_KDF) 446 PROP(TEE_TYPE_CONCAT_KDF_Z, 8, 0, 4096, 447 4096 / 8 + sizeof(struct tee_cryp_obj_secret), 448 tee_cryp_obj_concat_kdf_z_attrs), 449 #endif 450 #if defined(CFG_CRYPTO_PBKDF2) 451 PROP(TEE_TYPE_PBKDF2_PASSWORD, 8, 0, 4096, 452 4096 / 8 + sizeof(struct tee_cryp_obj_secret), 453 tee_cryp_obj_pbkdf2_passwd_attrs), 454 #endif 455 PROP(TEE_TYPE_RSA_PUBLIC_KEY, 1, 256, CFG_CORE_BIGNUM_MAX_BITS, 456 sizeof(struct rsa_public_key), 457 tee_cryp_obj_rsa_pub_key_attrs), 458 459 PROP(TEE_TYPE_RSA_KEYPAIR, 1, 256, CFG_CORE_BIGNUM_MAX_BITS, 460 sizeof(struct rsa_keypair), 461 tee_cryp_obj_rsa_keypair_attrs), 462 463 PROP(TEE_TYPE_DSA_PUBLIC_KEY, 64, 512, 3072, 464 sizeof(struct dsa_public_key), 465 tee_cryp_obj_dsa_pub_key_attrs), 466 467 PROP(TEE_TYPE_DSA_KEYPAIR, 64, 512, 3072, 468 sizeof(struct dsa_keypair), 469 tee_cryp_obj_dsa_keypair_attrs), 470 471 PROP(TEE_TYPE_DH_KEYPAIR, 1, 256, 2048, 472 sizeof(struct dh_keypair), 473 tee_cryp_obj_dh_keypair_attrs), 474 475 PROP(TEE_TYPE_ECDSA_PUBLIC_KEY, 1, 192, 521, 476 sizeof(struct ecc_public_key), 477 tee_cryp_obj_ecc_pub_key_attrs), 478 479 PROP(TEE_TYPE_ECDSA_KEYPAIR, 1, 192, 521, 480 sizeof(struct ecc_keypair), 481 tee_cryp_obj_ecc_keypair_attrs), 482 483 PROP(TEE_TYPE_ECDH_PUBLIC_KEY, 1, 192, 521, 484 sizeof(struct ecc_public_key), 485 tee_cryp_obj_ecc_pub_key_attrs), 486 487 PROP(TEE_TYPE_ECDH_KEYPAIR, 1, 192, 521, 488 sizeof(struct ecc_keypair), 489 tee_cryp_obj_ecc_keypair_attrs), 490 491 PROP(TEE_TYPE_SM2_DSA_PUBLIC_KEY, 1, 256, 256, 492 sizeof(struct ecc_public_key), 493 tee_cryp_obj_ecc_pub_key_attrs), 494 495 PROP(TEE_TYPE_SM2_DSA_KEYPAIR, 1, 256, 256, 496 sizeof(struct ecc_keypair), 497 tee_cryp_obj_ecc_keypair_attrs), 498 499 PROP(TEE_TYPE_SM2_PKE_PUBLIC_KEY, 1, 256, 256, 500 sizeof(struct ecc_public_key), 501 tee_cryp_obj_ecc_pub_key_attrs), 502 503 PROP(TEE_TYPE_SM2_PKE_KEYPAIR, 1, 256, 256, 504 sizeof(struct ecc_keypair), 505 tee_cryp_obj_ecc_keypair_attrs), 506 507 PROP(TEE_TYPE_SM2_KEP_PUBLIC_KEY, 1, 256, 256, 508 sizeof(struct ecc_public_key), 509 tee_cryp_obj_ecc_pub_key_attrs), 510 511 PROP(TEE_TYPE_SM2_KEP_KEYPAIR, 1, 256, 256, 512 sizeof(struct ecc_keypair), 513 tee_cryp_obj_ecc_keypair_attrs), 514 }; 515 516 struct attr_ops { 517 TEE_Result (*from_user)(void *attr, const void *buffer, size_t size); 518 TEE_Result (*to_user)(void *attr, struct ts_session *sess, 519 void *buffer, uint64_t *size); 520 TEE_Result (*to_binary)(void *attr, void *data, size_t data_len, 521 size_t *offs); 522 bool (*from_binary)(void *attr, const void *data, size_t data_len, 523 size_t *offs); 524 TEE_Result (*from_obj)(void *attr, void *src_attr); 525 void (*free)(void *attr); 526 void (*clear)(void *attr); 527 }; 528 529 static TEE_Result op_u32_to_binary_helper(uint32_t v, uint8_t *data, 530 size_t data_len, size_t *offs) 531 { 532 uint32_t field; 533 size_t next_offs; 534 535 if (ADD_OVERFLOW(*offs, sizeof(field), &next_offs)) 536 return TEE_ERROR_OVERFLOW; 537 538 if (data && next_offs <= data_len) { 539 field = TEE_U32_TO_BIG_ENDIAN(v); 540 memcpy(data + *offs, &field, sizeof(field)); 541 } 542 (*offs) = next_offs; 543 544 return TEE_SUCCESS; 545 } 546 547 static bool op_u32_from_binary_helper(uint32_t *v, const uint8_t *data, 548 size_t data_len, size_t *offs) 549 { 550 uint32_t field; 551 552 if (!data || (*offs + sizeof(field)) > data_len) 553 return false; 554 555 memcpy(&field, data + *offs, sizeof(field)); 556 *v = TEE_U32_FROM_BIG_ENDIAN(field); 557 (*offs) += sizeof(field); 558 return true; 559 } 560 561 static TEE_Result op_attr_secret_value_from_user(void *attr, const void *buffer, 562 size_t size) 563 { 564 struct tee_cryp_obj_secret *key = attr; 565 566 /* Data size has to fit in allocated buffer */ 567 if (size > key->alloc_size) 568 return TEE_ERROR_SECURITY; 569 memcpy(key + 1, buffer, size); 570 key->key_size = size; 571 return TEE_SUCCESS; 572 } 573 574 static TEE_Result op_attr_secret_value_to_user(void *attr, 575 struct ts_session *sess __unused, 576 void *buffer, uint64_t *size) 577 { 578 TEE_Result res; 579 struct tee_cryp_obj_secret *key = attr; 580 uint64_t s; 581 uint64_t key_size; 582 583 res = copy_from_user(&s, size, sizeof(s)); 584 if (res != TEE_SUCCESS) 585 return res; 586 587 key_size = key->key_size; 588 res = copy_to_user(size, &key_size, sizeof(key_size)); 589 if (res != TEE_SUCCESS) 590 return res; 591 592 if (s < key->key_size || !buffer) 593 return TEE_ERROR_SHORT_BUFFER; 594 595 return copy_to_user(buffer, key + 1, key->key_size); 596 } 597 598 static TEE_Result op_attr_secret_value_to_binary(void *attr, void *data, 599 size_t data_len, size_t *offs) 600 { 601 TEE_Result res; 602 struct tee_cryp_obj_secret *key = attr; 603 size_t next_offs; 604 605 res = op_u32_to_binary_helper(key->key_size, data, data_len, offs); 606 if (res != TEE_SUCCESS) 607 return res; 608 609 if (ADD_OVERFLOW(*offs, key->key_size, &next_offs)) 610 return TEE_ERROR_OVERFLOW; 611 612 if (data && next_offs <= data_len) 613 memcpy((uint8_t *)data + *offs, key + 1, key->key_size); 614 (*offs) = next_offs; 615 616 return TEE_SUCCESS; 617 } 618 619 static bool op_attr_secret_value_from_binary(void *attr, const void *data, 620 size_t data_len, size_t *offs) 621 { 622 struct tee_cryp_obj_secret *key = attr; 623 uint32_t s; 624 625 if (!op_u32_from_binary_helper(&s, data, data_len, offs)) 626 return false; 627 628 if ((*offs + s) > data_len) 629 return false; 630 631 /* Data size has to fit in allocated buffer */ 632 if (s > key->alloc_size) 633 return false; 634 key->key_size = s; 635 memcpy(key + 1, (const uint8_t *)data + *offs, s); 636 (*offs) += s; 637 return true; 638 } 639 640 641 static TEE_Result op_attr_secret_value_from_obj(void *attr, void *src_attr) 642 { 643 struct tee_cryp_obj_secret *key = attr; 644 struct tee_cryp_obj_secret *src_key = src_attr; 645 646 if (src_key->key_size > key->alloc_size) 647 return TEE_ERROR_BAD_STATE; 648 memcpy(key + 1, src_key + 1, src_key->key_size); 649 key->key_size = src_key->key_size; 650 return TEE_SUCCESS; 651 } 652 653 static void op_attr_secret_value_clear(void *attr) 654 { 655 struct tee_cryp_obj_secret *key = attr; 656 657 key->key_size = 0; 658 memset(key + 1, 0, key->alloc_size); 659 } 660 661 static TEE_Result op_attr_bignum_from_user(void *attr, const void *buffer, 662 size_t size) 663 { 664 struct bignum **bn = attr; 665 666 return crypto_bignum_bin2bn(buffer, size, *bn); 667 } 668 669 static TEE_Result op_attr_bignum_to_user(void *attr, 670 struct ts_session *sess, 671 void *buffer, uint64_t *size) 672 { 673 TEE_Result res = TEE_SUCCESS; 674 struct bignum **bn = attr; 675 uint64_t req_size = 0; 676 uint64_t s = 0; 677 678 res = copy_from_user(&s, size, sizeof(s)); 679 if (res != TEE_SUCCESS) 680 return res; 681 682 req_size = crypto_bignum_num_bytes(*bn); 683 res = copy_to_user(size, &req_size, sizeof(req_size)); 684 if (res != TEE_SUCCESS) 685 return res; 686 if (!req_size) 687 return TEE_SUCCESS; 688 if (s < req_size || !buffer) 689 return TEE_ERROR_SHORT_BUFFER; 690 691 /* Check we can access data using supplied user mode pointer */ 692 res = vm_check_access_rights(&to_user_ta_ctx(sess->ctx)->uctx, 693 TEE_MEMORY_ACCESS_READ | 694 TEE_MEMORY_ACCESS_WRITE | 695 TEE_MEMORY_ACCESS_ANY_OWNER, 696 (uaddr_t)buffer, req_size); 697 if (res != TEE_SUCCESS) 698 return res; 699 /* 700 * Write the bignum (wich raw data points to) into an array of 701 * bytes (stored in buffer) 702 */ 703 crypto_bignum_bn2bin(*bn, buffer); 704 return TEE_SUCCESS; 705 } 706 707 static TEE_Result op_attr_bignum_to_binary(void *attr, void *data, 708 size_t data_len, size_t *offs) 709 { 710 TEE_Result res; 711 struct bignum **bn = attr; 712 uint32_t n = crypto_bignum_num_bytes(*bn); 713 size_t next_offs; 714 715 res = op_u32_to_binary_helper(n, data, data_len, offs); 716 if (res != TEE_SUCCESS) 717 return res; 718 719 if (ADD_OVERFLOW(*offs, n, &next_offs)) 720 return TEE_ERROR_OVERFLOW; 721 722 if (data && next_offs <= data_len) 723 crypto_bignum_bn2bin(*bn, (uint8_t *)data + *offs); 724 (*offs) = next_offs; 725 726 return TEE_SUCCESS; 727 } 728 729 static bool op_attr_bignum_from_binary(void *attr, const void *data, 730 size_t data_len, size_t *offs) 731 { 732 struct bignum **bn = attr; 733 uint32_t n; 734 735 if (!op_u32_from_binary_helper(&n, data, data_len, offs)) 736 return false; 737 738 if ((*offs + n) > data_len) 739 return false; 740 if (crypto_bignum_bin2bn((const uint8_t *)data + *offs, n, *bn)) 741 return false; 742 (*offs) += n; 743 return true; 744 } 745 746 static TEE_Result op_attr_bignum_from_obj(void *attr, void *src_attr) 747 { 748 struct bignum **bn = attr; 749 struct bignum **src_bn = src_attr; 750 751 crypto_bignum_copy(*bn, *src_bn); 752 return TEE_SUCCESS; 753 } 754 755 static void op_attr_bignum_clear(void *attr) 756 { 757 struct bignum **bn = attr; 758 759 crypto_bignum_clear(*bn); 760 } 761 762 static void op_attr_bignum_free(void *attr) 763 { 764 struct bignum **bn = attr; 765 766 crypto_bignum_free(*bn); 767 *bn = NULL; 768 } 769 770 static TEE_Result op_attr_value_from_user(void *attr, const void *buffer, 771 size_t size) 772 { 773 uint32_t *v = attr; 774 775 if (size != sizeof(uint32_t) * 2) 776 return TEE_ERROR_GENERIC; /* "can't happen */ 777 778 /* Note that only the first value is copied */ 779 memcpy(v, buffer, sizeof(uint32_t)); 780 return TEE_SUCCESS; 781 } 782 783 static TEE_Result op_attr_value_to_user(void *attr, 784 struct ts_session *sess __unused, 785 void *buffer, uint64_t *size) 786 { 787 TEE_Result res; 788 uint32_t *v = attr; 789 uint64_t s; 790 uint32_t value[2] = { *v }; 791 uint64_t req_size = sizeof(value); 792 793 res = copy_from_user(&s, size, sizeof(s)); 794 if (res != TEE_SUCCESS) 795 return res; 796 797 if (s < req_size || !buffer) 798 return TEE_ERROR_SHORT_BUFFER; 799 800 return copy_to_user(buffer, value, req_size); 801 } 802 803 static TEE_Result op_attr_value_to_binary(void *attr, void *data, 804 size_t data_len, size_t *offs) 805 { 806 uint32_t *v = attr; 807 808 return op_u32_to_binary_helper(*v, data, data_len, offs); 809 } 810 811 static bool op_attr_value_from_binary(void *attr, const void *data, 812 size_t data_len, size_t *offs) 813 { 814 uint32_t *v = attr; 815 816 return op_u32_from_binary_helper(v, data, data_len, offs); 817 } 818 819 static TEE_Result op_attr_value_from_obj(void *attr, void *src_attr) 820 { 821 uint32_t *v = attr; 822 uint32_t *src_v = src_attr; 823 824 *v = *src_v; 825 return TEE_SUCCESS; 826 } 827 828 static void op_attr_value_clear(void *attr) 829 { 830 uint32_t *v = attr; 831 832 *v = 0; 833 } 834 835 static const struct attr_ops attr_ops[] = { 836 [ATTR_OPS_INDEX_SECRET] = { 837 .from_user = op_attr_secret_value_from_user, 838 .to_user = op_attr_secret_value_to_user, 839 .to_binary = op_attr_secret_value_to_binary, 840 .from_binary = op_attr_secret_value_from_binary, 841 .from_obj = op_attr_secret_value_from_obj, 842 .free = op_attr_secret_value_clear, /* not a typo */ 843 .clear = op_attr_secret_value_clear, 844 }, 845 [ATTR_OPS_INDEX_BIGNUM] = { 846 .from_user = op_attr_bignum_from_user, 847 .to_user = op_attr_bignum_to_user, 848 .to_binary = op_attr_bignum_to_binary, 849 .from_binary = op_attr_bignum_from_binary, 850 .from_obj = op_attr_bignum_from_obj, 851 .free = op_attr_bignum_free, 852 .clear = op_attr_bignum_clear, 853 }, 854 [ATTR_OPS_INDEX_VALUE] = { 855 .from_user = op_attr_value_from_user, 856 .to_user = op_attr_value_to_user, 857 .to_binary = op_attr_value_to_binary, 858 .from_binary = op_attr_value_from_binary, 859 .from_obj = op_attr_value_from_obj, 860 .free = op_attr_value_clear, /* not a typo */ 861 .clear = op_attr_value_clear, 862 }, 863 }; 864 865 static TEE_Result get_user_u64_as_size_t(size_t *dst, uint64_t *src) 866 { 867 uint64_t d = 0; 868 TEE_Result res = copy_from_user(&d, src, sizeof(d)); 869 870 /* 871 * On 32-bit systems a size_t can't hold a uint64_t so we need to 872 * check that the value isn't too large. 873 */ 874 if (!res && ADD_OVERFLOW(0, d, dst)) 875 return TEE_ERROR_OVERFLOW; 876 877 return res; 878 } 879 880 static TEE_Result put_user_u64(uint64_t *dst, size_t value) 881 { 882 uint64_t v = value; 883 884 return copy_to_user(dst, &v, sizeof(v)); 885 } 886 887 TEE_Result syscall_cryp_obj_get_info(unsigned long obj, TEE_ObjectInfo *info) 888 { 889 struct ts_session *sess = ts_get_current_session(); 890 TEE_Result res = TEE_SUCCESS; 891 struct tee_obj *o = NULL; 892 893 res = tee_obj_get(to_user_ta_ctx(sess->ctx), 894 uref_to_vaddr(obj), &o); 895 if (res != TEE_SUCCESS) 896 goto exit; 897 898 res = copy_to_user_private(info, &o->info, sizeof(o->info)); 899 900 exit: 901 return res; 902 } 903 904 TEE_Result syscall_cryp_obj_restrict_usage(unsigned long obj, 905 unsigned long usage) 906 { 907 struct ts_session *sess = ts_get_current_session(); 908 TEE_Result res = TEE_SUCCESS; 909 struct tee_obj *o = NULL; 910 911 res = tee_obj_get(to_user_ta_ctx(sess->ctx), uref_to_vaddr(obj), &o); 912 if (res != TEE_SUCCESS) 913 goto exit; 914 915 o->info.objectUsage &= usage; 916 917 exit: 918 return res; 919 } 920 921 static int tee_svc_cryp_obj_find_type_attr_idx( 922 uint32_t attr_id, 923 const struct tee_cryp_obj_type_props *type_props) 924 { 925 size_t n; 926 927 for (n = 0; n < type_props->num_type_attrs; n++) { 928 if (attr_id == type_props->type_attrs[n].attr_id) 929 return n; 930 } 931 return -1; 932 } 933 934 static const struct tee_cryp_obj_type_props *tee_svc_find_type_props( 935 TEE_ObjectType obj_type) 936 { 937 size_t n; 938 939 for (n = 0; n < ARRAY_SIZE(tee_cryp_obj_props); n++) { 940 if (tee_cryp_obj_props[n].obj_type == obj_type) 941 return tee_cryp_obj_props + n; 942 } 943 944 return NULL; 945 } 946 947 /* Set an attribute on an object */ 948 static void set_attribute(struct tee_obj *o, 949 const struct tee_cryp_obj_type_props *props, 950 uint32_t attr) 951 { 952 int idx = tee_svc_cryp_obj_find_type_attr_idx(attr, props); 953 954 if (idx < 0) 955 return; 956 o->have_attrs |= BIT(idx); 957 } 958 959 /* Get an attribute on an object */ 960 static uint32_t get_attribute(const struct tee_obj *o, 961 const struct tee_cryp_obj_type_props *props, 962 uint32_t attr) 963 { 964 int idx = tee_svc_cryp_obj_find_type_attr_idx(attr, props); 965 966 if (idx < 0) 967 return 0; 968 return o->have_attrs & BIT(idx); 969 } 970 971 TEE_Result syscall_cryp_obj_get_attr(unsigned long obj, unsigned long attr_id, 972 void *buffer, uint64_t *size) 973 { 974 struct ts_session *sess = ts_get_current_session(); 975 TEE_Result res = TEE_SUCCESS; 976 struct tee_obj *o = NULL; 977 const struct tee_cryp_obj_type_props *type_props = NULL; 978 int idx = 0; 979 const struct attr_ops *ops = NULL; 980 void *attr = NULL; 981 982 res = tee_obj_get(to_user_ta_ctx(sess->ctx), uref_to_vaddr(obj), &o); 983 if (res != TEE_SUCCESS) 984 return TEE_ERROR_ITEM_NOT_FOUND; 985 986 /* Check that the object is initialized */ 987 if (!(o->info.handleFlags & TEE_HANDLE_FLAG_INITIALIZED)) 988 return TEE_ERROR_BAD_PARAMETERS; 989 990 /* Check that getting the attribute is allowed */ 991 if (!(attr_id & TEE_ATTR_FLAG_PUBLIC) && 992 !(o->info.objectUsage & TEE_USAGE_EXTRACTABLE)) 993 return TEE_ERROR_BAD_PARAMETERS; 994 995 type_props = tee_svc_find_type_props(o->info.objectType); 996 if (!type_props) { 997 /* Unknown object type, "can't happen" */ 998 return TEE_ERROR_BAD_STATE; 999 } 1000 1001 idx = tee_svc_cryp_obj_find_type_attr_idx(attr_id, type_props); 1002 if ((idx < 0) || ((o->have_attrs & (1 << idx)) == 0)) 1003 return TEE_ERROR_ITEM_NOT_FOUND; 1004 1005 ops = attr_ops + type_props->type_attrs[idx].ops_index; 1006 attr = (uint8_t *)o->attr + type_props->type_attrs[idx].raw_offs; 1007 return ops->to_user(attr, sess, buffer, size); 1008 } 1009 1010 void tee_obj_attr_free(struct tee_obj *o) 1011 { 1012 const struct tee_cryp_obj_type_props *tp; 1013 size_t n; 1014 1015 if (!o->attr) 1016 return; 1017 tp = tee_svc_find_type_props(o->info.objectType); 1018 if (!tp) 1019 return; 1020 1021 for (n = 0; n < tp->num_type_attrs; n++) { 1022 const struct tee_cryp_obj_type_attrs *ta = tp->type_attrs + n; 1023 1024 attr_ops[ta->ops_index].free((uint8_t *)o->attr + ta->raw_offs); 1025 } 1026 } 1027 1028 void tee_obj_attr_clear(struct tee_obj *o) 1029 { 1030 const struct tee_cryp_obj_type_props *tp; 1031 size_t n; 1032 1033 if (!o->attr) 1034 return; 1035 tp = tee_svc_find_type_props(o->info.objectType); 1036 if (!tp) 1037 return; 1038 1039 for (n = 0; n < tp->num_type_attrs; n++) { 1040 const struct tee_cryp_obj_type_attrs *ta = tp->type_attrs + n; 1041 1042 attr_ops[ta->ops_index].clear((uint8_t *)o->attr + 1043 ta->raw_offs); 1044 } 1045 } 1046 1047 TEE_Result tee_obj_attr_to_binary(struct tee_obj *o, void *data, 1048 size_t *data_len) 1049 { 1050 const struct tee_cryp_obj_type_props *tp; 1051 size_t n; 1052 size_t offs = 0; 1053 size_t len = data ? *data_len : 0; 1054 TEE_Result res; 1055 1056 if (o->info.objectType == TEE_TYPE_DATA) { 1057 *data_len = 0; 1058 return TEE_SUCCESS; /* pure data object */ 1059 } 1060 if (!o->attr) 1061 return TEE_ERROR_BAD_STATE; 1062 tp = tee_svc_find_type_props(o->info.objectType); 1063 if (!tp) 1064 return TEE_ERROR_BAD_STATE; 1065 1066 for (n = 0; n < tp->num_type_attrs; n++) { 1067 const struct tee_cryp_obj_type_attrs *ta = tp->type_attrs + n; 1068 void *attr = (uint8_t *)o->attr + ta->raw_offs; 1069 1070 res = attr_ops[ta->ops_index].to_binary(attr, data, len, &offs); 1071 if (res != TEE_SUCCESS) 1072 return res; 1073 } 1074 1075 *data_len = offs; 1076 if (data && offs > len) 1077 return TEE_ERROR_SHORT_BUFFER; 1078 return TEE_SUCCESS; 1079 } 1080 1081 TEE_Result tee_obj_attr_from_binary(struct tee_obj *o, const void *data, 1082 size_t data_len) 1083 { 1084 const struct tee_cryp_obj_type_props *tp; 1085 size_t n; 1086 size_t offs = 0; 1087 1088 if (o->info.objectType == TEE_TYPE_DATA) 1089 return TEE_SUCCESS; /* pure data object */ 1090 if (!o->attr) 1091 return TEE_ERROR_BAD_STATE; 1092 tp = tee_svc_find_type_props(o->info.objectType); 1093 if (!tp) 1094 return TEE_ERROR_BAD_STATE; 1095 1096 for (n = 0; n < tp->num_type_attrs; n++) { 1097 const struct tee_cryp_obj_type_attrs *ta = tp->type_attrs + n; 1098 void *attr = (uint8_t *)o->attr + ta->raw_offs; 1099 1100 if (!attr_ops[ta->ops_index].from_binary(attr, data, data_len, 1101 &offs)) 1102 return TEE_ERROR_CORRUPT_OBJECT; 1103 } 1104 return TEE_SUCCESS; 1105 } 1106 1107 TEE_Result tee_obj_attr_copy_from(struct tee_obj *o, const struct tee_obj *src) 1108 { 1109 TEE_Result res; 1110 const struct tee_cryp_obj_type_props *tp; 1111 const struct tee_cryp_obj_type_attrs *ta; 1112 size_t n; 1113 uint32_t have_attrs = 0; 1114 void *attr; 1115 void *src_attr; 1116 1117 if (o->info.objectType == TEE_TYPE_DATA) 1118 return TEE_SUCCESS; /* pure data object */ 1119 if (!o->attr) 1120 return TEE_ERROR_BAD_STATE; 1121 tp = tee_svc_find_type_props(o->info.objectType); 1122 if (!tp) 1123 return TEE_ERROR_BAD_STATE; 1124 1125 if (o->info.objectType == src->info.objectType) { 1126 have_attrs = src->have_attrs; 1127 for (n = 0; n < tp->num_type_attrs; n++) { 1128 ta = tp->type_attrs + n; 1129 attr = (uint8_t *)o->attr + ta->raw_offs; 1130 src_attr = (uint8_t *)src->attr + ta->raw_offs; 1131 res = attr_ops[ta->ops_index].from_obj(attr, src_attr); 1132 if (res != TEE_SUCCESS) 1133 return res; 1134 } 1135 } else { 1136 const struct tee_cryp_obj_type_props *tp_src; 1137 int idx; 1138 1139 if (o->info.objectType == TEE_TYPE_RSA_PUBLIC_KEY) { 1140 if (src->info.objectType != TEE_TYPE_RSA_KEYPAIR) 1141 return TEE_ERROR_BAD_PARAMETERS; 1142 } else if (o->info.objectType == TEE_TYPE_DSA_PUBLIC_KEY) { 1143 if (src->info.objectType != TEE_TYPE_DSA_KEYPAIR) 1144 return TEE_ERROR_BAD_PARAMETERS; 1145 } else if (o->info.objectType == TEE_TYPE_ECDSA_PUBLIC_KEY) { 1146 if (src->info.objectType != TEE_TYPE_ECDSA_KEYPAIR) 1147 return TEE_ERROR_BAD_PARAMETERS; 1148 } else if (o->info.objectType == TEE_TYPE_ECDH_PUBLIC_KEY) { 1149 if (src->info.objectType != TEE_TYPE_ECDH_KEYPAIR) 1150 return TEE_ERROR_BAD_PARAMETERS; 1151 } else if (o->info.objectType == TEE_TYPE_SM2_DSA_PUBLIC_KEY) { 1152 if (src->info.objectType != TEE_TYPE_SM2_DSA_KEYPAIR) 1153 return TEE_ERROR_BAD_PARAMETERS; 1154 } else if (o->info.objectType == TEE_TYPE_SM2_PKE_PUBLIC_KEY) { 1155 if (src->info.objectType != TEE_TYPE_SM2_PKE_KEYPAIR) 1156 return TEE_ERROR_BAD_PARAMETERS; 1157 } else if (o->info.objectType == TEE_TYPE_SM2_KEP_PUBLIC_KEY) { 1158 if (src->info.objectType != TEE_TYPE_SM2_KEP_KEYPAIR) 1159 return TEE_ERROR_BAD_PARAMETERS; 1160 } else { 1161 return TEE_ERROR_BAD_PARAMETERS; 1162 } 1163 1164 tp_src = tee_svc_find_type_props(src->info.objectType); 1165 if (!tp_src) 1166 return TEE_ERROR_BAD_STATE; 1167 1168 have_attrs = BIT32(tp->num_type_attrs) - 1; 1169 for (n = 0; n < tp->num_type_attrs; n++) { 1170 ta = tp->type_attrs + n; 1171 1172 idx = tee_svc_cryp_obj_find_type_attr_idx(ta->attr_id, 1173 tp_src); 1174 if (idx < 0) 1175 return TEE_ERROR_BAD_STATE; 1176 1177 attr = (uint8_t *)o->attr + ta->raw_offs; 1178 src_attr = (uint8_t *)src->attr + 1179 tp_src->type_attrs[idx].raw_offs; 1180 res = attr_ops[ta->ops_index].from_obj(attr, src_attr); 1181 if (res != TEE_SUCCESS) 1182 return res; 1183 } 1184 } 1185 1186 o->have_attrs = have_attrs; 1187 return TEE_SUCCESS; 1188 } 1189 1190 static bool is_gp_legacy_des_key_size(TEE_ObjectType type, size_t sz) 1191 { 1192 return IS_ENABLED(CFG_COMPAT_GP10_DES) && 1193 ((type == TEE_TYPE_DES && sz == 56) || 1194 (type == TEE_TYPE_DES3 && (sz == 112 || sz == 168))); 1195 } 1196 1197 static TEE_Result check_key_size(const struct tee_cryp_obj_type_props *props, 1198 size_t key_size) 1199 { 1200 size_t sz = key_size; 1201 1202 /* 1203 * In GP Internal API Specification 1.0 the partity bits aren't 1204 * counted when telling the size of the key in bits so add them 1205 * here if missing. 1206 */ 1207 if (is_gp_legacy_des_key_size(props->obj_type, sz)) 1208 sz += sz / 7; 1209 1210 if (sz % props->quanta != 0) 1211 return TEE_ERROR_NOT_SUPPORTED; 1212 if (sz < props->min_size) 1213 return TEE_ERROR_NOT_SUPPORTED; 1214 if (sz > props->max_size) 1215 return TEE_ERROR_NOT_SUPPORTED; 1216 1217 return TEE_SUCCESS; 1218 } 1219 1220 TEE_Result tee_obj_set_type(struct tee_obj *o, uint32_t obj_type, 1221 size_t max_key_size) 1222 { 1223 TEE_Result res = TEE_SUCCESS; 1224 const struct tee_cryp_obj_type_props *type_props; 1225 1226 /* Can only set type for newly allocated objs */ 1227 if (o->attr) 1228 return TEE_ERROR_BAD_STATE; 1229 1230 /* 1231 * Verify that maxKeySize is supported and find out how 1232 * much should be allocated. 1233 */ 1234 1235 if (obj_type == TEE_TYPE_DATA) { 1236 if (max_key_size) 1237 return TEE_ERROR_NOT_SUPPORTED; 1238 } else { 1239 /* Find description of object */ 1240 type_props = tee_svc_find_type_props(obj_type); 1241 if (!type_props) 1242 return TEE_ERROR_NOT_SUPPORTED; 1243 1244 /* Check that max_key_size follows restrictions */ 1245 res = check_key_size(type_props, max_key_size); 1246 if (res) 1247 return res; 1248 1249 o->attr = calloc(1, type_props->alloc_size); 1250 if (!o->attr) 1251 return TEE_ERROR_OUT_OF_MEMORY; 1252 } 1253 1254 /* If we have a key structure, pre-allocate the bignums inside */ 1255 switch (obj_type) { 1256 case TEE_TYPE_RSA_PUBLIC_KEY: 1257 res = crypto_acipher_alloc_rsa_public_key(o->attr, 1258 max_key_size); 1259 break; 1260 case TEE_TYPE_RSA_KEYPAIR: 1261 res = crypto_acipher_alloc_rsa_keypair(o->attr, max_key_size); 1262 break; 1263 case TEE_TYPE_DSA_PUBLIC_KEY: 1264 res = crypto_acipher_alloc_dsa_public_key(o->attr, 1265 max_key_size); 1266 break; 1267 case TEE_TYPE_DSA_KEYPAIR: 1268 res = crypto_acipher_alloc_dsa_keypair(o->attr, max_key_size); 1269 break; 1270 case TEE_TYPE_DH_KEYPAIR: 1271 res = crypto_acipher_alloc_dh_keypair(o->attr, max_key_size); 1272 break; 1273 case TEE_TYPE_ECDSA_PUBLIC_KEY: 1274 case TEE_TYPE_ECDH_PUBLIC_KEY: 1275 case TEE_TYPE_SM2_DSA_PUBLIC_KEY: 1276 case TEE_TYPE_SM2_PKE_PUBLIC_KEY: 1277 case TEE_TYPE_SM2_KEP_PUBLIC_KEY: 1278 res = crypto_acipher_alloc_ecc_public_key(o->attr, obj_type, 1279 max_key_size); 1280 break; 1281 case TEE_TYPE_ECDSA_KEYPAIR: 1282 case TEE_TYPE_ECDH_KEYPAIR: 1283 case TEE_TYPE_SM2_DSA_KEYPAIR: 1284 case TEE_TYPE_SM2_PKE_KEYPAIR: 1285 case TEE_TYPE_SM2_KEP_KEYPAIR: 1286 res = crypto_acipher_alloc_ecc_keypair(o->attr, obj_type, 1287 max_key_size); 1288 break; 1289 default: 1290 if (obj_type != TEE_TYPE_DATA) { 1291 struct tee_cryp_obj_secret *key = o->attr; 1292 1293 key->alloc_size = type_props->alloc_size - 1294 sizeof(*key); 1295 } 1296 break; 1297 } 1298 1299 if (res != TEE_SUCCESS) 1300 return res; 1301 1302 o->info.objectType = obj_type; 1303 o->info.maxKeySize = max_key_size; 1304 o->info.objectUsage = TEE_USAGE_DEFAULT; 1305 1306 return TEE_SUCCESS; 1307 } 1308 1309 TEE_Result syscall_cryp_obj_alloc(unsigned long obj_type, 1310 unsigned long max_key_size, uint32_t *obj) 1311 { 1312 struct ts_session *sess = ts_get_current_session(); 1313 TEE_Result res = TEE_SUCCESS; 1314 struct tee_obj *o = NULL; 1315 1316 1317 o = tee_obj_alloc(); 1318 if (!o) 1319 return TEE_ERROR_OUT_OF_MEMORY; 1320 1321 res = tee_obj_set_type(o, obj_type, max_key_size); 1322 if (res != TEE_SUCCESS) { 1323 tee_obj_free(o); 1324 return res; 1325 } 1326 1327 tee_obj_add(to_user_ta_ctx(sess->ctx), o); 1328 1329 res = copy_kaddr_to_uref(obj, o); 1330 if (res != TEE_SUCCESS) 1331 tee_obj_close(to_user_ta_ctx(sess->ctx), o); 1332 return res; 1333 } 1334 1335 TEE_Result syscall_cryp_obj_close(unsigned long obj) 1336 { 1337 struct ts_session *sess = ts_get_current_session(); 1338 TEE_Result res = TEE_SUCCESS; 1339 struct tee_obj *o = NULL; 1340 1341 res = tee_obj_get(to_user_ta_ctx(sess->ctx), uref_to_vaddr(obj), &o); 1342 if (res != TEE_SUCCESS) 1343 return res; 1344 1345 /* 1346 * If it's busy it's used by an operation, a client should never have 1347 * this handle. 1348 */ 1349 if (o->busy) 1350 return TEE_ERROR_ITEM_NOT_FOUND; 1351 1352 tee_obj_close(to_user_ta_ctx(sess->ctx), o); 1353 return TEE_SUCCESS; 1354 } 1355 1356 TEE_Result syscall_cryp_obj_reset(unsigned long obj) 1357 { 1358 struct ts_session *sess = ts_get_current_session(); 1359 TEE_Result res = TEE_SUCCESS; 1360 struct tee_obj *o = NULL; 1361 1362 res = tee_obj_get(to_user_ta_ctx(sess->ctx), uref_to_vaddr(obj), &o); 1363 if (res != TEE_SUCCESS) 1364 return res; 1365 1366 if ((o->info.handleFlags & TEE_HANDLE_FLAG_PERSISTENT) == 0) { 1367 tee_obj_attr_clear(o); 1368 o->info.keySize = 0; 1369 o->info.objectUsage = TEE_USAGE_DEFAULT; 1370 } else { 1371 return TEE_ERROR_BAD_PARAMETERS; 1372 } 1373 1374 /* the object is no more initialized */ 1375 o->info.handleFlags &= ~TEE_HANDLE_FLAG_INITIALIZED; 1376 1377 return TEE_SUCCESS; 1378 } 1379 1380 static TEE_Result copy_in_attrs(struct user_ta_ctx *utc, 1381 const struct utee_attribute *usr_attrs, 1382 uint32_t attr_count, TEE_Attribute *attrs) 1383 { 1384 TEE_Result res = TEE_SUCCESS; 1385 size_t size = 0; 1386 uint32_t n = 0; 1387 1388 if (MUL_OVERFLOW(sizeof(struct utee_attribute), attr_count, &size)) 1389 return TEE_ERROR_OVERFLOW; 1390 1391 res = vm_check_access_rights(&utc->uctx, 1392 TEE_MEMORY_ACCESS_READ | 1393 TEE_MEMORY_ACCESS_ANY_OWNER, 1394 (uaddr_t)usr_attrs, size); 1395 if (res != TEE_SUCCESS) 1396 return res; 1397 1398 for (n = 0; n < attr_count; n++) { 1399 attrs[n].attributeID = usr_attrs[n].attribute_id; 1400 if (attrs[n].attributeID & TEE_ATTR_FLAG_VALUE) { 1401 attrs[n].content.value.a = usr_attrs[n].a; 1402 attrs[n].content.value.b = usr_attrs[n].b; 1403 } else { 1404 uintptr_t buf = usr_attrs[n].a; 1405 size_t len = usr_attrs[n].b; 1406 uint32_t flags = TEE_MEMORY_ACCESS_READ | 1407 TEE_MEMORY_ACCESS_ANY_OWNER; 1408 1409 res = vm_check_access_rights(&utc->uctx, flags, buf, 1410 len); 1411 if (res != TEE_SUCCESS) 1412 return res; 1413 attrs[n].content.ref.buffer = (void *)buf; 1414 attrs[n].content.ref.length = len; 1415 } 1416 } 1417 1418 return TEE_SUCCESS; 1419 } 1420 1421 enum attr_usage { 1422 ATTR_USAGE_POPULATE, 1423 ATTR_USAGE_GENERATE_KEY 1424 }; 1425 1426 static TEE_Result tee_svc_cryp_check_attr(enum attr_usage usage, 1427 const struct tee_cryp_obj_type_props 1428 *type_props, 1429 const TEE_Attribute *attrs, 1430 uint32_t attr_count) 1431 { 1432 uint32_t required_flag = 0; 1433 uint32_t opt_flag = 0; 1434 bool all_opt_needed = false; 1435 uint32_t req_attrs = 0; 1436 uint32_t opt_grp_attrs = 0; 1437 uint32_t attrs_found = 0; 1438 size_t n = 0; 1439 uint32_t bit = 0; 1440 uint32_t flags = 0; 1441 int idx = 0; 1442 1443 if (usage == ATTR_USAGE_POPULATE) { 1444 required_flag = TEE_TYPE_ATTR_REQUIRED; 1445 opt_flag = TEE_TYPE_ATTR_OPTIONAL_GROUP; 1446 all_opt_needed = true; 1447 } else { 1448 required_flag = TEE_TYPE_ATTR_GEN_KEY_REQ; 1449 opt_flag = TEE_TYPE_ATTR_GEN_KEY_OPT; 1450 all_opt_needed = false; 1451 } 1452 1453 /* 1454 * First find out which attributes are required and which belong to 1455 * the optional group 1456 */ 1457 for (n = 0; n < type_props->num_type_attrs; n++) { 1458 bit = 1 << n; 1459 flags = type_props->type_attrs[n].flags; 1460 1461 if (flags & required_flag) 1462 req_attrs |= bit; 1463 else if (flags & opt_flag) 1464 opt_grp_attrs |= bit; 1465 } 1466 1467 /* 1468 * Verify that all required attributes are in place and 1469 * that the same attribute isn't repeated. 1470 */ 1471 for (n = 0; n < attr_count; n++) { 1472 idx = tee_svc_cryp_obj_find_type_attr_idx( 1473 attrs[n].attributeID, 1474 type_props); 1475 1476 /* attribute not defined in current object type */ 1477 if (idx < 0) 1478 return TEE_ERROR_ITEM_NOT_FOUND; 1479 1480 bit = 1 << idx; 1481 1482 /* attribute not repeated */ 1483 if ((attrs_found & bit) != 0) 1484 return TEE_ERROR_ITEM_NOT_FOUND; 1485 1486 /* 1487 * Attribute not defined in current object type for this 1488 * usage. 1489 */ 1490 if (!(bit & (req_attrs | opt_grp_attrs))) 1491 return TEE_ERROR_ITEM_NOT_FOUND; 1492 1493 attrs_found |= bit; 1494 } 1495 /* Required attribute missing */ 1496 if ((attrs_found & req_attrs) != req_attrs) 1497 return TEE_ERROR_ITEM_NOT_FOUND; 1498 1499 /* 1500 * If the flag says that "if one of the optional attributes are included 1501 * all of them has to be included" this must be checked. 1502 */ 1503 if (all_opt_needed && (attrs_found & opt_grp_attrs) != 0 && 1504 (attrs_found & opt_grp_attrs) != opt_grp_attrs) 1505 return TEE_ERROR_ITEM_NOT_FOUND; 1506 1507 return TEE_SUCCESS; 1508 } 1509 1510 static TEE_Result get_ec_key_size(uint32_t curve, size_t *key_size) 1511 { 1512 switch (curve) { 1513 case TEE_ECC_CURVE_NIST_P192: 1514 *key_size = 192; 1515 break; 1516 case TEE_ECC_CURVE_NIST_P224: 1517 *key_size = 224; 1518 break; 1519 case TEE_ECC_CURVE_NIST_P256: 1520 *key_size = 256; 1521 break; 1522 case TEE_ECC_CURVE_NIST_P384: 1523 *key_size = 384; 1524 break; 1525 case TEE_ECC_CURVE_NIST_P521: 1526 *key_size = 521; 1527 break; 1528 case TEE_ECC_CURVE_SM2: 1529 *key_size = 256; 1530 break; 1531 default: 1532 return TEE_ERROR_NOT_SUPPORTED; 1533 } 1534 1535 return TEE_SUCCESS; 1536 } 1537 1538 static size_t get_used_bits(const TEE_Attribute *a) 1539 { 1540 int nbits = a->content.ref.length * 8; 1541 int v = 0; 1542 1543 bit_ffs(a->content.ref.buffer, nbits, &v); 1544 return nbits - v; 1545 } 1546 1547 static TEE_Result tee_svc_cryp_obj_populate_type( 1548 struct tee_obj *o, 1549 const struct tee_cryp_obj_type_props *type_props, 1550 const TEE_Attribute *attrs, 1551 uint32_t attr_count) 1552 { 1553 TEE_Result res = TEE_SUCCESS; 1554 uint32_t have_attrs = 0; 1555 size_t obj_size = 0; 1556 size_t n = 0; 1557 int idx = 0; 1558 const struct attr_ops *ops = NULL; 1559 void *attr = NULL; 1560 1561 for (n = 0; n < attr_count; n++) { 1562 idx = tee_svc_cryp_obj_find_type_attr_idx( 1563 attrs[n].attributeID, 1564 type_props); 1565 /* attribute not defined in current object type */ 1566 if (idx < 0) 1567 return TEE_ERROR_ITEM_NOT_FOUND; 1568 1569 have_attrs |= BIT32(idx); 1570 ops = attr_ops + type_props->type_attrs[idx].ops_index; 1571 attr = (uint8_t *)o->attr + 1572 type_props->type_attrs[idx].raw_offs; 1573 if (attrs[n].attributeID & TEE_ATTR_FLAG_VALUE) 1574 res = ops->from_user(attr, &attrs[n].content.value, 1575 sizeof(attrs[n].content.value)); 1576 else 1577 res = ops->from_user(attr, attrs[n].content.ref.buffer, 1578 attrs[n].content.ref.length); 1579 if (res != TEE_SUCCESS) 1580 return res; 1581 1582 /* 1583 * The attribute that gives the size of the object is 1584 * flagged with TEE_TYPE_ATTR_SIZE_INDICATOR. 1585 */ 1586 if (type_props->type_attrs[idx].flags & 1587 TEE_TYPE_ATTR_SIZE_INDICATOR) { 1588 /* There should be only one */ 1589 if (obj_size) 1590 return TEE_ERROR_BAD_STATE; 1591 1592 /* 1593 * For ECDSA/ECDH we need to translate curve into 1594 * object size 1595 */ 1596 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE) { 1597 res = get_ec_key_size(attrs[n].content.value.a, 1598 &obj_size); 1599 if (res != TEE_SUCCESS) 1600 return res; 1601 } else { 1602 TEE_ObjectType obj_type = o->info.objectType; 1603 size_t sz = o->info.maxKeySize; 1604 1605 obj_size = attrs[n].content.ref.length * 8; 1606 /* Drop the parity bits for legacy objects */ 1607 if (is_gp_legacy_des_key_size(obj_type, sz)) 1608 obj_size -= obj_size / 8; 1609 } 1610 if (obj_size > o->info.maxKeySize) 1611 return TEE_ERROR_BAD_STATE; 1612 } 1613 1614 /* 1615 * Bignum attributes limited by the number of bits in 1616 * o->info.keySize are flagged with 1617 * TEE_TYPE_ATTR_BIGNUM_MAXBITS. 1618 */ 1619 if (type_props->type_attrs[idx].flags & 1620 TEE_TYPE_ATTR_BIGNUM_MAXBITS) { 1621 if (get_used_bits(attrs + n) > o->info.maxKeySize) 1622 return TEE_ERROR_BAD_STATE; 1623 } 1624 } 1625 1626 o->have_attrs = have_attrs; 1627 o->info.keySize = obj_size; 1628 /* 1629 * In GP Internal API Specification 1.0 the partity bits aren't 1630 * counted when telling the size of the key in bits so remove the 1631 * parity bits here. 1632 */ 1633 if (is_gp_legacy_des_key_size(o->info.objectType, o->info.maxKeySize)) 1634 o->info.keySize -= o->info.keySize / 8; 1635 1636 return TEE_SUCCESS; 1637 } 1638 1639 TEE_Result syscall_cryp_obj_populate(unsigned long obj, 1640 struct utee_attribute *usr_attrs, 1641 unsigned long attr_count) 1642 { 1643 struct ts_session *sess = ts_get_current_session(); 1644 TEE_Result res = TEE_SUCCESS; 1645 struct tee_obj *o = NULL; 1646 const struct tee_cryp_obj_type_props *type_props = NULL; 1647 TEE_Attribute *attrs = NULL; 1648 1649 res = tee_obj_get(to_user_ta_ctx(sess->ctx), uref_to_vaddr(obj), &o); 1650 if (res != TEE_SUCCESS) 1651 return res; 1652 1653 /* Must be a transient object */ 1654 if ((o->info.handleFlags & TEE_HANDLE_FLAG_PERSISTENT) != 0) 1655 return TEE_ERROR_BAD_PARAMETERS; 1656 1657 /* Must not be initialized already */ 1658 if ((o->info.handleFlags & TEE_HANDLE_FLAG_INITIALIZED) != 0) 1659 return TEE_ERROR_BAD_PARAMETERS; 1660 1661 type_props = tee_svc_find_type_props(o->info.objectType); 1662 if (!type_props) 1663 return TEE_ERROR_NOT_IMPLEMENTED; 1664 1665 size_t alloc_size = 0; 1666 1667 if (MUL_OVERFLOW(sizeof(TEE_Attribute), attr_count, &alloc_size)) 1668 return TEE_ERROR_OVERFLOW; 1669 1670 attrs = malloc(alloc_size); 1671 if (!attrs) 1672 return TEE_ERROR_OUT_OF_MEMORY; 1673 1674 res = copy_in_attrs(to_user_ta_ctx(sess->ctx), usr_attrs, attr_count, 1675 attrs); 1676 if (res != TEE_SUCCESS) 1677 goto out; 1678 1679 res = tee_svc_cryp_check_attr(ATTR_USAGE_POPULATE, type_props, 1680 attrs, attr_count); 1681 if (res != TEE_SUCCESS) 1682 goto out; 1683 1684 res = tee_svc_cryp_obj_populate_type(o, type_props, attrs, attr_count); 1685 if (res == TEE_SUCCESS) 1686 o->info.handleFlags |= TEE_HANDLE_FLAG_INITIALIZED; 1687 1688 out: 1689 free_wipe(attrs); 1690 return res; 1691 } 1692 1693 TEE_Result syscall_cryp_obj_copy(unsigned long dst, unsigned long src) 1694 { 1695 struct ts_session *sess = ts_get_current_session(); 1696 TEE_Result res = TEE_SUCCESS; 1697 struct tee_obj *dst_o = NULL; 1698 struct tee_obj *src_o = NULL; 1699 1700 res = tee_obj_get(to_user_ta_ctx(sess->ctx), 1701 uref_to_vaddr(dst), &dst_o); 1702 if (res != TEE_SUCCESS) 1703 return res; 1704 1705 res = tee_obj_get(to_user_ta_ctx(sess->ctx), 1706 uref_to_vaddr(src), &src_o); 1707 if (res != TEE_SUCCESS) 1708 return res; 1709 1710 if ((src_o->info.handleFlags & TEE_HANDLE_FLAG_INITIALIZED) == 0) 1711 return TEE_ERROR_BAD_PARAMETERS; 1712 if ((dst_o->info.handleFlags & TEE_HANDLE_FLAG_PERSISTENT) != 0) 1713 return TEE_ERROR_BAD_PARAMETERS; 1714 if ((dst_o->info.handleFlags & TEE_HANDLE_FLAG_INITIALIZED) != 0) 1715 return TEE_ERROR_BAD_PARAMETERS; 1716 1717 res = tee_obj_attr_copy_from(dst_o, src_o); 1718 if (res != TEE_SUCCESS) 1719 return res; 1720 1721 dst_o->info.handleFlags |= TEE_HANDLE_FLAG_INITIALIZED; 1722 dst_o->info.keySize = src_o->info.keySize; 1723 dst_o->info.objectUsage = src_o->info.objectUsage; 1724 return TEE_SUCCESS; 1725 } 1726 1727 static TEE_Result check_pub_rsa_key(struct bignum *e) 1728 { 1729 size_t n = crypto_bignum_num_bytes(e); 1730 uint8_t bin_key[256 / 8] = { 0 }; 1731 1732 /* 1733 * NIST SP800-56B requires public RSA key to be an odd integer in 1734 * the range 65537 <= e < 2^256. 1735 */ 1736 1737 if (n > sizeof(bin_key) || n < 3) 1738 return TEE_ERROR_BAD_PARAMETERS; 1739 1740 crypto_bignum_bn2bin(e, bin_key); 1741 1742 if (!(bin_key[0] & 1)) /* key must be odd */ 1743 return TEE_ERROR_BAD_PARAMETERS; 1744 1745 if (n == 3) { 1746 uint32_t key = 0; 1747 1748 for (n = 0; n < 3; n++) { 1749 key <<= 8; 1750 key |= bin_key[n]; 1751 } 1752 1753 if (key < 65537) 1754 return TEE_ERROR_BAD_PARAMETERS; 1755 } 1756 1757 /* key is larger than 65537 */ 1758 return TEE_SUCCESS; 1759 } 1760 1761 static TEE_Result tee_svc_obj_generate_key_rsa( 1762 struct tee_obj *o, const struct tee_cryp_obj_type_props *type_props, 1763 uint32_t key_size, 1764 const TEE_Attribute *params, uint32_t param_count) 1765 { 1766 TEE_Result res = TEE_SUCCESS; 1767 struct rsa_keypair *key = o->attr; 1768 uint32_t e = TEE_U32_TO_BIG_ENDIAN(65537); 1769 1770 /* Copy the present attributes into the obj before starting */ 1771 res = tee_svc_cryp_obj_populate_type(o, type_props, params, 1772 param_count); 1773 if (res != TEE_SUCCESS) 1774 return res; 1775 if (get_attribute(o, type_props, TEE_ATTR_RSA_PUBLIC_EXPONENT)) { 1776 res = check_pub_rsa_key(key->e); 1777 if (res) 1778 return res; 1779 } else { 1780 crypto_bignum_bin2bn((const uint8_t *)&e, sizeof(e), key->e); 1781 } 1782 res = crypto_acipher_gen_rsa_key(key, key_size); 1783 if (res != TEE_SUCCESS) 1784 return res; 1785 1786 /* Set bits for all known attributes for this object type */ 1787 o->have_attrs = (1 << type_props->num_type_attrs) - 1; 1788 1789 return TEE_SUCCESS; 1790 } 1791 1792 static TEE_Result tee_svc_obj_generate_key_dsa( 1793 struct tee_obj *o, const struct tee_cryp_obj_type_props *type_props, 1794 uint32_t key_size, const TEE_Attribute *params, uint32_t param_count) 1795 { 1796 TEE_Result res; 1797 1798 /* Copy the present attributes into the obj before starting */ 1799 res = tee_svc_cryp_obj_populate_type(o, type_props, params, 1800 param_count); 1801 if (res != TEE_SUCCESS) 1802 return res; 1803 1804 res = crypto_acipher_gen_dsa_key(o->attr, key_size); 1805 if (res != TEE_SUCCESS) 1806 return res; 1807 1808 /* Set bits for all known attributes for this object type */ 1809 o->have_attrs = (1 << type_props->num_type_attrs) - 1; 1810 1811 return TEE_SUCCESS; 1812 } 1813 1814 static TEE_Result tee_svc_obj_generate_key_dh( 1815 struct tee_obj *o, const struct tee_cryp_obj_type_props *type_props, 1816 uint32_t key_size, const TEE_Attribute *params, uint32_t param_count) 1817 { 1818 TEE_Result res; 1819 struct dh_keypair *tee_dh_key; 1820 struct bignum *dh_q = NULL; 1821 uint32_t dh_xbits = 0; 1822 1823 /* Copy the present attributes into the obj before starting */ 1824 res = tee_svc_cryp_obj_populate_type(o, type_props, params, 1825 param_count); 1826 if (res != TEE_SUCCESS) 1827 return res; 1828 1829 tee_dh_key = (struct dh_keypair *)o->attr; 1830 1831 if (get_attribute(o, type_props, TEE_ATTR_DH_SUBPRIME)) 1832 dh_q = tee_dh_key->q; 1833 if (get_attribute(o, type_props, TEE_ATTR_DH_X_BITS)) 1834 dh_xbits = tee_dh_key->xbits; 1835 res = crypto_acipher_gen_dh_key(tee_dh_key, dh_q, dh_xbits, key_size); 1836 if (res != TEE_SUCCESS) 1837 return res; 1838 1839 /* Set bits for the generated public and private key */ 1840 set_attribute(o, type_props, TEE_ATTR_DH_PUBLIC_VALUE); 1841 set_attribute(o, type_props, TEE_ATTR_DH_PRIVATE_VALUE); 1842 set_attribute(o, type_props, TEE_ATTR_DH_X_BITS); 1843 return TEE_SUCCESS; 1844 } 1845 1846 static TEE_Result tee_svc_obj_generate_key_ecc( 1847 struct tee_obj *o, const struct tee_cryp_obj_type_props *type_props, 1848 uint32_t key_size, const TEE_Attribute *params, uint32_t param_count) 1849 { 1850 TEE_Result res; 1851 struct ecc_keypair *tee_ecc_key; 1852 1853 /* Copy the present attributes into the obj before starting */ 1854 res = tee_svc_cryp_obj_populate_type(o, type_props, params, 1855 param_count); 1856 if (res != TEE_SUCCESS) 1857 return res; 1858 1859 tee_ecc_key = (struct ecc_keypair *)o->attr; 1860 1861 res = crypto_acipher_gen_ecc_key(tee_ecc_key, key_size); 1862 if (res != TEE_SUCCESS) 1863 return res; 1864 1865 /* Set bits for the generated public and private key */ 1866 set_attribute(o, type_props, TEE_ATTR_ECC_PRIVATE_VALUE); 1867 set_attribute(o, type_props, TEE_ATTR_ECC_PUBLIC_VALUE_X); 1868 set_attribute(o, type_props, TEE_ATTR_ECC_PUBLIC_VALUE_Y); 1869 set_attribute(o, type_props, TEE_ATTR_ECC_CURVE); 1870 return TEE_SUCCESS; 1871 } 1872 1873 TEE_Result syscall_obj_generate_key(unsigned long obj, unsigned long key_size, 1874 const struct utee_attribute *usr_params, 1875 unsigned long param_count) 1876 { 1877 struct ts_session *sess = ts_get_current_session(); 1878 TEE_Result res = TEE_SUCCESS; 1879 const struct tee_cryp_obj_type_props *type_props = NULL; 1880 struct tee_obj *o = NULL; 1881 struct tee_cryp_obj_secret *key = NULL; 1882 size_t byte_size = 0; 1883 TEE_Attribute *params = NULL; 1884 1885 res = tee_obj_get(to_user_ta_ctx(sess->ctx), uref_to_vaddr(obj), &o); 1886 if (res != TEE_SUCCESS) 1887 return res; 1888 1889 /* Must be a transient object */ 1890 if ((o->info.handleFlags & TEE_HANDLE_FLAG_PERSISTENT) != 0) 1891 return TEE_ERROR_BAD_STATE; 1892 1893 /* Must not be initialized already */ 1894 if ((o->info.handleFlags & TEE_HANDLE_FLAG_INITIALIZED) != 0) 1895 return TEE_ERROR_BAD_STATE; 1896 1897 /* Find description of object */ 1898 type_props = tee_svc_find_type_props(o->info.objectType); 1899 if (!type_props) 1900 return TEE_ERROR_NOT_SUPPORTED; 1901 1902 /* Check that key_size follows restrictions */ 1903 res = check_key_size(type_props, key_size); 1904 if (res) 1905 return res; 1906 1907 size_t alloc_size = 0; 1908 1909 if (MUL_OVERFLOW(sizeof(TEE_Attribute), param_count, &alloc_size)) 1910 return TEE_ERROR_OVERFLOW; 1911 1912 params = malloc(alloc_size); 1913 if (!params) 1914 return TEE_ERROR_OUT_OF_MEMORY; 1915 res = copy_in_attrs(to_user_ta_ctx(sess->ctx), usr_params, param_count, 1916 params); 1917 if (res != TEE_SUCCESS) 1918 goto out; 1919 1920 res = tee_svc_cryp_check_attr(ATTR_USAGE_GENERATE_KEY, type_props, 1921 params, param_count); 1922 if (res != TEE_SUCCESS) 1923 goto out; 1924 1925 switch (o->info.objectType) { 1926 case TEE_TYPE_AES: 1927 case TEE_TYPE_DES: 1928 case TEE_TYPE_DES3: 1929 case TEE_TYPE_SM4: 1930 case TEE_TYPE_HMAC_MD5: 1931 case TEE_TYPE_HMAC_SHA1: 1932 case TEE_TYPE_HMAC_SHA224: 1933 case TEE_TYPE_HMAC_SHA256: 1934 case TEE_TYPE_HMAC_SHA384: 1935 case TEE_TYPE_HMAC_SHA512: 1936 case TEE_TYPE_HMAC_SM3: 1937 case TEE_TYPE_GENERIC_SECRET: 1938 byte_size = key_size / 8; 1939 1940 /* 1941 * In GP Internal API Specification 1.0 the partity bits 1942 * aren't counted when telling the size of the key in bits. 1943 */ 1944 if (is_gp_legacy_des_key_size(o->info.objectType, key_size)) 1945 byte_size = (key_size + key_size / 7) / 8; 1946 1947 key = (struct tee_cryp_obj_secret *)o->attr; 1948 if (byte_size > key->alloc_size) { 1949 res = TEE_ERROR_EXCESS_DATA; 1950 goto out; 1951 } 1952 1953 res = crypto_rng_read((void *)(key + 1), byte_size); 1954 if (res != TEE_SUCCESS) 1955 goto out; 1956 1957 key->key_size = byte_size; 1958 1959 /* Set bits for all known attributes for this object type */ 1960 o->have_attrs = (1 << type_props->num_type_attrs) - 1; 1961 1962 break; 1963 1964 case TEE_TYPE_RSA_KEYPAIR: 1965 res = tee_svc_obj_generate_key_rsa(o, type_props, key_size, 1966 params, param_count); 1967 if (res != TEE_SUCCESS) 1968 goto out; 1969 break; 1970 1971 case TEE_TYPE_DSA_KEYPAIR: 1972 res = tee_svc_obj_generate_key_dsa(o, type_props, key_size, 1973 params, param_count); 1974 if (res != TEE_SUCCESS) 1975 goto out; 1976 break; 1977 1978 case TEE_TYPE_DH_KEYPAIR: 1979 res = tee_svc_obj_generate_key_dh(o, type_props, key_size, 1980 params, param_count); 1981 if (res != TEE_SUCCESS) 1982 goto out; 1983 break; 1984 1985 case TEE_TYPE_ECDSA_KEYPAIR: 1986 case TEE_TYPE_ECDH_KEYPAIR: 1987 case TEE_TYPE_SM2_PKE_KEYPAIR: 1988 res = tee_svc_obj_generate_key_ecc(o, type_props, key_size, 1989 params, param_count); 1990 if (res != TEE_SUCCESS) 1991 goto out; 1992 break; 1993 1994 default: 1995 res = TEE_ERROR_BAD_FORMAT; 1996 } 1997 1998 out: 1999 free_wipe(params); 2000 if (res == TEE_SUCCESS) { 2001 o->info.keySize = key_size; 2002 o->info.handleFlags |= TEE_HANDLE_FLAG_INITIALIZED; 2003 } 2004 return res; 2005 } 2006 2007 static TEE_Result tee_svc_cryp_get_state(struct ts_session *sess, 2008 vaddr_t state_id, 2009 struct tee_cryp_state **state) 2010 { 2011 struct tee_cryp_state *s; 2012 struct user_ta_ctx *utc = to_user_ta_ctx(sess->ctx); 2013 2014 TAILQ_FOREACH(s, &utc->cryp_states, link) { 2015 if (state_id == (vaddr_t)s) { 2016 *state = s; 2017 return TEE_SUCCESS; 2018 } 2019 } 2020 return TEE_ERROR_BAD_PARAMETERS; 2021 } 2022 2023 static void cryp_state_free(struct user_ta_ctx *utc, struct tee_cryp_state *cs) 2024 { 2025 struct tee_obj *o; 2026 2027 if (tee_obj_get(utc, cs->key1, &o) == TEE_SUCCESS) 2028 tee_obj_close(utc, o); 2029 if (tee_obj_get(utc, cs->key2, &o) == TEE_SUCCESS) 2030 tee_obj_close(utc, o); 2031 2032 TAILQ_REMOVE(&utc->cryp_states, cs, link); 2033 if (cs->ctx_finalize != NULL) 2034 cs->ctx_finalize(cs->ctx); 2035 2036 switch (TEE_ALG_GET_CLASS(cs->algo)) { 2037 case TEE_OPERATION_CIPHER: 2038 crypto_cipher_free_ctx(cs->ctx); 2039 break; 2040 case TEE_OPERATION_AE: 2041 crypto_authenc_free_ctx(cs->ctx); 2042 break; 2043 case TEE_OPERATION_DIGEST: 2044 crypto_hash_free_ctx(cs->ctx); 2045 break; 2046 case TEE_OPERATION_MAC: 2047 crypto_mac_free_ctx(cs->ctx); 2048 break; 2049 default: 2050 assert(!cs->ctx); 2051 } 2052 2053 free(cs); 2054 } 2055 2056 static TEE_Result tee_svc_cryp_check_key_type(const struct tee_obj *o, 2057 uint32_t algo, 2058 TEE_OperationMode mode) 2059 { 2060 uint32_t req_key_type; 2061 uint32_t req_key_type2 = 0; 2062 2063 switch (TEE_ALG_GET_MAIN_ALG(algo)) { 2064 case TEE_MAIN_ALGO_MD5: 2065 req_key_type = TEE_TYPE_HMAC_MD5; 2066 break; 2067 case TEE_MAIN_ALGO_SHA1: 2068 req_key_type = TEE_TYPE_HMAC_SHA1; 2069 break; 2070 case TEE_MAIN_ALGO_SHA224: 2071 req_key_type = TEE_TYPE_HMAC_SHA224; 2072 break; 2073 case TEE_MAIN_ALGO_SHA256: 2074 req_key_type = TEE_TYPE_HMAC_SHA256; 2075 break; 2076 case TEE_MAIN_ALGO_SHA384: 2077 req_key_type = TEE_TYPE_HMAC_SHA384; 2078 break; 2079 case TEE_MAIN_ALGO_SHA512: 2080 req_key_type = TEE_TYPE_HMAC_SHA512; 2081 break; 2082 case TEE_MAIN_ALGO_SM3: 2083 req_key_type = TEE_TYPE_HMAC_SM3; 2084 break; 2085 case TEE_MAIN_ALGO_AES: 2086 req_key_type = TEE_TYPE_AES; 2087 break; 2088 case TEE_MAIN_ALGO_DES: 2089 req_key_type = TEE_TYPE_DES; 2090 break; 2091 case TEE_MAIN_ALGO_DES3: 2092 req_key_type = TEE_TYPE_DES3; 2093 break; 2094 case TEE_MAIN_ALGO_SM4: 2095 req_key_type = TEE_TYPE_SM4; 2096 break; 2097 case TEE_MAIN_ALGO_RSA: 2098 req_key_type = TEE_TYPE_RSA_KEYPAIR; 2099 if (mode == TEE_MODE_ENCRYPT || mode == TEE_MODE_VERIFY) 2100 req_key_type2 = TEE_TYPE_RSA_PUBLIC_KEY; 2101 break; 2102 case TEE_MAIN_ALGO_DSA: 2103 req_key_type = TEE_TYPE_DSA_KEYPAIR; 2104 if (mode == TEE_MODE_ENCRYPT || mode == TEE_MODE_VERIFY) 2105 req_key_type2 = TEE_TYPE_DSA_PUBLIC_KEY; 2106 break; 2107 case TEE_MAIN_ALGO_DH: 2108 req_key_type = TEE_TYPE_DH_KEYPAIR; 2109 break; 2110 case TEE_MAIN_ALGO_ECDSA: 2111 req_key_type = TEE_TYPE_ECDSA_KEYPAIR; 2112 if (mode == TEE_MODE_VERIFY) 2113 req_key_type2 = TEE_TYPE_ECDSA_PUBLIC_KEY; 2114 break; 2115 case TEE_MAIN_ALGO_ECDH: 2116 req_key_type = TEE_TYPE_ECDH_KEYPAIR; 2117 break; 2118 case TEE_MAIN_ALGO_SM2_PKE: 2119 if (mode == TEE_MODE_ENCRYPT) 2120 req_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY; 2121 else 2122 req_key_type = TEE_TYPE_SM2_PKE_KEYPAIR; 2123 break; 2124 case TEE_MAIN_ALGO_SM2_DSA_SM3: 2125 if (mode == TEE_MODE_VERIFY) 2126 req_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY; 2127 else 2128 req_key_type = TEE_TYPE_SM2_DSA_KEYPAIR; 2129 break; 2130 #if defined(CFG_CRYPTO_SM2_KEP) 2131 case TEE_MAIN_ALGO_SM2_KEP: 2132 req_key_type = TEE_TYPE_SM2_KEP_KEYPAIR; 2133 req_key_type2 = TEE_TYPE_SM2_KEP_PUBLIC_KEY; 2134 break; 2135 #endif 2136 #if defined(CFG_CRYPTO_HKDF) 2137 case TEE_MAIN_ALGO_HKDF: 2138 req_key_type = TEE_TYPE_HKDF_IKM; 2139 break; 2140 #endif 2141 #if defined(CFG_CRYPTO_CONCAT_KDF) 2142 case TEE_MAIN_ALGO_CONCAT_KDF: 2143 req_key_type = TEE_TYPE_CONCAT_KDF_Z; 2144 break; 2145 #endif 2146 #if defined(CFG_CRYPTO_PBKDF2) 2147 case TEE_MAIN_ALGO_PBKDF2: 2148 req_key_type = TEE_TYPE_PBKDF2_PASSWORD; 2149 break; 2150 #endif 2151 default: 2152 return TEE_ERROR_BAD_PARAMETERS; 2153 } 2154 2155 if (req_key_type != o->info.objectType && 2156 req_key_type2 != o->info.objectType) 2157 return TEE_ERROR_BAD_PARAMETERS; 2158 return TEE_SUCCESS; 2159 } 2160 2161 TEE_Result syscall_cryp_state_alloc(unsigned long algo, unsigned long mode, 2162 unsigned long key1, unsigned long key2, 2163 uint32_t *state) 2164 { 2165 struct ts_session *sess = ts_get_current_session(); 2166 struct user_ta_ctx *utc = to_user_ta_ctx(sess->ctx); 2167 TEE_Result res = TEE_SUCCESS; 2168 struct tee_cryp_state *cs = NULL; 2169 struct tee_obj *o1 = NULL; 2170 struct tee_obj *o2 = NULL; 2171 2172 if (key1 != 0) { 2173 res = tee_obj_get(utc, uref_to_vaddr(key1), &o1); 2174 if (res != TEE_SUCCESS) 2175 return res; 2176 if (o1->busy) 2177 return TEE_ERROR_BAD_PARAMETERS; 2178 res = tee_svc_cryp_check_key_type(o1, algo, mode); 2179 if (res != TEE_SUCCESS) 2180 return res; 2181 } 2182 if (key2 != 0) { 2183 res = tee_obj_get(utc, uref_to_vaddr(key2), &o2); 2184 if (res != TEE_SUCCESS) 2185 return res; 2186 if (o2->busy) 2187 return TEE_ERROR_BAD_PARAMETERS; 2188 res = tee_svc_cryp_check_key_type(o2, algo, mode); 2189 if (res != TEE_SUCCESS) 2190 return res; 2191 } 2192 2193 cs = calloc(1, sizeof(struct tee_cryp_state)); 2194 if (!cs) 2195 return TEE_ERROR_OUT_OF_MEMORY; 2196 TAILQ_INSERT_TAIL(&utc->cryp_states, cs, link); 2197 cs->algo = algo; 2198 cs->mode = mode; 2199 cs->state = CRYP_STATE_UNINITIALIZED; 2200 2201 switch (TEE_ALG_GET_CLASS(algo)) { 2202 case TEE_OPERATION_CIPHER: 2203 if ((algo == TEE_ALG_AES_XTS && (key1 == 0 || key2 == 0)) || 2204 (algo != TEE_ALG_AES_XTS && (key1 == 0 || key2 != 0))) { 2205 res = TEE_ERROR_BAD_PARAMETERS; 2206 } else { 2207 res = crypto_cipher_alloc_ctx(&cs->ctx, algo); 2208 if (res != TEE_SUCCESS) 2209 break; 2210 } 2211 break; 2212 case TEE_OPERATION_AE: 2213 if (key1 == 0 || key2 != 0) { 2214 res = TEE_ERROR_BAD_PARAMETERS; 2215 } else { 2216 res = crypto_authenc_alloc_ctx(&cs->ctx, algo); 2217 if (res != TEE_SUCCESS) 2218 break; 2219 } 2220 break; 2221 case TEE_OPERATION_MAC: 2222 if (key1 == 0 || key2 != 0) { 2223 res = TEE_ERROR_BAD_PARAMETERS; 2224 } else { 2225 res = crypto_mac_alloc_ctx(&cs->ctx, algo); 2226 if (res != TEE_SUCCESS) 2227 break; 2228 } 2229 break; 2230 case TEE_OPERATION_DIGEST: 2231 if (key1 != 0 || key2 != 0) { 2232 res = TEE_ERROR_BAD_PARAMETERS; 2233 } else { 2234 res = crypto_hash_alloc_ctx(&cs->ctx, algo); 2235 if (res != TEE_SUCCESS) 2236 break; 2237 } 2238 break; 2239 case TEE_OPERATION_ASYMMETRIC_CIPHER: 2240 case TEE_OPERATION_ASYMMETRIC_SIGNATURE: 2241 if (algo == TEE_ALG_RSASSA_PKCS1_V1_5 && 2242 !IS_ENABLED(CFG_CRYPTO_RSASSA_NA1)) { 2243 res = TEE_ERROR_NOT_SUPPORTED; 2244 break; 2245 } 2246 if (key1 == 0 || key2 != 0) 2247 res = TEE_ERROR_BAD_PARAMETERS; 2248 break; 2249 case TEE_OPERATION_KEY_DERIVATION: 2250 if (algo == TEE_ALG_SM2_KEP) { 2251 if (key1 == 0 || key2 == 0) 2252 res = TEE_ERROR_BAD_PARAMETERS; 2253 } else { 2254 if (key1 == 0 || key2 != 0) 2255 res = TEE_ERROR_BAD_PARAMETERS; 2256 } 2257 break; 2258 default: 2259 res = TEE_ERROR_NOT_SUPPORTED; 2260 break; 2261 } 2262 if (res != TEE_SUCCESS) 2263 goto out; 2264 2265 res = copy_kaddr_to_uref(state, cs); 2266 if (res != TEE_SUCCESS) 2267 goto out; 2268 2269 /* Register keys */ 2270 if (o1 != NULL) { 2271 o1->busy = true; 2272 cs->key1 = (vaddr_t)o1; 2273 } 2274 if (o2 != NULL) { 2275 o2->busy = true; 2276 cs->key2 = (vaddr_t)o2; 2277 } 2278 2279 out: 2280 if (res != TEE_SUCCESS) 2281 cryp_state_free(utc, cs); 2282 return res; 2283 } 2284 2285 TEE_Result syscall_cryp_state_copy(unsigned long dst, unsigned long src) 2286 { 2287 struct ts_session *sess = ts_get_current_session(); 2288 TEE_Result res = TEE_SUCCESS; 2289 struct tee_cryp_state *cs_dst = NULL; 2290 struct tee_cryp_state *cs_src = NULL; 2291 2292 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(dst), &cs_dst); 2293 if (res != TEE_SUCCESS) 2294 return res; 2295 2296 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(src), &cs_src); 2297 if (res != TEE_SUCCESS) 2298 return res; 2299 if (cs_dst->algo != cs_src->algo || cs_dst->mode != cs_src->mode) 2300 return TEE_ERROR_BAD_PARAMETERS; 2301 2302 switch (TEE_ALG_GET_CLASS(cs_src->algo)) { 2303 case TEE_OPERATION_CIPHER: 2304 crypto_cipher_copy_state(cs_dst->ctx, cs_src->ctx); 2305 break; 2306 case TEE_OPERATION_AE: 2307 crypto_authenc_copy_state(cs_dst->ctx, cs_src->ctx); 2308 break; 2309 case TEE_OPERATION_DIGEST: 2310 crypto_hash_copy_state(cs_dst->ctx, cs_src->ctx); 2311 break; 2312 case TEE_OPERATION_MAC: 2313 crypto_mac_copy_state(cs_dst->ctx, cs_src->ctx); 2314 break; 2315 default: 2316 return TEE_ERROR_BAD_STATE; 2317 } 2318 2319 cs_dst->state = cs_src->state; 2320 2321 return TEE_SUCCESS; 2322 } 2323 2324 void tee_svc_cryp_free_states(struct user_ta_ctx *utc) 2325 { 2326 struct tee_cryp_state_head *states = &utc->cryp_states; 2327 2328 while (!TAILQ_EMPTY(states)) 2329 cryp_state_free(utc, TAILQ_FIRST(states)); 2330 } 2331 2332 TEE_Result syscall_cryp_state_free(unsigned long state) 2333 { 2334 struct ts_session *sess = ts_get_current_session(); 2335 TEE_Result res = TEE_SUCCESS; 2336 struct tee_cryp_state *cs = NULL; 2337 2338 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 2339 if (res != TEE_SUCCESS) 2340 return res; 2341 cryp_state_free(to_user_ta_ctx(sess->ctx), cs); 2342 return TEE_SUCCESS; 2343 } 2344 2345 TEE_Result syscall_hash_init(unsigned long state, 2346 const void *iv __maybe_unused, 2347 size_t iv_len __maybe_unused) 2348 { 2349 struct ts_session *sess = ts_get_current_session(); 2350 TEE_Result res = TEE_SUCCESS; 2351 struct tee_cryp_state *cs = NULL; 2352 2353 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 2354 if (res != TEE_SUCCESS) 2355 return res; 2356 2357 switch (TEE_ALG_GET_CLASS(cs->algo)) { 2358 case TEE_OPERATION_DIGEST: 2359 res = crypto_hash_init(cs->ctx); 2360 if (res != TEE_SUCCESS) 2361 return res; 2362 break; 2363 case TEE_OPERATION_MAC: 2364 { 2365 struct tee_obj *o; 2366 struct tee_cryp_obj_secret *key; 2367 2368 res = tee_obj_get(to_user_ta_ctx(sess->ctx), 2369 cs->key1, &o); 2370 if (res != TEE_SUCCESS) 2371 return res; 2372 if ((o->info.handleFlags & 2373 TEE_HANDLE_FLAG_INITIALIZED) == 0) 2374 return TEE_ERROR_BAD_PARAMETERS; 2375 2376 key = (struct tee_cryp_obj_secret *)o->attr; 2377 res = crypto_mac_init(cs->ctx, (void *)(key + 1), 2378 key->key_size); 2379 if (res != TEE_SUCCESS) 2380 return res; 2381 break; 2382 } 2383 default: 2384 return TEE_ERROR_BAD_PARAMETERS; 2385 } 2386 2387 cs->state = CRYP_STATE_INITIALIZED; 2388 2389 return TEE_SUCCESS; 2390 } 2391 2392 TEE_Result syscall_hash_update(unsigned long state, const void *chunk, 2393 size_t chunk_size) 2394 { 2395 struct ts_session *sess = ts_get_current_session(); 2396 struct tee_cryp_state *cs = NULL; 2397 TEE_Result res = TEE_SUCCESS; 2398 2399 /* No data, but size provided isn't valid parameters. */ 2400 if (!chunk && chunk_size) 2401 return TEE_ERROR_BAD_PARAMETERS; 2402 2403 /* Zero length hash is valid, but nothing we need to do. */ 2404 if (!chunk_size) 2405 return TEE_SUCCESS; 2406 2407 res = vm_check_access_rights(&to_user_ta_ctx(sess->ctx)->uctx, 2408 TEE_MEMORY_ACCESS_READ | 2409 TEE_MEMORY_ACCESS_ANY_OWNER, 2410 (uaddr_t)chunk, chunk_size); 2411 if (res != TEE_SUCCESS) 2412 return res; 2413 2414 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 2415 if (res != TEE_SUCCESS) 2416 return res; 2417 2418 if (cs->state != CRYP_STATE_INITIALIZED) 2419 return TEE_ERROR_BAD_STATE; 2420 2421 switch (TEE_ALG_GET_CLASS(cs->algo)) { 2422 case TEE_OPERATION_DIGEST: 2423 res = crypto_hash_update(cs->ctx, chunk, chunk_size); 2424 if (res != TEE_SUCCESS) 2425 return res; 2426 break; 2427 case TEE_OPERATION_MAC: 2428 res = crypto_mac_update(cs->ctx, chunk, chunk_size); 2429 if (res != TEE_SUCCESS) 2430 return res; 2431 break; 2432 default: 2433 return TEE_ERROR_BAD_PARAMETERS; 2434 } 2435 2436 return TEE_SUCCESS; 2437 } 2438 2439 TEE_Result syscall_hash_final(unsigned long state, const void *chunk, 2440 size_t chunk_size, void *hash, uint64_t *hash_len) 2441 { 2442 struct ts_session *sess = ts_get_current_session(); 2443 struct tee_cryp_state *cs = NULL; 2444 TEE_Result res2 = TEE_SUCCESS; 2445 TEE_Result res = TEE_SUCCESS; 2446 size_t hash_size = 0; 2447 size_t hlen = 0; 2448 2449 /* No data, but size provided isn't valid parameters. */ 2450 if (!chunk && chunk_size) 2451 return TEE_ERROR_BAD_PARAMETERS; 2452 2453 res = vm_check_access_rights(&to_user_ta_ctx(sess->ctx)->uctx, 2454 TEE_MEMORY_ACCESS_READ | 2455 TEE_MEMORY_ACCESS_ANY_OWNER, 2456 (uaddr_t)chunk, chunk_size); 2457 if (res != TEE_SUCCESS) 2458 return res; 2459 2460 res = get_user_u64_as_size_t(&hlen, hash_len); 2461 if (res != TEE_SUCCESS) 2462 return res; 2463 2464 res = vm_check_access_rights(&to_user_ta_ctx(sess->ctx)->uctx, 2465 TEE_MEMORY_ACCESS_READ | 2466 TEE_MEMORY_ACCESS_WRITE | 2467 TEE_MEMORY_ACCESS_ANY_OWNER, 2468 (uaddr_t)hash, hlen); 2469 if (res != TEE_SUCCESS) 2470 return res; 2471 2472 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 2473 if (res != TEE_SUCCESS) 2474 return res; 2475 2476 if (cs->state != CRYP_STATE_INITIALIZED) 2477 return TEE_ERROR_BAD_STATE; 2478 2479 switch (TEE_ALG_GET_CLASS(cs->algo)) { 2480 case TEE_OPERATION_DIGEST: 2481 res = tee_alg_get_digest_size(cs->algo, &hash_size); 2482 if (res != TEE_SUCCESS) 2483 return res; 2484 if (hlen < hash_size) { 2485 res = TEE_ERROR_SHORT_BUFFER; 2486 goto out; 2487 } 2488 2489 if (chunk_size) { 2490 res = crypto_hash_update(cs->ctx, chunk, chunk_size); 2491 if (res != TEE_SUCCESS) 2492 return res; 2493 } 2494 2495 res = crypto_hash_final(cs->ctx, hash, hash_size); 2496 if (res != TEE_SUCCESS) 2497 return res; 2498 break; 2499 2500 case TEE_OPERATION_MAC: 2501 res = tee_alg_get_digest_size(cs->algo, &hash_size); 2502 if (res != TEE_SUCCESS) 2503 return res; 2504 if (hlen < hash_size) { 2505 res = TEE_ERROR_SHORT_BUFFER; 2506 goto out; 2507 } 2508 2509 if (chunk_size) { 2510 res = crypto_mac_update(cs->ctx, chunk, chunk_size); 2511 if (res != TEE_SUCCESS) 2512 return res; 2513 } 2514 2515 res = crypto_mac_final(cs->ctx, hash, hash_size); 2516 if (res != TEE_SUCCESS) 2517 return res; 2518 break; 2519 2520 default: 2521 return TEE_ERROR_BAD_PARAMETERS; 2522 } 2523 out: 2524 res2 = put_user_u64(hash_len, hash_size); 2525 if (res2 != TEE_SUCCESS) 2526 return res2; 2527 return res; 2528 } 2529 2530 TEE_Result syscall_cipher_init(unsigned long state, const void *iv, 2531 size_t iv_len) 2532 { 2533 struct ts_session *sess = ts_get_current_session(); 2534 struct user_ta_ctx *utc = to_user_ta_ctx(sess->ctx); 2535 struct tee_cryp_obj_secret *key1 = NULL; 2536 struct tee_cryp_state *cs = NULL; 2537 TEE_Result res = TEE_SUCCESS; 2538 struct tee_obj *o = NULL; 2539 2540 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 2541 if (res != TEE_SUCCESS) 2542 return res; 2543 2544 if (TEE_ALG_GET_CLASS(cs->algo) != TEE_OPERATION_CIPHER) 2545 return TEE_ERROR_BAD_STATE; 2546 2547 res = vm_check_access_rights(&utc->uctx, 2548 TEE_MEMORY_ACCESS_READ | 2549 TEE_MEMORY_ACCESS_ANY_OWNER, 2550 (uaddr_t)iv, iv_len); 2551 if (res != TEE_SUCCESS) 2552 return res; 2553 2554 res = tee_obj_get(utc, cs->key1, &o); 2555 if (res != TEE_SUCCESS) 2556 return res; 2557 if ((o->info.handleFlags & TEE_HANDLE_FLAG_INITIALIZED) == 0) 2558 return TEE_ERROR_BAD_PARAMETERS; 2559 2560 key1 = o->attr; 2561 2562 if (tee_obj_get(utc, cs->key2, &o) == TEE_SUCCESS) { 2563 struct tee_cryp_obj_secret *key2 = o->attr; 2564 2565 if ((o->info.handleFlags & TEE_HANDLE_FLAG_INITIALIZED) == 0) 2566 return TEE_ERROR_BAD_PARAMETERS; 2567 2568 res = crypto_cipher_init(cs->ctx, cs->mode, 2569 (uint8_t *)(key1 + 1), key1->key_size, 2570 (uint8_t *)(key2 + 1), key2->key_size, 2571 iv, iv_len); 2572 } else { 2573 res = crypto_cipher_init(cs->ctx, cs->mode, 2574 (uint8_t *)(key1 + 1), key1->key_size, 2575 NULL, 0, iv, iv_len); 2576 } 2577 if (res != TEE_SUCCESS) 2578 return res; 2579 2580 cs->ctx_finalize = crypto_cipher_final; 2581 cs->state = CRYP_STATE_INITIALIZED; 2582 2583 return TEE_SUCCESS; 2584 } 2585 2586 static TEE_Result tee_svc_cipher_update_helper(unsigned long state, 2587 bool last_block, const void *src, size_t src_len, 2588 void *dst, uint64_t *dst_len) 2589 { 2590 struct ts_session *sess = ts_get_current_session(); 2591 struct tee_cryp_state *cs = NULL; 2592 TEE_Result res = TEE_SUCCESS; 2593 size_t dlen = 0; 2594 2595 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 2596 if (res != TEE_SUCCESS) 2597 return res; 2598 2599 if (cs->state != CRYP_STATE_INITIALIZED) 2600 return TEE_ERROR_BAD_STATE; 2601 2602 res = vm_check_access_rights(&to_user_ta_ctx(sess->ctx)->uctx, 2603 TEE_MEMORY_ACCESS_READ | 2604 TEE_MEMORY_ACCESS_ANY_OWNER, 2605 (uaddr_t)src, src_len); 2606 if (res != TEE_SUCCESS) 2607 return res; 2608 2609 if (!dst_len) { 2610 dlen = 0; 2611 } else { 2612 struct user_mode_ctx *uctx = &to_user_ta_ctx(sess->ctx)->uctx; 2613 uint32_t flags = TEE_MEMORY_ACCESS_READ | 2614 TEE_MEMORY_ACCESS_WRITE | 2615 TEE_MEMORY_ACCESS_ANY_OWNER; 2616 2617 res = get_user_u64_as_size_t(&dlen, dst_len); 2618 if (res != TEE_SUCCESS) 2619 return res; 2620 2621 res = vm_check_access_rights(uctx, flags, (uaddr_t)dst, dlen); 2622 if (res != TEE_SUCCESS) 2623 return res; 2624 } 2625 2626 if (dlen < src_len) { 2627 res = TEE_ERROR_SHORT_BUFFER; 2628 goto out; 2629 } 2630 2631 if (src_len > 0) { 2632 /* Permit src_len == 0 to finalize the operation */ 2633 res = tee_do_cipher_update(cs->ctx, cs->algo, cs->mode, 2634 last_block, src, src_len, dst); 2635 } 2636 2637 if (last_block && cs->ctx_finalize != NULL) { 2638 cs->ctx_finalize(cs->ctx); 2639 cs->ctx_finalize = NULL; 2640 } 2641 2642 out: 2643 if ((res == TEE_SUCCESS || res == TEE_ERROR_SHORT_BUFFER) && 2644 dst_len != NULL) { 2645 TEE_Result res2; 2646 2647 res2 = put_user_u64(dst_len, src_len); 2648 if (res2 != TEE_SUCCESS) 2649 res = res2; 2650 } 2651 2652 return res; 2653 } 2654 2655 TEE_Result syscall_cipher_update(unsigned long state, const void *src, 2656 size_t src_len, void *dst, uint64_t *dst_len) 2657 { 2658 return tee_svc_cipher_update_helper(state, false /* last_block */, 2659 src, src_len, dst, dst_len); 2660 } 2661 2662 TEE_Result syscall_cipher_final(unsigned long state, const void *src, 2663 size_t src_len, void *dst, uint64_t *dst_len) 2664 { 2665 return tee_svc_cipher_update_helper(state, true /* last_block */, 2666 src, src_len, dst, dst_len); 2667 } 2668 2669 #if defined(CFG_CRYPTO_HKDF) 2670 static TEE_Result get_hkdf_params(const TEE_Attribute *params, 2671 uint32_t param_count, 2672 void **salt, size_t *salt_len, void **info, 2673 size_t *info_len, size_t *okm_len) 2674 { 2675 size_t n; 2676 enum { SALT = 0x1, LENGTH = 0x2, INFO = 0x4 }; 2677 uint8_t found = 0; 2678 2679 *salt = *info = NULL; 2680 *salt_len = *info_len = *okm_len = 0; 2681 2682 for (n = 0; n < param_count; n++) { 2683 switch (params[n].attributeID) { 2684 case TEE_ATTR_HKDF_SALT: 2685 if (!(found & SALT)) { 2686 *salt = params[n].content.ref.buffer; 2687 *salt_len = params[n].content.ref.length; 2688 found |= SALT; 2689 } 2690 break; 2691 case TEE_ATTR_HKDF_OKM_LENGTH: 2692 if (!(found & LENGTH)) { 2693 *okm_len = params[n].content.value.a; 2694 found |= LENGTH; 2695 } 2696 break; 2697 case TEE_ATTR_HKDF_INFO: 2698 if (!(found & INFO)) { 2699 *info = params[n].content.ref.buffer; 2700 *info_len = params[n].content.ref.length; 2701 found |= INFO; 2702 } 2703 break; 2704 default: 2705 /* Unexpected attribute */ 2706 return TEE_ERROR_BAD_PARAMETERS; 2707 } 2708 2709 } 2710 2711 if (!(found & LENGTH)) 2712 return TEE_ERROR_BAD_PARAMETERS; 2713 2714 return TEE_SUCCESS; 2715 } 2716 #endif 2717 2718 #if defined(CFG_CRYPTO_CONCAT_KDF) 2719 static TEE_Result get_concat_kdf_params(const TEE_Attribute *params, 2720 uint32_t param_count, 2721 void **other_info, 2722 size_t *other_info_len, 2723 size_t *derived_key_len) 2724 { 2725 size_t n; 2726 enum { LENGTH = 0x1, INFO = 0x2 }; 2727 uint8_t found = 0; 2728 2729 *other_info = NULL; 2730 *other_info_len = *derived_key_len = 0; 2731 2732 for (n = 0; n < param_count; n++) { 2733 switch (params[n].attributeID) { 2734 case TEE_ATTR_CONCAT_KDF_OTHER_INFO: 2735 if (!(found & INFO)) { 2736 *other_info = params[n].content.ref.buffer; 2737 *other_info_len = params[n].content.ref.length; 2738 found |= INFO; 2739 } 2740 break; 2741 case TEE_ATTR_CONCAT_KDF_DKM_LENGTH: 2742 if (!(found & LENGTH)) { 2743 *derived_key_len = params[n].content.value.a; 2744 found |= LENGTH; 2745 } 2746 break; 2747 default: 2748 /* Unexpected attribute */ 2749 return TEE_ERROR_BAD_PARAMETERS; 2750 } 2751 } 2752 2753 if (!(found & LENGTH)) 2754 return TEE_ERROR_BAD_PARAMETERS; 2755 2756 return TEE_SUCCESS; 2757 } 2758 #endif 2759 2760 #if defined(CFG_CRYPTO_PBKDF2) 2761 static TEE_Result get_pbkdf2_params(const TEE_Attribute *params, 2762 uint32_t param_count, void **salt, 2763 size_t *salt_len, size_t *derived_key_len, 2764 size_t *iteration_count) 2765 { 2766 size_t n; 2767 enum { SALT = 0x1, LENGTH = 0x2, COUNT = 0x4 }; 2768 uint8_t found = 0; 2769 2770 *salt = NULL; 2771 *salt_len = *derived_key_len = *iteration_count = 0; 2772 2773 for (n = 0; n < param_count; n++) { 2774 switch (params[n].attributeID) { 2775 case TEE_ATTR_PBKDF2_SALT: 2776 if (!(found & SALT)) { 2777 *salt = params[n].content.ref.buffer; 2778 *salt_len = params[n].content.ref.length; 2779 found |= SALT; 2780 } 2781 break; 2782 case TEE_ATTR_PBKDF2_DKM_LENGTH: 2783 if (!(found & LENGTH)) { 2784 *derived_key_len = params[n].content.value.a; 2785 found |= LENGTH; 2786 } 2787 break; 2788 case TEE_ATTR_PBKDF2_ITERATION_COUNT: 2789 if (!(found & COUNT)) { 2790 *iteration_count = params[n].content.value.a; 2791 found |= COUNT; 2792 } 2793 break; 2794 default: 2795 /* Unexpected attribute */ 2796 return TEE_ERROR_BAD_PARAMETERS; 2797 } 2798 } 2799 2800 if ((found & (LENGTH|COUNT)) != (LENGTH|COUNT)) 2801 return TEE_ERROR_BAD_PARAMETERS; 2802 2803 return TEE_SUCCESS; 2804 } 2805 #endif 2806 2807 #if defined(CFG_CRYPTO_SM2_KEP) 2808 static TEE_Result get_sm2_kep_params(const TEE_Attribute *params, 2809 uint32_t param_count, 2810 struct ecc_public_key *peer_key, 2811 struct ecc_public_key *peer_eph_key, 2812 struct sm2_kep_parms *kep_parms) 2813 { 2814 TEE_Result res = TEE_ERROR_GENERIC; 2815 size_t n; 2816 enum { 2817 IS_INITIATOR, 2818 PEER_KEY_X, 2819 PEER_KEY_Y, 2820 PEER_EPH_KEY_X, 2821 PEER_EPH_KEY_Y, 2822 INITIATOR_ID, 2823 RESPONDER_ID, 2824 }; 2825 uint8_t mandatory = BIT(IS_INITIATOR) | BIT(PEER_KEY_X) | 2826 BIT(PEER_KEY_Y) | BIT(PEER_EPH_KEY_X) | BIT(PEER_EPH_KEY_Y) | 2827 BIT(INITIATOR_ID) | BIT(RESPONDER_ID); 2828 uint8_t found = 0; 2829 2830 res = crypto_acipher_alloc_ecc_public_key(peer_key, 2831 TEE_TYPE_SM2_KEP_PUBLIC_KEY, 2832 256); 2833 if (res) 2834 goto out; 2835 2836 res = crypto_acipher_alloc_ecc_public_key(peer_eph_key, 2837 TEE_TYPE_SM2_KEP_PUBLIC_KEY, 2838 256); 2839 if (res) 2840 goto out; 2841 2842 peer_key->curve = TEE_ECC_CURVE_SM2; 2843 peer_eph_key->curve = TEE_ECC_CURVE_SM2; 2844 2845 for (n = 0; n < param_count; n++) { 2846 const TEE_Attribute *p = ¶ms[n]; 2847 2848 switch (p->attributeID) { 2849 case TEE_ATTR_SM2_KEP_USER: 2850 kep_parms->is_initiator = !p->content.value.a; 2851 found |= BIT(IS_INITIATOR); 2852 break; 2853 case TEE_ATTR_ECC_PUBLIC_VALUE_X: 2854 crypto_bignum_bin2bn(p->content.ref.buffer, 2855 p->content.ref.length, 2856 peer_key->x); 2857 found |= BIT(PEER_KEY_X); 2858 break; 2859 case TEE_ATTR_ECC_PUBLIC_VALUE_Y: 2860 crypto_bignum_bin2bn(p->content.ref.buffer, 2861 p->content.ref.length, 2862 peer_key->y); 2863 found |= BIT(PEER_KEY_Y); 2864 break; 2865 case TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X: 2866 crypto_bignum_bin2bn(p->content.ref.buffer, 2867 p->content.ref.length, 2868 peer_eph_key->x); 2869 found |= BIT(PEER_EPH_KEY_X); 2870 break; 2871 case TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y: 2872 crypto_bignum_bin2bn(p->content.ref.buffer, 2873 p->content.ref.length, 2874 peer_eph_key->y); 2875 found |= BIT(PEER_EPH_KEY_Y); 2876 break; 2877 case TEE_ATTR_SM2_ID_INITIATOR: 2878 kep_parms->initiator_id = p->content.ref.buffer; 2879 kep_parms->initiator_id_len = p->content.ref.length; 2880 found |= BIT(INITIATOR_ID); 2881 break; 2882 case TEE_ATTR_SM2_ID_RESPONDER: 2883 kep_parms->responder_id = p->content.ref.buffer; 2884 kep_parms->responder_id_len = p->content.ref.length; 2885 found |= BIT(RESPONDER_ID); 2886 break; 2887 case TEE_ATTR_SM2_KEP_CONFIRMATION_IN: 2888 kep_parms->conf_in = p->content.ref.buffer; 2889 kep_parms->conf_in_len = p->content.ref.length; 2890 break; 2891 case TEE_ATTR_SM2_KEP_CONFIRMATION_OUT: 2892 kep_parms->conf_out = p->content.ref.buffer; 2893 kep_parms->conf_out_len = p->content.ref.length; 2894 break; 2895 default: 2896 /* Unexpected attribute */ 2897 res = TEE_ERROR_BAD_PARAMETERS; 2898 goto out; 2899 } 2900 } 2901 2902 if ((found & mandatory) != mandatory) { 2903 res = TEE_ERROR_BAD_PARAMETERS; 2904 goto out; 2905 } 2906 2907 return TEE_SUCCESS; 2908 out: 2909 crypto_acipher_free_ecc_public_key(peer_key); 2910 crypto_acipher_free_ecc_public_key(peer_eph_key); 2911 return res; 2912 } 2913 #endif 2914 2915 TEE_Result syscall_cryp_derive_key(unsigned long state, 2916 const struct utee_attribute *usr_params, 2917 unsigned long param_count, unsigned long derived_key) 2918 { 2919 struct ts_session *sess = ts_get_current_session(); 2920 struct user_ta_ctx *utc = to_user_ta_ctx(sess->ctx); 2921 TEE_Result res = TEE_ERROR_NOT_SUPPORTED; 2922 struct tee_obj *ko = NULL; 2923 struct tee_obj *so = NULL; 2924 struct tee_cryp_state *cs = NULL; 2925 struct tee_cryp_obj_secret *sk = NULL; 2926 const struct tee_cryp_obj_type_props *type_props = NULL; 2927 TEE_Attribute *params = NULL; 2928 size_t alloc_size = 0; 2929 2930 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 2931 if (res != TEE_SUCCESS) 2932 return res; 2933 2934 if (MUL_OVERFLOW(sizeof(TEE_Attribute), param_count, &alloc_size)) 2935 return TEE_ERROR_OVERFLOW; 2936 2937 params = malloc(alloc_size); 2938 if (!params) 2939 return TEE_ERROR_OUT_OF_MEMORY; 2940 res = copy_in_attrs(utc, usr_params, param_count, params); 2941 if (res != TEE_SUCCESS) 2942 goto out; 2943 2944 /* Get key set in operation */ 2945 res = tee_obj_get(utc, cs->key1, &ko); 2946 if (res != TEE_SUCCESS) 2947 goto out; 2948 2949 res = tee_obj_get(utc, uref_to_vaddr(derived_key), &so); 2950 if (res != TEE_SUCCESS) 2951 goto out; 2952 2953 /* Find information needed about the object to initialize */ 2954 sk = so->attr; 2955 2956 /* Find description of object */ 2957 type_props = tee_svc_find_type_props(so->info.objectType); 2958 if (!type_props) { 2959 res = TEE_ERROR_NOT_SUPPORTED; 2960 goto out; 2961 } 2962 2963 if (cs->algo == TEE_ALG_DH_DERIVE_SHARED_SECRET) { 2964 struct bignum *pub; 2965 struct bignum *ss; 2966 2967 if (param_count != 1 || 2968 params[0].attributeID != TEE_ATTR_DH_PUBLIC_VALUE) { 2969 res = TEE_ERROR_BAD_PARAMETERS; 2970 goto out; 2971 } 2972 2973 size_t bin_size = params[0].content.ref.length; 2974 2975 if (MUL_OVERFLOW(bin_size, 8, &alloc_size)) { 2976 res = TEE_ERROR_OVERFLOW; 2977 goto out; 2978 } 2979 2980 pub = crypto_bignum_allocate(alloc_size); 2981 ss = crypto_bignum_allocate(alloc_size); 2982 if (pub && ss) { 2983 crypto_bignum_bin2bn(params[0].content.ref.buffer, 2984 bin_size, pub); 2985 res = crypto_acipher_dh_shared_secret(ko->attr, 2986 pub, ss); 2987 if (res == TEE_SUCCESS) { 2988 sk->key_size = crypto_bignum_num_bytes(ss); 2989 crypto_bignum_bn2bin(ss, (uint8_t *)(sk + 1)); 2990 so->info.handleFlags |= 2991 TEE_HANDLE_FLAG_INITIALIZED; 2992 set_attribute(so, type_props, 2993 TEE_ATTR_SECRET_VALUE); 2994 } 2995 } else { 2996 res = TEE_ERROR_OUT_OF_MEMORY; 2997 } 2998 crypto_bignum_free(pub); 2999 crypto_bignum_free(ss); 3000 } else if (TEE_ALG_GET_MAIN_ALG(cs->algo) == TEE_MAIN_ALGO_ECDH) { 3001 struct ecc_public_key key_public; 3002 uint8_t *pt_secret; 3003 unsigned long pt_secret_len; 3004 uint32_t key_type = TEE_TYPE_ECDH_PUBLIC_KEY; 3005 3006 if (param_count != 2 || 3007 params[0].attributeID != TEE_ATTR_ECC_PUBLIC_VALUE_X || 3008 params[1].attributeID != TEE_ATTR_ECC_PUBLIC_VALUE_Y) { 3009 res = TEE_ERROR_BAD_PARAMETERS; 3010 goto out; 3011 } 3012 3013 switch (cs->algo) { 3014 case TEE_ALG_ECDH_P192: 3015 alloc_size = 192; 3016 break; 3017 case TEE_ALG_ECDH_P224: 3018 alloc_size = 224; 3019 break; 3020 case TEE_ALG_ECDH_P256: 3021 alloc_size = 256; 3022 break; 3023 case TEE_ALG_ECDH_P384: 3024 alloc_size = 384; 3025 break; 3026 case TEE_ALG_ECDH_P521: 3027 alloc_size = 521; 3028 break; 3029 default: 3030 res = TEE_ERROR_NOT_IMPLEMENTED; 3031 goto out; 3032 } 3033 3034 /* Create the public key */ 3035 res = crypto_acipher_alloc_ecc_public_key(&key_public, key_type, 3036 alloc_size); 3037 if (res != TEE_SUCCESS) 3038 goto out; 3039 key_public.curve = ((struct ecc_keypair *)ko->attr)->curve; 3040 crypto_bignum_bin2bn(params[0].content.ref.buffer, 3041 params[0].content.ref.length, 3042 key_public.x); 3043 crypto_bignum_bin2bn(params[1].content.ref.buffer, 3044 params[1].content.ref.length, 3045 key_public.y); 3046 3047 pt_secret = (uint8_t *)(sk + 1); 3048 pt_secret_len = sk->alloc_size; 3049 res = crypto_acipher_ecc_shared_secret(ko->attr, &key_public, 3050 pt_secret, 3051 &pt_secret_len); 3052 3053 if (res == TEE_SUCCESS) { 3054 sk->key_size = pt_secret_len; 3055 so->info.handleFlags |= TEE_HANDLE_FLAG_INITIALIZED; 3056 set_attribute(so, type_props, TEE_ATTR_SECRET_VALUE); 3057 } 3058 3059 /* free the public key */ 3060 crypto_acipher_free_ecc_public_key(&key_public); 3061 } 3062 #if defined(CFG_CRYPTO_HKDF) 3063 else if (TEE_ALG_GET_MAIN_ALG(cs->algo) == TEE_MAIN_ALGO_HKDF) { 3064 void *salt, *info; 3065 size_t salt_len, info_len, okm_len; 3066 uint32_t hash_id = TEE_ALG_GET_DIGEST_HASH(cs->algo); 3067 struct tee_cryp_obj_secret *ik = ko->attr; 3068 const uint8_t *ikm = (const uint8_t *)(ik + 1); 3069 3070 res = get_hkdf_params(params, param_count, &salt, &salt_len, 3071 &info, &info_len, &okm_len); 3072 if (res != TEE_SUCCESS) 3073 goto out; 3074 3075 /* Requested size must fit into the output object's buffer */ 3076 if (okm_len > ik->alloc_size) { 3077 res = TEE_ERROR_BAD_PARAMETERS; 3078 goto out; 3079 } 3080 3081 res = tee_cryp_hkdf(hash_id, ikm, ik->key_size, salt, salt_len, 3082 info, info_len, (uint8_t *)(sk + 1), 3083 okm_len); 3084 if (res == TEE_SUCCESS) { 3085 sk->key_size = okm_len; 3086 so->info.handleFlags |= TEE_HANDLE_FLAG_INITIALIZED; 3087 set_attribute(so, type_props, TEE_ATTR_SECRET_VALUE); 3088 } 3089 } 3090 #endif 3091 #if defined(CFG_CRYPTO_CONCAT_KDF) 3092 else if (TEE_ALG_GET_MAIN_ALG(cs->algo) == TEE_MAIN_ALGO_CONCAT_KDF) { 3093 void *info; 3094 size_t info_len, derived_key_len; 3095 uint32_t hash_id = TEE_ALG_GET_DIGEST_HASH(cs->algo); 3096 struct tee_cryp_obj_secret *ss = ko->attr; 3097 const uint8_t *shared_secret = (const uint8_t *)(ss + 1); 3098 3099 res = get_concat_kdf_params(params, param_count, &info, 3100 &info_len, &derived_key_len); 3101 if (res != TEE_SUCCESS) 3102 goto out; 3103 3104 /* Requested size must fit into the output object's buffer */ 3105 if (derived_key_len > ss->alloc_size) { 3106 res = TEE_ERROR_BAD_PARAMETERS; 3107 goto out; 3108 } 3109 3110 res = tee_cryp_concat_kdf(hash_id, shared_secret, ss->key_size, 3111 info, info_len, (uint8_t *)(sk + 1), 3112 derived_key_len); 3113 if (res == TEE_SUCCESS) { 3114 sk->key_size = derived_key_len; 3115 so->info.handleFlags |= TEE_HANDLE_FLAG_INITIALIZED; 3116 set_attribute(so, type_props, TEE_ATTR_SECRET_VALUE); 3117 } 3118 } 3119 #endif 3120 #if defined(CFG_CRYPTO_PBKDF2) 3121 else if (TEE_ALG_GET_MAIN_ALG(cs->algo) == TEE_MAIN_ALGO_PBKDF2) { 3122 void *salt; 3123 size_t salt_len, iteration_count, derived_key_len; 3124 uint32_t hash_id = TEE_ALG_GET_DIGEST_HASH(cs->algo); 3125 struct tee_cryp_obj_secret *ss = ko->attr; 3126 const uint8_t *password = (const uint8_t *)(ss + 1); 3127 3128 res = get_pbkdf2_params(params, param_count, &salt, &salt_len, 3129 &derived_key_len, &iteration_count); 3130 if (res != TEE_SUCCESS) 3131 goto out; 3132 3133 /* Requested size must fit into the output object's buffer */ 3134 if (derived_key_len > ss->alloc_size) { 3135 res = TEE_ERROR_BAD_PARAMETERS; 3136 goto out; 3137 } 3138 3139 res = tee_cryp_pbkdf2(hash_id, password, ss->key_size, salt, 3140 salt_len, iteration_count, 3141 (uint8_t *)(sk + 1), derived_key_len); 3142 if (res == TEE_SUCCESS) { 3143 sk->key_size = derived_key_len; 3144 so->info.handleFlags |= TEE_HANDLE_FLAG_INITIALIZED; 3145 set_attribute(so, type_props, TEE_ATTR_SECRET_VALUE); 3146 } 3147 } 3148 #endif 3149 #if defined(CFG_CRYPTO_SM2_KEP) 3150 else if (cs->algo == TEE_ALG_SM2_KEP) { 3151 struct ecc_public_key peer_eph_key = { }; 3152 struct ecc_public_key peer_key = { }; 3153 struct sm2_kep_parms kep_parms = { 3154 .out = (uint8_t *)(sk + 1), 3155 .out_len = so->info.maxKeySize, 3156 }; 3157 struct tee_obj *ko2 = NULL; 3158 3159 res = tee_obj_get(utc, cs->key2, &ko2); 3160 if (res != TEE_SUCCESS) 3161 goto out; 3162 3163 res = get_sm2_kep_params(params, param_count, &peer_key, 3164 &peer_eph_key, &kep_parms); 3165 if (res != TEE_SUCCESS) 3166 goto out; 3167 3168 /* 3169 * key1 is our private keypair, key2 is our ephemeral public key 3170 */ 3171 res = crypto_acipher_sm2_kep_derive(ko->attr, /* key1 */ 3172 ko2->attr, /* key2 */ 3173 &peer_key, &peer_eph_key, 3174 &kep_parms); 3175 3176 if (res == TEE_SUCCESS) { 3177 sk->key_size = kep_parms.out_len; 3178 so->info.handleFlags |= TEE_HANDLE_FLAG_INITIALIZED; 3179 set_attribute(so, type_props, TEE_ATTR_SECRET_VALUE); 3180 } 3181 crypto_acipher_free_ecc_public_key(&peer_key); 3182 crypto_acipher_free_ecc_public_key(&peer_eph_key); 3183 } 3184 #endif 3185 else 3186 res = TEE_ERROR_NOT_SUPPORTED; 3187 3188 out: 3189 free_wipe(params); 3190 return res; 3191 } 3192 3193 TEE_Result syscall_cryp_random_number_generate(void *buf, size_t blen) 3194 { 3195 struct ts_session *sess = ts_get_current_session(); 3196 TEE_Result res = TEE_SUCCESS; 3197 3198 res = vm_check_access_rights(&to_user_ta_ctx(sess->ctx)->uctx, 3199 TEE_MEMORY_ACCESS_WRITE, 3200 (uaddr_t)buf, blen); 3201 if (res != TEE_SUCCESS) 3202 return res; 3203 3204 res = crypto_rng_read(buf, blen); 3205 if (res != TEE_SUCCESS) 3206 return res; 3207 3208 return res; 3209 } 3210 3211 TEE_Result syscall_authenc_init(unsigned long state, const void *nonce, 3212 size_t nonce_len, size_t tag_len, 3213 size_t aad_len, size_t payload_len) 3214 { 3215 struct ts_session *sess = ts_get_current_session(); 3216 struct tee_cryp_obj_secret *key = NULL; 3217 struct tee_cryp_state *cs = NULL; 3218 TEE_Result res = TEE_SUCCESS; 3219 struct tee_obj *o = NULL; 3220 3221 res = vm_check_access_rights(&to_user_ta_ctx(sess->ctx)->uctx, 3222 TEE_MEMORY_ACCESS_READ | 3223 TEE_MEMORY_ACCESS_ANY_OWNER, 3224 (uaddr_t)nonce, nonce_len); 3225 if (res != TEE_SUCCESS) 3226 return res; 3227 3228 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 3229 if (res != TEE_SUCCESS) 3230 return res; 3231 3232 res = tee_obj_get(to_user_ta_ctx(sess->ctx), cs->key1, &o); 3233 if (res != TEE_SUCCESS) 3234 return res; 3235 if ((o->info.handleFlags & TEE_HANDLE_FLAG_INITIALIZED) == 0) 3236 return TEE_ERROR_BAD_PARAMETERS; 3237 3238 key = o->attr; 3239 res = crypto_authenc_init(cs->ctx, cs->mode, (uint8_t *)(key + 1), 3240 key->key_size, nonce, nonce_len, tag_len, 3241 aad_len, payload_len); 3242 if (res != TEE_SUCCESS) 3243 return res; 3244 3245 cs->ctx_finalize = crypto_authenc_final; 3246 cs->state = CRYP_STATE_INITIALIZED; 3247 3248 return TEE_SUCCESS; 3249 } 3250 3251 TEE_Result syscall_authenc_update_aad(unsigned long state, 3252 const void *aad_data, size_t aad_data_len) 3253 { 3254 struct ts_session *sess = ts_get_current_session(); 3255 TEE_Result res = TEE_SUCCESS; 3256 struct tee_cryp_state *cs = NULL; 3257 3258 res = vm_check_access_rights(&to_user_ta_ctx(sess->ctx)->uctx, 3259 TEE_MEMORY_ACCESS_READ | 3260 TEE_MEMORY_ACCESS_ANY_OWNER, 3261 (uaddr_t)aad_data, aad_data_len); 3262 if (res != TEE_SUCCESS) 3263 return res; 3264 3265 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 3266 if (res != TEE_SUCCESS) 3267 return res; 3268 3269 if (cs->state != CRYP_STATE_INITIALIZED) 3270 return TEE_ERROR_BAD_STATE; 3271 3272 if (TEE_ALG_GET_CLASS(cs->algo) != TEE_OPERATION_AE) 3273 return TEE_ERROR_BAD_STATE; 3274 3275 res = crypto_authenc_update_aad(cs->ctx, cs->mode, aad_data, 3276 aad_data_len); 3277 if (res != TEE_SUCCESS) 3278 return res; 3279 3280 return TEE_SUCCESS; 3281 } 3282 3283 TEE_Result syscall_authenc_update_payload(unsigned long state, 3284 const void *src_data, 3285 size_t src_len, void *dst_data, 3286 uint64_t *dst_len) 3287 { 3288 struct ts_session *sess = ts_get_current_session(); 3289 struct tee_cryp_state *cs = NULL; 3290 TEE_Result res = TEE_SUCCESS; 3291 size_t dlen = 0; 3292 3293 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 3294 if (res != TEE_SUCCESS) 3295 return res; 3296 3297 if (cs->state != CRYP_STATE_INITIALIZED) 3298 return TEE_ERROR_BAD_STATE; 3299 3300 if (TEE_ALG_GET_CLASS(cs->algo) != TEE_OPERATION_AE) 3301 return TEE_ERROR_BAD_STATE; 3302 3303 res = vm_check_access_rights(&to_user_ta_ctx(sess->ctx)->uctx, 3304 TEE_MEMORY_ACCESS_READ | 3305 TEE_MEMORY_ACCESS_ANY_OWNER, 3306 (uaddr_t)src_data, src_len); 3307 if (res != TEE_SUCCESS) 3308 return res; 3309 3310 res = get_user_u64_as_size_t(&dlen, dst_len); 3311 if (res != TEE_SUCCESS) 3312 return res; 3313 3314 res = vm_check_access_rights(&to_user_ta_ctx(sess->ctx)->uctx, 3315 TEE_MEMORY_ACCESS_READ | 3316 TEE_MEMORY_ACCESS_WRITE | 3317 TEE_MEMORY_ACCESS_ANY_OWNER, 3318 (uaddr_t)dst_data, dlen); 3319 if (res != TEE_SUCCESS) 3320 return res; 3321 3322 if (dlen < src_len) { 3323 res = TEE_ERROR_SHORT_BUFFER; 3324 goto out; 3325 } 3326 3327 res = crypto_authenc_update_payload(cs->ctx, cs->mode, src_data, 3328 src_len, dst_data, &dlen); 3329 out: 3330 if (res == TEE_SUCCESS || res == TEE_ERROR_SHORT_BUFFER) { 3331 TEE_Result res2 = put_user_u64(dst_len, dlen); 3332 3333 if (res2 != TEE_SUCCESS) 3334 res = res2; 3335 } 3336 3337 return res; 3338 } 3339 3340 TEE_Result syscall_authenc_enc_final(unsigned long state, const void *src_data, 3341 size_t src_len, void *dst_data, 3342 uint64_t *dst_len, void *tag, 3343 uint64_t *tag_len) 3344 { 3345 struct ts_session *sess = ts_get_current_session(); 3346 struct user_mode_ctx *uctx = &to_user_ta_ctx(sess->ctx)->uctx; 3347 struct tee_cryp_state *cs = NULL; 3348 TEE_Result res = TEE_SUCCESS; 3349 size_t dlen = 0; 3350 size_t tlen = 0; 3351 3352 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 3353 if (res != TEE_SUCCESS) 3354 return res; 3355 3356 if (cs->state != CRYP_STATE_INITIALIZED) 3357 return TEE_ERROR_BAD_STATE; 3358 3359 if (cs->mode != TEE_MODE_ENCRYPT) 3360 return TEE_ERROR_BAD_PARAMETERS; 3361 3362 if (TEE_ALG_GET_CLASS(cs->algo) != TEE_OPERATION_AE) 3363 return TEE_ERROR_BAD_STATE; 3364 3365 res = vm_check_access_rights(uctx, 3366 TEE_MEMORY_ACCESS_READ | 3367 TEE_MEMORY_ACCESS_ANY_OWNER, 3368 (uaddr_t)src_data, src_len); 3369 if (res != TEE_SUCCESS) 3370 return res; 3371 3372 if (!dst_len) { 3373 dlen = 0; 3374 } else { 3375 res = get_user_u64_as_size_t(&dlen, dst_len); 3376 if (res != TEE_SUCCESS) 3377 return res; 3378 3379 res = vm_check_access_rights(uctx, 3380 TEE_MEMORY_ACCESS_READ | 3381 TEE_MEMORY_ACCESS_WRITE | 3382 TEE_MEMORY_ACCESS_ANY_OWNER, 3383 (uaddr_t)dst_data, dlen); 3384 if (res != TEE_SUCCESS) 3385 return res; 3386 } 3387 3388 if (dlen < src_len) { 3389 res = TEE_ERROR_SHORT_BUFFER; 3390 goto out; 3391 } 3392 3393 res = get_user_u64_as_size_t(&tlen, tag_len); 3394 if (res != TEE_SUCCESS) 3395 return res; 3396 3397 res = vm_check_access_rights(uctx, 3398 TEE_MEMORY_ACCESS_READ | 3399 TEE_MEMORY_ACCESS_WRITE | 3400 TEE_MEMORY_ACCESS_ANY_OWNER, 3401 (uaddr_t)tag, tlen); 3402 if (res != TEE_SUCCESS) 3403 return res; 3404 3405 res = crypto_authenc_enc_final(cs->ctx, src_data, src_len, dst_data, 3406 &dlen, tag, &tlen); 3407 3408 out: 3409 if (res == TEE_SUCCESS || res == TEE_ERROR_SHORT_BUFFER) { 3410 TEE_Result res2 = TEE_SUCCESS; 3411 3412 if (dst_len != NULL) { 3413 res2 = put_user_u64(dst_len, dlen); 3414 if (res2 != TEE_SUCCESS) 3415 return res2; 3416 } 3417 3418 res2 = put_user_u64(tag_len, tlen); 3419 if (res2 != TEE_SUCCESS) 3420 return res2; 3421 } 3422 3423 return res; 3424 } 3425 3426 TEE_Result syscall_authenc_dec_final(unsigned long state, 3427 const void *src_data, size_t src_len, void *dst_data, 3428 uint64_t *dst_len, const void *tag, size_t tag_len) 3429 { 3430 struct ts_session *sess = ts_get_current_session(); 3431 struct user_mode_ctx *uctx = &to_user_ta_ctx(sess->ctx)->uctx; 3432 struct tee_cryp_state *cs = NULL; 3433 TEE_Result res = TEE_SUCCESS; 3434 size_t dlen = 0; 3435 3436 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 3437 if (res != TEE_SUCCESS) 3438 return res; 3439 3440 if (cs->state != CRYP_STATE_INITIALIZED) 3441 return TEE_ERROR_BAD_STATE; 3442 3443 if (cs->mode != TEE_MODE_DECRYPT) 3444 return TEE_ERROR_BAD_PARAMETERS; 3445 3446 if (TEE_ALG_GET_CLASS(cs->algo) != TEE_OPERATION_AE) 3447 return TEE_ERROR_BAD_STATE; 3448 3449 res = vm_check_access_rights(uctx, 3450 TEE_MEMORY_ACCESS_READ | 3451 TEE_MEMORY_ACCESS_ANY_OWNER, 3452 (uaddr_t)src_data, src_len); 3453 if (res != TEE_SUCCESS) 3454 return res; 3455 3456 if (!dst_len) { 3457 dlen = 0; 3458 } else { 3459 res = get_user_u64_as_size_t(&dlen, dst_len); 3460 if (res != TEE_SUCCESS) 3461 return res; 3462 3463 res = vm_check_access_rights(uctx, 3464 TEE_MEMORY_ACCESS_READ | 3465 TEE_MEMORY_ACCESS_WRITE | 3466 TEE_MEMORY_ACCESS_ANY_OWNER, 3467 (uaddr_t)dst_data, dlen); 3468 if (res != TEE_SUCCESS) 3469 return res; 3470 } 3471 3472 if (dlen < src_len) { 3473 res = TEE_ERROR_SHORT_BUFFER; 3474 goto out; 3475 } 3476 3477 res = vm_check_access_rights(uctx, TEE_MEMORY_ACCESS_READ, 3478 (uaddr_t)tag, tag_len); 3479 if (res != TEE_SUCCESS) 3480 return res; 3481 3482 res = crypto_authenc_dec_final(cs->ctx, src_data, src_len, dst_data, 3483 &dlen, tag, tag_len); 3484 3485 out: 3486 if ((res == TEE_SUCCESS || res == TEE_ERROR_SHORT_BUFFER) && 3487 dst_len != NULL) { 3488 TEE_Result res2 = put_user_u64(dst_len, dlen); 3489 3490 if (res2 != TEE_SUCCESS) 3491 return res2; 3492 } 3493 3494 return res; 3495 } 3496 3497 static int pkcs1_get_salt_len(const TEE_Attribute *params, uint32_t num_params, 3498 size_t default_len) 3499 { 3500 size_t n; 3501 3502 assert(default_len < INT_MAX); 3503 3504 for (n = 0; n < num_params; n++) { 3505 if (params[n].attributeID == TEE_ATTR_RSA_PSS_SALT_LENGTH) { 3506 if (params[n].content.value.a < INT_MAX) 3507 return params[n].content.value.a; 3508 break; 3509 } 3510 } 3511 /* 3512 * If salt length isn't provided use the default value which is 3513 * the length of the digest. 3514 */ 3515 return default_len; 3516 } 3517 3518 TEE_Result syscall_asymm_operate(unsigned long state, 3519 const struct utee_attribute *usr_params, 3520 size_t num_params, const void *src_data, size_t src_len, 3521 void *dst_data, uint64_t *dst_len) 3522 { 3523 struct ts_session *sess = ts_get_current_session(); 3524 struct user_ta_ctx *utc = to_user_ta_ctx(sess->ctx); 3525 TEE_Result res = TEE_SUCCESS; 3526 struct tee_cryp_state *cs = NULL; 3527 size_t dlen = 0; 3528 struct tee_obj *o = NULL; 3529 void *label = NULL; 3530 size_t label_len = 0; 3531 size_t n = 0; 3532 int salt_len = 0; 3533 TEE_Attribute *params = NULL; 3534 3535 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 3536 if (res != TEE_SUCCESS) 3537 return res; 3538 3539 res = vm_check_access_rights(&utc->uctx, 3540 TEE_MEMORY_ACCESS_READ | 3541 TEE_MEMORY_ACCESS_ANY_OWNER, 3542 (uaddr_t)src_data, src_len); 3543 if (res != TEE_SUCCESS) 3544 return res; 3545 3546 res = get_user_u64_as_size_t(&dlen, dst_len); 3547 if (res != TEE_SUCCESS) 3548 return res; 3549 3550 res = vm_check_access_rights(&utc->uctx, 3551 TEE_MEMORY_ACCESS_READ | 3552 TEE_MEMORY_ACCESS_WRITE | 3553 TEE_MEMORY_ACCESS_ANY_OWNER, 3554 (uaddr_t)dst_data, dlen); 3555 if (res != TEE_SUCCESS) 3556 return res; 3557 3558 size_t alloc_size = 0; 3559 3560 if (MUL_OVERFLOW(sizeof(TEE_Attribute), num_params, &alloc_size)) 3561 return TEE_ERROR_OVERFLOW; 3562 3563 params = malloc(alloc_size); 3564 if (!params) 3565 return TEE_ERROR_OUT_OF_MEMORY; 3566 res = copy_in_attrs(utc, usr_params, num_params, params); 3567 if (res != TEE_SUCCESS) 3568 goto out; 3569 3570 res = tee_obj_get(utc, cs->key1, &o); 3571 if (res != TEE_SUCCESS) 3572 goto out; 3573 if ((o->info.handleFlags & TEE_HANDLE_FLAG_INITIALIZED) == 0) { 3574 res = TEE_ERROR_GENERIC; 3575 goto out; 3576 } 3577 3578 switch (cs->algo) { 3579 case TEE_ALG_RSA_NOPAD: 3580 if (cs->mode == TEE_MODE_ENCRYPT) { 3581 res = crypto_acipher_rsanopad_encrypt(o->attr, src_data, 3582 src_len, dst_data, 3583 &dlen); 3584 } else if (cs->mode == TEE_MODE_DECRYPT) { 3585 res = crypto_acipher_rsanopad_decrypt(o->attr, src_data, 3586 src_len, dst_data, 3587 &dlen); 3588 } else { 3589 /* 3590 * We will panic because "the mode is not compatible 3591 * with the function" 3592 */ 3593 res = TEE_ERROR_GENERIC; 3594 } 3595 break; 3596 3597 case TEE_ALG_SM2_PKE: 3598 if (cs->mode == TEE_MODE_ENCRYPT) { 3599 res = crypto_acipher_sm2_pke_encrypt(o->attr, src_data, 3600 src_len, dst_data, 3601 &dlen); 3602 } else if (cs->mode == TEE_MODE_DECRYPT) { 3603 res = crypto_acipher_sm2_pke_decrypt(o->attr, src_data, 3604 src_len, dst_data, 3605 &dlen); 3606 } else { 3607 res = TEE_ERROR_GENERIC; 3608 } 3609 break; 3610 3611 case TEE_ALG_RSAES_PKCS1_V1_5: 3612 case TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1: 3613 case TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA224: 3614 case TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256: 3615 case TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA384: 3616 case TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA512: 3617 for (n = 0; n < num_params; n++) { 3618 if (params[n].attributeID == TEE_ATTR_RSA_OAEP_LABEL) { 3619 label = params[n].content.ref.buffer; 3620 label_len = params[n].content.ref.length; 3621 break; 3622 } 3623 } 3624 3625 if (cs->mode == TEE_MODE_ENCRYPT) { 3626 res = crypto_acipher_rsaes_encrypt(cs->algo, o->attr, 3627 label, label_len, 3628 src_data, src_len, 3629 dst_data, &dlen); 3630 } else if (cs->mode == TEE_MODE_DECRYPT) { 3631 res = crypto_acipher_rsaes_decrypt( 3632 cs->algo, o->attr, label, label_len, 3633 src_data, src_len, dst_data, &dlen); 3634 } else { 3635 res = TEE_ERROR_BAD_PARAMETERS; 3636 } 3637 break; 3638 3639 #if defined(CFG_CRYPTO_RSASSA_NA1) 3640 case TEE_ALG_RSASSA_PKCS1_V1_5: 3641 #endif 3642 case TEE_ALG_RSASSA_PKCS1_V1_5_MD5: 3643 case TEE_ALG_RSASSA_PKCS1_V1_5_SHA1: 3644 case TEE_ALG_RSASSA_PKCS1_V1_5_SHA224: 3645 case TEE_ALG_RSASSA_PKCS1_V1_5_SHA256: 3646 case TEE_ALG_RSASSA_PKCS1_V1_5_SHA384: 3647 case TEE_ALG_RSASSA_PKCS1_V1_5_SHA512: 3648 case TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1: 3649 case TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224: 3650 case TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256: 3651 case TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384: 3652 case TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512: 3653 if (cs->mode != TEE_MODE_SIGN) { 3654 res = TEE_ERROR_BAD_PARAMETERS; 3655 break; 3656 } 3657 salt_len = pkcs1_get_salt_len(params, num_params, src_len); 3658 res = crypto_acipher_rsassa_sign(cs->algo, o->attr, salt_len, 3659 src_data, src_len, dst_data, 3660 &dlen); 3661 break; 3662 3663 case TEE_ALG_DSA_SHA1: 3664 case TEE_ALG_DSA_SHA224: 3665 case TEE_ALG_DSA_SHA256: 3666 res = crypto_acipher_dsa_sign(cs->algo, o->attr, src_data, 3667 src_len, dst_data, &dlen); 3668 break; 3669 case TEE_ALG_ECDSA_P192: 3670 case TEE_ALG_ECDSA_P224: 3671 case TEE_ALG_ECDSA_P256: 3672 case TEE_ALG_ECDSA_P384: 3673 case TEE_ALG_ECDSA_P521: 3674 res = crypto_acipher_ecc_sign(cs->algo, o->attr, src_data, 3675 src_len, dst_data, &dlen); 3676 break; 3677 case TEE_ALG_SM2_DSA_SM3: 3678 res = crypto_acipher_sm2_dsa_sign(cs->algo, o->attr, src_data, 3679 src_len, dst_data, &dlen); 3680 break; 3681 3682 default: 3683 res = TEE_ERROR_BAD_PARAMETERS; 3684 break; 3685 } 3686 3687 out: 3688 free_wipe(params); 3689 3690 if (res == TEE_SUCCESS || res == TEE_ERROR_SHORT_BUFFER) { 3691 TEE_Result res2 = put_user_u64(dst_len, dlen); 3692 3693 if (res2 != TEE_SUCCESS) 3694 return res2; 3695 } 3696 3697 return res; 3698 } 3699 3700 TEE_Result syscall_asymm_verify(unsigned long state, 3701 const struct utee_attribute *usr_params, 3702 size_t num_params, const void *data, size_t data_len, 3703 const void *sig, size_t sig_len) 3704 { 3705 struct ts_session *sess = ts_get_current_session(); 3706 struct user_ta_ctx *utc = to_user_ta_ctx(sess->ctx); 3707 struct tee_cryp_state *cs = NULL; 3708 TEE_Result res = TEE_SUCCESS; 3709 TEE_Attribute *params = NULL; 3710 struct tee_obj *o = NULL; 3711 size_t hash_size = 0; 3712 uint32_t hash_algo = 0; 3713 int salt_len = 0; 3714 3715 res = tee_svc_cryp_get_state(sess, uref_to_vaddr(state), &cs); 3716 if (res != TEE_SUCCESS) 3717 return res; 3718 3719 if (cs->mode != TEE_MODE_VERIFY) 3720 return TEE_ERROR_BAD_PARAMETERS; 3721 3722 res = vm_check_access_rights(&utc->uctx, 3723 TEE_MEMORY_ACCESS_READ | 3724 TEE_MEMORY_ACCESS_ANY_OWNER, 3725 (uaddr_t)data, data_len); 3726 if (res != TEE_SUCCESS) 3727 return res; 3728 3729 res = vm_check_access_rights(&utc->uctx, 3730 TEE_MEMORY_ACCESS_READ | 3731 TEE_MEMORY_ACCESS_ANY_OWNER, 3732 (uaddr_t)sig, sig_len); 3733 if (res != TEE_SUCCESS) 3734 return res; 3735 3736 size_t alloc_size = 0; 3737 3738 if (MUL_OVERFLOW(sizeof(TEE_Attribute), num_params, &alloc_size)) 3739 return TEE_ERROR_OVERFLOW; 3740 3741 params = malloc(alloc_size); 3742 if (!params) 3743 return TEE_ERROR_OUT_OF_MEMORY; 3744 res = copy_in_attrs(utc, usr_params, num_params, params); 3745 if (res != TEE_SUCCESS) 3746 goto out; 3747 3748 res = tee_obj_get(utc, cs->key1, &o); 3749 if (res != TEE_SUCCESS) 3750 goto out; 3751 if ((o->info.handleFlags & TEE_HANDLE_FLAG_INITIALIZED) == 0) { 3752 res = TEE_ERROR_BAD_PARAMETERS; 3753 goto out; 3754 } 3755 3756 switch (TEE_ALG_GET_MAIN_ALG(cs->algo)) { 3757 case TEE_MAIN_ALGO_RSA: 3758 if (cs->algo != TEE_ALG_RSASSA_PKCS1_V1_5) { 3759 hash_algo = TEE_DIGEST_HASH_TO_ALGO(cs->algo); 3760 res = tee_alg_get_digest_size(hash_algo, &hash_size); 3761 if (res != TEE_SUCCESS) 3762 break; 3763 if (data_len != hash_size) { 3764 res = TEE_ERROR_BAD_PARAMETERS; 3765 break; 3766 } 3767 salt_len = pkcs1_get_salt_len(params, num_params, 3768 hash_size); 3769 } 3770 res = crypto_acipher_rsassa_verify(cs->algo, o->attr, salt_len, 3771 data, data_len, sig, 3772 sig_len); 3773 break; 3774 3775 case TEE_MAIN_ALGO_DSA: 3776 hash_algo = TEE_DIGEST_HASH_TO_ALGO(cs->algo); 3777 res = tee_alg_get_digest_size(hash_algo, &hash_size); 3778 if (res != TEE_SUCCESS) 3779 break; 3780 3781 if (data_len != hash_size) { 3782 struct dsa_public_key *key = o->attr; 3783 3784 /* 3785 * Depending on the DSA algorithm (NIST), the 3786 * digital signature output size may be truncated 3787 * to the size of a key pair (Q prime size). Q 3788 * prime size must be less or equal than the hash 3789 * output length of the hash algorithm involved. 3790 * 3791 * We're checking here in order to be able to 3792 * return this particular error code, which will 3793 * cause TEE_AsymmetricVerifyDigest() to panic as 3794 * required by GP. crypto_acipher_dsa_verify() is 3795 * implemented in the glue layer of the crypto 3796 * library and it might be a bit harder to catch 3797 * this particular case there or lead to duplicated 3798 * code in different crypto glue layers. 3799 * 3800 * The GP spec says that we SHOULD panic if 3801 * data_len != hash_size, but that would break a 3802 * few of the DSA tests in xtest where the 3803 * hash_size is larger than possible data_len. So 3804 * the compromise is in case data_len != hash_size 3805 * check that it's not smaller than what makes 3806 * sense. 3807 */ 3808 if (data_len != crypto_bignum_num_bytes(key->q)) { 3809 res = TEE_ERROR_BAD_PARAMETERS; 3810 break; 3811 } 3812 } 3813 res = crypto_acipher_dsa_verify(cs->algo, o->attr, data, 3814 data_len, sig, sig_len); 3815 break; 3816 3817 case TEE_MAIN_ALGO_ECDSA: 3818 res = crypto_acipher_ecc_verify(cs->algo, o->attr, data, 3819 data_len, sig, sig_len); 3820 break; 3821 3822 case TEE_MAIN_ALGO_SM2_DSA_SM3: 3823 res = crypto_acipher_sm2_dsa_verify(cs->algo, o->attr, data, 3824 data_len, sig, sig_len); 3825 break; 3826 3827 default: 3828 res = TEE_ERROR_NOT_SUPPORTED; 3829 } 3830 3831 out: 3832 free_wipe(params); 3833 return res; 3834 } 3835