zcrypt_ep11misc.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Copyright IBM Corp. 2019
  4. * Author(s): Harald Freudenberger <[email protected]>
  5. *
  6. * Collection of EP11 misc functions used by zcrypt and pkey
  7. */
  8. #ifndef _ZCRYPT_EP11MISC_H_
  9. #define _ZCRYPT_EP11MISC_H_
  10. #include <asm/zcrypt.h>
  11. #include <asm/pkey.h>
  12. #define EP11_API_V 4 /* highest known and supported EP11 API version */
  13. #define EP11_STRUCT_MAGIC 0x1234
  14. #define EP11_BLOB_PKEY_EXTRACTABLE 0x00200000
  15. /*
  16. * Internal used values for the version field of the key header.
  17. * Should match to the enum pkey_key_type in pkey.h.
  18. */
  19. #define TOKVER_EP11_AES 0x03 /* EP11 AES key blob (old style) */
  20. #define TOKVER_EP11_AES_WITH_HEADER 0x06 /* EP11 AES key blob with header */
  21. #define TOKVER_EP11_ECC_WITH_HEADER 0x07 /* EP11 ECC key blob with header */
  22. /* inside view of an EP11 secure key blob */
  23. struct ep11keyblob {
  24. union {
  25. u8 session[32];
  26. /* only used for PKEY_TYPE_EP11: */
  27. struct ep11kblob_header head;
  28. };
  29. u8 wkvp[16]; /* wrapping key verification pattern */
  30. u64 attr; /* boolean key attributes */
  31. u64 mode; /* mode bits */
  32. u16 version; /* 0x1234, EP11_STRUCT_MAGIC */
  33. u8 iv[14];
  34. u8 encrypted_key_data[144];
  35. u8 mac[32];
  36. } __packed;
  37. /* check ep11 key magic to find out if this is an ep11 key blob */
  38. static inline bool is_ep11_keyblob(const u8 *key)
  39. {
  40. struct ep11keyblob *kb = (struct ep11keyblob *)key;
  41. return (kb->version == EP11_STRUCT_MAGIC);
  42. }
  43. /*
  44. * Simple check if the key blob is a valid EP11 AES key blob with header.
  45. * If checkcpacfexport is enabled, the key is also checked for the
  46. * attributes needed to export this key for CPACF use.
  47. * Returns 0 on success or errno value on failure.
  48. */
  49. int ep11_check_aes_key_with_hdr(debug_info_t *dbg, int dbflvl,
  50. const u8 *key, size_t keylen, int checkcpacfexp);
  51. /*
  52. * Simple check if the key blob is a valid EP11 ECC key blob with header.
  53. * If checkcpacfexport is enabled, the key is also checked for the
  54. * attributes needed to export this key for CPACF use.
  55. * Returns 0 on success or errno value on failure.
  56. */
  57. int ep11_check_ecc_key_with_hdr(debug_info_t *dbg, int dbflvl,
  58. const u8 *key, size_t keylen, int checkcpacfexp);
  59. /*
  60. * Simple check if the key blob is a valid EP11 AES key blob with
  61. * the header in the session field (old style EP11 AES key).
  62. * If checkcpacfexport is enabled, the key is also checked for the
  63. * attributes needed to export this key for CPACF use.
  64. * Returns 0 on success or errno value on failure.
  65. */
  66. int ep11_check_aes_key(debug_info_t *dbg, int dbflvl,
  67. const u8 *key, size_t keylen, int checkcpacfexp);
  68. /* EP11 card info struct */
  69. struct ep11_card_info {
  70. u32 API_ord_nr; /* API ordinal number */
  71. u16 FW_version; /* Firmware major and minor version */
  72. char serial[16]; /* serial number string (16 ascii, no 0x00 !) */
  73. u64 op_mode; /* card operational mode(s) */
  74. };
  75. /* EP11 domain info struct */
  76. struct ep11_domain_info {
  77. char cur_wk_state; /* '0' invalid, '1' valid */
  78. char new_wk_state; /* '0' empty, '1' uncommitted, '2' committed */
  79. u8 cur_wkvp[32]; /* current wrapping key verification pattern */
  80. u8 new_wkvp[32]; /* new wrapping key verification pattern */
  81. u64 op_mode; /* domain operational mode(s) */
  82. };
  83. /*
  84. * Provide information about an EP11 card.
  85. */
  86. int ep11_get_card_info(u16 card, struct ep11_card_info *info, int verify);
  87. /*
  88. * Provide information about a domain within an EP11 card.
  89. */
  90. int ep11_get_domain_info(u16 card, u16 domain, struct ep11_domain_info *info);
  91. /*
  92. * Generate (random) EP11 AES secure key.
  93. */
  94. int ep11_genaeskey(u16 card, u16 domain, u32 keybitsize, u32 keygenflags,
  95. u8 *keybuf, size_t *keybufsize, u32 keybufver);
  96. /*
  97. * Generate EP11 AES secure key with given clear key value.
  98. */
  99. int ep11_clr2keyblob(u16 cardnr, u16 domain, u32 keybitsize, u32 keygenflags,
  100. const u8 *clrkey, u8 *keybuf, size_t *keybufsize,
  101. u32 keytype);
  102. /*
  103. * Build a list of ep11 apqns meeting the following constrains:
  104. * - apqn is online and is in fact an EP11 apqn
  105. * - if cardnr is not FFFF only apqns with this cardnr
  106. * - if domain is not FFFF only apqns with this domainnr
  107. * - if minhwtype > 0 only apqns with hwtype >= minhwtype
  108. * - if minapi > 0 only apqns with API_ord_nr >= minapi
  109. * - if wkvp != NULL only apqns where the wkvp (EP11_WKVPLEN bytes) matches
  110. * to the first EP11_WKVPLEN bytes of the wkvp of the current wrapping
  111. * key for this domain. When a wkvp is given there will aways be a re-fetch
  112. * of the domain info for the potential apqn - so this triggers an request
  113. * reply to each apqn eligible.
  114. * The array of apqn entries is allocated with kmalloc and returned in *apqns;
  115. * the number of apqns stored into the list is returned in *nr_apqns. One apqn
  116. * entry is simple a 32 bit value with 16 bit cardnr and 16 bit domain nr and
  117. * may be casted to struct pkey_apqn. The return value is either 0 for success
  118. * or a negative errno value. If no apqn meeting the criterias is found,
  119. * -ENODEV is returned.
  120. */
  121. int ep11_findcard2(u32 **apqns, u32 *nr_apqns, u16 cardnr, u16 domain,
  122. int minhwtype, int minapi, const u8 *wkvp);
  123. /*
  124. * Derive proteced key from EP11 key blob (AES and ECC keys).
  125. */
  126. int ep11_kblob2protkey(u16 card, u16 dom, const u8 *key, size_t keylen,
  127. u8 *protkey, u32 *protkeylen, u32 *protkeytype);
  128. void zcrypt_ep11misc_exit(void);
  129. #endif /* _ZCRYPT_EP11MISC_H_ */