fsl_mfgprot.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2014-2016 Freescale Semiconductor, Inc.
  4. * Copyright 2017 NXP
  5. */
  6. #include <common.h>
  7. #include <errno.h>
  8. #include <fsl_sec.h>
  9. #include <memalign.h>
  10. #include "desc.h"
  11. #include "desc_constr.h"
  12. #include "jobdesc.h"
  13. #include "jr.h"
  14. /* Size of MFG descriptor */
  15. #define MFG_PUBK_DSC_WORDS 4
  16. #define MFG_SIGN_DSC_WORDS 8
  17. static void mfg_build_sign_dsc(u32 *dsc_ptr, const u8 *m, int size,
  18. u8 *dgst, u8 *c, u8 *d)
  19. {
  20. u32 *dsc = dsc_ptr;
  21. struct pdb_mp_sign *pdb;
  22. init_job_desc_pdb(dsc, 0, sizeof(struct pdb_mp_sign));
  23. pdb = (struct pdb_mp_sign *)desc_pdb(dsc);
  24. /* Curve */
  25. pdb->pdb_hdr = (PDB_MP_CSEL_P256);
  26. /* Message Pointer */
  27. pdb_add_ptr(&pdb->dma_addr_msg, virt_to_phys((void *)m));
  28. /* mes-resp Pointer */
  29. pdb_add_ptr(&pdb->dma_addr_hash, virt_to_phys((void *)dgst));
  30. /* C Pointer */
  31. pdb_add_ptr(&pdb->dma_addr_c_sig, virt_to_phys((void *)c));
  32. /* d Pointer */
  33. pdb_add_ptr(&pdb->dma_addr_d_sig, virt_to_phys((void *)d));
  34. /* Message Size */
  35. pdb->img_size = size;
  36. /* MP PubK generate key command */
  37. append_cmd(dsc, (CMD_OPERATION | OP_TYPE_DECAP_PROTOCOL |
  38. OP_PCLID_MP_SIGN));
  39. }
  40. static void mfg_build_pubk_dsc(u32 *dsc_ptr, u8 *dst)
  41. {
  42. u32 *dsc = dsc_ptr;
  43. struct pdb_mp_pub_k *pdb;
  44. init_job_desc_pdb(dsc, 0, sizeof(struct pdb_mp_pub_k));
  45. pdb = (struct pdb_mp_pub_k *)desc_pdb(dsc);
  46. /* Curve */
  47. pdb->pdb_hdr = (PDB_MP_CSEL_P256);
  48. /* Message Pointer */
  49. pdb_add_ptr(&pdb->dma_pkey, virt_to_phys((void *)dst));
  50. /* MP Sign key command */
  51. append_cmd(dsc, (CMD_OPERATION | OP_TYPE_DECAP_PROTOCOL |
  52. OP_PCLID_MP_PUB_KEY));
  53. }
  54. int gen_mppubk(u8 *dst)
  55. {
  56. int size, ret;
  57. u32 *dsc;
  58. /* Job Descriptor initialization */
  59. dsc = memalign(ARCH_DMA_MINALIGN,
  60. sizeof(uint32_t) * MFG_PUBK_DSC_WORDS);
  61. if (!dsc) {
  62. debug("Not enough memory for descriptor allocation\n");
  63. return -ENOMEM;
  64. }
  65. mfg_build_pubk_dsc(dsc, dst);
  66. size = roundup(sizeof(uint32_t) * MFG_PUBK_DSC_WORDS,
  67. ARCH_DMA_MINALIGN);
  68. flush_dcache_range((unsigned long)dsc, (unsigned long)dsc + size);
  69. size = roundup(FSL_CAAM_MP_PUBK_BYTES, ARCH_DMA_MINALIGN);
  70. flush_dcache_range((unsigned long)dst, (unsigned long)dst + size);
  71. /* Execute Job Descriptor */
  72. puts("\nGenerating Manufacturing Protection Public Key\n");
  73. ret = run_descriptor_jr(dsc);
  74. if (ret) {
  75. debug("Error in public key generation %d\n", ret);
  76. goto err;
  77. }
  78. size = roundup(FSL_CAAM_MP_PUBK_BYTES, ARCH_DMA_MINALIGN);
  79. invalidate_dcache_range((unsigned long)dst, (unsigned long)dst + size);
  80. err:
  81. free(dsc);
  82. return ret;
  83. }
  84. int sign_mppubk(const u8 *m, int data_size, u8 *dgst, u8 *c, u8 *d)
  85. {
  86. int size, ret;
  87. u32 *dsc;
  88. /* Job Descriptor initialization */
  89. dsc = memalign(ARCH_DMA_MINALIGN,
  90. sizeof(uint32_t) * MFG_SIGN_DSC_WORDS);
  91. if (!dsc) {
  92. debug("Not enough memory for descriptor allocation\n");
  93. return -ENOMEM;
  94. }
  95. mfg_build_sign_dsc(dsc, m, data_size, dgst, c, d);
  96. size = roundup(sizeof(uint32_t) * MFG_SIGN_DSC_WORDS,
  97. ARCH_DMA_MINALIGN);
  98. flush_dcache_range((unsigned long)dsc, (unsigned long)dsc + size);
  99. size = roundup(data_size, ARCH_DMA_MINALIGN);
  100. flush_dcache_range((unsigned long)m, (unsigned long)m + size);
  101. size = roundup(FSL_CAAM_MP_MES_DGST_BYTES, ARCH_DMA_MINALIGN);
  102. flush_dcache_range((unsigned long)dgst, (unsigned long)dgst + size);
  103. size = roundup(FSL_CAAM_MP_PRVK_BYTES, ARCH_DMA_MINALIGN);
  104. flush_dcache_range((unsigned long)c, (unsigned long)c + size);
  105. flush_dcache_range((unsigned long)d, (unsigned long)d + size);
  106. /* Execute Job Descriptor */
  107. puts("\nSigning message with Manufacturing Protection Private Key\n");
  108. ret = run_descriptor_jr(dsc);
  109. if (ret) {
  110. debug("Error in public key generation %d\n", ret);
  111. goto err;
  112. }
  113. size = roundup(FSL_CAAM_MP_MES_DGST_BYTES, ARCH_DMA_MINALIGN);
  114. invalidate_dcache_range((unsigned long)dgst,
  115. (unsigned long)dgst + size);
  116. size = roundup(FSL_CAAM_MP_PRVK_BYTES, ARCH_DMA_MINALIGN);
  117. invalidate_dcache_range((unsigned long)c, (unsigned long)c + size);
  118. invalidate_dcache_range((unsigned long)d, (unsigned long)d + size);
  119. err:
  120. free(dsc);
  121. return ret;
  122. }