@@ -40,6 +40,12 @@ typedef struct {
40
40
CHAR16 Password [SB_PASSWORD_LEN ];
41
41
} __attribute__ ((packed )) MokDBvar ;
42
42
43
+ typedef struct {
44
+ UINT32 MokTMLState ;
45
+ UINT32 PWLen ;
46
+ CHAR16 Password [SB_PASSWORD_LEN ];
47
+ } __attribute__ ((packed )) MokTMLvar ;
48
+
43
49
typedef struct {
44
50
INT32 Timeout ;
45
51
} __attribute__ ((packed )) MokTimeoutvar ;
@@ -1678,6 +1684,121 @@ static EFI_STATUS mok_db_prompt(void *MokDB, UINTN MokDBSize)
1678
1684
return EFI_SUCCESS ;
1679
1685
}
1680
1686
1687
+ static EFI_STATUS mok_tml_prompt (void * MokTML , UINTN MokTMLSize )
1688
+ {
1689
+ EFI_STATUS efi_status ;
1690
+ SIMPLE_TEXT_OUTPUT_MODE SavedMode ;
1691
+ MokTMLvar * var = MokTML ;
1692
+ CHAR16 * message [4 ];
1693
+ CHAR16 pass1 , pass2 , pass3 ;
1694
+ CHAR16 * str ;
1695
+ UINT8 fail_count = 0 ;
1696
+ UINT8 dbval = 1 ;
1697
+ UINT8 pos1 , pos2 , pos3 ;
1698
+ int ret ;
1699
+ CHAR16 * untrust_tml [] = { L"Do not trust the MOK list" , NULL };
1700
+ CHAR16 * trust_tml [] = { L"Trust the MOK list" , NULL };
1701
+
1702
+ if (MokTMLSize != sizeof (MokTMLvar )) {
1703
+ console_notify (L"Invalid MokTML variable contents" );
1704
+ return EFI_INVALID_PARAMETER ;
1705
+ }
1706
+
1707
+ clear_screen ();
1708
+
1709
+ message [0 ] = L"Change Trusted MOK List Keyring state" ;
1710
+ message [1 ] = NULL ;
1711
+
1712
+ console_save_and_set_mode (& SavedMode );
1713
+ console_print_box_at (message , -1 , 0 , 0 , -1 , -1 , 1 , 1 );
1714
+ console_restore_mode (& SavedMode );
1715
+
1716
+ while (fail_count < 3 ) {
1717
+ RandomBytes (& pos1 , sizeof (pos1 ));
1718
+ pos1 = (pos1 % var -> PWLen );
1719
+
1720
+ do {
1721
+ RandomBytes (& pos2 , sizeof (pos2 ));
1722
+ pos2 = (pos2 % var -> PWLen );
1723
+ } while (pos2 == pos1 );
1724
+
1725
+ do {
1726
+ RandomBytes (& pos3 , sizeof (pos3 ));
1727
+ pos3 = (pos3 % var -> PWLen );
1728
+ } while (pos3 == pos2 || pos3 == pos1 );
1729
+
1730
+ str = PoolPrint (L"Enter password character %d: " , pos1 + 1 );
1731
+ if (!str ) {
1732
+ console_errorbox (L"Failed to allocate buffer" );
1733
+ return EFI_OUT_OF_RESOURCES ;
1734
+ }
1735
+ pass1 = get_password_charater (str );
1736
+ FreePool (str );
1737
+
1738
+ str = PoolPrint (L"Enter password character %d: " , pos2 + 1 );
1739
+ if (!str ) {
1740
+ console_errorbox (L"Failed to allocate buffer" );
1741
+ return EFI_OUT_OF_RESOURCES ;
1742
+ }
1743
+ pass2 = get_password_charater (str );
1744
+ FreePool (str );
1745
+
1746
+ str = PoolPrint (L"Enter password character %d: " , pos3 + 1 );
1747
+ if (!str ) {
1748
+ console_errorbox (L"Failed to allocate buffer" );
1749
+ return EFI_OUT_OF_RESOURCES ;
1750
+ }
1751
+ pass3 = get_password_charater (str );
1752
+ FreePool (str );
1753
+
1754
+ if (pass1 != var -> Password [pos1 ] ||
1755
+ pass2 != var -> Password [pos2 ] ||
1756
+ pass3 != var -> Password [pos3 ]) {
1757
+ console_print (L"Invalid character\n" );
1758
+ fail_count ++ ;
1759
+ } else {
1760
+ break ;
1761
+ }
1762
+ }
1763
+
1764
+ if (fail_count >= 3 ) {
1765
+ console_notify (L"Password limit reached" );
1766
+ return EFI_ACCESS_DENIED ;
1767
+ }
1768
+
1769
+ if (var -> MokTMLState == 0 )
1770
+ ret = console_yes_no (trust_tml );
1771
+ else
1772
+ ret = console_yes_no (untrust_tml );
1773
+
1774
+ if (ret == 0 ) {
1775
+ LibDeleteVariable (L"MokListTrustedNew" , & SHIM_LOCK_GUID );
1776
+ return EFI_ABORTED ;
1777
+ }
1778
+
1779
+ if (var -> MokTMLState == 0 ) {
1780
+ efi_status = RT -> SetVariable (L"MokListTrusted" , & SHIM_LOCK_GUID ,
1781
+ EFI_VARIABLE_NON_VOLATILE |
1782
+ EFI_VARIABLE_BOOTSERVICE_ACCESS ,
1783
+ 1 , & dbval );
1784
+ if (EFI_ERROR (efi_status )) {
1785
+ console_notify (L"Failed to set MokListTrusted state" );
1786
+ return efi_status ;
1787
+ }
1788
+ } else {
1789
+ efi_status = RT -> SetVariable (L"MokListTrusted" , & SHIM_LOCK_GUID ,
1790
+ EFI_VARIABLE_NON_VOLATILE |
1791
+ EFI_VARIABLE_BOOTSERVICE_ACCESS ,
1792
+ 0 , NULL );
1793
+ if (EFI_ERROR (efi_status )) {
1794
+ console_notify (L"Failed to delete MokListTrusted state" );
1795
+ return efi_status ;
1796
+ }
1797
+ }
1798
+
1799
+ return EFI_SUCCESS ;
1800
+ }
1801
+
1681
1802
static EFI_STATUS mok_pw_prompt (void * MokPW , UINTN MokPWSize )
1682
1803
{
1683
1804
EFI_STATUS efi_status ;
@@ -2076,7 +2197,8 @@ typedef enum {
2076
2197
MOK_SET_PW ,
2077
2198
MOK_CHANGE_DB ,
2078
2199
MOK_KEY_ENROLL ,
2079
- MOK_HASH_ENROLL
2200
+ MOK_HASH_ENROLL ,
2201
+ MOK_CHANGE_TML
2080
2202
} mok_menu_item ;
2081
2203
2082
2204
static void free_menu (mok_menu_item * menu_item , CHAR16 * * menu_strings )
@@ -2095,7 +2217,8 @@ static EFI_STATUS enter_mok_menu(EFI_HANDLE image_handle UNUSED,
2095
2217
void * MokPW , UINTN MokPWSize ,
2096
2218
void * MokDB , UINTN MokDBSize ,
2097
2219
void * MokXNew , UINTN MokXNewSize ,
2098
- void * MokXDel , UINTN MokXDelSize )
2220
+ void * MokXDel , UINTN MokXDelSize ,
2221
+ void * MokTML , UINTN MokTMLSize )
2099
2222
{
2100
2223
CHAR16 * * menu_strings = NULL ;
2101
2224
mok_menu_item * menu_item = NULL ;
@@ -2171,6 +2294,9 @@ static EFI_STATUS enter_mok_menu(EFI_HANDLE image_handle UNUSED,
2171
2294
if (MokDB )
2172
2295
menucount ++ ;
2173
2296
2297
+ if (MokTML )
2298
+ menucount ++ ;
2299
+
2174
2300
menu_strings = AllocateZeroPool (sizeof (CHAR16 * ) *
2175
2301
(menucount + 1 ));
2176
2302
if (!menu_strings )
@@ -2242,6 +2368,12 @@ static EFI_STATUS enter_mok_menu(EFI_HANDLE image_handle UNUSED,
2242
2368
i ++ ;
2243
2369
}
2244
2370
2371
+ if (MokTML ) {
2372
+ menu_strings [i ] = L"Change MOK List Trusted State" ;
2373
+ menu_item [i ] = MOK_CHANGE_TML ;
2374
+ i ++ ;
2375
+ }
2376
+
2245
2377
menu_strings [i ] = L"Enroll key from disk" ;
2246
2378
menu_item [i ] = MOK_KEY_ENROLL ;
2247
2379
i ++ ;
@@ -2352,6 +2484,17 @@ static EFI_STATUS enter_mok_menu(EFI_HANDLE image_handle UNUSED,
2352
2484
case MOK_HASH_ENROLL :
2353
2485
efi_status = mok_hash_enroll ();
2354
2486
break ;
2487
+ case MOK_CHANGE_TML :
2488
+ if (!MokTML ) {
2489
+ console_print (L"MokManager: internal error: %s" ,
2490
+ L"MokListTrusted was ! NULL bs is now NULL\n" );
2491
+ ret = EFI_ABORTED ;
2492
+ goto out ;
2493
+ }
2494
+ efi_status = mok_tml_prompt (MokTML , MokTMLSize );
2495
+ if (!EFI_ERROR (efi_status ))
2496
+ MokTML = NULL ;
2497
+ break ;
2355
2498
}
2356
2499
2357
2500
if (!EFI_ERROR (efi_status ))
@@ -2376,14 +2519,15 @@ static EFI_STATUS enter_mok_menu(EFI_HANDLE image_handle UNUSED,
2376
2519
static EFI_STATUS check_mok_request (EFI_HANDLE image_handle )
2377
2520
{
2378
2521
UINTN MokNewSize = 0 , MokDelSize = 0 , MokSBSize = 0 , MokPWSize = 0 ;
2379
- UINTN MokDBSize = 0 , MokXNewSize = 0 , MokXDelSize = 0 ;
2522
+ UINTN MokDBSize = 0 , MokXNewSize = 0 , MokXDelSize = 0 , MokTMLSize = 0 ;
2380
2523
void * MokNew = NULL ;
2381
2524
void * MokDel = NULL ;
2382
2525
void * MokSB = NULL ;
2383
2526
void * MokPW = NULL ;
2384
2527
void * MokDB = NULL ;
2385
2528
void * MokXNew = NULL ;
2386
2529
void * MokXDel = NULL ;
2530
+ void * MokTML = NULL ;
2387
2531
EFI_STATUS efi_status ;
2388
2532
2389
2533
efi_status = get_variable (L"MokNew" , (UINT8 * * ) & MokNew , & MokNewSize ,
@@ -2436,6 +2580,18 @@ static EFI_STATUS check_mok_request(EFI_HANDLE image_handle)
2436
2580
console_error (L"Could not retrieve MokDB" , efi_status );
2437
2581
}
2438
2582
2583
+ efi_status = get_variable (L"MokListTrustedNew" , (UINT8 * * ) & MokTML ,
2584
+ & MokTMLSize , SHIM_LOCK_GUID );
2585
+ if (!EFI_ERROR (efi_status )) {
2586
+ efi_status = LibDeleteVariable (L"MokListTrustedNew" ,
2587
+ & SHIM_LOCK_GUID );
2588
+ if (EFI_ERROR (efi_status ))
2589
+ console_notify (L"Failed to delete MokListTrustedNew" );
2590
+ } else if (EFI_ERROR (efi_status ) && efi_status != EFI_NOT_FOUND ) {
2591
+ console_error (L"Could not retrieve MokListTrustedNew" ,
2592
+ efi_status );
2593
+ }
2594
+
2439
2595
efi_status = get_variable (L"MokXNew" , (UINT8 * * ) & MokXNew ,
2440
2596
& MokXNewSize , SHIM_LOCK_GUID );
2441
2597
if (!EFI_ERROR (efi_status )) {
@@ -2458,7 +2614,7 @@ static EFI_STATUS check_mok_request(EFI_HANDLE image_handle)
2458
2614
2459
2615
enter_mok_menu (image_handle , MokNew , MokNewSize , MokDel , MokDelSize ,
2460
2616
MokSB , MokSBSize , MokPW , MokPWSize , MokDB , MokDBSize ,
2461
- MokXNew , MokXNewSize , MokXDel , MokXDelSize );
2617
+ MokXNew , MokXNewSize , MokXDel , MokXDelSize , MokTML , MokTMLSize );
2462
2618
2463
2619
if (MokNew )
2464
2620
FreePool (MokNew );
@@ -2481,6 +2637,9 @@ static EFI_STATUS check_mok_request(EFI_HANDLE image_handle)
2481
2637
if (MokXDel )
2482
2638
FreePool (MokXDel );
2483
2639
2640
+ if (MokTML )
2641
+ FreePool (MokTML );
2642
+
2484
2643
LibDeleteVariable (L"MokAuth" , & SHIM_LOCK_GUID );
2485
2644
LibDeleteVariable (L"MokDelAuth" , & SHIM_LOCK_GUID );
2486
2645
LibDeleteVariable (L"MokXAuth" , & SHIM_LOCK_GUID );
0 commit comments