File indexing completed on 2025-05-11 08:23:00
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "fsl_puf.h"
0010 #include "fsl_clock.h"
0011 #include "fsl_common.h"
0012
0013 #if !(defined(FSL_FEATURE_PUF_HAS_NO_RESET) && (FSL_FEATURE_PUF_HAS_NO_RESET > 0))
0014 #include "fsl_reset.h"
0015 #endif
0016
0017
0018 #ifndef FSL_COMPONENT_ID
0019 #define FSL_COMPONENT_ID "platform.drivers.puf"
0020 #endif
0021
0022
0023 #if defined(FSL_FEATURE_PUF_PWR_HAS_MANUAL_SLEEP_CONTROL) && (FSL_FEATURE_PUF_PWR_HAS_MANUAL_SLEEP_CONTROL > 0)
0024 #define PUF_PWRCTRL_CKDIS_MASK (0x4U)
0025 #define PUF_PWRCTRL_RAMINIT_MASK (0x8U)
0026 #define PUF_PWRCTRL_RAMPSWLARGEMA_MASK (0x10U)
0027 #define PUF_PWRCTRL_RAMPSWLARGEMP_MASK (0x20U)
0028 #define PUF_PWRCTRL_RAMPSWSMALLMA_MASK (0x40U)
0029 #define PUF_PWRCTRL_RAMPSWSMALLMP_MASK (0x80U)
0030 #endif
0031
0032 #if defined(FSL_FEATURE_PUF_HAS_SRAM_CTRL) && (FSL_FEATURE_PUF_HAS_SRAM_CTRL > 0)
0033 #define DEFAULT_CKGATING 0x0u
0034 #define PUF_ENABLE_MASK 0xFFFFFFFEu
0035 #define PUF_ENABLE_CTRL 0x1u
0036
0037 #else
0038 static void puf_wait_usec(volatile uint32_t usec, uint32_t coreClockFrequencyMHz)
0039 {
0040 SDK_DelayAtLeastUs(usec, coreClockFrequencyMHz * 1000000U);
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054 }
0055 #endif
0056
0057 static status_t puf_waitForInit(PUF_Type *base)
0058 {
0059 status_t status = kStatus_Fail;
0060
0061
0062 while (0U == base->STAT)
0063 {
0064 }
0065
0066
0067 while ((base->STAT & PUF_STAT_BUSY_MASK) != 0U)
0068 {
0069 }
0070
0071
0072 if (0U != (base->STAT & (PUF_STAT_SUCCESS_MASK | PUF_STAT_ERROR_MASK)))
0073 {
0074 status = kStatus_Success;
0075 }
0076
0077 return status;
0078 }
0079
0080 static void puf_powerOn(PUF_Type *base, puf_config_t *conf)
0081 {
0082 #if defined(FSL_FEATURE_PUF_PWR_HAS_MANUAL_SLEEP_CONTROL) && (FSL_FEATURE_PUF_PWR_HAS_MANUAL_SLEEP_CONTROL > 0)
0083
0084 base->PWRCTRL = (PUF_PWRCTRL_RAM_ON_MASK | PUF_PWRCTRL_CK_DIS_MASK);
0085 base->PWRCTRL = (PUF_PWRCTRL_RAM_ON_MASK | PUF_PWRCTRL_CK_DIS_MASK | PUF_PWRCTRL_RAMINIT_MASK);
0086 base->PWRCTRL = (PUF_PWRCTRL_RAM_ON_MASK | PUF_PWRCTRL_RAMINIT_MASK);
0087 #elif defined(FSL_FEATURE_PUF_HAS_SRAM_CTRL) && (FSL_FEATURE_PUF_HAS_SRAM_CTRL > 0)
0088
0089 conf->puf_sram_base->CFG |= PUF_ENABLE_CTRL;
0090 while (0U == (PUF_SRAM_CTRL_STATUS_READY_MASK & conf->puf_sram_base->STATUS))
0091 {
0092 }
0093 #else
0094
0095 base->PWRCTRL = PUF_PWRCTRL_RAMON_MASK;
0096 while (0U == (PUF_PWRCTRL_RAMSTAT_MASK & base->PWRCTRL))
0097 {
0098 }
0099 #endif
0100 }
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110 status_t PUF_PowerCycle(PUF_Type *base, puf_config_t *conf)
0111 {
0112 #if defined(FSL_FEATURE_PUF_PWR_HAS_MANUAL_SLEEP_CONTROL) && (FSL_FEATURE_PUF_PWR_HAS_MANUAL_SLEEP_CONTROL > 0)
0113
0114 uint32_t coreClockFrequencyMHz = conf->coreClockFrequencyHz / 1000000u;
0115
0116 base->PWRCTRL = (PUF_PWRCTRL_RAM_ON_MASK | PUF_PWRCTRL_CK_DIS_MASK | PUF_PWRCTRL_RAMINIT_MASK);
0117
0118
0119 base->PWRCTRL = (PUF_PWRCTRL_CK_DIS_MASK | PUF_PWRCTRL_RAMINIT_MASK);
0120 base->PWRCTRL = (PUF_PWRCTRL_RAMINIT_MASK);
0121 base->PWRCTRL = (PUF_PWRCTRL_RAMINIT_MASK | PUF_PWRCTRL_RAMPSWLARGEMA_MASK | PUF_PWRCTRL_RAMPSWLARGEMP_MASK |
0122 PUF_PWRCTRL_RAMPSWSMALLMA_MASK | PUF_PWRCTRL_RAMPSWSMALLMP_MASK);
0123
0124
0125 puf_wait_usec(conf->dischargeTimeMsec * 1000u, conf->coreClockFrequencyHz / 1000000u);
0126
0127
0128 base->PWRCTRL = (PUF_PWRCTRL_RAMINIT_MASK | PUF_PWRCTRL_RAMPSWLARGEMA_MASK |
0129 PUF_PWRCTRL_RAMPSWLARGEMP_MASK);
0130 puf_wait_usec(1, coreClockFrequencyMHz);
0131
0132
0133 base->PWRCTRL = PUF_PWRCTRL_RAMINIT_MASK;
0134 puf_wait_usec(1, coreClockFrequencyMHz);
0135
0136 base->PWRCTRL = (PUF_PWRCTRL_CK_DIS_MASK | PUF_PWRCTRL_RAMINIT_MASK);
0137 base->PWRCTRL = (PUF_PWRCTRL_RAM_ON_MASK | PUF_PWRCTRL_CK_DIS_MASK | PUF_PWRCTRL_RAMINIT_MASK);
0138 base->PWRCTRL = (PUF_PWRCTRL_RAM_ON_MASK | PUF_PWRCTRL_RAMINIT_MASK);
0139
0140
0141 base->PWRCTRL = (PUF_PWRCTRL_RAM_ON_MASK | PUF_PWRCTRL_CK_DIS_MASK | PUF_PWRCTRL_RAMINIT_MASK);
0142 base->PWRCTRL = (PUF_PWRCTRL_RAM_ON_MASK | PUF_PWRCTRL_CK_DIS_MASK);
0143 base->PWRCTRL = PUF_PWRCTRL_RAM_ON_MASK;
0144 #elif defined(FSL_FEATURE_PUF_HAS_SRAM_CTRL) && (FSL_FEATURE_PUF_HAS_SRAM_CTRL > 0)
0145
0146 conf->puf_sram_base->CFG &= PUF_ENABLE_MASK;
0147 #else
0148
0149 base->PWRCTRL = 0x0u;
0150 while (0U != (PUF_PWRCTRL_RAMSTAT_MASK & base->PWRCTRL))
0151 {
0152 }
0153
0154
0155 puf_wait_usec(conf->dischargeTimeMsec * 1000u, conf->coreClockFrequencyHz / 1000000u);
0156 #endif
0157
0158 #if !(defined(FSL_FEATURE_PUF_HAS_NO_RESET) && (FSL_FEATURE_PUF_HAS_NO_RESET > 0))
0159
0160 RESET_PeripheralReset(kPUF_RST_SHIFT_RSTn);
0161 #endif
0162 puf_powerOn(base, conf);
0163
0164 return kStatus_Success;
0165 }
0166
0167
0168
0169
0170
0171
0172
0173
0174 void PUF_GetDefaultConfig(puf_config_t *conf)
0175 {
0176 #if defined(FSL_FEATURE_PUF_HAS_SRAM_CTRL) && (FSL_FEATURE_PUF_HAS_SRAM_CTRL > 0)
0177
0178 conf->puf_sram_base = PUF_SRAM_CTRL;
0179
0180
0181 conf->CKGATING = DEFAULT_CKGATING;
0182 #endif
0183
0184 conf->dischargeTimeMsec = KEYSTORE_PUF_DISCHARGE_TIME_FIRST_TRY_MS;
0185 conf->coreClockFrequencyHz = CLOCK_GetFreq(kCLOCK_CoreSysClk);
0186
0187 return;
0188 }
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199 status_t PUF_Init(PUF_Type *base, puf_config_t *conf)
0200 {
0201 status_t status = kStatus_Fail;
0202
0203 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0204 CLOCK_EnableClock(kCLOCK_Puf);
0205 #endif
0206 #if !(defined(FSL_FEATURE_PUF_HAS_NO_RESET) && (FSL_FEATURE_PUF_HAS_NO_RESET > 0))
0207
0208 RESET_PeripheralReset(kPUF_RST_SHIFT_RSTn);
0209 #endif
0210
0211 #if defined(FSL_FEATURE_PUF_HAS_SRAM_CTRL) && (FSL_FEATURE_PUF_HAS_SRAM_CTRL > 0)
0212
0213 conf->puf_sram_base->CFG |= PUF_SRAM_CTRL_CFG_CKGATING(conf->CKGATING);
0214
0215 #endif
0216
0217
0218 puf_powerOn(base, conf);
0219
0220
0221 status = puf_waitForInit(base);
0222
0223
0224
0225
0226 if ((status != kStatus_Success) || (0U == (base->ALLOW & (PUF_ALLOW_ALLOWENROLL_MASK | PUF_ALLOW_ALLOWSTART_MASK))))
0227 {
0228 (void)PUF_PowerCycle(base, conf);
0229 status = puf_waitForInit(base);
0230 }
0231
0232
0233 if ((status != kStatus_Success) || (0U == (base->ALLOW & (PUF_ALLOW_ALLOWENROLL_MASK | PUF_ALLOW_ALLOWSTART_MASK))))
0234 {
0235 conf->dischargeTimeMsec = KEYSTORE_PUF_DISCHARGE_TIME_MAX_MS;
0236 (void)PUF_PowerCycle(base, conf);
0237 status = puf_waitForInit(base);
0238 }
0239
0240 return status;
0241 }
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251 void PUF_Deinit(PUF_Type *base, puf_config_t *conf)
0252 {
0253 #if defined(FSL_FEATURE_PUF_PWR_HAS_MANUAL_SLEEP_CONTROL) && (FSL_FEATURE_PUF_PWR_HAS_MANUAL_SLEEP_CONTROL > 0)
0254
0255 base->PWRCTRL = (PUF_PWRCTRL_RAM_ON_MASK | PUF_PWRCTRL_CK_DIS_MASK | PUF_PWRCTRL_RAMINIT_MASK);
0256
0257
0258 base->PWRCTRL = (PUF_PWRCTRL_CK_DIS_MASK | PUF_PWRCTRL_RAMINIT_MASK);
0259 base->PWRCTRL = PUF_PWRCTRL_RAMINIT_MASK;
0260 base->PWRCTRL = (PUF_PWRCTRL_RAMINIT_MASK | PUF_PWRCTRL_RAMPSWLARGEMA_MASK | PUF_PWRCTRL_RAMPSWLARGEMP_MASK |
0261 PUF_PWRCTRL_RAMPSWSMALLMA_MASK | PUF_PWRCTRL_RAMPSWSMALLMP_MASK);
0262 puf_wait_usec(conf->dischargeTimeMsec * 1000u, conf->coreClockFrequencyHz / 1000000u);
0263 #elif defined(FSL_FEATURE_PUF_HAS_SRAM_CTRL) && (FSL_FEATURE_PUF_HAS_SRAM_CTRL > 0)
0264
0265 conf->puf_sram_base = PUF_SRAM_CTRL;
0266 conf->puf_sram_base->CFG &= PUF_ENABLE_MASK;
0267 #else
0268
0269 base->PWRCTRL = 0x00u;
0270 puf_wait_usec(conf->dischargeTimeMsec * 1000u, conf->coreClockFrequencyHz / 1000000u);
0271 #endif
0272
0273 #if !(defined(FSL_FEATURE_PUF_HAS_NO_RESET) && (FSL_FEATURE_PUF_HAS_NO_RESET > 0))
0274 RESET_SetPeripheralReset(kPUF_RST_SHIFT_RSTn);
0275 #endif
0276
0277 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0278 CLOCK_DisableClock(kCLOCK_Puf);
0279 #endif
0280 }
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294 status_t PUF_Enroll(PUF_Type *base, uint8_t *activationCode, size_t activationCodeSize)
0295 {
0296 status_t status = kStatus_Fail;
0297 uint32_t *activationCodeAligned = NULL;
0298 register uint32_t temp32 = 0;
0299
0300
0301 if (activationCodeSize < PUF_ACTIVATION_CODE_SIZE)
0302 {
0303 return kStatus_InvalidArgument;
0304 }
0305
0306
0307 if (0U != (0x3u & (uintptr_t)activationCode))
0308 {
0309 return kStatus_InvalidArgument;
0310 }
0311
0312 activationCodeAligned = (uint32_t *)(uintptr_t)activationCode;
0313
0314
0315 if (0x0u == (base->ALLOW & PUF_ALLOW_ALLOWENROLL_MASK))
0316 {
0317 return kStatus_EnrollNotAllowed;
0318 }
0319
0320
0321 base->CTRL = PUF_CTRL_ENROLL_MASK;
0322
0323
0324 while (0U == (base->STAT & (PUF_STAT_BUSY_MASK | PUF_STAT_ERROR_MASK)))
0325 {
0326 }
0327
0328
0329 while (0U != (base->STAT & PUF_STAT_BUSY_MASK))
0330 {
0331 if (0U != (PUF_STAT_CODEOUTAVAIL_MASK & base->STAT))
0332 {
0333 temp32 = base->CODEOUTPUT;
0334 if (activationCodeSize >= sizeof(uint32_t))
0335 {
0336 *activationCodeAligned = temp32;
0337 activationCodeAligned++;
0338 activationCodeSize -= sizeof(uint32_t);
0339 }
0340 }
0341 }
0342
0343 if (((base->STAT & PUF_STAT_SUCCESS_MASK) != 0U) && (activationCodeSize == 0U))
0344 {
0345 status = kStatus_Success;
0346 }
0347
0348 return status;
0349 }
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363 status_t PUF_Start(PUF_Type *base, const uint8_t *activationCode, size_t activationCodeSize)
0364 {
0365 status_t status = kStatus_Fail;
0366 const uint32_t *activationCodeAligned = NULL;
0367 register uint32_t temp32 = 0;
0368
0369
0370 if (activationCodeSize < 1192U)
0371 {
0372 return kStatus_InvalidArgument;
0373 }
0374
0375
0376 if (0U != (0x3u & (uintptr_t)activationCode))
0377 {
0378 return kStatus_InvalidArgument;
0379 }
0380
0381 activationCodeAligned = (const uint32_t *)(uintptr_t)activationCode;
0382
0383
0384 if (0x0u == (base->ALLOW & PUF_ALLOW_ALLOWSTART_MASK))
0385 {
0386 return kStatus_StartNotAllowed;
0387 }
0388
0389
0390 base->CTRL = PUF_CTRL_START_MASK;
0391
0392
0393 while (0U == (base->STAT & (PUF_STAT_BUSY_MASK | PUF_STAT_ERROR_MASK)))
0394 {
0395 }
0396
0397
0398 while (0U != (base->STAT & PUF_STAT_BUSY_MASK))
0399 {
0400 if (0U != (PUF_STAT_CODEINREQ_MASK & base->STAT))
0401 {
0402 if (activationCodeSize >= sizeof(uint32_t))
0403 {
0404 temp32 = *activationCodeAligned;
0405 activationCodeAligned++;
0406 activationCodeSize -= sizeof(uint32_t);
0407 }
0408 base->CODEINPUT = temp32;
0409 }
0410 }
0411
0412
0413 if (0U != (base->STAT & PUF_STAT_SUCCESS_MASK))
0414 {
0415 status = kStatus_Success;
0416 }
0417
0418 return status;
0419 }
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438 status_t PUF_SetIntrinsicKey(
0439 PUF_Type *base, puf_key_index_register_t keyIndex, size_t keySize, uint8_t *keyCode, size_t keyCodeSize)
0440 {
0441 status_t status = kStatus_Fail;
0442 uint32_t *keyCodeAligned = NULL;
0443 register uint32_t temp32 = 0;
0444
0445
0446 if (0x0u == (base->ALLOW & PUF_ALLOW_ALLOWSETKEY_MASK))
0447 {
0448 return kStatus_Fail;
0449 }
0450
0451
0452 if (0U != (0x3u & (uintptr_t)keyCode))
0453 {
0454 return kStatus_InvalidArgument;
0455 }
0456
0457
0458 if ((keySize < (uint32_t)kPUF_KeySizeMin) || (keySize > (uint32_t)kPUF_KeySizeMax) || (0U != (keySize & 0x7U)))
0459 {
0460 return kStatus_InvalidArgument;
0461 }
0462
0463
0464 if (keyCodeSize < PUF_GET_KEY_CODE_SIZE_FOR_KEY_SIZE(keySize))
0465 {
0466 return kStatus_InvalidArgument;
0467 }
0468
0469 if ((uint32_t)keyIndex > (uint32_t)kPUF_KeyIndexMax)
0470 {
0471 return kStatus_InvalidArgument;
0472 }
0473
0474 keyCodeAligned = (uint32_t *)(uintptr_t)keyCode;
0475
0476
0477 base->KEYSIZE = keySize >> 3;
0478 base->KEYINDEX = (uint32_t)keyIndex;
0479
0480
0481 base->CTRL = PUF_CTRL_GENERATEKEY_MASK;
0482
0483
0484 while (0U == (base->STAT & (PUF_STAT_BUSY_MASK | PUF_STAT_ERROR_MASK)))
0485 {
0486 }
0487
0488
0489 while (0U != (base->STAT & PUF_STAT_BUSY_MASK))
0490 {
0491 if (0U != (PUF_STAT_CODEOUTAVAIL_MASK & base->STAT))
0492 {
0493 temp32 = base->CODEOUTPUT;
0494 if (keyCodeSize >= sizeof(uint32_t))
0495 {
0496 *keyCodeAligned = temp32;
0497 keyCodeAligned++;
0498 keyCodeSize -= sizeof(uint32_t);
0499 }
0500 }
0501 }
0502
0503
0504 if (0U != (base->STAT & PUF_STAT_SUCCESS_MASK))
0505 {
0506 status = kStatus_Success;
0507 }
0508
0509 return status;
0510 }
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528 status_t PUF_SetUserKey(PUF_Type *base,
0529 puf_key_index_register_t keyIndex,
0530 const uint8_t *userKey,
0531 size_t userKeySize,
0532 uint8_t *keyCode,
0533 size_t keyCodeSize)
0534 {
0535 status_t status = kStatus_Fail;
0536 uint32_t *keyCodeAligned = NULL;
0537 const uint32_t *userKeyAligned = NULL;
0538 register uint32_t temp32 = 0;
0539
0540
0541 if (0x0u == (base->ALLOW & PUF_ALLOW_ALLOWSETKEY_MASK))
0542 {
0543 return kStatus_Fail;
0544 }
0545
0546
0547 if (0U != (0x3u & (uintptr_t)keyCode))
0548 {
0549 return kStatus_InvalidArgument;
0550 }
0551
0552
0553 if ((userKeySize < (uint32_t)kPUF_KeySizeMin) || (userKeySize > (uint32_t)kPUF_KeySizeMax) ||
0554 (0U != (userKeySize & 0x7U)))
0555 {
0556 return kStatus_InvalidArgument;
0557 }
0558
0559
0560 if (keyCodeSize < PUF_GET_KEY_CODE_SIZE_FOR_KEY_SIZE(userKeySize))
0561 {
0562 return kStatus_InvalidArgument;
0563 }
0564
0565 if ((uint32_t)keyIndex > (uint32_t)kPUF_KeyIndexMax)
0566 {
0567 return kStatus_InvalidArgument;
0568 }
0569
0570 keyCodeAligned = (uint32_t *)(uintptr_t)keyCode;
0571 userKeyAligned = (const uint32_t *)(uintptr_t)userKey;
0572
0573
0574 base->KEYSIZE = userKeySize >> 3;
0575 base->KEYINDEX = (uint32_t)keyIndex;
0576
0577
0578 if (keyIndex == kPUF_KeyIndex_00)
0579 {
0580 userKeyAligned = userKeyAligned + (userKeySize / sizeof(uint32_t));
0581 }
0582
0583
0584 base->CTRL = PUF_CTRL_SETKEY_MASK;
0585
0586
0587 while (0U == (base->STAT & (PUF_STAT_BUSY_MASK | PUF_STAT_ERROR_MASK)))
0588 {
0589 }
0590
0591
0592 while (0U != (base->STAT & PUF_STAT_BUSY_MASK))
0593 {
0594 if (0U != (PUF_STAT_KEYINREQ_MASK & base->STAT))
0595 {
0596 if (userKeySize >= sizeof(uint32_t))
0597 {
0598 #if defined(LPC54S018_SERIES)
0599 if (keyIndex == kPUF_KeyIndex_00)
0600 {
0601 userKeyAligned--;
0602 temp32 = *userKeyAligned;
0603 userKeySize -= sizeof(uint32_t);
0604 }
0605 #else
0606 if (keyIndex == kPUF_KeyIndex_00)
0607 {
0608 userKeyAligned--;
0609 temp32 = __REV(*userKeyAligned);
0610 userKeySize--;
0611 }
0612 #endif
0613 else if (keyIndex != kPUF_KeyIndex_00)
0614 {
0615 temp32 = *userKeyAligned;
0616 userKeyAligned++;
0617 userKeySize -= sizeof(uint32_t);
0618 }
0619 else
0620 {
0621
0622 }
0623 }
0624 base->KEYINPUT = temp32;
0625 }
0626
0627 if (0U != (PUF_STAT_CODEOUTAVAIL_MASK & base->STAT))
0628 {
0629 temp32 = base->CODEOUTPUT;
0630 if (keyCodeSize >= sizeof(uint32_t))
0631 {
0632 *keyCodeAligned = temp32;
0633 keyCodeAligned++;
0634 keyCodeSize -= sizeof(uint32_t);
0635 }
0636 }
0637 }
0638
0639
0640 if (0U != (base->STAT & PUF_STAT_SUCCESS_MASK))
0641 {
0642 status = kStatus_Success;
0643 }
0644
0645 return status;
0646 }
0647
0648 static status_t puf_getHwKey(PUF_Type *base, const uint8_t *keyCode, size_t keyCodeSize)
0649 {
0650 status_t status = kStatus_Fail;
0651 uint32_t *keyCodeAligned = NULL;
0652 register uint32_t temp32 = 0;
0653
0654 keyCodeAligned = (uint32_t *)(uintptr_t)keyCode;
0655
0656
0657 base->CTRL = PUF_CTRL_GETKEY_MASK;
0658
0659
0660 while (0U == (base->STAT & (PUF_STAT_BUSY_MASK | PUF_STAT_ERROR_MASK)))
0661 {
0662 }
0663
0664
0665 while (0U != (base->STAT & PUF_STAT_BUSY_MASK))
0666 {
0667 if (0U != (PUF_STAT_CODEINREQ_MASK & base->STAT))
0668 {
0669 if (keyCodeSize >= sizeof(uint32_t))
0670 {
0671 temp32 = *keyCodeAligned;
0672 keyCodeAligned++;
0673 keyCodeSize -= sizeof(uint32_t);
0674 }
0675 base->CODEINPUT = temp32;
0676 }
0677 }
0678
0679
0680 if (0U != (base->STAT & PUF_STAT_SUCCESS_MASK))
0681 {
0682 status = kStatus_Success;
0683 }
0684
0685 return status;
0686 }
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705 status_t PUF_GetHwKey(
0706 PUF_Type *base, const uint8_t *keyCode, size_t keyCodeSize, puf_key_slot_t keySlot, uint32_t keyMask)
0707 {
0708 status_t status = kStatus_Fail;
0709 uint32_t keyIndex;
0710
0711
0712 if (0x0u == (base->ALLOW & PUF_ALLOW_ALLOWGETKEY_MASK))
0713 {
0714 return kStatus_Fail;
0715 }
0716
0717
0718 if (0U != (0x3u & (uintptr_t)keyCode))
0719 {
0720 return kStatus_Fail;
0721 }
0722
0723
0724 if (keyCodeSize < PUF_MIN_KEY_CODE_SIZE)
0725 {
0726 return kStatus_InvalidArgument;
0727 }
0728
0729 keyIndex = (uint32_t)(0x0Fu & (uint32_t)keyCode[1]);
0730
0731
0732 if (kPUF_KeyIndex_00 != (puf_key_index_register_t)keyIndex)
0733 {
0734 return kStatus_Fail;
0735 }
0736
0737 #if defined(PUF_KEYMASK_COUNT) && (PUF_KEYMASK_COUNT > 0)
0738 volatile uint32_t *keyMask_reg = NULL;
0739 uint32_t regVal = ((uint32_t)2U << ((uint32_t)2U * (uint32_t)keySlot));
0740
0741 switch (keySlot)
0742 {
0743 case kPUF_KeySlot0:
0744 keyMask_reg = &base->KEYMASK[0];
0745 break;
0746
0747 case kPUF_KeySlot1:
0748 keyMask_reg = &base->KEYMASK[1];
0749 break;
0750 #if (PUF_KEYMASK_COUNT > 2)
0751 case kPUF_KeySlot2:
0752 keyMask_reg = &base->KEYMASK[2];
0753 break;
0754
0755 case kPUF_KeySlot3:
0756 keyMask_reg = &base->KEYMASK[3];
0757 break;
0758 #endif
0759 default:
0760 status = kStatus_InvalidArgument;
0761 break;
0762 }
0763 #endif
0764
0765 if (status != kStatus_InvalidArgument)
0766 {
0767 #if defined(PUF_KEYMASK_COUNT) && (PUF_KEYMASK_COUNT > 0)
0768 base->KEYRESET = regVal;
0769 base->KEYENABLE = regVal;
0770 *keyMask_reg = keyMask;
0771 #endif
0772
0773 status = puf_getHwKey(base, keyCode, keyCodeSize);
0774
0775 #if defined(FSL_FEATURE_PUF_HAS_SHIFT_STATUS) && (FSL_FEATURE_PUF_HAS_SHIFT_STATUS > 0)
0776 size_t keyWords = 0;
0777
0778 if (status == kStatus_Success)
0779 {
0780
0781 keyWords = ((((size_t)keyCode[3]) * 2U) - 1u) << ((size_t)keySlot << 2U);
0782 if (keyWords != ((0x0FUL << ((uint32_t)keySlot << 2U)) & base->SHIFT_STATUS))
0783 {
0784 status = kStatus_Fail;
0785 }
0786 }
0787 #elif defined(PUF_IDXBLK_SHIFT_IND_KEY0_MASK) && PUF_IDXBLK_SHIFT_IND_KEY0_MASK
0788 size_t keyWords = 0;
0789
0790 if (status == kStatus_Success)
0791 {
0792
0793 keyWords = ((((size_t)keyCode[3]) * 2U) - 1u) << ((size_t)keySlot << 2U);
0794 if (keyWords != ((0x0FUL << ((uint32_t)keySlot << 2U)) & base->IDXBLK_SHIFT))
0795 {
0796 status = kStatus_Fail;
0797 }
0798 }
0799 #endif
0800 }
0801
0802 return status;
0803 }
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813 bool PUF_IsGetKeyAllowed(PUF_Type *base)
0814 {
0815
0816 if (0x0u == (base->ALLOW & PUF_ALLOW_ALLOWGETKEY_MASK))
0817 {
0818 return false;
0819 }
0820
0821 return true;
0822 }
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839 status_t PUF_GetKey(PUF_Type *base, const uint8_t *keyCode, size_t keyCodeSize, uint8_t *key, size_t keySize)
0840 {
0841 status_t status = kStatus_Fail;
0842 uint32_t *keyCodeAligned = NULL;
0843 uint32_t *keyAligned = NULL;
0844 uint32_t keyIndex;
0845 register uint32_t temp32 = 0;
0846
0847
0848 if (0x0u == (base->ALLOW & PUF_ALLOW_ALLOWGETKEY_MASK))
0849 {
0850 return kStatus_Fail;
0851 }
0852
0853
0854 if (0U != (0x3u & (uintptr_t)keyCode))
0855 {
0856 return kStatus_Fail;
0857 }
0858
0859
0860 if (0U != (0x3u & (uintptr_t)key))
0861 {
0862 return kStatus_Fail;
0863 }
0864
0865
0866 if (keyCodeSize < PUF_GET_KEY_CODE_SIZE_FOR_KEY_SIZE(keySize))
0867 {
0868 return kStatus_InvalidArgument;
0869 }
0870
0871 keyIndex = (0x0Fu & (uint32_t)keyCode[1]);
0872
0873
0874 if (kPUF_KeyIndex_00 == (puf_key_index_register_t)keyIndex)
0875 {
0876 return kStatus_Fail;
0877 }
0878
0879 keyCodeAligned = (uint32_t *)(uintptr_t)keyCode;
0880 keyAligned = (uint32_t *)(uintptr_t)key;
0881
0882
0883 base->CTRL = PUF_CTRL_GETKEY_MASK;
0884
0885
0886 while (0U == (base->STAT & (PUF_STAT_BUSY_MASK | PUF_STAT_ERROR_MASK)))
0887 {
0888 }
0889
0890
0891 while (0U != (base->STAT & PUF_STAT_BUSY_MASK))
0892 {
0893 if (0U != (PUF_STAT_CODEINREQ_MASK & base->STAT))
0894 {
0895 temp32 = 0;
0896 if (keyCodeSize >= sizeof(uint32_t))
0897 {
0898 temp32 = *keyCodeAligned;
0899 keyCodeAligned++;
0900 keyCodeSize -= sizeof(uint32_t);
0901 }
0902 base->CODEINPUT = temp32;
0903 }
0904
0905 if (0U != (PUF_STAT_KEYOUTAVAIL_MASK & base->STAT))
0906 {
0907 keyIndex = base->KEYOUTINDEX;
0908 temp32 = base->KEYOUTPUT;
0909 if (keySize >= sizeof(uint32_t))
0910 {
0911 *keyAligned = temp32;
0912 keyAligned++;
0913 keySize -= sizeof(uint32_t);
0914 }
0915 }
0916 }
0917
0918
0919 if ((keyIndex != 0U) && (0U != (base->STAT & PUF_STAT_SUCCESS_MASK)))
0920 {
0921 status = kStatus_Success;
0922 }
0923
0924 return status;
0925 }
0926
0927
0928
0929
0930
0931
0932
0933
0934
0935 status_t PUF_Zeroize(PUF_Type *base)
0936 {
0937 status_t status = kStatus_Fail;
0938
0939
0940 base->CTRL = PUF_CTRL_ZEROIZE_MASK;
0941
0942
0943 if ((0U != (base->STAT & PUF_STAT_ERROR_MASK)) && (0U == base->ALLOW))
0944 {
0945 status = kStatus_Success;
0946 }
0947
0948 return status;
0949 }