File indexing completed on 2025-05-11 08:23:06
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269 #include "stm32h7xx_hal.h"
0270
0271
0272
0273
0274
0275 #if defined (CRYP)
0276
0277
0278
0279
0280
0281
0282
0283
0284 #ifdef HAL_CRYP_MODULE_ENABLED
0285
0286
0287
0288
0289
0290
0291 #define CRYP_TIMEOUT_KEYPREPARATION 82U
0292 #define CRYP_TIMEOUT_GCMCCMINITPHASE 299U
0293 #define CRYP_TIMEOUT_GCMCCMHEADERPHASE 290U
0294
0295 #define CRYP_PHASE_READY 0x00000001U
0296 #define CRYP_PHASE_PROCESS 0x00000002U
0297
0298 #define CRYP_PHASE_INIT 0x00000000U
0299 #define CRYP_PHASE_HEADER CRYP_CR_GCM_CCMPH_0
0300 #define CRYP_PHASE_PAYLOAD CRYP_CR_GCM_CCMPH_1
0301 #define CRYP_PHASE_FINAL CRYP_CR_GCM_CCMPH
0302 #define CRYP_OPERATINGMODE_ENCRYPT 0x00000000U
0303 #define CRYP_OPERATINGMODE_DECRYPT CRYP_CR_ALGODIR
0304
0305
0306
0307 #define CRYP_CCM_CTR1_0 0x07FFFFFFU
0308 #define CRYP_CCM_CTR1_1 0xFFFFFF00U
0309 #define CRYP_CCM_CTR1_2 0x00000001U
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321 #define CRYP_SET_PHASE(__HANDLE__, __PHASE__) do{(__HANDLE__)->Instance->CR &= (uint32_t)(~CRYP_CR_GCM_CCMPH);\
0322 (__HANDLE__)->Instance->CR |= (uint32_t)(__PHASE__);\
0323 }while(0)
0324
0325 #define HAL_CRYP_FIFO_FLUSH(__HANDLE__) ((__HANDLE__)->Instance->CR |= CRYP_CR_FFLUSH)
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339 static void CRYP_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uint16_t Size, uint32_t outputaddr);
0340 static void CRYP_DMAInCplt(DMA_HandleTypeDef *hdma);
0341 static void CRYP_DMAOutCplt(DMA_HandleTypeDef *hdma);
0342 static void CRYP_DMAError(DMA_HandleTypeDef *hdma);
0343 static void CRYP_SetKey(CRYP_HandleTypeDef *hcryp, uint32_t KeySize);
0344 static void CRYP_AES_IT(CRYP_HandleTypeDef *hcryp);
0345 static HAL_StatusTypeDef CRYP_GCMCCM_SetHeaderPhase(CRYP_HandleTypeDef *hcryp, uint32_t Timeout);
0346 static void CRYP_GCMCCM_SetPayloadPhase_IT(CRYP_HandleTypeDef *hcryp);
0347 static void CRYP_GCMCCM_SetHeaderPhase_IT(CRYP_HandleTypeDef *hcryp);
0348 static HAL_StatusTypeDef CRYP_GCMCCM_SetHeaderPhase_DMA(CRYP_HandleTypeDef *hcryp);
0349 #if !defined (CRYP_VER_2_2)
0350 static void CRYP_Workaround(CRYP_HandleTypeDef *hcryp, uint32_t Timeout);
0351 #endif
0352 static HAL_StatusTypeDef CRYP_AESGCM_Process_DMA(CRYP_HandleTypeDef *hcryp);
0353 static HAL_StatusTypeDef CRYP_AESGCM_Process_IT(CRYP_HandleTypeDef *hcryp);
0354 static HAL_StatusTypeDef CRYP_AESGCM_Process(CRYP_HandleTypeDef *hcryp, uint32_t Timeout);
0355 static HAL_StatusTypeDef CRYP_AESCCM_Process(CRYP_HandleTypeDef *hcryp, uint32_t Timeout);
0356 static HAL_StatusTypeDef CRYP_AESCCM_Process_IT(CRYP_HandleTypeDef *hcryp);
0357 static HAL_StatusTypeDef CRYP_AESCCM_Process_DMA(CRYP_HandleTypeDef *hcryp);
0358 static void CRYP_AES_ProcessData(CRYP_HandleTypeDef *hcrypt, uint32_t Timeout);
0359 static HAL_StatusTypeDef CRYP_AES_Encrypt(CRYP_HandleTypeDef *hcryp, uint32_t Timeout);
0360 static HAL_StatusTypeDef CRYP_AES_Decrypt(CRYP_HandleTypeDef *hcryp, uint32_t Timeout);
0361 static HAL_StatusTypeDef CRYP_AES_Decrypt_IT(CRYP_HandleTypeDef *hcryp);
0362 static HAL_StatusTypeDef CRYP_AES_Encrypt_IT(CRYP_HandleTypeDef *hcryp);
0363 static HAL_StatusTypeDef CRYP_AES_Decrypt_DMA(CRYP_HandleTypeDef *hcryp);
0364 static void CRYP_TDES_IT(CRYP_HandleTypeDef *hcryp);
0365 static HAL_StatusTypeDef CRYP_WaitOnIFEMFlag(const CRYP_HandleTypeDef *hcryp, uint32_t Timeout);
0366 static HAL_StatusTypeDef CRYP_WaitOnBUSYFlag(const CRYP_HandleTypeDef *hcryp, uint32_t Timeout);
0367 static HAL_StatusTypeDef CRYP_WaitOnOFNEFlag(const CRYP_HandleTypeDef *hcryp, uint32_t Timeout);
0368 static HAL_StatusTypeDef CRYP_TDES_Process(CRYP_HandleTypeDef *hcryp, uint32_t Timeout);
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417 HAL_StatusTypeDef HAL_CRYP_Init(CRYP_HandleTypeDef *hcryp)
0418 {
0419
0420 if (hcryp == NULL)
0421 {
0422 return HAL_ERROR;
0423 }
0424
0425
0426 assert_param(IS_CRYP_KEYSIZE(hcryp->Init.KeySize));
0427 assert_param(IS_CRYP_DATATYPE(hcryp->Init.DataType));
0428 assert_param(IS_CRYP_ALGORITHM(hcryp->Init.Algorithm));
0429 assert_param(IS_CRYP_INIT(hcryp->Init.KeyIVConfigSkip));
0430
0431 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
0432 if (hcryp->State == HAL_CRYP_STATE_RESET)
0433 {
0434
0435 hcryp->Lock = HAL_UNLOCKED;
0436
0437 hcryp->InCpltCallback = HAL_CRYP_InCpltCallback;
0438 hcryp->OutCpltCallback = HAL_CRYP_OutCpltCallback;
0439 hcryp->ErrorCallback = HAL_CRYP_ErrorCallback;
0440
0441 if (hcryp->MspInitCallback == NULL)
0442 {
0443 hcryp->MspInitCallback = HAL_CRYP_MspInit;
0444 }
0445
0446
0447 hcryp->MspInitCallback(hcryp);
0448 }
0449 #else
0450 if (hcryp->State == HAL_CRYP_STATE_RESET)
0451 {
0452
0453 hcryp->Lock = HAL_UNLOCKED;
0454
0455
0456 HAL_CRYP_MspInit(hcryp);
0457 }
0458 #endif
0459
0460
0461 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_DATATYPE | CRYP_CR_KEYSIZE | CRYP_CR_ALGOMODE,
0462 hcryp->Init.DataType | hcryp->Init.KeySize | hcryp->Init.Algorithm);
0463 #if !defined (CRYP_VER_2_2)
0464
0465 hcryp->Version = HAL_GetREVID();
0466 #endif
0467
0468 hcryp->ErrorCode = HAL_CRYP_ERROR_NONE;
0469
0470
0471 hcryp->KeyIVConfig = 0U;
0472
0473
0474 hcryp->State = HAL_CRYP_STATE_READY;
0475
0476
0477 hcryp->Phase = CRYP_PHASE_READY;
0478
0479
0480 return HAL_OK;
0481 }
0482
0483
0484
0485
0486
0487
0488
0489 HAL_StatusTypeDef HAL_CRYP_DeInit(CRYP_HandleTypeDef *hcryp)
0490 {
0491
0492 if (hcryp == NULL)
0493 {
0494 return HAL_ERROR;
0495 }
0496
0497
0498 hcryp->Phase = CRYP_PHASE_READY;
0499
0500
0501 hcryp->CrypInCount = 0;
0502 hcryp->CrypOutCount = 0;
0503 hcryp->CrypHeaderCount = 0;
0504
0505
0506 __HAL_CRYP_DISABLE(hcryp);
0507
0508 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
0509 if (hcryp->MspDeInitCallback == NULL)
0510 {
0511 hcryp->MspDeInitCallback = HAL_CRYP_MspDeInit;
0512 }
0513
0514 hcryp->MspDeInitCallback(hcryp);
0515
0516 #else
0517
0518 HAL_CRYP_MspDeInit(hcryp);
0519 #endif
0520
0521
0522 hcryp->State = HAL_CRYP_STATE_RESET;
0523
0524
0525 __HAL_UNLOCK(hcryp);
0526
0527
0528 return HAL_OK;
0529 }
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539 HAL_StatusTypeDef HAL_CRYP_SetConfig(CRYP_HandleTypeDef *hcryp, CRYP_ConfigTypeDef *pConf)
0540 {
0541
0542 if ((hcryp == NULL) || (pConf == NULL))
0543 {
0544 return HAL_ERROR;
0545 }
0546
0547
0548 assert_param(IS_CRYP_KEYSIZE(pConf->KeySize));
0549 assert_param(IS_CRYP_DATATYPE(pConf->DataType));
0550 assert_param(IS_CRYP_ALGORITHM(pConf->Algorithm));
0551
0552 if (hcryp->State == HAL_CRYP_STATE_READY)
0553 {
0554
0555 hcryp->State = HAL_CRYP_STATE_BUSY;
0556
0557
0558 __HAL_LOCK(hcryp);
0559
0560
0561 hcryp->Init.DataType = pConf->DataType;
0562 hcryp->Init.pKey = pConf->pKey;
0563 hcryp->Init.Algorithm = pConf->Algorithm;
0564 hcryp->Init.KeySize = pConf->KeySize;
0565 hcryp->Init.pInitVect = pConf->pInitVect;
0566 hcryp->Init.Header = pConf->Header;
0567 hcryp->Init.HeaderSize = pConf->HeaderSize;
0568 hcryp->Init.B0 = pConf->B0;
0569 hcryp->Init.DataWidthUnit = pConf->DataWidthUnit;
0570 hcryp->Init.HeaderWidthUnit = pConf->HeaderWidthUnit;
0571 hcryp->Init.KeyIVConfigSkip = pConf->KeyIVConfigSkip;
0572
0573
0574 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_DATATYPE | CRYP_CR_KEYSIZE | CRYP_CR_ALGOMODE,
0575 hcryp->Init.DataType | hcryp->Init.KeySize | hcryp->Init.Algorithm);
0576
0577
0578 __HAL_UNLOCK(hcryp);
0579
0580
0581 hcryp->ErrorCode = HAL_CRYP_ERROR_NONE;
0582
0583
0584 hcryp->State = HAL_CRYP_STATE_READY;
0585
0586
0587 hcryp->Phase = CRYP_PHASE_READY;
0588
0589
0590 return HAL_OK;
0591 }
0592 else
0593 {
0594
0595 __HAL_UNLOCK(hcryp);
0596
0597
0598 hcryp->ErrorCode |= HAL_CRYP_ERROR_BUSY;
0599 return HAL_ERROR;
0600 }
0601 }
0602
0603
0604
0605
0606
0607
0608
0609
0610 HAL_StatusTypeDef HAL_CRYP_GetConfig(CRYP_HandleTypeDef *hcryp, CRYP_ConfigTypeDef *pConf)
0611 {
0612
0613 if ((hcryp == NULL) || (pConf == NULL))
0614 {
0615 return HAL_ERROR;
0616 }
0617
0618 if (hcryp->State == HAL_CRYP_STATE_READY)
0619 {
0620
0621 hcryp->State = HAL_CRYP_STATE_BUSY;
0622
0623
0624 __HAL_LOCK(hcryp);
0625
0626
0627 pConf->DataType = hcryp->Init.DataType;
0628 pConf->pKey = hcryp->Init.pKey;
0629 pConf->Algorithm = hcryp->Init.Algorithm;
0630 pConf->KeySize = hcryp->Init.KeySize ;
0631 pConf->pInitVect = hcryp->Init.pInitVect;
0632 pConf->Header = hcryp->Init.Header ;
0633 pConf->HeaderSize = hcryp->Init.HeaderSize;
0634 pConf->B0 = hcryp->Init.B0;
0635 pConf->DataWidthUnit = hcryp->Init.DataWidthUnit;
0636 pConf->HeaderWidthUnit = hcryp->Init.HeaderWidthUnit;
0637 pConf->KeyIVConfigSkip = hcryp->Init.KeyIVConfigSkip;
0638
0639
0640 __HAL_UNLOCK(hcryp);
0641
0642
0643 hcryp->State = HAL_CRYP_STATE_READY;
0644
0645
0646 return HAL_OK;
0647 }
0648 else
0649 {
0650
0651 __HAL_UNLOCK(hcryp);
0652
0653
0654 hcryp->ErrorCode |= HAL_CRYP_ERROR_BUSY;
0655 return HAL_ERROR;
0656 }
0657 }
0658
0659
0660
0661
0662
0663
0664 __weak void HAL_CRYP_MspInit(CRYP_HandleTypeDef *hcryp)
0665 {
0666
0667 UNUSED(hcryp);
0668
0669
0670
0671
0672 }
0673
0674
0675
0676
0677
0678
0679
0680 __weak void HAL_CRYP_MspDeInit(CRYP_HandleTypeDef *hcryp)
0681 {
0682
0683 UNUSED(hcryp);
0684
0685
0686
0687
0688 }
0689
0690 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
0691
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705 HAL_StatusTypeDef HAL_CRYP_RegisterCallback(CRYP_HandleTypeDef *hcryp, HAL_CRYP_CallbackIDTypeDef CallbackID,
0706 pCRYP_CallbackTypeDef pCallback)
0707 {
0708 HAL_StatusTypeDef status = HAL_OK;
0709
0710 if (pCallback == NULL)
0711 {
0712
0713 hcryp->ErrorCode |= HAL_CRYP_ERROR_INVALID_CALLBACK;
0714
0715 return HAL_ERROR;
0716 }
0717
0718 __HAL_LOCK(hcryp);
0719
0720 if (hcryp->State == HAL_CRYP_STATE_READY)
0721 {
0722 switch (CallbackID)
0723 {
0724 case HAL_CRYP_INPUT_COMPLETE_CB_ID :
0725 hcryp->InCpltCallback = pCallback;
0726 break;
0727
0728 case HAL_CRYP_OUTPUT_COMPLETE_CB_ID :
0729 hcryp->OutCpltCallback = pCallback;
0730 break;
0731
0732 case HAL_CRYP_ERROR_CB_ID :
0733 hcryp->ErrorCallback = pCallback;
0734 break;
0735
0736 case HAL_CRYP_MSPINIT_CB_ID :
0737 hcryp->MspInitCallback = pCallback;
0738 break;
0739
0740 case HAL_CRYP_MSPDEINIT_CB_ID :
0741 hcryp->MspDeInitCallback = pCallback;
0742 break;
0743
0744 default :
0745
0746 hcryp->ErrorCode |= HAL_CRYP_ERROR_INVALID_CALLBACK;
0747
0748 status = HAL_ERROR;
0749 break;
0750 }
0751 }
0752 else if (hcryp->State == HAL_CRYP_STATE_RESET)
0753 {
0754 switch (CallbackID)
0755 {
0756 case HAL_CRYP_MSPINIT_CB_ID :
0757 hcryp->MspInitCallback = pCallback;
0758 break;
0759
0760 case HAL_CRYP_MSPDEINIT_CB_ID :
0761 hcryp->MspDeInitCallback = pCallback;
0762 break;
0763
0764 default :
0765
0766 hcryp->ErrorCode |= HAL_CRYP_ERROR_INVALID_CALLBACK;
0767
0768 status = HAL_ERROR;
0769 break;
0770 }
0771 }
0772 else
0773 {
0774
0775 hcryp->ErrorCode |= HAL_CRYP_ERROR_INVALID_CALLBACK;
0776
0777 status = HAL_ERROR;
0778 }
0779
0780
0781 __HAL_UNLOCK(hcryp);
0782
0783 return status;
0784 }
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799 HAL_StatusTypeDef HAL_CRYP_UnRegisterCallback(CRYP_HandleTypeDef *hcryp, HAL_CRYP_CallbackIDTypeDef CallbackID)
0800 {
0801 HAL_StatusTypeDef status = HAL_OK;
0802
0803
0804 __HAL_LOCK(hcryp);
0805
0806 if (hcryp->State == HAL_CRYP_STATE_READY)
0807 {
0808 switch (CallbackID)
0809 {
0810 case HAL_CRYP_INPUT_COMPLETE_CB_ID :
0811 hcryp->InCpltCallback = HAL_CRYP_InCpltCallback;
0812 break;
0813
0814 case HAL_CRYP_OUTPUT_COMPLETE_CB_ID :
0815 hcryp->OutCpltCallback = HAL_CRYP_OutCpltCallback;
0816 break;
0817
0818 case HAL_CRYP_ERROR_CB_ID :
0819 hcryp->ErrorCallback = HAL_CRYP_ErrorCallback;
0820 break;
0821
0822 case HAL_CRYP_MSPINIT_CB_ID :
0823 hcryp->MspInitCallback = HAL_CRYP_MspInit;
0824 break;
0825
0826 case HAL_CRYP_MSPDEINIT_CB_ID :
0827 hcryp->MspDeInitCallback = HAL_CRYP_MspDeInit;
0828 break;
0829
0830 default :
0831
0832 hcryp->ErrorCode |= HAL_CRYP_ERROR_INVALID_CALLBACK;
0833
0834 status = HAL_ERROR;
0835 break;
0836 }
0837 }
0838 else if (hcryp->State == HAL_CRYP_STATE_RESET)
0839 {
0840 switch (CallbackID)
0841 {
0842 case HAL_CRYP_MSPINIT_CB_ID :
0843 hcryp->MspInitCallback = HAL_CRYP_MspInit;
0844 break;
0845
0846 case HAL_CRYP_MSPDEINIT_CB_ID :
0847 hcryp->MspDeInitCallback = HAL_CRYP_MspDeInit;
0848 break;
0849
0850 default :
0851
0852 hcryp->ErrorCode |= HAL_CRYP_ERROR_INVALID_CALLBACK;
0853
0854 status = HAL_ERROR;
0855 break;
0856 }
0857 }
0858 else
0859 {
0860
0861 hcryp->ErrorCode |= HAL_CRYP_ERROR_INVALID_CALLBACK;;
0862
0863 status = HAL_ERROR;
0864 }
0865
0866
0867 __HAL_UNLOCK(hcryp);
0868
0869 return status;
0870 }
0871 #endif
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897
0898
0899
0900
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911
0912
0913
0914
0915
0916
0917
0918 HAL_StatusTypeDef HAL_CRYP_Encrypt(CRYP_HandleTypeDef *hcryp, uint32_t *Input, uint16_t Size, uint32_t *Output,
0919 uint32_t Timeout)
0920 {
0921 uint32_t algo;
0922 HAL_StatusTypeDef status;
0923
0924 if (hcryp->State == HAL_CRYP_STATE_READY)
0925 {
0926
0927 hcryp->State = HAL_CRYP_STATE_BUSY;
0928
0929
0930 __HAL_LOCK(hcryp);
0931
0932
0933 hcryp->CrypInCount = 0U;
0934 hcryp->CrypOutCount = 0U;
0935 hcryp->pCrypInBuffPtr = Input;
0936 hcryp->pCrypOutBuffPtr = Output;
0937
0938
0939 if (hcryp->Init.DataWidthUnit == CRYP_DATAWIDTHUNIT_WORD)
0940 {
0941 hcryp->Size = Size * 4U;
0942 }
0943 else
0944 {
0945 hcryp->Size = Size;
0946 }
0947
0948
0949 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGODIR, CRYP_OPERATINGMODE_ENCRYPT);
0950
0951
0952 algo = hcryp->Instance->CR & CRYP_CR_ALGOMODE;
0953
0954 switch (algo)
0955 {
0956 case CRYP_DES_ECB:
0957 case CRYP_DES_CBC:
0958 case CRYP_TDES_ECB:
0959 case CRYP_TDES_CBC:
0960
0961
0962 hcryp->Instance->K1LR = *(uint32_t *)(hcryp->Init.pKey);
0963 hcryp->Instance->K1RR = *(uint32_t *)(hcryp->Init.pKey + 1);
0964 if ((hcryp->Init.Algorithm == CRYP_TDES_ECB) || (hcryp->Init.Algorithm == CRYP_TDES_CBC))
0965 {
0966 hcryp->Instance->K2LR = *(uint32_t *)(hcryp->Init.pKey + 2);
0967 hcryp->Instance->K2RR = *(uint32_t *)(hcryp->Init.pKey + 3);
0968 hcryp->Instance->K3LR = *(uint32_t *)(hcryp->Init.pKey + 4);
0969 hcryp->Instance->K3RR = *(uint32_t *)(hcryp->Init.pKey + 5);
0970 }
0971
0972
0973 if ((hcryp->Init.Algorithm == CRYP_DES_CBC) || (hcryp->Init.Algorithm == CRYP_TDES_CBC))
0974 {
0975 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
0976 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1);
0977 }
0978
0979
0980 HAL_CRYP_FIFO_FLUSH(hcryp);
0981
0982
0983 hcryp->Phase = CRYP_PHASE_PROCESS;
0984
0985
0986 status = CRYP_TDES_Process(hcryp, Timeout);
0987 break;
0988
0989 case CRYP_AES_ECB:
0990 case CRYP_AES_CBC:
0991 case CRYP_AES_CTR:
0992
0993
0994 status = CRYP_AES_Encrypt(hcryp, Timeout);
0995 break;
0996
0997 case CRYP_AES_GCM:
0998
0999
1000 status = CRYP_AESGCM_Process(hcryp, Timeout);
1001 break;
1002
1003 case CRYP_AES_CCM:
1004
1005
1006 status = CRYP_AESCCM_Process(hcryp, Timeout);
1007 break;
1008
1009 default:
1010 hcryp->ErrorCode |= HAL_CRYP_ERROR_NOT_SUPPORTED;
1011 status = HAL_ERROR;
1012 break;
1013 }
1014
1015 if (status == HAL_OK)
1016 {
1017
1018 hcryp->State = HAL_CRYP_STATE_READY;
1019
1020
1021 __HAL_UNLOCK(hcryp);
1022 }
1023 }
1024 else
1025 {
1026
1027 __HAL_UNLOCK(hcryp);
1028
1029
1030 hcryp->ErrorCode |= HAL_CRYP_ERROR_BUSY;
1031 status = HAL_ERROR;
1032 }
1033
1034
1035 return status ;
1036 }
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048 HAL_StatusTypeDef HAL_CRYP_Decrypt(CRYP_HandleTypeDef *hcryp, uint32_t *Input, uint16_t Size, uint32_t *Output,
1049 uint32_t Timeout)
1050 {
1051 HAL_StatusTypeDef status;
1052 uint32_t algo;
1053
1054 if (hcryp->State == HAL_CRYP_STATE_READY)
1055 {
1056
1057 hcryp->State = HAL_CRYP_STATE_BUSY;
1058
1059
1060 __HAL_LOCK(hcryp);
1061
1062
1063 hcryp->CrypInCount = 0U;
1064 hcryp->CrypOutCount = 0U;
1065 hcryp->pCrypInBuffPtr = Input;
1066 hcryp->pCrypOutBuffPtr = Output;
1067
1068
1069 if (hcryp->Init.DataWidthUnit == CRYP_DATAWIDTHUNIT_WORD)
1070 {
1071 hcryp->Size = Size * 4U;
1072 }
1073 else
1074 {
1075 hcryp->Size = Size;
1076 }
1077
1078
1079 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGODIR, CRYP_OPERATINGMODE_DECRYPT);
1080
1081
1082 algo = hcryp->Instance->CR & CRYP_CR_ALGOMODE;
1083
1084 switch (algo)
1085 {
1086 case CRYP_DES_ECB:
1087 case CRYP_DES_CBC:
1088 case CRYP_TDES_ECB:
1089 case CRYP_TDES_CBC:
1090
1091
1092 hcryp->Instance->K1LR = *(uint32_t *)(hcryp->Init.pKey);
1093 hcryp->Instance->K1RR = *(uint32_t *)(hcryp->Init.pKey + 1);
1094 if ((hcryp->Init.Algorithm == CRYP_TDES_ECB) || (hcryp->Init.Algorithm == CRYP_TDES_CBC))
1095 {
1096 hcryp->Instance->K2LR = *(uint32_t *)(hcryp->Init.pKey + 2);
1097 hcryp->Instance->K2RR = *(uint32_t *)(hcryp->Init.pKey + 3);
1098 hcryp->Instance->K3LR = *(uint32_t *)(hcryp->Init.pKey + 4);
1099 hcryp->Instance->K3RR = *(uint32_t *)(hcryp->Init.pKey + 5);
1100 }
1101
1102
1103 if ((hcryp->Init.Algorithm == CRYP_DES_CBC) || (hcryp->Init.Algorithm == CRYP_TDES_CBC))
1104 {
1105 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
1106 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1);
1107 }
1108
1109
1110 HAL_CRYP_FIFO_FLUSH(hcryp);
1111
1112
1113 hcryp->Phase = CRYP_PHASE_PROCESS;
1114
1115
1116 status = CRYP_TDES_Process(hcryp, Timeout);
1117
1118 break;
1119
1120 case CRYP_AES_ECB:
1121 case CRYP_AES_CBC:
1122 case CRYP_AES_CTR:
1123
1124
1125 status = CRYP_AES_Decrypt(hcryp, Timeout);
1126 break;
1127
1128 case CRYP_AES_GCM:
1129
1130
1131 status = CRYP_AESGCM_Process(hcryp, Timeout) ;
1132 break;
1133
1134 case CRYP_AES_CCM:
1135
1136
1137 status = CRYP_AESCCM_Process(hcryp, Timeout);
1138 break;
1139
1140 default:
1141 hcryp->ErrorCode |= HAL_CRYP_ERROR_NOT_SUPPORTED;
1142 status = HAL_ERROR;
1143 break;
1144 }
1145
1146 if (status == HAL_OK)
1147 {
1148
1149 hcryp->State = HAL_CRYP_STATE_READY;
1150
1151
1152 __HAL_UNLOCK(hcryp);
1153 }
1154 }
1155 else
1156 {
1157
1158 __HAL_UNLOCK(hcryp);
1159
1160
1161 hcryp->ErrorCode |= HAL_CRYP_ERROR_BUSY;
1162 status = HAL_ERROR;
1163 }
1164
1165
1166 return status;
1167 }
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178 HAL_StatusTypeDef HAL_CRYP_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint32_t *Input, uint16_t Size, uint32_t *Output)
1179 {
1180 uint32_t algo;
1181 HAL_StatusTypeDef status;
1182
1183 if (hcryp->State == HAL_CRYP_STATE_READY)
1184 {
1185
1186 hcryp->State = HAL_CRYP_STATE_BUSY;
1187
1188
1189 __HAL_LOCK(hcryp);
1190
1191
1192 hcryp->CrypInCount = 0U;
1193 hcryp->CrypOutCount = 0U;
1194 hcryp->pCrypInBuffPtr = Input;
1195 hcryp->pCrypOutBuffPtr = Output;
1196
1197
1198 if (hcryp->Init.DataWidthUnit == CRYP_DATAWIDTHUNIT_WORD)
1199 {
1200 hcryp->Size = Size * 4U;
1201 }
1202 else
1203 {
1204 hcryp->Size = Size;
1205 }
1206
1207
1208 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGODIR, CRYP_OPERATINGMODE_ENCRYPT);
1209
1210
1211 algo = (hcryp->Instance->CR & CRYP_CR_ALGOMODE);
1212
1213 switch (algo)
1214 {
1215 case CRYP_DES_ECB:
1216 case CRYP_DES_CBC:
1217 case CRYP_TDES_ECB:
1218 case CRYP_TDES_CBC:
1219
1220
1221 hcryp->Instance->K1LR = *(uint32_t *)(hcryp->Init.pKey);
1222 hcryp->Instance->K1RR = *(uint32_t *)(hcryp->Init.pKey + 1);
1223 if ((hcryp->Init.Algorithm == CRYP_TDES_ECB) || (hcryp->Init.Algorithm == CRYP_TDES_CBC))
1224 {
1225 hcryp->Instance->K2LR = *(uint32_t *)(hcryp->Init.pKey + 2);
1226 hcryp->Instance->K2RR = *(uint32_t *)(hcryp->Init.pKey + 3);
1227 hcryp->Instance->K3LR = *(uint32_t *)(hcryp->Init.pKey + 4);
1228 hcryp->Instance->K3RR = *(uint32_t *)(hcryp->Init.pKey + 5);
1229 }
1230
1231 if ((hcryp->Init.Algorithm == CRYP_DES_CBC) || (hcryp->Init.Algorithm == CRYP_TDES_CBC))
1232 {
1233 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
1234 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1);
1235 }
1236
1237
1238 HAL_CRYP_FIFO_FLUSH(hcryp);
1239
1240
1241 hcryp->Phase = CRYP_PHASE_PROCESS;
1242
1243
1244 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
1245
1246
1247 __HAL_CRYP_ENABLE(hcryp);
1248
1249 status = HAL_OK;
1250 break;
1251
1252 case CRYP_AES_ECB:
1253 case CRYP_AES_CBC:
1254 case CRYP_AES_CTR:
1255
1256 status = CRYP_AES_Encrypt_IT(hcryp);
1257 break;
1258
1259 case CRYP_AES_GCM:
1260
1261 status = CRYP_AESGCM_Process_IT(hcryp) ;
1262 break;
1263
1264 case CRYP_AES_CCM:
1265
1266 status = CRYP_AESCCM_Process_IT(hcryp);
1267 break;
1268
1269 default:
1270 hcryp->ErrorCode |= HAL_CRYP_ERROR_NOT_SUPPORTED;
1271 status = HAL_ERROR;
1272 break;
1273 }
1274 }
1275 else
1276 {
1277
1278 hcryp->ErrorCode |= HAL_CRYP_ERROR_BUSY;
1279 status = HAL_ERROR;
1280 }
1281
1282
1283 return status ;
1284 }
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295 HAL_StatusTypeDef HAL_CRYP_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint32_t *Input, uint16_t Size, uint32_t *Output)
1296 {
1297 uint32_t algo;
1298 HAL_StatusTypeDef status = HAL_OK;
1299
1300 if (hcryp->State == HAL_CRYP_STATE_READY)
1301 {
1302
1303 hcryp->State = HAL_CRYP_STATE_BUSY;
1304
1305
1306 __HAL_LOCK(hcryp);
1307
1308
1309 hcryp->CrypInCount = 0U;
1310 hcryp->CrypOutCount = 0U;
1311 hcryp->pCrypInBuffPtr = Input;
1312 hcryp->pCrypOutBuffPtr = Output;
1313
1314
1315 if (hcryp->Init.DataWidthUnit == CRYP_DATAWIDTHUNIT_WORD)
1316 {
1317 hcryp->Size = Size * 4U;
1318 }
1319 else
1320 {
1321 hcryp->Size = Size;
1322 }
1323
1324
1325 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGODIR, CRYP_OPERATINGMODE_DECRYPT);
1326
1327
1328 algo = hcryp->Instance->CR & CRYP_CR_ALGOMODE;
1329
1330 switch (algo)
1331 {
1332 case CRYP_DES_ECB:
1333 case CRYP_DES_CBC:
1334 case CRYP_TDES_ECB:
1335 case CRYP_TDES_CBC:
1336
1337
1338 hcryp->Instance->K1LR = *(uint32_t *)(hcryp->Init.pKey);
1339 hcryp->Instance->K1RR = *(uint32_t *)(hcryp->Init.pKey + 1);
1340 if ((hcryp->Init.Algorithm == CRYP_TDES_ECB) || (hcryp->Init.Algorithm == CRYP_TDES_CBC))
1341 {
1342 hcryp->Instance->K2LR = *(uint32_t *)(hcryp->Init.pKey + 2);
1343 hcryp->Instance->K2RR = *(uint32_t *)(hcryp->Init.pKey + 3);
1344 hcryp->Instance->K3LR = *(uint32_t *)(hcryp->Init.pKey + 4);
1345 hcryp->Instance->K3RR = *(uint32_t *)(hcryp->Init.pKey + 5);
1346 }
1347
1348
1349 if ((hcryp->Init.Algorithm == CRYP_DES_CBC) || (hcryp->Init.Algorithm == CRYP_TDES_CBC))
1350 {
1351 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
1352 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1);
1353 }
1354
1355 HAL_CRYP_FIFO_FLUSH(hcryp);
1356
1357
1358 hcryp->Phase = CRYP_PHASE_PROCESS;
1359
1360
1361 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
1362
1363
1364 __HAL_CRYP_ENABLE(hcryp);
1365
1366 break;
1367
1368 case CRYP_AES_ECB:
1369 case CRYP_AES_CBC:
1370 case CRYP_AES_CTR:
1371
1372
1373 status = CRYP_AES_Decrypt_IT(hcryp);
1374 break;
1375
1376 case CRYP_AES_GCM:
1377
1378
1379 status = CRYP_AESGCM_Process_IT(hcryp) ;
1380 break;
1381
1382 case CRYP_AES_CCM:
1383
1384
1385 status = CRYP_AESCCM_Process_IT(hcryp);
1386 break;
1387
1388 default:
1389 hcryp->ErrorCode |= HAL_CRYP_ERROR_NOT_SUPPORTED;
1390 status = HAL_ERROR;
1391 break;
1392 }
1393 }
1394 else
1395 {
1396
1397 hcryp->ErrorCode |= HAL_CRYP_ERROR_BUSY;
1398 status = HAL_ERROR;
1399 }
1400
1401
1402 return status;
1403 }
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414 HAL_StatusTypeDef HAL_CRYP_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint32_t *Input, uint16_t Size, uint32_t *Output)
1415 {
1416 HAL_StatusTypeDef status = HAL_OK;
1417 uint32_t algo;
1418 uint32_t DoKeyIVConfig = 1U;
1419
1420 if (hcryp->State == HAL_CRYP_STATE_READY)
1421 {
1422
1423 hcryp->State = HAL_CRYP_STATE_BUSY;
1424
1425
1426 __HAL_LOCK(hcryp);
1427
1428
1429 hcryp->CrypInCount = 0U;
1430 hcryp->CrypOutCount = 0U;
1431 hcryp->pCrypInBuffPtr = Input;
1432 hcryp->pCrypOutBuffPtr = Output;
1433
1434
1435 if (hcryp->Init.DataWidthUnit == CRYP_DATAWIDTHUNIT_WORD)
1436 {
1437 hcryp->Size = Size * 4U;
1438 }
1439 else
1440 {
1441 hcryp->Size = Size;
1442 }
1443
1444
1445 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGODIR, CRYP_OPERATINGMODE_ENCRYPT);
1446
1447
1448 algo = hcryp->Instance->CR & CRYP_CR_ALGOMODE;
1449
1450 switch (algo)
1451 {
1452 case CRYP_DES_ECB:
1453 case CRYP_DES_CBC:
1454 case CRYP_TDES_ECB:
1455 case CRYP_TDES_CBC:
1456
1457
1458 hcryp->Instance->K1LR = *(uint32_t *)(hcryp->Init.pKey);
1459 hcryp->Instance->K1RR = *(uint32_t *)(hcryp->Init.pKey + 1);
1460 if ((hcryp->Init.Algorithm == CRYP_TDES_ECB) || (hcryp->Init.Algorithm == CRYP_TDES_CBC))
1461 {
1462 hcryp->Instance->K2LR = *(uint32_t *)(hcryp->Init.pKey + 2);
1463 hcryp->Instance->K2RR = *(uint32_t *)(hcryp->Init.pKey + 3);
1464 hcryp->Instance->K3LR = *(uint32_t *)(hcryp->Init.pKey + 4);
1465 hcryp->Instance->K3RR = *(uint32_t *)(hcryp->Init.pKey + 5);
1466 }
1467
1468
1469 if ((hcryp->Init.Algorithm == CRYP_DES_CBC) || (hcryp->Init.Algorithm == CRYP_TDES_CBC))
1470 {
1471 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
1472 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1);
1473 }
1474
1475
1476 HAL_CRYP_FIFO_FLUSH(hcryp);
1477
1478
1479 hcryp->Phase = CRYP_PHASE_PROCESS;
1480
1481
1482 CRYP_SetDMAConfig(hcryp, (uint32_t)(hcryp->pCrypInBuffPtr), (hcryp->Size / 4U),
1483 (uint32_t)(hcryp->pCrypOutBuffPtr));
1484
1485 break;
1486
1487 case CRYP_AES_ECB:
1488 case CRYP_AES_CBC:
1489 case CRYP_AES_CTR:
1490
1491 if (hcryp->Init.KeyIVConfigSkip == CRYP_KEYIVCONFIG_ONCE)
1492 {
1493 if (hcryp->KeyIVConfig == 1U)
1494 {
1495
1496
1497 DoKeyIVConfig = 0U;
1498 }
1499 else
1500 {
1501
1502
1503
1504 hcryp->KeyIVConfig = 1U;
1505 }
1506 }
1507
1508 if (DoKeyIVConfig == 1U)
1509 {
1510
1511 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
1512
1513
1514 if (hcryp->Init.Algorithm != CRYP_AES_ECB)
1515 {
1516 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
1517 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1U);
1518 hcryp->Instance->IV1LR = *(uint32_t *)(hcryp->Init.pInitVect + 2U);
1519 hcryp->Instance->IV1RR = *(uint32_t *)(hcryp->Init.pInitVect + 3U);
1520 }
1521 }
1522
1523
1524 hcryp->Phase = CRYP_PHASE_PROCESS;
1525
1526
1527 CRYP_SetDMAConfig(hcryp, (uint32_t)(hcryp->pCrypInBuffPtr), (hcryp->Size / 4U),
1528 (uint32_t)(hcryp->pCrypOutBuffPtr));
1529 break;
1530
1531 case CRYP_AES_GCM:
1532
1533
1534 status = CRYP_AESGCM_Process_DMA(hcryp) ;
1535 break;
1536
1537 case CRYP_AES_CCM:
1538
1539
1540 status = CRYP_AESCCM_Process_DMA(hcryp);
1541 break;
1542
1543 default:
1544 hcryp->ErrorCode |= HAL_CRYP_ERROR_NOT_SUPPORTED;
1545 status = HAL_ERROR;
1546 break;
1547 }
1548 }
1549 else
1550 {
1551
1552 hcryp->ErrorCode |= HAL_CRYP_ERROR_BUSY;
1553 status = HAL_ERROR;
1554 }
1555
1556
1557 return status;
1558 }
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569 HAL_StatusTypeDef HAL_CRYP_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint32_t *Input, uint16_t Size, uint32_t *Output)
1570 {
1571 uint32_t algo;
1572 HAL_StatusTypeDef status = HAL_OK;
1573
1574 if (hcryp->State == HAL_CRYP_STATE_READY)
1575 {
1576
1577 hcryp->State = HAL_CRYP_STATE_BUSY;
1578
1579
1580 __HAL_LOCK(hcryp);
1581
1582
1583 hcryp->CrypInCount = 0U;
1584 hcryp->CrypOutCount = 0U;
1585 hcryp->pCrypInBuffPtr = Input;
1586 hcryp->pCrypOutBuffPtr = Output;
1587
1588
1589 if (hcryp->Init.DataWidthUnit == CRYP_DATAWIDTHUNIT_WORD)
1590 {
1591 hcryp->Size = Size * 4U;
1592 }
1593 else
1594 {
1595 hcryp->Size = Size;
1596 }
1597
1598
1599 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGODIR, CRYP_OPERATINGMODE_DECRYPT);
1600
1601
1602 algo = hcryp->Instance->CR & CRYP_CR_ALGOMODE;
1603
1604 switch (algo)
1605 {
1606 case CRYP_DES_ECB:
1607 case CRYP_DES_CBC:
1608 case CRYP_TDES_ECB:
1609 case CRYP_TDES_CBC:
1610
1611
1612 hcryp->Instance->K1LR = *(uint32_t *)(hcryp->Init.pKey);
1613 hcryp->Instance->K1RR = *(uint32_t *)(hcryp->Init.pKey + 1);
1614 if ((hcryp->Init.Algorithm == CRYP_TDES_ECB) || (hcryp->Init.Algorithm == CRYP_TDES_CBC))
1615 {
1616 hcryp->Instance->K2LR = *(uint32_t *)(hcryp->Init.pKey + 2);
1617 hcryp->Instance->K2RR = *(uint32_t *)(hcryp->Init.pKey + 3);
1618 hcryp->Instance->K3LR = *(uint32_t *)(hcryp->Init.pKey + 4);
1619 hcryp->Instance->K3RR = *(uint32_t *)(hcryp->Init.pKey + 5);
1620 }
1621
1622
1623 if ((hcryp->Init.Algorithm == CRYP_DES_CBC) || (hcryp->Init.Algorithm == CRYP_TDES_CBC))
1624 {
1625 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
1626 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1);
1627 }
1628
1629
1630 HAL_CRYP_FIFO_FLUSH(hcryp);
1631
1632
1633 hcryp->Phase = CRYP_PHASE_PROCESS;
1634
1635
1636 CRYP_SetDMAConfig(hcryp, (uint32_t)(hcryp->pCrypInBuffPtr), (hcryp->Size / 4U),
1637 (uint32_t)(hcryp->pCrypOutBuffPtr));
1638 break;
1639
1640 case CRYP_AES_ECB:
1641 case CRYP_AES_CBC:
1642 case CRYP_AES_CTR:
1643
1644
1645 status = CRYP_AES_Decrypt_DMA(hcryp);
1646 break;
1647
1648 case CRYP_AES_GCM:
1649
1650
1651 status = CRYP_AESGCM_Process_DMA(hcryp) ;
1652
1653 break;
1654
1655 case CRYP_AES_CCM:
1656
1657
1658 status = CRYP_AESCCM_Process_DMA(hcryp);
1659 break;
1660
1661 default:
1662 hcryp->ErrorCode |= HAL_CRYP_ERROR_NOT_SUPPORTED;
1663 status = HAL_ERROR;
1664 break;
1665 }
1666 }
1667 else
1668 {
1669
1670 hcryp->ErrorCode |= HAL_CRYP_ERROR_BUSY;
1671 status = HAL_ERROR;
1672 }
1673
1674
1675 return status;
1676 }
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707 void HAL_CRYP_IRQHandler(CRYP_HandleTypeDef *hcryp)
1708 {
1709 uint32_t itstatus = hcryp->Instance->MISR;
1710
1711 if ((itstatus & (CRYP_IT_INI | CRYP_IT_OUTI)) != 0U)
1712 {
1713 if ((hcryp->Init.Algorithm == CRYP_DES_ECB) || (hcryp->Init.Algorithm == CRYP_DES_CBC) ||
1714 (hcryp->Init.Algorithm == CRYP_TDES_ECB) || (hcryp->Init.Algorithm == CRYP_TDES_CBC))
1715 {
1716 CRYP_TDES_IT(hcryp);
1717 }
1718 else if ((hcryp->Init.Algorithm == CRYP_AES_ECB) || (hcryp->Init.Algorithm == CRYP_AES_CBC) ||
1719 (hcryp->Init.Algorithm == CRYP_AES_CTR))
1720 {
1721 CRYP_AES_IT(hcryp);
1722 }
1723
1724 else if ((hcryp->Init.Algorithm == CRYP_AES_GCM) || (hcryp->Init.Algorithm == CRYP_CR_ALGOMODE_AES_CCM))
1725 {
1726
1727 if ((hcryp->Instance->CR & CRYP_PHASE_HEADER) == CRYP_PHASE_HEADER)
1728 {
1729 CRYP_GCMCCM_SetHeaderPhase_IT(hcryp);
1730 }
1731 else
1732 {
1733 CRYP_GCMCCM_SetPayloadPhase_IT(hcryp);
1734 }
1735 }
1736 else
1737 {
1738
1739 }
1740 }
1741 }
1742
1743
1744
1745
1746
1747
1748
1749 uint32_t HAL_CRYP_GetError(CRYP_HandleTypeDef *hcryp)
1750 {
1751 return hcryp->ErrorCode;
1752 }
1753
1754
1755
1756
1757
1758
1759
1760 HAL_CRYP_STATETypeDef HAL_CRYP_GetState(CRYP_HandleTypeDef *hcryp)
1761 {
1762 return hcryp->State;
1763 }
1764
1765
1766
1767
1768
1769
1770
1771 __weak void HAL_CRYP_InCpltCallback(CRYP_HandleTypeDef *hcryp)
1772 {
1773
1774 UNUSED(hcryp);
1775
1776
1777
1778
1779 }
1780
1781
1782
1783
1784
1785
1786
1787 __weak void HAL_CRYP_OutCpltCallback(CRYP_HandleTypeDef *hcryp)
1788 {
1789
1790 UNUSED(hcryp);
1791
1792
1793
1794
1795 }
1796
1797
1798
1799
1800
1801
1802
1803 __weak void HAL_CRYP_ErrorCallback(CRYP_HandleTypeDef *hcryp)
1804 {
1805
1806 UNUSED(hcryp);
1807
1808
1809
1810
1811 }
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831 static HAL_StatusTypeDef CRYP_TDES_Process(CRYP_HandleTypeDef *hcryp, uint32_t Timeout)
1832 {
1833
1834 uint32_t temp;
1835 uint16_t incount;
1836 uint16_t outcount;
1837
1838
1839 __HAL_CRYP_ENABLE(hcryp);
1840
1841 outcount = hcryp->CrypOutCount;
1842
1843
1844 while ((hcryp->CrypInCount < (hcryp->Size / 4U)) && (outcount < (hcryp->Size / 4U)))
1845 {
1846
1847 incount = hcryp->CrypInCount;
1848
1849 if (((hcryp->Instance->SR & CRYP_FLAG_IFNF) != 0x0U) && (incount < (hcryp->Size / 4U)))
1850 {
1851
1852 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
1853 hcryp->CrypInCount++;
1854 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
1855 hcryp->CrypInCount++;
1856 }
1857
1858
1859 if (CRYP_WaitOnOFNEFlag(hcryp, Timeout) != HAL_OK)
1860 {
1861
1862 __HAL_CRYP_DISABLE(hcryp);
1863
1864
1865 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
1866 hcryp->State = HAL_CRYP_STATE_READY;
1867
1868
1869 __HAL_UNLOCK(hcryp);
1870 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
1871
1872 hcryp->ErrorCallback(hcryp);
1873 #else
1874
1875 HAL_CRYP_ErrorCallback(hcryp);
1876 #endif
1877 }
1878
1879
1880 outcount = hcryp->CrypOutCount;
1881
1882 if (((hcryp->Instance->SR & CRYP_FLAG_OFNE) != 0x0U) && (outcount < (hcryp->Size / 4U)))
1883 {
1884
1885
1886 temp = hcryp->Instance->DOUT;
1887 *(uint32_t *)(hcryp->pCrypOutBuffPtr + (hcryp->CrypOutCount)) = temp;
1888 hcryp->CrypOutCount++;
1889 temp = hcryp->Instance->DOUT;
1890 *(uint32_t *)(hcryp->pCrypOutBuffPtr + (hcryp->CrypOutCount)) = temp;
1891 hcryp->CrypOutCount++;
1892 }
1893
1894 outcount = hcryp->CrypOutCount;
1895 }
1896
1897 __HAL_CRYP_DISABLE(hcryp);
1898
1899 hcryp->State = HAL_CRYP_STATE_READY;
1900
1901
1902 return HAL_OK;
1903 }
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913 static void CRYP_TDES_IT(CRYP_HandleTypeDef *hcryp)
1914 {
1915 uint32_t temp;
1916
1917 if (hcryp->State == HAL_CRYP_STATE_BUSY)
1918 {
1919 if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI) != 0x0U)
1920 {
1921 if (__HAL_CRYP_GET_FLAG(hcryp, CRYP_FLAG_INRIS) != 0x0U)
1922 {
1923
1924 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
1925 hcryp->CrypInCount++;
1926 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
1927 hcryp->CrypInCount++;
1928
1929 if (hcryp->CrypInCount == (hcryp->Size / 4U))
1930 {
1931
1932 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI);
1933
1934
1935 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
1936
1937 hcryp->InCpltCallback(hcryp);
1938 #else
1939
1940 HAL_CRYP_InCpltCallback(hcryp);
1941 #endif
1942 }
1943 }
1944 }
1945
1946 if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI) != 0x0U)
1947 {
1948 if (__HAL_CRYP_GET_FLAG(hcryp, CRYP_FLAG_OUTRIS) != 0x0U)
1949 {
1950
1951
1952 temp = hcryp->Instance->DOUT;
1953 *(uint32_t *)(hcryp->pCrypOutBuffPtr + (hcryp->CrypOutCount)) = temp;
1954 hcryp->CrypOutCount++;
1955 temp = hcryp->Instance->DOUT;
1956 *(uint32_t *)(hcryp->pCrypOutBuffPtr + (hcryp->CrypOutCount)) = temp;
1957 hcryp->CrypOutCount++;
1958 if (hcryp->CrypOutCount == (hcryp->Size / 4U))
1959 {
1960
1961 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI);
1962
1963
1964 __HAL_CRYP_DISABLE(hcryp);
1965
1966
1967 __HAL_UNLOCK(hcryp);
1968
1969
1970 hcryp->State = HAL_CRYP_STATE_READY;
1971
1972
1973 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
1974
1975 hcryp->OutCpltCallback(hcryp);
1976 #else
1977
1978 HAL_CRYP_OutCpltCallback(hcryp);
1979 #endif
1980
1981 }
1982 }
1983 }
1984 }
1985 else
1986 {
1987
1988 __HAL_UNLOCK(hcryp);
1989
1990 hcryp->ErrorCode |= HAL_CRYP_ERROR_BUSY;
1991 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
1992
1993 hcryp->ErrorCallback(hcryp);
1994 #else
1995
1996 HAL_CRYP_ErrorCallback(hcryp);
1997 #endif
1998 }
1999 }
2000
2001
2002
2003
2004
2005
2006
2007 static HAL_StatusTypeDef CRYP_AES_Encrypt(CRYP_HandleTypeDef *hcryp, uint32_t Timeout)
2008 {
2009 uint16_t outcount;
2010 uint32_t DoKeyIVConfig = 1U;
2011
2012 if (hcryp->Init.KeyIVConfigSkip == CRYP_KEYIVCONFIG_ONCE)
2013 {
2014 if (hcryp->KeyIVConfig == 1U)
2015 {
2016
2017
2018 DoKeyIVConfig = 0U;
2019 }
2020 else
2021 {
2022
2023
2024
2025 hcryp->KeyIVConfig = 1U;
2026 }
2027 }
2028
2029 if (DoKeyIVConfig == 1U)
2030 {
2031
2032 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
2033
2034 if (hcryp->Init.Algorithm != CRYP_AES_ECB)
2035 {
2036
2037 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
2038 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1U);
2039 hcryp->Instance->IV1LR = *(uint32_t *)(hcryp->Init.pInitVect + 2U);
2040 hcryp->Instance->IV1RR = *(uint32_t *)(hcryp->Init.pInitVect + 3U);
2041 }
2042 }
2043
2044
2045 hcryp->Phase = CRYP_PHASE_PROCESS;
2046
2047
2048 __HAL_CRYP_ENABLE(hcryp);
2049
2050 outcount = hcryp->CrypOutCount;
2051
2052 while ((hcryp->CrypInCount < (hcryp->Size / 4U)) && (outcount < (hcryp->Size / 4U)))
2053 {
2054
2055 CRYP_AES_ProcessData(hcryp, Timeout);
2056
2057 outcount = hcryp->CrypOutCount;
2058 }
2059
2060
2061 __HAL_CRYP_DISABLE(hcryp);
2062
2063
2064 hcryp->State = HAL_CRYP_STATE_READY;
2065
2066
2067 return HAL_OK;
2068 }
2069
2070
2071
2072
2073
2074
2075
2076 static HAL_StatusTypeDef CRYP_AES_Encrypt_IT(CRYP_HandleTypeDef *hcryp)
2077 {
2078 uint32_t DoKeyIVConfig = 1U;
2079
2080 if (hcryp->Init.KeyIVConfigSkip == CRYP_KEYIVCONFIG_ONCE)
2081 {
2082 if (hcryp->KeyIVConfig == 1U)
2083 {
2084
2085
2086 DoKeyIVConfig = 0U;
2087 }
2088 else
2089 {
2090
2091
2092
2093 hcryp->KeyIVConfig = 1U;
2094 }
2095 }
2096
2097 if (DoKeyIVConfig == 1U)
2098 {
2099
2100 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
2101
2102 if (hcryp->Init.Algorithm != CRYP_AES_ECB)
2103 {
2104
2105 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
2106 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1U);
2107 hcryp->Instance->IV1LR = *(uint32_t *)(hcryp->Init.pInitVect + 2U);
2108 hcryp->Instance->IV1RR = *(uint32_t *)(hcryp->Init.pInitVect + 3U);
2109 }
2110 }
2111
2112
2113 hcryp->Phase = CRYP_PHASE_PROCESS;
2114
2115 if (hcryp->Size != 0U)
2116 {
2117
2118 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
2119
2120
2121 __HAL_CRYP_ENABLE(hcryp);
2122 }
2123 else
2124 {
2125
2126 hcryp->State = HAL_CRYP_STATE_READY;
2127
2128
2129 __HAL_UNLOCK(hcryp);
2130 }
2131
2132
2133 return HAL_OK;
2134 }
2135
2136
2137
2138
2139
2140
2141
2142 static HAL_StatusTypeDef CRYP_AES_Decrypt(CRYP_HandleTypeDef *hcryp, uint32_t Timeout)
2143 {
2144 uint16_t outcount;
2145 uint32_t DoKeyIVConfig = 1U;
2146
2147 if (hcryp->Init.KeyIVConfigSkip == CRYP_KEYIVCONFIG_ONCE)
2148 {
2149 if (hcryp->KeyIVConfig == 1U)
2150 {
2151
2152
2153 DoKeyIVConfig = 0U;
2154 }
2155 else
2156 {
2157
2158
2159
2160 hcryp->KeyIVConfig = 1U;
2161 }
2162 }
2163
2164 if (DoKeyIVConfig == 1U)
2165 {
2166
2167 if (hcryp->Init.Algorithm != CRYP_AES_CTR)
2168 {
2169
2170 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGOMODE, CRYP_CR_ALGOMODE_AES_KEY);
2171
2172
2173 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
2174
2175
2176 __HAL_CRYP_ENABLE(hcryp);
2177
2178
2179 if (CRYP_WaitOnBUSYFlag(hcryp, Timeout) != HAL_OK)
2180 {
2181
2182 __HAL_CRYP_DISABLE(hcryp);
2183
2184
2185 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
2186 hcryp->State = HAL_CRYP_STATE_READY;
2187
2188
2189 __HAL_UNLOCK(hcryp);
2190 return HAL_ERROR;
2191 }
2192
2193 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGOMODE, hcryp->Init.Algorithm);
2194 }
2195 else
2196 {
2197
2198 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
2199 }
2200
2201
2202 if (hcryp->Init.Algorithm != CRYP_AES_ECB)
2203 {
2204
2205 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
2206 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1);
2207 hcryp->Instance->IV1LR = *(uint32_t *)(hcryp->Init.pInitVect + 2);
2208 hcryp->Instance->IV1RR = *(uint32_t *)(hcryp->Init.pInitVect + 3);
2209 }
2210 }
2211
2212
2213 hcryp->Phase = CRYP_PHASE_PROCESS;
2214
2215
2216 __HAL_CRYP_ENABLE(hcryp);
2217
2218
2219 outcount = hcryp->CrypOutCount;
2220
2221 while ((hcryp->CrypInCount < (hcryp->Size / 4U)) && (outcount < (hcryp->Size / 4U)))
2222 {
2223
2224 CRYP_AES_ProcessData(hcryp, Timeout);
2225
2226 outcount = hcryp->CrypOutCount;
2227 }
2228
2229
2230 __HAL_CRYP_DISABLE(hcryp);
2231
2232
2233 hcryp->State = HAL_CRYP_STATE_READY;
2234
2235
2236 return HAL_OK;
2237 }
2238
2239
2240
2241
2242
2243
2244 static HAL_StatusTypeDef CRYP_AES_Decrypt_IT(CRYP_HandleTypeDef *hcryp)
2245 {
2246 __IO uint32_t count = 0U;
2247 uint32_t DoKeyIVConfig = 1U;
2248
2249 if (hcryp->Init.KeyIVConfigSkip == CRYP_KEYIVCONFIG_ONCE)
2250 {
2251 if (hcryp->KeyIVConfig == 1U)
2252 {
2253
2254
2255 DoKeyIVConfig = 0U;
2256 }
2257 else
2258 {
2259
2260
2261
2262 hcryp->KeyIVConfig = 1U;
2263 }
2264 }
2265
2266 if (DoKeyIVConfig == 1U)
2267 {
2268
2269 if (hcryp->Init.Algorithm != CRYP_AES_CTR)
2270 {
2271
2272 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGOMODE, CRYP_CR_ALGOMODE_AES_KEY);
2273
2274
2275 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
2276
2277
2278 __HAL_CRYP_ENABLE(hcryp);
2279
2280
2281 count = CRYP_TIMEOUT_KEYPREPARATION;
2282 do
2283 {
2284 count-- ;
2285 if (count == 0U)
2286 {
2287
2288 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
2289 hcryp->State = HAL_CRYP_STATE_READY;
2290
2291
2292 __HAL_UNLOCK(hcryp);
2293 return HAL_ERROR;
2294 }
2295 }
2296 while (HAL_IS_BIT_SET(hcryp->Instance->SR, CRYP_FLAG_BUSY));
2297
2298
2299 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGOMODE, hcryp->Init.Algorithm);
2300 }
2301 else
2302 {
2303
2304 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
2305 }
2306
2307
2308 if (hcryp->Init.Algorithm != CRYP_AES_ECB)
2309 {
2310
2311 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
2312 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1);
2313 hcryp->Instance->IV1LR = *(uint32_t *)(hcryp->Init.pInitVect + 2);
2314 hcryp->Instance->IV1RR = *(uint32_t *)(hcryp->Init.pInitVect + 3);
2315 }
2316 }
2317
2318
2319 hcryp->Phase = CRYP_PHASE_PROCESS;
2320 if (hcryp->Size != 0U)
2321 {
2322
2323 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
2324
2325
2326 __HAL_CRYP_ENABLE(hcryp);
2327 }
2328 else
2329 {
2330
2331 __HAL_UNLOCK(hcryp);
2332
2333
2334 hcryp->State = HAL_CRYP_STATE_READY;
2335 }
2336
2337 return HAL_OK;
2338 }
2339
2340
2341
2342
2343
2344
2345 static HAL_StatusTypeDef CRYP_AES_Decrypt_DMA(CRYP_HandleTypeDef *hcryp)
2346 {
2347 __IO uint32_t count = 0U;
2348 uint32_t DoKeyIVConfig = 1U;
2349
2350 if (hcryp->Init.KeyIVConfigSkip == CRYP_KEYIVCONFIG_ONCE)
2351 {
2352 if (hcryp->KeyIVConfig == 1U)
2353 {
2354
2355
2356 DoKeyIVConfig = 0U;
2357 }
2358 else
2359 {
2360
2361
2362
2363 hcryp->KeyIVConfig = 1U;
2364 }
2365 }
2366
2367 if (DoKeyIVConfig == 1U)
2368 {
2369
2370 if (hcryp->Init.Algorithm != CRYP_AES_CTR)
2371 {
2372
2373 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGOMODE, CRYP_CR_ALGOMODE_AES_KEY);
2374
2375
2376 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
2377
2378
2379 __HAL_CRYP_ENABLE(hcryp);
2380
2381
2382 count = CRYP_TIMEOUT_KEYPREPARATION;
2383 do
2384 {
2385 count-- ;
2386 if (count == 0U)
2387 {
2388
2389 __HAL_CRYP_DISABLE(hcryp);
2390
2391
2392 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
2393 hcryp->State = HAL_CRYP_STATE_READY;
2394
2395
2396 __HAL_UNLOCK(hcryp);
2397 return HAL_ERROR;
2398 }
2399 }
2400 while (HAL_IS_BIT_SET(hcryp->Instance->SR, CRYP_FLAG_BUSY));
2401
2402
2403 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGOMODE, hcryp->Init.Algorithm);
2404 }
2405 else
2406 {
2407
2408 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
2409 }
2410
2411 if (hcryp->Init.Algorithm != CRYP_AES_ECB)
2412 {
2413
2414 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
2415 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1);
2416 hcryp->Instance->IV1LR = *(uint32_t *)(hcryp->Init.pInitVect + 2);
2417 hcryp->Instance->IV1RR = *(uint32_t *)(hcryp->Init.pInitVect + 3);
2418 }
2419 }
2420
2421
2422 hcryp->Phase = CRYP_PHASE_PROCESS;
2423
2424 if (hcryp->Size != 0U)
2425 {
2426
2427 CRYP_SetDMAConfig(hcryp, (uint32_t)(hcryp->pCrypInBuffPtr), (hcryp->Size / 4U),
2428 (uint32_t)(hcryp->pCrypOutBuffPtr));
2429 }
2430 else
2431 {
2432
2433 __HAL_UNLOCK(hcryp);
2434
2435
2436 hcryp->State = HAL_CRYP_STATE_READY;
2437 }
2438
2439
2440 return HAL_OK;
2441 }
2442
2443
2444
2445
2446
2447
2448
2449 static void CRYP_DMAInCplt(DMA_HandleTypeDef *hdma)
2450 {
2451 CRYP_HandleTypeDef *hcryp = (CRYP_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2452
2453
2454
2455 hcryp->Instance->DMACR &= (uint32_t)(~CRYP_DMACR_DIEN);
2456
2457
2458 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
2459
2460 hcryp->InCpltCallback(hcryp);
2461 #else
2462
2463 HAL_CRYP_InCpltCallback(hcryp);
2464 #endif
2465 }
2466
2467
2468
2469
2470
2471
2472 static void CRYP_DMAOutCplt(DMA_HandleTypeDef *hdma)
2473 {
2474 uint32_t count;
2475 uint32_t npblb;
2476 uint32_t lastwordsize;
2477 uint32_t temp;
2478 uint32_t temp_cr_algodir;
2479 CRYP_HandleTypeDef *hcryp = (CRYP_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2480
2481
2482
2483 hcryp->Instance->DMACR &= (uint32_t)(~CRYP_DMACR_DOEN);
2484
2485
2486 if (((hcryp->Size) % 16U) != 0U)
2487 {
2488
2489 hcryp->CrypInCount = (hcryp->Size / 16U) * 4U ;
2490 hcryp->CrypOutCount = hcryp->CrypInCount;
2491
2492
2493 npblb = ((((uint32_t)(hcryp->Size) / 16U) + 1U) * 16U) - (uint32_t)(hcryp->Size);
2494
2495 #if !defined (CRYP_VER_2_2)
2496 if (hcryp->Version >= REV_ID_B)
2497 #endif
2498 {
2499
2500 temp_cr_algodir = hcryp->Instance->CR & CRYP_CR_ALGODIR;
2501 if (((temp_cr_algodir == CRYP_OPERATINGMODE_ENCRYPT) && (hcryp->Init.Algorithm == CRYP_AES_GCM)) ||
2502 ((temp_cr_algodir == CRYP_OPERATINGMODE_DECRYPT) && (hcryp->Init.Algorithm == CRYP_AES_CCM)))
2503 {
2504
2505 __HAL_CRYP_DISABLE(hcryp);
2506
2507
2508 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_NPBLB, npblb << 20);
2509
2510
2511 __HAL_CRYP_ENABLE(hcryp);
2512 }
2513 }
2514
2515
2516 if ((npblb % 4U) == 0U)
2517 {
2518 lastwordsize = (16U - npblb) / 4U;
2519 }
2520 else
2521 {
2522 lastwordsize = ((16U - npblb) / 4U) + 1U;
2523 }
2524
2525 for (count = 0U; count < lastwordsize; count ++)
2526 {
2527 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
2528 hcryp->CrypInCount++;
2529 }
2530
2531 while (count < 4U)
2532 {
2533 hcryp->Instance->DIN = 0U;
2534 count++;
2535 }
2536
2537 count = CRYP_TIMEOUT_GCMCCMHEADERPHASE;
2538 do
2539 {
2540 count-- ;
2541 if (count == 0U)
2542 {
2543
2544 __HAL_CRYP_DISABLE(hcryp);
2545
2546
2547 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
2548 hcryp->State = HAL_CRYP_STATE_READY;
2549
2550
2551 __HAL_UNLOCK(hcryp);
2552 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
2553
2554 hcryp->ErrorCallback(hcryp);
2555 #else
2556
2557 HAL_CRYP_ErrorCallback(hcryp);
2558 #endif
2559 }
2560 }
2561 while (HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_OFNE));
2562
2563
2564 for (count = 0U; count < 4U; count++)
2565 {
2566
2567
2568 temp = hcryp->Instance->DOUT;
2569
2570 *(uint32_t *)(hcryp->pCrypOutBuffPtr + (hcryp->CrypOutCount)) = temp;
2571 hcryp->CrypOutCount++;
2572 }
2573 }
2574
2575 if ((hcryp->Init.Algorithm & CRYP_AES_GCM) != CRYP_AES_GCM)
2576 {
2577
2578 __HAL_CRYP_DISABLE(hcryp);
2579 }
2580
2581
2582 hcryp->State = HAL_CRYP_STATE_READY;
2583
2584
2585 __HAL_UNLOCK(hcryp);
2586
2587
2588 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
2589
2590 hcryp->OutCpltCallback(hcryp);
2591 #else
2592
2593 HAL_CRYP_OutCpltCallback(hcryp);
2594 #endif
2595 }
2596
2597
2598
2599
2600
2601
2602 static void CRYP_DMAError(DMA_HandleTypeDef *hdma)
2603 {
2604 CRYP_HandleTypeDef *hcryp = (CRYP_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2605
2606
2607 hcryp->State = HAL_CRYP_STATE_READY;
2608
2609
2610 hcryp->ErrorCode |= HAL_CRYP_ERROR_DMA;
2611
2612
2613 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
2614
2615 hcryp->ErrorCallback(hcryp);
2616 #else
2617
2618 HAL_CRYP_ErrorCallback(hcryp);
2619 #endif
2620 }
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631 static void CRYP_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uint16_t Size, uint32_t outputaddr)
2632 {
2633
2634 hcryp->hdmain->XferCpltCallback = CRYP_DMAInCplt;
2635
2636
2637 hcryp->hdmain->XferErrorCallback = CRYP_DMAError;
2638
2639
2640 hcryp->hdmaout->XferCpltCallback = CRYP_DMAOutCplt;
2641
2642
2643 hcryp->hdmaout->XferErrorCallback = CRYP_DMAError;
2644
2645
2646 __HAL_CRYP_ENABLE(hcryp);
2647
2648
2649 if (HAL_DMA_Start_IT(hcryp->hdmain, inputaddr, (uint32_t)&hcryp->Instance->DIN, Size) != HAL_OK)
2650 {
2651
2652 hcryp->ErrorCode |= HAL_CRYP_ERROR_DMA;
2653
2654
2655 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
2656
2657 hcryp->ErrorCallback(hcryp);
2658 #else
2659
2660 HAL_CRYP_ErrorCallback(hcryp);
2661 #endif
2662 }
2663
2664
2665 if (HAL_DMA_Start_IT(hcryp->hdmaout, (uint32_t)&hcryp->Instance->DOUT, outputaddr, Size) != HAL_OK)
2666 {
2667
2668 hcryp->ErrorCode |= HAL_CRYP_ERROR_DMA;
2669
2670
2671 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
2672
2673 hcryp->ErrorCallback(hcryp);
2674 #else
2675
2676 HAL_CRYP_ErrorCallback(hcryp);
2677 #endif
2678 }
2679
2680 hcryp->Instance->DMACR = CRYP_DMACR_DOEN | CRYP_DMACR_DIEN;
2681 }
2682
2683
2684
2685
2686
2687
2688
2689
2690 static void CRYP_AES_ProcessData(CRYP_HandleTypeDef *hcryp, uint32_t Timeout)
2691 {
2692
2693 uint32_t temp[4];
2694 uint16_t incount;
2695 uint16_t outcount;
2696 uint32_t i;
2697
2698
2699 incount = hcryp->CrypInCount;
2700
2701 if (((hcryp->Instance->SR & CRYP_FLAG_IFNF) != 0x0U) && (incount < ((hcryp->Size) / 4U)))
2702 {
2703
2704 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
2705 hcryp->CrypInCount++;
2706 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
2707 hcryp->CrypInCount++;
2708 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
2709 hcryp->CrypInCount++;
2710 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
2711 hcryp->CrypInCount++;
2712 }
2713
2714
2715 if (CRYP_WaitOnOFNEFlag(hcryp, Timeout) != HAL_OK)
2716 {
2717
2718 __HAL_CRYP_DISABLE(hcryp);
2719
2720
2721 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
2722 hcryp->State = HAL_CRYP_STATE_READY;
2723
2724
2725 __HAL_UNLOCK(hcryp);
2726 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
2727
2728 hcryp->ErrorCallback(hcryp);
2729 #else
2730
2731 HAL_CRYP_ErrorCallback(hcryp);
2732 #endif
2733 }
2734
2735 outcount = hcryp->CrypOutCount;
2736
2737 if (((hcryp->Instance->SR & CRYP_FLAG_OFNE) != 0x0U) && (outcount < ((hcryp->Size) / 4U)))
2738 {
2739
2740
2741 for (i = 0U; i < 4U; i++)
2742 {
2743 temp[i] = hcryp->Instance->DOUT;
2744 }
2745 i = 0U;
2746 while (((hcryp->CrypOutCount < ((hcryp->Size) / 4U))) && (i < 4U))
2747 {
2748 *(uint32_t *)(hcryp->pCrypOutBuffPtr + hcryp->CrypOutCount) = temp[i];
2749 hcryp->CrypOutCount++;
2750 i++;
2751 }
2752 }
2753 }
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763 static void CRYP_AES_IT(CRYP_HandleTypeDef *hcryp)
2764 {
2765 uint32_t temp[4];
2766 uint16_t incount;
2767 uint16_t outcount;
2768 uint32_t i;
2769
2770 if (hcryp->State == HAL_CRYP_STATE_BUSY)
2771 {
2772
2773 incount = hcryp->CrypInCount;
2774
2775 if (((hcryp->Instance->SR & CRYP_FLAG_IFNF) != 0x0U) && (incount < (hcryp->Size / 4U)))
2776 {
2777
2778 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
2779 hcryp->CrypInCount++;
2780 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
2781 hcryp->CrypInCount++;
2782 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
2783 hcryp->CrypInCount++;
2784 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
2785 hcryp->CrypInCount++;
2786 if (hcryp->CrypInCount == (hcryp->Size / 4U))
2787 {
2788
2789 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI);
2790
2791
2792 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
2793
2794 hcryp->InCpltCallback(hcryp);
2795 #else
2796
2797 HAL_CRYP_InCpltCallback(hcryp);
2798 #endif
2799 }
2800 }
2801
2802
2803 outcount = hcryp->CrypOutCount;
2804
2805 if (((hcryp->Instance->SR & CRYP_FLAG_OFNE) != 0x0U) && (outcount < (hcryp->Size / 4U)))
2806 {
2807
2808
2809 for (i = 0U; i < 4U; i++)
2810 {
2811 temp[i] = hcryp->Instance->DOUT;
2812 }
2813 i = 0U;
2814 while (((hcryp->CrypOutCount < ((hcryp->Size) / 4U))) && (i < 4U))
2815 {
2816 *(uint32_t *)(hcryp->pCrypOutBuffPtr + hcryp->CrypOutCount) = temp[i];
2817 hcryp->CrypOutCount++;
2818 i++;
2819 }
2820 if (hcryp->CrypOutCount == (hcryp->Size / 4U))
2821 {
2822
2823 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI);
2824
2825
2826 hcryp->State = HAL_CRYP_STATE_READY;
2827
2828
2829 __HAL_CRYP_DISABLE(hcryp);
2830
2831
2832 __HAL_UNLOCK(hcryp);
2833
2834
2835 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
2836
2837 hcryp->OutCpltCallback(hcryp);
2838 #else
2839
2840 HAL_CRYP_OutCpltCallback(hcryp);
2841 #endif
2842 }
2843 }
2844 }
2845 else
2846 {
2847
2848 __HAL_UNLOCK(hcryp);
2849
2850 hcryp->ErrorCode |= HAL_CRYP_ERROR_BUSY;
2851 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
2852
2853 hcryp->ErrorCallback(hcryp);
2854 #else
2855
2856 HAL_CRYP_ErrorCallback(hcryp);
2857 #endif
2858 }
2859 }
2860
2861
2862
2863
2864
2865
2866
2867
2868 static void CRYP_SetKey(CRYP_HandleTypeDef *hcryp, uint32_t KeySize)
2869 {
2870 switch (KeySize)
2871 {
2872 case CRYP_KEYSIZE_256B:
2873 hcryp->Instance->K0LR = *(uint32_t *)(hcryp->Init.pKey);
2874 hcryp->Instance->K0RR = *(uint32_t *)(hcryp->Init.pKey + 1);
2875 hcryp->Instance->K1LR = *(uint32_t *)(hcryp->Init.pKey + 2);
2876 hcryp->Instance->K1RR = *(uint32_t *)(hcryp->Init.pKey + 3);
2877 hcryp->Instance->K2LR = *(uint32_t *)(hcryp->Init.pKey + 4);
2878 hcryp->Instance->K2RR = *(uint32_t *)(hcryp->Init.pKey + 5);
2879 hcryp->Instance->K3LR = *(uint32_t *)(hcryp->Init.pKey + 6);
2880 hcryp->Instance->K3RR = *(uint32_t *)(hcryp->Init.pKey + 7);
2881 break;
2882 case CRYP_KEYSIZE_192B:
2883 hcryp->Instance->K1LR = *(uint32_t *)(hcryp->Init.pKey);
2884 hcryp->Instance->K1RR = *(uint32_t *)(hcryp->Init.pKey + 1);
2885 hcryp->Instance->K2LR = *(uint32_t *)(hcryp->Init.pKey + 2);
2886 hcryp->Instance->K2RR = *(uint32_t *)(hcryp->Init.pKey + 3);
2887 hcryp->Instance->K3LR = *(uint32_t *)(hcryp->Init.pKey + 4);
2888 hcryp->Instance->K3RR = *(uint32_t *)(hcryp->Init.pKey + 5);
2889 break;
2890 case CRYP_KEYSIZE_128B:
2891 hcryp->Instance->K2LR = *(uint32_t *)(hcryp->Init.pKey);
2892 hcryp->Instance->K2RR = *(uint32_t *)(hcryp->Init.pKey + 1);
2893 hcryp->Instance->K3LR = *(uint32_t *)(hcryp->Init.pKey + 2);
2894 hcryp->Instance->K3RR = *(uint32_t *)(hcryp->Init.pKey + 3);
2895
2896 break;
2897 default:
2898 break;
2899 }
2900 }
2901
2902
2903
2904
2905
2906
2907
2908
2909 static HAL_StatusTypeDef CRYP_AESGCM_Process(CRYP_HandleTypeDef *hcryp, uint32_t Timeout)
2910 {
2911 uint32_t tickstart;
2912 uint32_t wordsize = (uint32_t)(hcryp->Size) / 4U;
2913 uint32_t npblb ;
2914 uint32_t temp[4];
2915 uint32_t index ;
2916 uint32_t lastwordsize ;
2917 uint32_t nolastpaddingbytes;
2918 uint8_t *pval;
2919 uint16_t outcount;
2920 uint32_t DoKeyIVConfig = 1U;
2921
2922 if (hcryp->Init.KeyIVConfigSkip == CRYP_KEYIVCONFIG_ONCE)
2923 {
2924 if (hcryp->KeyIVConfig == 1U)
2925 {
2926
2927
2928 DoKeyIVConfig = 0U;
2929 hcryp->SizesSum += hcryp->Size;
2930 }
2931 else
2932 {
2933
2934
2935
2936 hcryp->KeyIVConfig = 1U;
2937 hcryp->SizesSum = hcryp->Size;
2938 }
2939 }
2940 else
2941 {
2942 hcryp->SizesSum = hcryp->Size;
2943 }
2944
2945 if (DoKeyIVConfig == 1U)
2946 {
2947
2948 hcryp->CrypHeaderCount = 0U;
2949
2950
2951
2952 CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
2953
2954
2955 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
2956
2957
2958 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
2959 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1);
2960 hcryp->Instance->IV1LR = *(uint32_t *)(hcryp->Init.pInitVect + 2);
2961 hcryp->Instance->IV1RR = *(uint32_t *)(hcryp->Init.pInitVect + 3);
2962
2963
2964 __HAL_CRYP_ENABLE(hcryp);
2965
2966
2967 tickstart = HAL_GetTick();
2968
2969
2970 while ((hcryp->Instance->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
2971 {
2972
2973 if (Timeout != HAL_MAX_DELAY)
2974 {
2975 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
2976 {
2977
2978 __HAL_CRYP_DISABLE(hcryp);
2979
2980
2981 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
2982 hcryp->State = HAL_CRYP_STATE_READY;
2983
2984
2985 __HAL_UNLOCK(hcryp);
2986 return HAL_ERROR;
2987 }
2988 }
2989 }
2990
2991
2992
2993 if (CRYP_GCMCCM_SetHeaderPhase(hcryp, Timeout) != HAL_OK)
2994 {
2995 return HAL_ERROR;
2996 }
2997
2998
2999
3000
3001 hcryp->Phase = CRYP_PHASE_PROCESS;
3002
3003
3004 __HAL_CRYP_DISABLE(hcryp);
3005
3006 #if !defined (CRYP_VER_2_2)
3007 if (hcryp->Version >= REV_ID_B)
3008 #endif
3009 {
3010
3011 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_NPBLB, 0U);
3012 }
3013
3014
3015 CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
3016
3017
3018 __HAL_CRYP_ENABLE(hcryp);
3019 }
3020
3021 if ((hcryp->Size % 16U) != 0U)
3022 {
3023
3024 wordsize = ((wordsize / 4U) * 4U) ;
3025 }
3026
3027
3028 tickstart = HAL_GetTick();
3029
3030 outcount = hcryp->CrypOutCount;
3031
3032
3033 while ((hcryp->CrypInCount < wordsize) && (outcount < wordsize))
3034 {
3035
3036 CRYP_AES_ProcessData(hcryp, Timeout);
3037
3038
3039 outcount = hcryp->CrypOutCount;
3040
3041
3042 if (Timeout != HAL_MAX_DELAY)
3043 {
3044 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
3045 {
3046
3047 __HAL_CRYP_DISABLE(hcryp);
3048
3049
3050 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
3051 hcryp->State = HAL_CRYP_STATE_READY;
3052
3053
3054 __HAL_UNLOCK(hcryp);
3055 return HAL_ERROR;
3056 }
3057 }
3058 }
3059
3060 if ((hcryp->Size % 16U) != 0U)
3061 {
3062
3063 #if !defined (CRYP_VER_2_2)
3064 if (hcryp->Version >= REV_ID_B)
3065 #endif
3066 {
3067
3068 npblb = ((((uint32_t)(hcryp->Size) / 16U) + 1U) * 16U) - (uint32_t)(hcryp->Size);
3069
3070
3071 if ((hcryp->Instance->CR & CRYP_CR_ALGODIR) == CRYP_OPERATINGMODE_ENCRYPT)
3072 {
3073
3074 __HAL_CRYP_DISABLE(hcryp);
3075
3076
3077 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_NPBLB, npblb << 20);
3078
3079
3080 __HAL_CRYP_ENABLE(hcryp);
3081 }
3082
3083 if ((npblb % 4U) == 0U)
3084 {
3085 lastwordsize = (16U - npblb) / 4U;
3086 }
3087 else
3088 {
3089 lastwordsize = ((16U - npblb) / 4U) + 1U;
3090 }
3091
3092
3093 for (index = 0U; index < lastwordsize; index ++)
3094 {
3095 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
3096 hcryp->CrypInCount++;
3097 }
3098
3099
3100 while (index < 4U)
3101 {
3102 hcryp->Instance->DIN = 0U;
3103 index++;
3104 }
3105
3106
3107 if (CRYP_WaitOnOFNEFlag(hcryp, Timeout) != HAL_OK)
3108 {
3109
3110 __HAL_CRYP_DISABLE(hcryp);
3111
3112
3113 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
3114 hcryp->State = HAL_CRYP_STATE_READY;
3115
3116
3117 __HAL_UNLOCK(hcryp);
3118 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
3119
3120 hcryp->ErrorCallback(hcryp);
3121 #else
3122
3123 HAL_CRYP_ErrorCallback(hcryp);
3124 #endif
3125 }
3126
3127
3128 if ((hcryp->Instance->SR & CRYP_FLAG_OFNE) != 0x0U)
3129 {
3130 for (index = 0U; index < 4U; index++)
3131 {
3132
3133
3134 temp[index] = hcryp->Instance->DOUT;
3135 }
3136
3137 for (index = 0U; index < lastwordsize; index++)
3138 {
3139 pval = (uint8_t *)(hcryp->pCrypOutBuffPtr + (hcryp->CrypOutCount));
3140
3141 if (index == (lastwordsize - 1U))
3142 {
3143 nolastpaddingbytes = npblb % 4U;
3144
3145 switch (nolastpaddingbytes)
3146 {
3147 case 1:
3148 *(pval) = (uint8_t)(temp[index]);
3149 pval++;
3150 *(pval) = (uint8_t)(temp[index] >> 8U);
3151 pval++;
3152 *(pval) = (uint8_t)(temp[index] >> 16U);
3153 break;
3154 case 2:
3155 *(pval) = (uint8_t)(temp[index]);
3156 pval++;
3157 *(pval) = (uint8_t)(temp[index] >> 8U);
3158 break;
3159 case 3:
3160 *(pval) = (uint8_t)(temp[index]);
3161 break;
3162 default:
3163 *(pval) = (uint8_t)(temp[index]);
3164 pval++;
3165 *(pval) = (uint8_t)(temp[index] >> 8U);
3166 pval++;
3167 *(pval) = (uint8_t)(temp[index] >> 16U);
3168 pval++;
3169 *(pval) = (uint8_t)(temp[index] >> 24U);
3170 break;
3171 }
3172 }
3173 else
3174 {
3175 *(uint32_t *)(hcryp->pCrypOutBuffPtr + (hcryp->CrypOutCount)) = temp[index];
3176 }
3177
3178 hcryp->CrypOutCount++;
3179 }
3180 }
3181 }
3182 #if !defined (CRYP_VER_2_2)
3183 else
3184 {
3185
3186
3187 CRYP_Workaround(hcryp, Timeout);
3188 }
3189 #endif
3190 }
3191
3192
3193 return HAL_OK;
3194 }
3195
3196
3197
3198
3199
3200
3201
3202 static HAL_StatusTypeDef CRYP_AESGCM_Process_IT(CRYP_HandleTypeDef *hcryp)
3203 {
3204 __IO uint32_t count = 0U;
3205 uint32_t DoKeyIVConfig = 1U;
3206
3207 if (hcryp->Init.KeyIVConfigSkip == CRYP_KEYIVCONFIG_ONCE)
3208 {
3209 if (hcryp->KeyIVConfig == 1U)
3210 {
3211
3212
3213 DoKeyIVConfig = 0U;
3214 hcryp->SizesSum += hcryp->Size;
3215 }
3216 else
3217 {
3218
3219
3220
3221 hcryp->KeyIVConfig = 1U;
3222 hcryp->SizesSum = hcryp->Size;
3223 }
3224 }
3225 else
3226 {
3227 hcryp->SizesSum = hcryp->Size;
3228 }
3229
3230
3231 if (DoKeyIVConfig == 1U)
3232 {
3233
3234 hcryp->CrypHeaderCount = 0U;
3235
3236
3237
3238 CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
3239
3240
3241 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
3242
3243
3244 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
3245 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1);
3246 hcryp->Instance->IV1LR = *(uint32_t *)(hcryp->Init.pInitVect + 2);
3247 hcryp->Instance->IV1RR = *(uint32_t *)(hcryp->Init.pInitVect + 3);
3248
3249
3250 __HAL_CRYP_ENABLE(hcryp);
3251
3252
3253 count = CRYP_TIMEOUT_GCMCCMINITPHASE;
3254 do
3255 {
3256 count-- ;
3257 if (count == 0U)
3258 {
3259
3260 __HAL_CRYP_DISABLE(hcryp);
3261
3262
3263 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
3264 hcryp->State = HAL_CRYP_STATE_READY;
3265
3266
3267 __HAL_UNLOCK(hcryp);
3268 return HAL_ERROR;
3269 }
3270 }
3271 while ((hcryp->Instance->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN);
3272
3273
3274
3275
3276 CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
3277 }
3278
3279 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI);
3280
3281
3282 __HAL_CRYP_ENABLE(hcryp);
3283
3284
3285 return HAL_OK;
3286 }
3287
3288
3289
3290
3291
3292
3293
3294
3295 static HAL_StatusTypeDef CRYP_AESGCM_Process_DMA(CRYP_HandleTypeDef *hcryp)
3296 {
3297 __IO uint32_t count = 0U;
3298 uint32_t wordsize = (uint32_t)(hcryp->Size) / 4U ;
3299 uint32_t index;
3300 uint32_t npblb;
3301 uint32_t lastwordsize;
3302 uint32_t temp[4];
3303 uint32_t DoKeyIVConfig = 1U;
3304
3305 if (hcryp->Init.KeyIVConfigSkip == CRYP_KEYIVCONFIG_ONCE)
3306 {
3307 if (hcryp->KeyIVConfig == 1U)
3308 {
3309
3310
3311 DoKeyIVConfig = 0U;
3312 hcryp->SizesSum += hcryp->Size;
3313 }
3314 else
3315 {
3316
3317
3318
3319 hcryp->KeyIVConfig = 1U;
3320 hcryp->SizesSum = hcryp->Size;
3321 }
3322 }
3323 else
3324 {
3325 hcryp->SizesSum = hcryp->Size;
3326 }
3327
3328 if (DoKeyIVConfig == 1U)
3329 {
3330
3331 hcryp->CrypHeaderCount = 0U;
3332
3333
3334
3335 CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
3336
3337
3338 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
3339
3340
3341 hcryp->Instance->IV0LR = *(uint32_t *)(hcryp->Init.pInitVect);
3342 hcryp->Instance->IV0RR = *(uint32_t *)(hcryp->Init.pInitVect + 1);
3343 hcryp->Instance->IV1LR = *(uint32_t *)(hcryp->Init.pInitVect + 2);
3344 hcryp->Instance->IV1RR = *(uint32_t *)(hcryp->Init.pInitVect + 3);
3345
3346
3347 __HAL_CRYP_ENABLE(hcryp);
3348
3349
3350 count = CRYP_TIMEOUT_GCMCCMINITPHASE;
3351 do
3352 {
3353 count-- ;
3354 if (count == 0U)
3355 {
3356
3357 __HAL_CRYP_DISABLE(hcryp);
3358
3359
3360 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
3361 hcryp->State = HAL_CRYP_STATE_READY;
3362
3363
3364 __HAL_UNLOCK(hcryp);
3365 return HAL_ERROR;
3366 }
3367 }
3368 while ((hcryp->Instance->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN);
3369
3370
3371
3372 if (CRYP_GCMCCM_SetHeaderPhase_DMA(hcryp) != HAL_OK)
3373 {
3374 return HAL_ERROR;
3375 }
3376
3377
3378
3379
3380 hcryp->Phase = CRYP_PHASE_PROCESS;
3381
3382
3383 __HAL_CRYP_DISABLE(hcryp);
3384
3385 #if !defined (CRYP_VER_2_2)
3386 if (hcryp->Version >= REV_ID_B)
3387 #endif
3388 {
3389
3390 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_NPBLB, 0U);
3391 }
3392
3393
3394 CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
3395
3396 }
3397
3398 if (hcryp->Size == 0U)
3399 {
3400
3401 __HAL_UNLOCK(hcryp);
3402
3403
3404 hcryp->State = HAL_CRYP_STATE_READY;
3405 }
3406 else if (hcryp->Size >= 16U)
3407 {
3408
3409
3410
3411
3412
3413 wordsize = wordsize - (wordsize % 4U);
3414
3415
3416 CRYP_SetDMAConfig(hcryp, (uint32_t)(hcryp->pCrypInBuffPtr), (uint16_t)wordsize,
3417 (uint32_t)(hcryp->pCrypOutBuffPtr));
3418 }
3419 else
3420 {
3421
3422 npblb = 16U - (uint32_t)hcryp->Size;
3423
3424 #if !defined (CRYP_VER_2_2)
3425 if (hcryp->Version >= REV_ID_B)
3426 #endif
3427 {
3428
3429 if ((hcryp->Instance->CR & CRYP_CR_ALGODIR) == CRYP_OPERATINGMODE_ENCRYPT)
3430 {
3431
3432 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_NPBLB, npblb << 20);
3433 }
3434 }
3435
3436 __HAL_CRYP_ENABLE(hcryp);
3437
3438
3439 if ((npblb % 4U) == 0U)
3440 {
3441 lastwordsize = (16U - npblb) / 4U;
3442 }
3443 else
3444 {
3445 lastwordsize = ((16U - npblb) / 4U) + 1U;
3446 }
3447
3448
3449 for (index = 0; index < lastwordsize; index ++)
3450 {
3451 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
3452 hcryp->CrypInCount++;
3453 }
3454
3455
3456 while (index < 4U)
3457 {
3458 hcryp->Instance->DIN = 0U;
3459 index++;
3460 }
3461
3462
3463 count = CRYP_TIMEOUT_GCMCCMHEADERPHASE;
3464 do
3465 {
3466 count-- ;
3467 if (count == 0U)
3468 {
3469
3470 __HAL_CRYP_DISABLE(hcryp);
3471
3472
3473 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
3474 hcryp->State = HAL_CRYP_STATE_READY;
3475
3476
3477 __HAL_UNLOCK(hcryp);
3478 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
3479
3480 hcryp->ErrorCallback(hcryp);
3481 #else
3482
3483 HAL_CRYP_ErrorCallback(hcryp);
3484 #endif
3485 }
3486 }
3487 while (HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_OFNE));
3488
3489
3490 for (index = 0U; index < 4U; index++)
3491 {
3492
3493
3494 temp[index] = hcryp->Instance->DOUT;
3495 }
3496 for (index = 0; index < lastwordsize; index++)
3497 {
3498 *(uint32_t *)(hcryp->pCrypOutBuffPtr + hcryp->CrypOutCount) = temp[index];
3499 hcryp->CrypOutCount++;
3500 }
3501
3502
3503 hcryp->State = HAL_CRYP_STATE_READY;
3504
3505
3506 __HAL_UNLOCK(hcryp);
3507 }
3508
3509
3510 return HAL_OK;
3511 }
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521 static HAL_StatusTypeDef CRYP_AESCCM_Process(CRYP_HandleTypeDef *hcryp, uint32_t Timeout)
3522 {
3523 uint32_t tickstart;
3524 uint32_t wordsize = (uint32_t)(hcryp->Size) / 4U;
3525 uint32_t npblb ;
3526 uint32_t lastwordsize ;
3527 uint32_t temp[4] ;
3528 uint32_t index ;
3529 uint16_t outcount;
3530 uint32_t DoKeyIVConfig = 1U;
3531
3532 if (hcryp->Init.KeyIVConfigSkip == CRYP_KEYIVCONFIG_ONCE)
3533 {
3534 if (hcryp->KeyIVConfig == 1U)
3535 {
3536
3537
3538 DoKeyIVConfig = 0U;
3539 hcryp->SizesSum += hcryp->Size;
3540 }
3541 else
3542 {
3543
3544
3545
3546 hcryp->KeyIVConfig = 1U;
3547 hcryp->SizesSum = hcryp->Size;
3548 }
3549 }
3550 else
3551 {
3552 hcryp->SizesSum = hcryp->Size;
3553 }
3554
3555 if (DoKeyIVConfig == 1U)
3556 {
3557
3558 hcryp->CrypHeaderCount = 0U;
3559
3560
3561
3562 CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
3563
3564
3565 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
3566
3567
3568 hcryp->Instance->IV0LR = (hcryp->Init.B0[0]) & CRYP_CCM_CTR1_0;
3569 hcryp->Instance->IV0RR = hcryp->Init.B0[1];
3570 hcryp->Instance->IV1LR = hcryp->Init.B0[2];
3571 hcryp->Instance->IV1RR = (hcryp->Init.B0[3] & CRYP_CCM_CTR1_1) | CRYP_CCM_CTR1_2;
3572
3573
3574 __HAL_CRYP_ENABLE(hcryp);
3575
3576 #if defined (CRYP_VER_2_2)
3577 {
3578
3579 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0);
3580 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 1);
3581 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 2);
3582 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 3);
3583 }
3584 #else
3585 if (hcryp->Version >= REV_ID_B)
3586 {
3587
3588 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0);
3589 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 1);
3590 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 2);
3591 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 3);
3592 }
3593 else
3594 {
3595 if (hcryp->Init.DataType == CRYP_BYTE_SWAP)
3596 {
3597 hcryp->Instance->DIN = __REV(*(uint32_t *)(hcryp->Init.B0));
3598 hcryp->Instance->DIN = __REV(*(uint32_t *)(hcryp->Init.B0 + 1));
3599 hcryp->Instance->DIN = __REV(*(uint32_t *)(hcryp->Init.B0 + 2));
3600 hcryp->Instance->DIN = __REV(*(uint32_t *)(hcryp->Init.B0 + 3));
3601 }
3602 else if (hcryp->Init.DataType == CRYP_HALFWORD_SWAP)
3603 {
3604 hcryp->Instance->DIN = __ROR(*(uint32_t *)(hcryp->Init.B0), 16);
3605 hcryp->Instance->DIN = __ROR(*(uint32_t *)(hcryp->Init.B0 + 1), 16);
3606 hcryp->Instance->DIN = __ROR(*(uint32_t *)(hcryp->Init.B0 + 2), 16);
3607 hcryp->Instance->DIN = __ROR(*(uint32_t *)(hcryp->Init.B0 + 3), 16);
3608 }
3609 else if (hcryp->Init.DataType == CRYP_BIT_SWAP)
3610 {
3611 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(hcryp->Init.B0));
3612 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(hcryp->Init.B0 + 1));
3613 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(hcryp->Init.B0 + 2));
3614 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(hcryp->Init.B0 + 3));
3615 }
3616 else
3617 {
3618 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0);
3619 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 1);
3620 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 2);
3621 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 3);
3622 }
3623 }
3624 #endif
3625
3626 tickstart = HAL_GetTick();
3627
3628
3629 while ((hcryp->Instance->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
3630 {
3631
3632 if (Timeout != HAL_MAX_DELAY)
3633 {
3634 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
3635 {
3636
3637 __HAL_CRYP_DISABLE(hcryp);
3638
3639
3640 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
3641 hcryp->State = HAL_CRYP_STATE_READY;
3642
3643
3644 __HAL_UNLOCK(hcryp);
3645 return HAL_ERROR;
3646 }
3647 }
3648 }
3649
3650
3651
3652
3653
3654 if (CRYP_GCMCCM_SetHeaderPhase(hcryp, Timeout) != HAL_OK)
3655 {
3656 return HAL_ERROR;
3657 }
3658
3659
3660
3661 hcryp->Phase = CRYP_PHASE_PROCESS;
3662
3663
3664 __HAL_CRYP_DISABLE(hcryp);
3665 #if !defined (CRYP_VER_2_2)
3666 if (hcryp->Version >= REV_ID_B)
3667 #endif
3668 {
3669
3670 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_NPBLB, 0U);
3671 }
3672
3673
3674 CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
3675
3676
3677 __HAL_CRYP_ENABLE(hcryp);
3678
3679 }
3680
3681 if ((hcryp->Size % 16U) != 0U)
3682 {
3683
3684 wordsize = ((wordsize / 4U) * 4U) ;
3685 }
3686
3687 tickstart = HAL_GetTick();
3688
3689
3690 outcount = hcryp->CrypOutCount;
3691
3692
3693 while ((hcryp->CrypInCount < wordsize) && (outcount < wordsize))
3694 {
3695
3696 CRYP_AES_ProcessData(hcryp, Timeout);
3697
3698
3699 outcount = hcryp->CrypOutCount;
3700
3701
3702 if (Timeout != HAL_MAX_DELAY)
3703 {
3704 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
3705 {
3706
3707 __HAL_CRYP_DISABLE(hcryp);
3708
3709
3710 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
3711 hcryp->State = HAL_CRYP_STATE_READY;
3712
3713
3714 __HAL_UNLOCK(hcryp);
3715 return HAL_ERROR;
3716 }
3717 }
3718 }
3719
3720 if ((hcryp->Size % 16U) != 0U)
3721 {
3722 #if !defined (CRYP_VER_2_2)
3723 if (hcryp->Version >= REV_ID_B)
3724 #endif
3725 {
3726
3727 npblb = ((((uint32_t)(hcryp->Size) / 16U) + 1U) * 16U) - (uint32_t)(hcryp->Size);
3728
3729 if ((hcryp->Instance->CR & CRYP_CR_ALGODIR) == CRYP_OPERATINGMODE_DECRYPT)
3730 {
3731
3732 __HAL_CRYP_DISABLE(hcryp);
3733
3734
3735 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_NPBLB, npblb << 20);
3736
3737
3738 __HAL_CRYP_ENABLE(hcryp);
3739 }
3740
3741
3742 if ((npblb % 4U) == 0U)
3743 {
3744 lastwordsize = (16U - npblb) / 4U;
3745 }
3746 else
3747 {
3748 lastwordsize = ((16U - npblb) / 4U) + 1U;
3749 }
3750
3751
3752 for (index = 0U; index < lastwordsize; index ++)
3753 {
3754 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
3755 hcryp->CrypInCount++;
3756 }
3757
3758
3759 while (index < 4U)
3760 {
3761 hcryp->Instance->DIN = 0U;
3762 index++;
3763 }
3764
3765
3766 if (CRYP_WaitOnOFNEFlag(hcryp, Timeout) != HAL_OK)
3767 {
3768
3769 __HAL_CRYP_DISABLE(hcryp);
3770
3771
3772 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
3773 hcryp->State = HAL_CRYP_STATE_READY;
3774
3775
3776 __HAL_UNLOCK(hcryp);
3777 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
3778
3779 hcryp->ErrorCallback(hcryp);
3780 #else
3781
3782 HAL_CRYP_ErrorCallback(hcryp);
3783 #endif
3784 }
3785
3786
3787 if ((hcryp->Instance->SR & CRYP_FLAG_OFNE) != 0x0U)
3788 {
3789 for (index = 0U; index < 4U; index++)
3790 {
3791
3792
3793 temp[index] = hcryp->Instance->DOUT;
3794 }
3795 for (index = 0; index < lastwordsize; index++)
3796 {
3797 *(uint32_t *)(hcryp->pCrypOutBuffPtr + hcryp->CrypOutCount) = temp[index];
3798 hcryp->CrypOutCount++;
3799 }
3800 }
3801 }
3802 #if !defined (CRYP_VER_2_2)
3803 else
3804 {
3805
3806
3807
3808 CRYP_Workaround(hcryp, Timeout);
3809 }
3810 #endif
3811 }
3812
3813
3814 return HAL_OK;
3815 }
3816
3817
3818
3819
3820
3821
3822
3823 static HAL_StatusTypeDef CRYP_AESCCM_Process_IT(CRYP_HandleTypeDef *hcryp)
3824 {
3825 __IO uint32_t count = 0U;
3826 uint32_t DoKeyIVConfig = 1U;
3827
3828 if (hcryp->Init.KeyIVConfigSkip == CRYP_KEYIVCONFIG_ONCE)
3829 {
3830 if (hcryp->KeyIVConfig == 1U)
3831 {
3832
3833
3834 DoKeyIVConfig = 0U;
3835 hcryp->SizesSum += hcryp->Size;
3836 }
3837 else
3838 {
3839
3840
3841
3842 hcryp->KeyIVConfig = 1U;
3843 hcryp->SizesSum = hcryp->Size;
3844 }
3845 }
3846 else
3847 {
3848 hcryp->SizesSum = hcryp->Size;
3849 }
3850
3851
3852 if (DoKeyIVConfig == 1U)
3853 {
3854
3855 hcryp->CrypHeaderCount = 0U;
3856
3857
3858
3859 CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
3860
3861
3862 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
3863
3864
3865 hcryp->Instance->IV0LR = (hcryp->Init.B0[0]) & CRYP_CCM_CTR1_0;
3866 hcryp->Instance->IV0RR = hcryp->Init.B0[1];
3867 hcryp->Instance->IV1LR = hcryp->Init.B0[2];
3868 hcryp->Instance->IV1RR = (hcryp->Init.B0[3] & CRYP_CCM_CTR1_1) | CRYP_CCM_CTR1_2;
3869
3870
3871 __HAL_CRYP_ENABLE(hcryp);
3872
3873
3874 #if !defined (CRYP_VER_2_2)
3875 if (hcryp->Version >= REV_ID_B)
3876 #endif
3877 {
3878
3879 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0);
3880 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 1);
3881 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 2);
3882 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 3);
3883 }
3884 #if !defined (CRYP_VER_2_2)
3885 else
3886 {
3887 if (hcryp->Init.DataType == CRYP_BYTE_SWAP)
3888 {
3889 hcryp->Instance->DIN = __REV(*(uint32_t *)(hcryp->Init.B0));
3890 hcryp->Instance->DIN = __REV(*(uint32_t *)(hcryp->Init.B0 + 1));
3891 hcryp->Instance->DIN = __REV(*(uint32_t *)(hcryp->Init.B0 + 2));
3892 hcryp->Instance->DIN = __REV(*(uint32_t *)(hcryp->Init.B0 + 3));
3893 }
3894 else if (hcryp->Init.DataType == CRYP_HALFWORD_SWAP)
3895 {
3896 hcryp->Instance->DIN = __ROR(*(uint32_t *)(hcryp->Init.B0), 16);
3897 hcryp->Instance->DIN = __ROR(*(uint32_t *)(hcryp->Init.B0 + 1), 16);
3898 hcryp->Instance->DIN = __ROR(*(uint32_t *)(hcryp->Init.B0 + 2), 16);
3899 hcryp->Instance->DIN = __ROR(*(uint32_t *)(hcryp->Init.B0 + 3), 16);
3900 }
3901 else if (hcryp->Init.DataType == CRYP_BIT_SWAP)
3902 {
3903 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(hcryp->Init.B0));
3904 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(hcryp->Init.B0 + 1));
3905 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(hcryp->Init.B0 + 2));
3906 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(hcryp->Init.B0 + 3));
3907 }
3908 else
3909 {
3910 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0);
3911 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 1);
3912 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 2);
3913 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 3);
3914 }
3915 }
3916 #endif
3917
3918 count = CRYP_TIMEOUT_GCMCCMINITPHASE;
3919 do
3920 {
3921 count-- ;
3922 if (count == 0U)
3923 {
3924
3925 __HAL_CRYP_DISABLE(hcryp);
3926
3927
3928 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
3929 hcryp->State = HAL_CRYP_STATE_READY;
3930
3931
3932 __HAL_UNLOCK(hcryp);
3933 return HAL_ERROR;
3934 }
3935 }
3936 while ((hcryp->Instance->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN);
3937
3938
3939 CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
3940 }
3941
3942 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI);
3943
3944
3945 __HAL_CRYP_ENABLE(hcryp);
3946
3947
3948 return HAL_OK;
3949 }
3950
3951
3952
3953
3954
3955
3956 static HAL_StatusTypeDef CRYP_AESCCM_Process_DMA(CRYP_HandleTypeDef *hcryp)
3957 {
3958 __IO uint32_t count = 0U;
3959 uint32_t wordsize = (uint32_t)(hcryp->Size) / 4U ;
3960 uint32_t index;
3961 uint32_t npblb;
3962 uint32_t lastwordsize;
3963 uint32_t temp[4];
3964 uint32_t DoKeyIVConfig = 1U;
3965
3966 if (hcryp->Init.KeyIVConfigSkip == CRYP_KEYIVCONFIG_ONCE)
3967 {
3968 if (hcryp->KeyIVConfig == 1U)
3969 {
3970
3971
3972 DoKeyIVConfig = 0U;
3973 hcryp->SizesSum += hcryp->Size;
3974 }
3975 else
3976 {
3977
3978
3979
3980 hcryp->KeyIVConfig = 1U;
3981 hcryp->SizesSum = hcryp->Size;
3982 }
3983 }
3984 else
3985 {
3986 hcryp->SizesSum = hcryp->Size;
3987 }
3988
3989 if (DoKeyIVConfig == 1U)
3990 {
3991
3992 hcryp->CrypHeaderCount = 0U;
3993
3994
3995
3996 CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
3997
3998
3999 CRYP_SetKey(hcryp, hcryp->Init.KeySize);
4000
4001
4002 hcryp->Instance->IV0LR = (hcryp->Init.B0[0]) & CRYP_CCM_CTR1_0;
4003 hcryp->Instance->IV0RR = hcryp->Init.B0[1];
4004 hcryp->Instance->IV1LR = hcryp->Init.B0[2];
4005 hcryp->Instance->IV1RR = (hcryp->Init.B0[3] & CRYP_CCM_CTR1_1) | CRYP_CCM_CTR1_2;
4006
4007
4008 __HAL_CRYP_ENABLE(hcryp);
4009
4010
4011 #if !defined (CRYP_VER_2_2)
4012 if (hcryp->Version >= REV_ID_B)
4013 #endif
4014 {
4015
4016 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0);
4017 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 1);
4018 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 2);
4019 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 3);
4020 }
4021 #if !defined (CRYP_VER_2_2)
4022 else
4023 {
4024 if (hcryp->Init.DataType == CRYP_BYTE_SWAP)
4025 {
4026 hcryp->Instance->DIN = __REV(*(uint32_t *)(hcryp->Init.B0));
4027 hcryp->Instance->DIN = __REV(*(uint32_t *)(hcryp->Init.B0 + 1));
4028 hcryp->Instance->DIN = __REV(*(uint32_t *)(hcryp->Init.B0 + 2));
4029 hcryp->Instance->DIN = __REV(*(uint32_t *)(hcryp->Init.B0 + 3));
4030 }
4031 else if (hcryp->Init.DataType == CRYP_HALFWORD_SWAP)
4032 {
4033 hcryp->Instance->DIN = __ROR(*(uint32_t *)(hcryp->Init.B0), 16);
4034 hcryp->Instance->DIN = __ROR(*(uint32_t *)(hcryp->Init.B0 + 1), 16);
4035 hcryp->Instance->DIN = __ROR(*(uint32_t *)(hcryp->Init.B0 + 2), 16);
4036 hcryp->Instance->DIN = __ROR(*(uint32_t *)(hcryp->Init.B0 + 3), 16);
4037 }
4038 else if (hcryp->Init.DataType == CRYP_BIT_SWAP)
4039 {
4040 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(hcryp->Init.B0));
4041 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(hcryp->Init.B0 + 1));
4042 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(hcryp->Init.B0 + 2));
4043 hcryp->Instance->DIN = __RBIT(*(uint32_t *)(hcryp->Init.B0 + 3));
4044 }
4045 else
4046 {
4047 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0);
4048 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 1);
4049 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 2);
4050 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.B0 + 3);
4051 }
4052 }
4053 #endif
4054
4055 count = CRYP_TIMEOUT_GCMCCMINITPHASE;
4056 do
4057 {
4058 count-- ;
4059 if (count == 0U)
4060 {
4061
4062 __HAL_CRYP_DISABLE(hcryp);
4063
4064
4065 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
4066 hcryp->State = HAL_CRYP_STATE_READY;
4067
4068
4069 __HAL_UNLOCK(hcryp);
4070 return HAL_ERROR;
4071 }
4072 }
4073 while ((hcryp->Instance->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN);
4074
4075
4076
4077 if (CRYP_GCMCCM_SetHeaderPhase_DMA(hcryp) != HAL_OK)
4078 {
4079 return HAL_ERROR;
4080 }
4081
4082
4083
4084
4085 hcryp->Phase = CRYP_PHASE_PROCESS;
4086
4087
4088 __HAL_CRYP_DISABLE(hcryp);
4089 #if !defined (CRYP_VER_2_2)
4090 if (hcryp->Version >= REV_ID_B)
4091 #endif
4092 {
4093
4094 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_NPBLB, 0U);
4095 }
4096
4097
4098 CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
4099 }
4100
4101 if (hcryp->Size == 0U)
4102 {
4103
4104 __HAL_UNLOCK(hcryp);
4105
4106
4107 hcryp->State = HAL_CRYP_STATE_READY;
4108 }
4109 else if (hcryp->Size >= 16U)
4110 {
4111
4112
4113
4114 wordsize = wordsize - (wordsize % 4U);
4115
4116
4117 CRYP_SetDMAConfig(hcryp, (uint32_t)(hcryp->pCrypInBuffPtr), (uint16_t) wordsize,
4118 (uint32_t)(hcryp->pCrypOutBuffPtr));
4119 }
4120 else
4121 {
4122
4123 npblb = 16U - (uint32_t)(hcryp->Size);
4124
4125 #if !defined (CRYP_VER_2_2)
4126 if (hcryp->Version >= REV_ID_B)
4127 #endif
4128 {
4129
4130 if ((hcryp->Instance->CR & CRYP_CR_ALGODIR) == CRYP_OPERATINGMODE_DECRYPT)
4131 {
4132
4133 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_NPBLB, npblb << 20);
4134 }
4135 }
4136
4137 __HAL_CRYP_ENABLE(hcryp);
4138
4139
4140 if ((npblb % 4U) == 0U)
4141 {
4142 lastwordsize = (16U - npblb) / 4U;
4143 }
4144 else
4145 {
4146 lastwordsize = ((16U - npblb) / 4U) + 1U;
4147 }
4148
4149
4150 for (index = 0U; index < lastwordsize; index ++)
4151 {
4152 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
4153 hcryp->CrypInCount++;
4154 }
4155
4156
4157 while (index < 4U)
4158 {
4159 hcryp->Instance->DIN = 0U;
4160 index++;
4161 }
4162
4163
4164 count = CRYP_TIMEOUT_GCMCCMHEADERPHASE;
4165 do
4166 {
4167 count-- ;
4168 if (count == 0U)
4169 {
4170
4171 __HAL_CRYP_DISABLE(hcryp);
4172
4173
4174 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
4175 hcryp->State = HAL_CRYP_STATE_READY;
4176
4177
4178 __HAL_UNLOCK(hcryp);
4179 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
4180
4181 hcryp->ErrorCallback(hcryp);
4182 #else
4183
4184 HAL_CRYP_ErrorCallback(hcryp);
4185 #endif
4186 }
4187 }
4188 while (HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_OFNE));
4189
4190
4191 for (index = 0U; index < 4U; index++)
4192 {
4193
4194
4195 temp[index] = hcryp->Instance->DOUT;
4196 }
4197 for (index = 0; index < lastwordsize; index++)
4198 {
4199 *(uint32_t *)(hcryp->pCrypOutBuffPtr + hcryp->CrypOutCount) = temp[index];
4200 hcryp->CrypOutCount++;
4201 }
4202
4203
4204 hcryp->State = HAL_CRYP_STATE_READY;
4205
4206
4207 __HAL_UNLOCK(hcryp);
4208 }
4209
4210
4211 return HAL_OK;
4212 }
4213
4214
4215
4216
4217
4218
4219
4220 static void CRYP_GCMCCM_SetPayloadPhase_IT(CRYP_HandleTypeDef *hcryp)
4221 {
4222 uint32_t loopcounter;
4223 uint32_t temp[4];
4224 uint32_t lastwordsize;
4225 uint32_t npblb;
4226 uint32_t temp_cr_algodir;
4227 uint8_t negative = 0U;
4228 uint32_t i;
4229
4230
4231
4232 if ((hcryp->Size / 4U) < hcryp->CrypInCount)
4233 {
4234 negative = 1U;
4235 }
4236
4237 if (hcryp->Size == 0U)
4238 {
4239
4240 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
4241
4242
4243 __HAL_UNLOCK(hcryp);
4244
4245
4246 hcryp->State = HAL_CRYP_STATE_READY;
4247 }
4248
4249 else if ((((hcryp->Size / 4U) - (hcryp->CrypInCount)) >= 4U) &&
4250 (negative == 0U))
4251 {
4252 if ((hcryp->Instance->IMSCR & CRYP_IMSCR_INIM) != 0x0U)
4253 {
4254
4255 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
4256 hcryp->CrypInCount++;
4257 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
4258 hcryp->CrypInCount++;
4259 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
4260 hcryp->CrypInCount++;
4261 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
4262 hcryp->CrypInCount++;
4263 if (((hcryp->Size / 4U) == hcryp->CrypInCount) && ((hcryp->Size % 16U) == 0U))
4264 {
4265
4266 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI);
4267
4268 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1U)
4269
4270 hcryp->InCpltCallback(hcryp);
4271 #else
4272
4273 HAL_CRYP_InCpltCallback(hcryp);
4274 #endif
4275 }
4276
4277 if (hcryp->CrypOutCount < (hcryp->Size / 4U))
4278 {
4279 if ((hcryp->Instance->SR & CRYP_FLAG_OFNE) != 0x0U)
4280 {
4281
4282
4283 for (i = 0U; i < 4U; i++)
4284 {
4285 temp[i] = hcryp->Instance->DOUT;
4286 }
4287 i = 0U;
4288 while (((hcryp->CrypOutCount < ((hcryp->Size) / 4U))) && (i < 4U))
4289 {
4290 *(uint32_t *)(hcryp->pCrypOutBuffPtr + hcryp->CrypOutCount) = temp[i];
4291 hcryp->CrypOutCount++;
4292 i++;
4293 }
4294 if (((hcryp->Size / 4U) == hcryp->CrypOutCount) && ((hcryp->Size % 16U) == 0U))
4295 {
4296
4297 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI);
4298
4299
4300 hcryp->State = HAL_CRYP_STATE_READY;
4301
4302
4303 __HAL_CRYP_DISABLE(hcryp);
4304
4305
4306 __HAL_UNLOCK(hcryp);
4307
4308
4309 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1U)
4310
4311 hcryp->OutCpltCallback(hcryp);
4312 #else
4313
4314 HAL_CRYP_OutCpltCallback(hcryp);
4315 #endif
4316 }
4317 }
4318 }
4319 }
4320 }
4321 else if ((hcryp->Size % 16U) != 0U)
4322 {
4323
4324 if ((hcryp->Instance->IMSCR & CRYP_IMSCR_INIM) != 0x0U)
4325 {
4326
4327 npblb = ((((uint32_t)hcryp->Size / 16U) + 1U) * 16U) - (uint32_t)(hcryp->Size);
4328
4329 #if !defined (CRYP_VER_2_2)
4330 if (hcryp->Version >= REV_ID_B)
4331 #endif
4332 {
4333
4334 temp_cr_algodir = hcryp->Instance->CR & CRYP_CR_ALGODIR;
4335
4336 if (((temp_cr_algodir == CRYP_OPERATINGMODE_ENCRYPT) && (hcryp->Init.Algorithm == CRYP_AES_GCM)) ||
4337 ((temp_cr_algodir == CRYP_OPERATINGMODE_DECRYPT) && (hcryp->Init.Algorithm == CRYP_AES_CCM)))
4338 {
4339
4340 __HAL_CRYP_DISABLE(hcryp);
4341
4342
4343 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_NPBLB, npblb << 20);
4344
4345
4346 __HAL_CRYP_ENABLE(hcryp);
4347 }
4348 }
4349
4350
4351 if ((npblb % 4U) == 0U)
4352 {
4353 lastwordsize = (16U - npblb) / 4U;
4354 }
4355 else
4356 {
4357 lastwordsize = ((16U - npblb) / 4U) + 1U;
4358 }
4359
4360
4361 for (loopcounter = 0U; loopcounter < lastwordsize; loopcounter++)
4362 {
4363 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
4364 hcryp->CrypInCount++;
4365 }
4366
4367 while (loopcounter < 4U)
4368 {
4369 hcryp->Instance->DIN = 0U;
4370 loopcounter++;
4371 }
4372
4373
4374 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI);
4375 }
4376
4377
4378 if ((hcryp->Instance->SR & CRYP_FLAG_OFNE) != 0x0U)
4379 {
4380 for (i = 0U; i < 4U; i++)
4381 {
4382 temp[i] = hcryp->Instance->DOUT;
4383 }
4384 if (((hcryp->Size) / 4U) == 0U)
4385 {
4386 for (i = 0U; (uint16_t)i < ((hcryp->Size) % 4U); i++)
4387 {
4388 *(uint32_t *)(hcryp->pCrypOutBuffPtr + hcryp->CrypOutCount) = temp[i];
4389 hcryp->CrypOutCount++;
4390 }
4391 }
4392 i = 0U;
4393 while (((hcryp->CrypOutCount < ((hcryp->Size) / 4U))) && (i < 4U))
4394 {
4395 *(uint32_t *)(hcryp->pCrypOutBuffPtr + hcryp->CrypOutCount) = temp[i];
4396 hcryp->CrypOutCount++;
4397 i++;
4398 }
4399 }
4400
4401
4402 if (hcryp->CrypOutCount >= ((hcryp->Size) / 4U))
4403 {
4404
4405 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI | CRYP_IT_INI);
4406
4407
4408 hcryp->State = HAL_CRYP_STATE_READY;
4409
4410
4411 __HAL_UNLOCK(hcryp);
4412
4413
4414 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1U)
4415
4416 hcryp->OutCpltCallback(hcryp);
4417 #else
4418
4419 HAL_CRYP_OutCpltCallback(hcryp);
4420 #endif
4421 }
4422 }
4423 else
4424 {
4425
4426 }
4427 }
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437 static HAL_StatusTypeDef CRYP_GCMCCM_SetHeaderPhase(CRYP_HandleTypeDef *hcryp, uint32_t Timeout)
4438 {
4439 uint32_t loopcounter;
4440 uint32_t size_in_bytes;
4441 uint32_t tmp;
4442 uint32_t mask[4] = {0x0U, 0x0FFU, 0x0FFFFU, 0x0FFFFFFU};
4443
4444
4445
4446
4447 if (hcryp->Init.HeaderWidthUnit == CRYP_HEADERWIDTHUNIT_WORD)
4448 {
4449 size_in_bytes = hcryp->Init.HeaderSize * 4U;
4450 }
4451 else
4452 {
4453 size_in_bytes = hcryp->Init.HeaderSize;
4454 }
4455
4456 if ((size_in_bytes != 0U))
4457 {
4458
4459 CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
4460
4461
4462 __HAL_CRYP_ENABLE(hcryp);
4463
4464
4465 if ((size_in_bytes % 16U) == 0U)
4466 {
4467
4468 for (loopcounter = 0U; (loopcounter < (size_in_bytes / 4U)); loopcounter += 4U)
4469
4470 {
4471 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4472 hcryp->CrypHeaderCount++ ;
4473 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4474 hcryp->CrypHeaderCount++ ;
4475 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4476 hcryp->CrypHeaderCount++ ;
4477 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4478 hcryp->CrypHeaderCount++ ;
4479
4480
4481 if (CRYP_WaitOnIFEMFlag(hcryp, Timeout) != HAL_OK)
4482 {
4483
4484 __HAL_CRYP_DISABLE(hcryp);
4485
4486
4487 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
4488 hcryp->State = HAL_CRYP_STATE_READY;
4489
4490
4491 __HAL_UNLOCK(hcryp);
4492 return HAL_ERROR;
4493 }
4494 }
4495 }
4496 else
4497 {
4498
4499 for (loopcounter = 0U; (loopcounter < ((size_in_bytes / 16U) * 4U)); loopcounter += 4U)
4500 {
4501 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4502 hcryp->CrypHeaderCount++ ;
4503 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4504 hcryp->CrypHeaderCount++ ;
4505 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4506 hcryp->CrypHeaderCount++ ;
4507 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4508 hcryp->CrypHeaderCount++ ;
4509
4510
4511 if (CRYP_WaitOnIFEMFlag(hcryp, Timeout) != HAL_OK)
4512 {
4513
4514 __HAL_CRYP_DISABLE(hcryp);
4515
4516
4517 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
4518 hcryp->State = HAL_CRYP_STATE_READY;
4519
4520
4521 __HAL_UNLOCK(hcryp);
4522 return HAL_ERROR;
4523 }
4524 }
4525
4526 for (loopcounter = 0U; (loopcounter < ((size_in_bytes / 4U) % 4U)); loopcounter++)
4527 {
4528 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4529 hcryp->CrypHeaderCount++ ;
4530 }
4531
4532 if ((size_in_bytes % 4U) == 0U)
4533 {
4534
4535 while (loopcounter < 4U)
4536 {
4537 hcryp->Instance->DIN = 0x0U;
4538 loopcounter++;
4539 }
4540 }
4541 else
4542 {
4543
4544 tmp = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4545 tmp &= mask[size_in_bytes % 4U];
4546 hcryp->Instance->DIN = tmp;
4547 loopcounter++;
4548
4549 while (loopcounter < 4U)
4550 {
4551 hcryp->Instance->DIN = 0x0U;
4552 loopcounter++;
4553 }
4554 }
4555
4556 if (CRYP_WaitOnIFEMFlag(hcryp, Timeout) != HAL_OK)
4557 {
4558
4559 __HAL_CRYP_DISABLE(hcryp);
4560
4561
4562 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
4563 hcryp->State = HAL_CRYP_STATE_READY;
4564
4565
4566 __HAL_UNLOCK(hcryp);
4567 return HAL_ERROR;
4568 }
4569 }
4570
4571 if (CRYP_WaitOnBUSYFlag(hcryp, Timeout) != HAL_OK)
4572 {
4573
4574 __HAL_CRYP_DISABLE(hcryp);
4575
4576
4577 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
4578 hcryp->State = HAL_CRYP_STATE_READY;
4579
4580
4581 __HAL_UNLOCK(hcryp);
4582 return HAL_ERROR;
4583 }
4584 }
4585
4586 return HAL_OK;
4587 }
4588
4589
4590
4591
4592
4593
4594
4595 static HAL_StatusTypeDef CRYP_GCMCCM_SetHeaderPhase_DMA(CRYP_HandleTypeDef *hcryp)
4596 {
4597 __IO uint32_t count = 0U;
4598 uint32_t loopcounter;
4599
4600
4601 if ((hcryp->Init.HeaderSize != 0U))
4602 {
4603
4604 CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
4605
4606
4607 __HAL_CRYP_ENABLE(hcryp);
4608
4609 if ((hcryp->Init.HeaderSize % 4U) == 0U)
4610 {
4611
4612 for (loopcounter = 0U; (loopcounter < hcryp->Init.HeaderSize); loopcounter += 4U)
4613 {
4614 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4615 hcryp->CrypHeaderCount++ ;
4616 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4617 hcryp->CrypHeaderCount++ ;
4618 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4619 hcryp->CrypHeaderCount++ ;
4620 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4621 hcryp->CrypHeaderCount++ ;
4622
4623
4624 count = CRYP_TIMEOUT_GCMCCMHEADERPHASE;
4625 do
4626 {
4627 count-- ;
4628 if (count == 0U)
4629 {
4630
4631 __HAL_CRYP_DISABLE(hcryp);
4632
4633
4634 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
4635 hcryp->State = HAL_CRYP_STATE_READY;
4636
4637
4638 __HAL_UNLOCK(hcryp);
4639 return HAL_ERROR;
4640 }
4641 }
4642 while (HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_IFEM));
4643 }
4644 }
4645 else
4646 {
4647
4648 for (loopcounter = 0U; (loopcounter < ((hcryp->Init.HeaderSize) - (hcryp->Init.HeaderSize % 4U)));
4649 loopcounter += 4U)
4650 {
4651 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4652 hcryp->CrypHeaderCount++ ;
4653 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4654 hcryp->CrypHeaderCount++ ;
4655 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4656 hcryp->CrypHeaderCount++ ;
4657 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4658 hcryp->CrypHeaderCount++ ;
4659
4660
4661 count = CRYP_TIMEOUT_GCMCCMHEADERPHASE;
4662 do
4663 {
4664 count-- ;
4665 if (count == 0U)
4666 {
4667
4668 __HAL_CRYP_DISABLE(hcryp);
4669
4670
4671 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
4672 hcryp->State = HAL_CRYP_STATE_READY;
4673
4674
4675 __HAL_UNLOCK(hcryp);
4676 return HAL_ERROR;
4677 }
4678 }
4679 while (HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_IFEM));
4680 }
4681
4682 for (loopcounter = 0U; (loopcounter < (hcryp->Init.HeaderSize % 4U)); loopcounter++)
4683 {
4684 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4685 hcryp->CrypHeaderCount++ ;
4686 }
4687 while (loopcounter < 4U)
4688 {
4689
4690 hcryp->Instance->DIN = 0x0U;
4691 loopcounter++;
4692 }
4693
4694 count = CRYP_TIMEOUT_GCMCCMHEADERPHASE;
4695 do
4696 {
4697 count-- ;
4698 if (count == 0U)
4699 {
4700
4701 __HAL_CRYP_DISABLE(hcryp);
4702
4703 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
4704 hcryp->State = HAL_CRYP_STATE_READY;
4705
4706 __HAL_UNLOCK(hcryp);
4707 return HAL_ERROR;
4708 }
4709 }
4710 while (HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_IFEM));
4711 }
4712
4713 count = CRYP_TIMEOUT_GCMCCMHEADERPHASE;
4714 do
4715 {
4716 count-- ;
4717 if (count == 0U)
4718 {
4719
4720 __HAL_CRYP_DISABLE(hcryp);
4721
4722 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
4723 hcryp->State = HAL_CRYP_STATE_READY;
4724
4725 __HAL_UNLOCK(hcryp);
4726 return HAL_ERROR;
4727 }
4728 }
4729 while (HAL_IS_BIT_SET(hcryp->Instance->SR, CRYP_FLAG_BUSY));
4730 }
4731
4732
4733 return HAL_OK;
4734 }
4735
4736
4737
4738
4739
4740
4741
4742 static void CRYP_GCMCCM_SetHeaderPhase_IT(CRYP_HandleTypeDef *hcryp)
4743 {
4744 uint32_t loopcounter;
4745
4746
4747
4748 if (hcryp->Init.HeaderSize == hcryp->CrypHeaderCount)
4749 {
4750
4751 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI);
4752
4753
4754 __HAL_CRYP_DISABLE(hcryp);
4755
4756 #if !defined (CRYP_VER_2_2)
4757 if (hcryp->Version >= REV_ID_B)
4758 #endif
4759 {
4760
4761 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_NPBLB, 0U);
4762 }
4763
4764
4765 hcryp->Phase = CRYP_PHASE_PROCESS;
4766
4767
4768 CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
4769
4770
4771 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
4772
4773
4774 __HAL_CRYP_ENABLE(hcryp);
4775 }
4776 else if (((hcryp->Init.HeaderSize) - (hcryp->CrypHeaderCount)) >= 4U)
4777
4778 {
4779
4780 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4781 hcryp->CrypHeaderCount++ ;
4782 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4783 hcryp->CrypHeaderCount++ ;
4784 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4785 hcryp->CrypHeaderCount++ ;
4786 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4787 hcryp->CrypHeaderCount++ ;
4788 }
4789 else
4790 {
4791
4792 for (loopcounter = 0U; loopcounter < (hcryp->Init.HeaderSize % 4U); loopcounter++)
4793 {
4794 hcryp->Instance->DIN = *(uint32_t *)(hcryp->Init.Header + hcryp->CrypHeaderCount);
4795 hcryp->CrypHeaderCount++ ;
4796 }
4797 while (loopcounter < 4U)
4798 {
4799
4800 hcryp->Instance->DIN = 0x0U;
4801 loopcounter++;
4802 }
4803 }
4804 }
4805
4806 #if !defined (CRYP_VER_2_2)
4807
4808
4809
4810
4811
4812
4813
4814 static void CRYP_Workaround(CRYP_HandleTypeDef *hcryp, uint32_t Timeout)
4815 {
4816 uint32_t iv1temp;
4817 uint32_t temp[4] = {0};
4818 uint32_t temp2[4] = {0};
4819 uint32_t intermediate_data[4] = {0};
4820 uint32_t index;
4821 uint32_t lastwordsize;
4822 uint32_t npblb;
4823
4824
4825 npblb = ((((uint32_t)(hcryp->Size) / 16U) + 1U) * 16U) - (uint32_t)(hcryp->Size);
4826
4827
4828 if ((npblb % 4U) == 0U)
4829 {
4830 lastwordsize = (16U - npblb) / 4U;
4831 }
4832 else
4833 {
4834 lastwordsize = ((16U - npblb) / 4U) + 1U;
4835 }
4836
4837
4838 if (hcryp->Init.Algorithm == CRYP_AES_GCM)
4839 {
4840 if ((hcryp->Instance->CR & CRYP_CR_ALGODIR) == CRYP_OPERATINGMODE_ENCRYPT)
4841 {
4842
4843
4844
4845 __HAL_CRYP_DISABLE(hcryp);
4846
4847
4848 hcryp->Instance->IV1RR = ((hcryp->Instance->CSGCMCCM7R) - 1U);
4849 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGOMODE, CRYP_AES_CTR);
4850
4851
4852 __HAL_CRYP_ENABLE(hcryp);
4853 }
4854
4855 for (index = 0; index < lastwordsize ; index ++)
4856 {
4857
4858 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
4859 hcryp->CrypInCount++;
4860 }
4861 while (index < 4U)
4862 {
4863
4864 hcryp->Instance->DIN = 0U;
4865 index++;
4866 }
4867
4868 if (CRYP_WaitOnOFNEFlag(hcryp, Timeout) != HAL_OK)
4869 {
4870
4871 __HAL_CRYP_DISABLE(hcryp);
4872
4873
4874 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
4875 hcryp->State = HAL_CRYP_STATE_READY;
4876
4877
4878 __HAL_UNLOCK(hcryp);
4879 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
4880
4881 hcryp->ErrorCallback(hcryp);
4882 #else
4883
4884 HAL_CRYP_ErrorCallback(hcryp);
4885 #endif
4886 }
4887 if ((hcryp->Instance->SR & CRYP_FLAG_OFNE) != 0x0U)
4888 {
4889 for (index = 0U; index < 4U; index++)
4890 {
4891
4892 intermediate_data[index] = hcryp->Instance->DOUT;
4893
4894
4895 *(uint32_t *)(hcryp->pCrypOutBuffPtr + (hcryp->CrypOutCount)) = intermediate_data[index];
4896 hcryp->CrypOutCount++;
4897 }
4898 }
4899
4900 if ((hcryp->Instance->CR & CRYP_CR_ALGODIR) == CRYP_OPERATINGMODE_ENCRYPT)
4901 {
4902
4903
4904
4905
4906 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGOMODE, CRYP_AES_GCM);
4907
4908
4909 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_GCM_CCMPH, CRYP_PHASE_FINAL);
4910
4911 if ((hcryp->Instance->CR & CRYP_CR_DATATYPE) == CRYP_NO_SWAP)
4912 {
4913 if ((npblb % 4U) == 1U)
4914 {
4915 intermediate_data[lastwordsize - 1U] &= 0xFFFFFF00U;
4916 }
4917 if ((npblb % 4U) == 2U)
4918 {
4919 intermediate_data[lastwordsize - 1U] &= 0xFFFF0000U;
4920 }
4921 if ((npblb % 4U) == 3U)
4922 {
4923 intermediate_data[lastwordsize - 1U] &= 0xFF000000U;
4924 }
4925 }
4926 else if ((hcryp->Instance->CR & CRYP_CR_DATATYPE) == CRYP_BYTE_SWAP)
4927 {
4928 if ((npblb % 4U) == 1U)
4929 {
4930 intermediate_data[lastwordsize - 1U] &= __REV(0xFFFFFF00U);
4931 }
4932 if ((npblb % 4U) == 2U)
4933 {
4934 intermediate_data[lastwordsize - 1U] &= __REV(0xFFFF0000U);
4935 }
4936 if ((npblb % 4U) == 3U)
4937 {
4938 intermediate_data[lastwordsize - 1U] &= __REV(0xFF000000U);
4939 }
4940 }
4941 else if ((hcryp->Instance->CR & CRYP_CR_DATATYPE) == CRYP_HALFWORD_SWAP)
4942 {
4943 if ((npblb % 4U) == 1U)
4944 {
4945 intermediate_data[lastwordsize - 1U] &= __ROR((0xFFFFFF00U), 16);
4946 }
4947 if ((npblb % 4U) == 2U)
4948 {
4949 intermediate_data[lastwordsize - 1U] &= __ROR((0xFFFF0000U), 16);
4950 }
4951 if ((npblb % 4U) == 3U)
4952 {
4953 intermediate_data[lastwordsize - 1U] &= __ROR((0xFF000000U), 16);
4954 }
4955 }
4956 else
4957 {
4958 if ((npblb % 4U) == 1U)
4959 {
4960 intermediate_data[lastwordsize - 1U] &= __RBIT(0xFFFFFF00U);
4961 }
4962 if ((npblb % 4U) == 2U)
4963 {
4964 intermediate_data[lastwordsize - 1U] &= __RBIT(0xFFFF0000U);
4965 }
4966 if ((npblb % 4U) == 3U)
4967 {
4968 intermediate_data[lastwordsize - 1U] &= __RBIT(0xFF000000U);
4969 }
4970 }
4971
4972 for (index = 0U; index < lastwordsize ; index ++)
4973 {
4974
4975 hcryp->Instance->DIN = intermediate_data[index];
4976 }
4977 while (index < 4U)
4978 {
4979
4980 hcryp->Instance->DIN = 0x0U;
4981 index++;
4982 }
4983
4984 if (CRYP_WaitOnOFNEFlag(hcryp, Timeout) != HAL_OK)
4985 {
4986
4987 __HAL_CRYP_DISABLE(hcryp);
4988
4989
4990 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
4991 hcryp->State = HAL_CRYP_STATE_READY;
4992
4993
4994 __HAL_UNLOCK(hcryp);
4995 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1U)
4996
4997 hcryp->ErrorCallback(hcryp);
4998 #else
4999
5000 HAL_CRYP_ErrorCallback(hcryp);
5001 #endif
5002 }
5003
5004 if ((hcryp->Instance->SR & CRYP_FLAG_OFNE) != 0x0U)
5005 {
5006 for (index = 0U; index < 4U; index++)
5007 {
5008 intermediate_data[index] = hcryp->Instance->DOUT;
5009 }
5010 }
5011 }
5012 }
5013 else
5014 {
5015
5016
5017
5018
5019 if ((hcryp->Instance->CR & CRYP_CR_ALGODIR) == CRYP_OPERATINGMODE_DECRYPT)
5020 {
5021 iv1temp = hcryp->Instance->CSGCMCCM7R;
5022
5023
5024 __HAL_CRYP_DISABLE(hcryp);
5025
5026 temp[0] = hcryp->Instance->CSGCMCCM0R;
5027 temp[1] = hcryp->Instance->CSGCMCCM1R;
5028 temp[2] = hcryp->Instance->CSGCMCCM2R;
5029 temp[3] = hcryp->Instance->CSGCMCCM3R;
5030
5031 hcryp->Instance->IV1RR = iv1temp;
5032
5033
5034 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGOMODE, CRYP_AES_CTR);
5035
5036
5037 __HAL_CRYP_ENABLE(hcryp);
5038 }
5039
5040 for (index = 0U; index < lastwordsize; index ++)
5041 {
5042
5043 hcryp->Instance->DIN = *(uint32_t *)(hcryp->pCrypInBuffPtr + hcryp->CrypInCount);
5044 hcryp->CrypInCount++;
5045 }
5046 while (index < 4U)
5047 {
5048
5049 hcryp->Instance->DIN = 0U;
5050 index++;
5051 }
5052
5053 if (CRYP_WaitOnOFNEFlag(hcryp, Timeout) != HAL_OK)
5054 {
5055
5056 __HAL_CRYP_DISABLE(hcryp);
5057
5058
5059 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
5060 hcryp->State = HAL_CRYP_STATE_READY;
5061
5062
5063 __HAL_UNLOCK(hcryp);
5064 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
5065
5066 hcryp->ErrorCallback(hcryp);
5067 #else
5068
5069 HAL_CRYP_ErrorCallback(hcryp);
5070 #endif
5071 }
5072
5073 if ((hcryp->Instance->SR & CRYP_FLAG_OFNE) != 0x0U)
5074 {
5075 for (index = 0U; index < 4U; index++)
5076 {
5077
5078 intermediate_data[index] = hcryp->Instance->DOUT;
5079
5080
5081 *(uint32_t *)(hcryp->pCrypOutBuffPtr + (hcryp->CrypOutCount)) = intermediate_data[index];
5082 hcryp->CrypOutCount++;
5083 }
5084 }
5085
5086 if ((hcryp->Instance->CR & CRYP_CR_ALGODIR) == CRYP_OPERATINGMODE_DECRYPT)
5087 {
5088 temp2[0] = hcryp->Instance->CSGCMCCM0R;
5089 temp2[1] = hcryp->Instance->CSGCMCCM1R;
5090 temp2[2] = hcryp->Instance->CSGCMCCM2R;
5091 temp2[3] = hcryp->Instance->CSGCMCCM3R;
5092
5093
5094 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_ALGOMODE, CRYP_AES_CCM);
5095
5096
5097 MODIFY_REG(hcryp->Instance->CR, CRYP_CR_GCM_CCMPH, CRYP_PHASE_HEADER);
5098
5099
5100 for (index = lastwordsize; index < 4U; index ++)
5101 {
5102 intermediate_data[index] = 0U;
5103 }
5104
5105 if ((npblb % 4U) == 1U)
5106 {
5107 intermediate_data[lastwordsize - 1U] &= 0xFFFFFF00U;
5108 }
5109 if ((npblb % 4U) == 2U)
5110 {
5111 intermediate_data[lastwordsize - 1U] &= 0xFFFF0000U;
5112 }
5113 if ((npblb % 4U) == 3U)
5114 {
5115 intermediate_data[lastwordsize - 1U] &= 0xFF000000U;
5116 }
5117
5118 for (index = 0U; index < 4U ; index ++)
5119 {
5120 intermediate_data[index] ^= temp[index];
5121 intermediate_data[index] ^= temp2[index];
5122 }
5123 for (index = 0U; index < 4U; index ++)
5124 {
5125
5126 hcryp->Instance->DIN = intermediate_data[index] ;
5127 }
5128
5129
5130 if (CRYP_WaitOnBUSYFlag(hcryp, Timeout) != HAL_OK)
5131 {
5132
5133 __HAL_CRYP_DISABLE(hcryp);
5134
5135
5136 hcryp->ErrorCode |= HAL_CRYP_ERROR_TIMEOUT;
5137 hcryp->State = HAL_CRYP_STATE_READY;
5138
5139
5140 __HAL_UNLOCK(hcryp);
5141 #if (USE_HAL_CRYP_REGISTER_CALLBACKS == 1)
5142
5143 hcryp->ErrorCallback(hcryp);
5144 #else
5145
5146 HAL_CRYP_ErrorCallback(hcryp);
5147 #endif
5148 }
5149 }
5150 }
5151
5152
5153 __HAL_UNLOCK(hcryp);
5154 }
5155 #endif
5156
5157
5158
5159
5160
5161
5162
5163
5164 static HAL_StatusTypeDef CRYP_WaitOnIFEMFlag(const CRYP_HandleTypeDef *hcryp, uint32_t Timeout)
5165 {
5166 uint32_t tickstart;
5167
5168
5169 tickstart = HAL_GetTick();
5170
5171 while (HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_IFEM))
5172 {
5173
5174 if (Timeout != HAL_MAX_DELAY)
5175 {
5176 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
5177 {
5178 return HAL_ERROR;
5179 }
5180 }
5181 }
5182 return HAL_OK;
5183 }
5184
5185
5186
5187
5188
5189
5190
5191 static HAL_StatusTypeDef CRYP_WaitOnBUSYFlag(const CRYP_HandleTypeDef *hcryp, uint32_t Timeout)
5192 {
5193 uint32_t tickstart;
5194
5195
5196 tickstart = HAL_GetTick();
5197
5198 while (HAL_IS_BIT_SET(hcryp->Instance->SR, CRYP_FLAG_BUSY))
5199 {
5200
5201 if (Timeout != HAL_MAX_DELAY)
5202 {
5203 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
5204 {
5205 return HAL_ERROR;
5206 }
5207 }
5208 }
5209 return HAL_OK;
5210 }
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220 static HAL_StatusTypeDef CRYP_WaitOnOFNEFlag(const CRYP_HandleTypeDef *hcryp, uint32_t Timeout)
5221 {
5222 uint32_t tickstart;
5223
5224
5225 tickstart = HAL_GetTick();
5226
5227 while (HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_OFNE))
5228 {
5229
5230 if (Timeout != HAL_MAX_DELAY)
5231 {
5232 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
5233 {
5234 return HAL_ERROR;
5235 }
5236 }
5237 }
5238 return HAL_OK;
5239 }
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252 #endif
5253
5254
5255
5256
5257
5258 #endif
5259
5260
5261
5262