unsigned int __fastcall merlin_decrypt_cw(nagra_data *n_data, _BYTE *cw, int a3)
{
int cwpk_cnt; // r3@1
nagra_data *csystem_data; // r4@1
signed int *fd; // r6@2
bool v6; // zf@4
int v7; // r0@4
signed int v8; // r2@6
_BYTE *v9; // r1@12
int v10; // r2@12
int v11; // r3@12
signed int v12; // r2@16
_BYTE *v14; // [sp+1Ch] [bp-24h]@1
int v15; // [sp+24h] [bp-1Ch]@1
cwpk_cnt = n_data->CWPK_cnt;
csystem_data = n_data;
v14 = cw;
v15 = 8;
if ( !cwpk_cnt )
return 0;
fd = &n_data->crypto_dma;
if ( hw_crypto_init(&n_data->crypto_dma, cw, a3, cwpk_cnt) != 1
|| hw_crypto_open((_DWORD *)csystem_data->crypto_dma) != 1 )
{
return 0;
}
v6 = crypt_open(csystem_data->crypto_dma, 2) == 0;
v7 = csystem_data->crypto_dma;
if ( v6 )
goto LABEL_22;
v6 = crypt_open_slot2(v7, 2) == 0;
v7 = csystem_data->crypto_dma;
if ( v6 )
goto LABEL_22;
v6 = crypt_open_slot3(v7, 0) == 0;
v7 = csystem_data->crypto_dma;
if ( v6 )
goto LABEL_22;
v6 = crypt_open_slot4(v7, 1, v8) == 0;
v7 = csystem_data->crypto_dma;
if ( v6 )
goto LABEL_22;
v6 = crypt_open_slot5(v7, 0) == 0;
v7 = csystem_data->crypto_dma;
if ( v6 )
goto LABEL_22;
if ( !crypto_set_key(v7, 4, 0)
|| !hw_crypto_decrypt(
csystem_data->crypto_dma,
(const void *)csystem_data->CWPK_Ptr,
8u,
0xAu,
0xCu,
0,
0,
0,
dword_F12B8) )
{
goto LABEL_28;
}
v6 = hw_crypto_decrypt(
csystem_data->crypto_dma,
(const void *)(csystem_data->CWPK_Ptr + 8),
8u,
0xBu,
0xDu,
0,
0,
0,
dword_F12B8) == 0;
v7 = csystem_data->crypto_dma;
if ( v6 )
goto LABEL_22;
if ( sub_7F014(v7) != 1 )
return 0;
csystem_data->crypto_dma = 0;
if ( hw_crypto_init(fd, v9, v10, v11) != 1 || hw_crypto_open((_DWORD *)csystem_data->crypto_dma) != 1 )
return 0;
v6 = crypt_open(csystem_data->crypto_dma, 3) == 0;
v7 = csystem_data->crypto_dma;
if ( v6
|| (v6 = crypt_open_slot2(v7, 3) == 0, v7 = csystem_data->crypto_dma, v6)
|| (v6 = crypt_open_slot4(v7, 1, v12) == 0, v7 = csystem_data->crypto_dma, v6)
|| (v6 = crypt_open_slot3(v7, 1) == 0, v7 = csystem_data->crypto_dma, v6)
|| (v6 = crypt_open_slot5(v7, 0) == 0, v7 = csystem_data->crypto_dma, v6) )
{
LABEL_22:
sub_7F014(v7);
return 0;
}
if ( !crypto_set_key(v7, 6, 1) )
{
LABEL_28:
v7 = csystem_data->crypto_dma;
goto LABEL_22;
}
v6 = hw_cbc_decrypt(csystem_data->crypto_dma, (int)&v14, (int)&v14, (int)&v15, 1u, 0, 0, 0, dword_F12B8) == 0;
v7 = csystem_data->crypto_dma;
if ( v6 )
goto LABEL_22;
sub_7F520(v7, 5);
sub_7F520(csystem_data->crypto_dma, 6);
return __clz(sub_7F014(csystem_data->crypto_dma) - 1) >> 5;
}