1
|
{"start": "void __fastcall __noreturn start(int a0, int a1) { int v2; int v3; int v4; char v5; _DWORD *v6; *(_DWORD *)(9 * v2) = 8 * v2; v6 = (_DWORD *)(8 * v2); *(_WORD *)((char *)v6 + a1) = v2; *v6 = v6; *v6 = v6; while ( 1 ) { v2 <<= 11; *(_BYTE *)(v2 + 1) = v5; *(_DWORD *)(v4 + 84) = v2; *(_DWORD *)(v2 + 84) = v2; v4 = *(_DWORD *)(v4 + 20); *(_DWORD *)(v2 + 84) = 8 * v3; __breakpoint(105); } }", "fmt_conversion_dispatch": "int __fastcall fmt_conversion_dispatch(__int64 a0, int *a1, int a2) { int v3; switch ( HIDWORD(a0) ) { case 'i': case 'd': case 'u': return fmt_emit_signed((int *)a0, SHIDWORD(a0), a1); case 'o': return fmt_emit_unsigned((int *)a0, 111, a1); case 'x': return fmt_emit_hex((int *)a0, 120, a1); default: break; } v3 = *(_DWORD *)a0 >> 7; if ( (*(_DWORD *)a0 & 0x40) != 0 ) HIDWORD(a0) |= 0x80u; if ( HIDWORD(a0) == 99 ) { *(_BYTE *)(a0 + 36) = *(_BYTE *)a1; *(_BYTE *)(a0 + 37) = 0; return fmt_out_string(a0, (unsigned __int8 *)(a0 + 36), 1u); } else if ( HIDWORD(a0) == 227 ) { HIDWORD(a0) = a0 + 36; *(_WORD *)(a0 + 36) = *(_WORD *)a1; *(_WORD *)(a0 + 38) = 0; return fmt_out_char(a0, 1, v3); } else { return 0; } }", "udivmod64": "int __fastcall udivmod64(unsigned __int64 a0, unsigned int a1, unsigned int a2, int a3) { unsigned __int64 v4; bool v5; bool v6; unsigned int v7; int v8; unsigned int v9; bool v10; unsigned int v11; unsigned int v12; bool v13; unsigned int v14; char v15; unsigned __int64 v16; unsigned int v17; unsigned int v18; unsigned __int64 v19; unsigned int v20; unsigned int v21; unsigned __int64 v22; unsigned int v23; __int64 v24; __int64 v25; unsigned __int64 v26; char v27; unsigned int v28; unsigned int v29; unsigned int v30; __int64 v31; unsigned int v32; bool v33; __int64 v34; __int64 v35; unsigned int v36; unsigned int v37; __int64 v38; __int64 v39; unsigned int v40; unsigned int v41; int v42; unsigned __int64 v43; bool v44; unsigned int v45; unsigned __int64 v46; bool v47; __int64 v48; unsigned int v49; unsigned int v50; unsigned int i; v4 = a0; v5 = a2 == 0; v6 = (a2 & 0x80000000) != 0; if ( a2 != 0 ) v7 = a2; else v7 = a1; v8 = __clz(v7); v9 = v7 << (v8 + 1); if ( a2 != 0 ) { v8 = 63 - v8; v5 = v8 == 0; v6 = v8 < 0; } if ( v5 ) { v8 = 31 - v8; v6 = v8 < 0; } if ( v6 ) { LODWORD(v48) = 0; } else { v10 = HIDWORD(a0) == 0; if ( HIDWORD(a0) != 0 ) { v11 = 63 - __clz(HIDWORD(a0)); v10 = v11 == 0; } else { v11 = __clz(a0); } if ( v10 ) v11 = 31 - v11; v12 = v11 - v8; if ( (int)(v11 - v8) < 0 ) { LODWORD(v48) = 0; } else if ( (int)(4 - v12) < 0 ) { if ( v8 - 32 <= 4 ) v9 |= a1 >> (v8 - 32); v13 = (unsigned int)v8 > 0x1F; v14 = *((_DWORD *)&SYM + (v9 >> 28)); if ( (unsigned int)v8 > 0x1F ) LOBYTE(v8) = v8 - 32; v15 = 32 - v8; if ( v13 ) { LODWORD(v34) = 0; HIDWORD(v34) = v14 * a1; v35 = v14 * (unsigned __int64)a2 + v34; v36 = -((HIDWORD(v35) << v15) | ((unsigned int)v35 >> v8)); if ( (_DWORD)v35 << (32 - v8) != 0 ) --v36; v37 = v14 + ((v14 * (unsigned __int64)v36) >> 32); LODWORD(v38) = 0; HIDWORD(v38) = v37 * a1; v39 = v37 * (unsigned __int64)a2 + v38; v40 = -((HIDWORD(v39) << (32 - v8)) | ((unsigned int)v39 >> v8)); if ( (_DWORD)v39 << (32 - v8) != 0 ) --v40; v41 = v37 + ((v37 * (unsigned __int64)v40) >> 32) - 1; v42 = 0; HIDWORD(v48) = v41 * v4; LODWORD(v48) = (unsigned int)((v41 * (unsigned __int64)HIDWORD(v4) + v48) >> 32) >> v8; v43 = v4 - __PAIR64__(a2, a1) * (unsigned int)v48; v44 = HIDWORD(v43) >= a2; if ( HIDWORD(v43) == a2 ) v44 = (unsigned int)v43 >= a1; if ( v44 ) { v45 = (unsigned int)((v41 * (unsigned __int64)HIDWORD(v43) + ((v41 * (unsigned __int64)(unsigned int)v43) >> 32)) >> 32) >> v8; LODWORD(v48) = v48 + v45; v46 = v43 - __PAIR64__(a2, a1) * v45; v47 = HIDWORD(v46) >= a2; if ( HIDWORD(v46) == a2 ) v47 = (unsigned int)v46 >= a1; if ( v47 ) LODWORD(v48) = v48 + 1; } } else { v16 = v14 * (unsigned __int64)a1; v17 = -((HIDWORD(v16) << v15) | ((unsigned int)v16 >> v8)); if ( (_DWORD)v16 << v15 != 0 ) --v17; v18 = v14 + ((v14 * (unsigned __int64)v17) >> 32); v19 = v18 * (unsigned __int64)a1; v20 = -((HIDWORD(v19) << v15) | ((unsigned int)v19 >> v8)); if ( (_DWORD)v19 << v15 != 0 ) --v20; v21 = v18 + ((v18 * (unsigned __int64)v20) >> 32); if ( HIDWORD(v4) != 0 ) { v22 = v21 * (unsigned __int64)a1; v23 = -((HIDWORD(v22) << v15) | ((unsigned int)v22 >> v8)); if ( (_DWORD)v22 << v15 != 0 ) --v23; v21 += (v21 * (unsigned __int64)v23) >> 32; } LODWORD(v24) = 0; HIDWORD(v24) = v21 * v4; v25 = v21 * (unsigned __int64)HIDWORD(v4) + v24; LODWORD(v48) = ((unsigned int)v25 >> v8) | (HIDWORD(v25) << v15); HIDWORD(v48) = HIDWORD(v25) >> v8; v26 = v4 - v48 * a1; v27 = HIDWORD(v26) != 0; if ( HIDWORD(v26) == 0 ) v27 = (unsigned int)v26 >= a1; if ( v27 ) { v28 = (v21 * (unsigned __int64)HIDWORD(v26) + ((v21 * (unsigned __int64)(unsigned int)v26) >> 32)) >> 32; v29 = ((unsigned int)((v26 * v21) >> 32) >> v8) | (v28 << (32 - v8)); v48 += __PAIR64__(v28 >> v8, v29); v30 = v26 - v29 * a1; if ( v30 >= a1 ) { v31 = v48 + 1; v32 = v30 - a1; v33 = v32 >= a1; if ( v32 >= a1 ) v32 -= a1; return v31 + v33 + (v32 >= a1); } } } } else { LODWORD(v48) = 0; v49 = a1 >> (32 - v12); v50 = a1 << v12; for ( i = (a2 << v12) | v49; ; i >>= 1 ) { LODWORD(v48) = v48 + (v4 >= __PAIR64__(i, v50)) + (_DWORD)v48; if ( v4 >= __PAIR64__(i, v50) ) v4 -= __PAIR64__(i, v50); v27 = v12-- != 0; if ( !v27 ) break; v27 = i & 1; v50 = (v50 >> 1) | (v27 << 31); } } } return v48; }", "shl_saturating": "int __fastcall shl_saturating(int a0, int a1, int a2) { if ( a2 - 32 >= 0 ) return 0; else return a0 << a2; }", "vsnprintf": "int vsnprintf(_BYTE *a0, int a1, ...) { _BYTE *var8[3]; int varg_r2; _BYTE *varg_r3; va_list va1; va_list va; va_start(va1, a1); va_start(va, a1); varg_r2 = va_arg(va1, _DWORD); varg_r3 = va_arg(va1, _BYTE *); var8[1] = varg_r3; var8[0] = a0; snprintf(a1, (int)var8, (int *)va, (int)SYM + 14685084); return fmt_put_char(0, var8); }", "snprintf_varargs": "int snprintf_varargs(_BYTE *a0, int a1, int a2, ...) { int result; _BYTE *v3; _BYTE *v4; int varg_r2; _BYTE *varg_r3; va_list va1; va_list va; va_start(va1, a2); va_start(va, a2); varg_r3 = va_arg(va1, _BYTE *); varg_r2 = a2; v4 = varg_r3; v3 = a0; if ( a1 != 0 ) a0 = &a0[a1 - 1]; v4 = a0; result = snprintf(varg_r2, (int)&v3, (int *)va, (int)SYM + 14685134); if ( a1 != 0 ) return fmt_put_char(0, &v3); return result; }", "fmt_emit_repeat": "int __fastcall fmt_emit_repeat(int *a0) { int v1; int v2; int v3; int result; v1 = a0[6]; v2 = *a0; if ( (v2 & 0x10) != 0 ) v3 = 48; else v3 = 32; result = v2 << 31; if ( result == 0 ) { while ( --v1 >= 0 ) { ((void (__fastcall *)(int, int))a0[1])(v3, a0[2]); result = a0[8] + 1; a0[8] = result; } } return result; }", "fmt_pad_zeros": "int __fastcall fmt_pad_zeros(unsigned __int8 *a0) { int v1; int result; v1 = *((_DWORD *)a0 + 6); result = *a0 << 31; if ( result != 0 ) { while ( --v1 >= 0 ) { (*((void (__fastcall **)(int, _DWORD))a0 + 1))(32, *((_DWORD *)a0 + 2)); result = *((_DWORD *)a0 + 8) + 1; *((_DWORD *)a0 + 8) = result; } } return result; }", "fmt_truncate_signed": "int __fastcall fmt_truncate_signed(int result, int *a0) { int v1; v1 = *a0; if ( (v1 & 0x400) != 0 ) return (char)result; if ( (v1 & 0x100) != 0 ) return (__int16)result; return result; }", "fmt_truncate_by_width": "int __fastcall fmt_truncate_by_width(int result, int *a0) { int v1; v1 = *a0; if ( (v1 & 0x400) != 0 ) return (unsigned __int8)result; if ( (v1 & 0x100) != 0 ) return (unsigned __int16)result; return result; }", "fmt_emit_bytes": "int __fastcall fmt_emit_bytes(int a0, unsigned __int8 *a1, unsigned int a2) { unsigned __int8 *v3; unsigned int i; unsigned __int8 *v4; int v5; v3 = a1; if ( a2 == 1 ) { i = 1; } else { if ( (*(_BYTE *)a0 & 0x20) != 0 ) a2 = *(_DWORD *)(a0 + 28); for ( i = 0; i < a2 && a1[i] != 0; ++i ) ; } v4 = &a1[i]; *(_DWORD *)(a0 + 24) -= i; *(_DWORD *)(a0 + 32) += i; fmt_emit_repeat((int *)a0); while ( v3 < v4 ) { v5 = *v3++; (*(void (__fastcall **)(int, _DWORD))(a0 + 4))(v5, *(_DWORD *)(a0 + 8)); } return fmt_pad_zeros((unsigned __int8 *)a0); }", "fmt_emit_signed": "int __fastcall fmt_emit_signed(int *a0, int a1, int *a2) { int v3; int v4; int *v5; int v6; int v7; char v8; v3 = 0; v4 = *a2; v5 = &SYM; if ( a1 == 117 ) { v6 = fmt_truncate_by_width(v4, a0); goto LABEL_10; } v6 = fmt_truncate_signed(v4, a0); if ( v6 < 0 ) { v6 = -v6; v5 = &SYM; LABEL_8: v3 = 1; goto LABEL_10; } if ( (*a0 & 2) != 0 ) { v5 = &SYM; goto LABEL_8; } if ( (*a0 & 4) != 0 ) { v5 = &SYM; goto LABEL_8; } LABEL_10: v7 = 0; while ( v6 != 0 ) { v6 = div_by_10(v6); *((_BYTE *)a0 + v7++ + 36) = v8 + 48; } return fmt_emit_padded((int)a0, v7, (int)v5, v3); }", "fmt_emit_u64": "__int64 __fastcall fmt_emit_u64(__int64 a0, int a1, int a2) { int v3; int v4; __int64 *v5; int v6; int v7; int v8; int i; unsigned int v9; unsigned int j; int v10; __int64 v11; _DWORD v12[2]; v11 = a0; v12[0] = a1; v12[1] = a2; v3 = HIDWORD(a0); v4 = a0; v5 = (__int64 *)((char *)SYM + 14685490); v6 = 0; v7 = 0; v11 = *(_QWORD *)((char *)SYM + 14685490); while ( ((*(_BYTE *)v4 & 0x20) == 0 || *(_DWORD *)(v4 + 28) > v6) && (v7 < a1 || *(_WORD *)(v3 + 2 * v7) != 0) ) { v8 = vsnprintf_dispatch(v12, *(unsigned __int16 *)(v3 + 2 * v7), (int)&v11); if ( v8 != -1 ) { if ( (*(_BYTE *)v4 & 0x20) != 0 && (unsigned int)(v6 + v8) > *(_DWORD *)(v4 + 28) ) break; v6 += v8; } ++v7; } *(_DWORD *)(v4 + 24) -= v6; fmt_emit_repeat((int *)v4); v11 = *v5; for ( i = 0; ; i = v10 + 1 ) { v10 = i; if ( i >= v7 ) break; v9 = vsnprintf_dispatch(v12, *(unsigned __int16 *)(v3 + 2 * i), (int)&v11); if ( v9 != -1 ) { for ( j = 0; j < v9; ++j ) (*(void (__fastcall **)(_DWORD, _DWORD))(v4 + 4))(*((unsigned __int8 *)v12 + j), *(_DWORD *)(v4 + 8)); } } *(_DWORD *)(v4 + 32) += v6; fmt_pad_zeros((unsigned __int8 *)v4); return v11; }", "fmt_emit_unsigned": "int __fastcall fmt_emit_unsigned(int *a0, int a1, int *a2) { unsigned int v3; int v4; char v5; int v6; int *v7; v3 = fmt_truncate_by_width(*a2, a0); v4 = 0; while ( v3 != 0 ) { v5 = (v3 & 7) + 48; v3 >>= 3; *((_BYTE *)a0 + v4++ + 36) = v5; } v6 = 0; v7 = &SYM; if ( (*a0 & 8) != 0 && ((*a0 & 0x20) != 0 || v4 != 0) ) { v6 = 1; v7 = &SYM; --a0[7]; } return fmt_emit_padded((int)a0, v4, (int)v7, v6); }", "fmt_emit_hex": "int __fastcall fmt_emit_hex(int *a0, int a1, int *a2) { unsigned int v3; char *v4; int v5; int v6; int v7; v3 = fmt_truncate_by_width(*a2, a0); if ( (*(_WORD *)a0 & 0x800) != 0 ) v4 = SYM + 14685766; else v4 = SYM + 14685786; v5 = 0; while ( v3 != 0 ) { v6 = v3 & 0xF; v3 >>= 4; *((_BYTE *)a0 + v5++ + 36) = v4[v6]; } v7 = 0; if ( (*(_BYTE *)a0 & 8) != 0 && a1 != 112 && v5 != 0 ) { v7 = 2; v4 += 17; } return fmt_emit_padded((int)a0, v5, (int)v4, v7); }", "vfprintf_engine": "int __fastcall vfprintf_engine(int a0, int *a1) { __int64 v2; int *v3; int v4; int i; int v5; int v6; int v7; int v8; int v9; int v10; int v11; int v12; int v13; int v14; LODWORD(v2) = a0; v3 = &(*SYM)[3671462]; *(_DWORD *)(a0 + 32) = 0; while ( 2 ) { v4 = (*(int (__fastcall **)(_DWORD))(v2 + 12))(v2); if ( v4 == 0 ) return *(_DWORD *)(v2 + 32); if ( v4 != 37 ) goto LABEL_4; for ( i = 0; ; i |= *((unsigned __int8 *)v3 + v5 - 32) ) { v5 = (*(int (__fastcall **)(_DWORD))(v2 + 12))(v2); HIDWORD(v2) = v5; if ( v5 < 32 || (unsigned int)v5 >= 0x31 || *((_BYTE *)v3 + v5 - 32) == 0 ) break; } if ( (i & 2) != 0 ) i &= ~4u; *(_DWORD *)(v2 + 28) = 0; v6 = 0; *(_DWORD *)(v2 + 24) = 0; while ( HIDWORD(v2) != 42 ) { if ( is_digit_ascii(SHIDWORD(v2)) ) { v8 = v2 + 4 * v6; for ( *(_DWORD *)(v8 + 24) = HIDWORD(v2) - 48; ; *(_DWORD *)(v8 + 24) = HIDWORD(v2) + 10 * *(_DWORD *)(v8 + 24) - 48 ) { HIDWORD(v2) = (*(int (__fastcall **)(_DWORD))(v2 + 12))(v2); if ( !is_digit_ascii(SHIDWORD(v2)) ) break; } } if ( v6 == 1 ) goto LABEL_24; LABEL_22: if ( HIDWORD(v2) == 46 ) { ++v6; HIDWORD(v2) = (*(int (__fastcall **)(_DWORD))(v2 + 12))(v2); i |= 0x20u; if ( v6 < 2 ) continue; } goto LABEL_24; } v9 = *a1++; *(_DWORD *)(v2 + 4 * v6 + 24) = v9; HIDWORD(v2) = (*(int (__fastcall **)(_DWORD))(v2 + 12))(v2); if ( v6 != 1 ) goto LABEL_22; if ( *(int *)(v2 + 28) < 0 ) i &= ~0x20u; LABEL_24: v10 = *(_DWORD *)(v2 + 24); if ( v10 < 0 ) { i |= 1u; *(_DWORD *)(v2 + 24) = -v10; } if ( i << 31 != 0 ) i &= ~0x10u; if ( HIDWORD(v2) != 108 && HIDWORD(v2) != 104 ) { if ( HIDWORD(v2) == 76 ) goto LABEL_51; if ( HIDWORD(v2) != 106 ) { if ( HIDWORD(v2) != 116 && HIDWORD(v2) != 122 ) goto LABEL_43; LABEL_51: v12 = 0; LABEL_39: i |= v12; HIDWORD(v2) = (*(int (__fastcall **)(_DWORD))(v2 + 12))(v2); goto LABEL_43; } goto LABEL_50; } v11 = HIDWORD(v2); HIDWORD(v2) = (*(int (__fastcall **)(_DWORD))(v2 + 12))(v2); if ( HIDWORD(v2) == v11 ) { if ( v11 != 108 ) { v12 = 1024; goto LABEL_39; } LABEL_50: v12 = 128; goto LABEL_39; } if ( v11 == 108 ) v13 = 64; else v13 = 256; i |= v13; LABEL_43: if ( HIDWORD(v2) != 0 ) { if ( (unsigned int)(HIDWORD(v2) - 65) <= 0x19 ) { HIDWORD(v2) += 32; i |= 0x800u; } *(_DWORD *)v2 = i; v14 = fmt_conversion_dispatch(v2, a1, v7); if ( v14 != 0 ) { if ( v14 == 1 ) ++a1; else a1 = (int *)((((unsigned int)a1 + 7) & 0xFFFFFFF8) + 8); continue; } LABEL_4: (*(void (**)(void))(v2 + 4))(); ++*(_DWORD *)(v2 + 32); continue; } return *(_DWORD *)(v2 + 32); } }", "memcmp_be": "int __fastcall memcmp_be(const void *a, const void *b, unsigned int n) { unsigned int v0; unsigned int v1; int v2; int v3; int v4; int v5; int v6; int v7; int v8; if ( ((unsigned int)a | (unsigned int)b) << 30 == 0 ) { while ( n >= 4 ) { v0 = *(_DWORD *)a; a = (char *)a + 4; v1 = *(_DWORD *)b; b = (char *)b + 4; n -= 4; if ( v0 != v1 ) { if ( bswap32(v0) <= bswap32(v1) ) return -1; else return 1; } } } if ( n == 0 ) return 0; if ( n << 31 == 0 ) goto LABEL_11; ++n; do { v7 = *(unsigned __int8 *)a; a = (char *)a + 1; v6 = v7; v8 = *(unsigned __int8 *)b; b = (char *)b + 1; v5 = v6 - v8; if ( v5 != 0 ) break; n -= 2; if ( n == 0 ) break; LABEL_11: v3 = *(unsigned __int8 *)a; a = (char *)a + 1; v2 = v3; v4 = *(unsigned __int8 *)b; b = (char *)b + 1; v5 = v2 - v4; } while ( v5 == 0 ); return v5; }", "strlen": "char *__fastcall strlen(char *a0) { char *v1; int v2; char *result; v1 = a0 + 1; while ( (_DWORD)a0 << 30 != 0 ) { v2 = (unsigned __int8)*a0++; if ( v2 == 0 ) return (char *)(a0 - v1); } _R3 = 16843009; do { _R1 = *(_DWORD *)a0; a0 += 4; __asm { UQSUB8.W R1, R3, R1 } } while ( _R1 == 0 ); result = (char *)(a0 - v1); if ( _R1 << 24 != 0 ) { result -= 3; } else if ( _R1 << 16 != 0 ) { result -= 2; } else if ( _R1 << 8 != 0 ) { --result; } return result; }", "memcpy_thunk": "void __fastcall memcpy_thunk(int a0) { JUMPOUT(ADDR); }", "j_memcpy": "int *__fastcall j_memcpy(int *result, int *a0, unsigned int a1) { return (int *)memcpy(result, a0, a1); }", "memcpy": "void *__fastcall memcpy(void *dst, const void *src, unsigned int n) { int v0; unsigned int i; int *v1; int v2; int v3; int v4; int v5; _DWORD *v6; int v7; int v8; int v9; int v10; int v11; int v12; int v13; int v14; bool v15; bool v16; int v17; __int16 v18; v15 = n >= 0x20; for ( i = n - 32; v15; dst = v6 + 4 ) { v2 = *(_DWORD *)src; v3 = *((_DWORD *)src + 1); v4 = *((_DWORD *)src + 2); v5 = *((_DWORD *)src + 3); v1 = (int *)((char *)src + 16); v15 = i >= 0x20; i -= 32; *(_DWORD *)dst = v2; *((_DWORD *)dst + 1) = v3; *((_DWORD *)dst + 2) = v4; *((_DWORD *)dst + 3) = v5; v6 = (char *)dst + 16; v0 = *v1; v7 = v1[1]; v8 = v1[2]; v9 = v1[3]; src = v1 + 4; *v6 = v0; v6[1] = v7; v6[2] = v8; v6[3] = v9; } if ( __CFSHL__(i, 28) ) { v0 = *(_DWORD *)src; v10 = *((_DWORD *)src + 1); v11 = *((_DWORD *)src + 2); v12 = *((_DWORD *)src + 3); src = (char *)src + 16; *(_DWORD *)dst = v0; *((_DWORD *)dst + 1) = v10; *((_DWORD *)dst + 2) = v11; *((_DWORD *)dst + 3) = v12; dst = (char *)dst + 16; } if ( (i & 8) != 0 ) { v0 = *(_DWORD *)src; v13 = *((_DWORD *)src + 1); src = (char *)src + 8; *(_DWORD *)dst = v0; *((_DWORD *)dst + 1) = v13; dst = (char *)dst + 8; } if ( __CFSHL__(i, 30) ) { v14 = *(_DWORD *)src; src = (char *)src + 4; LOWORD(v0) = v14; *(_DWORD *)dst = v14; dst = (char *)dst + 4; } if ( i << 30 != 0 ) { v15 = __CFSHL__(i, 31); v17 = i << 31; v16 = v17 < 0; if ( v15 ) { v18 = *(_WORD *)src; src = (char *)src + 2; LOWORD(v0) = v18; } if ( v17 < 0 ) LOBYTE(v17) = *(_BYTE *)src; if ( v15 ) { *(_WORD *)dst = v0; dst = (char *)dst + 2; } if ( v16 ) { *(_BYTE *)dst = v17; return (char *)dst + 1; } } return dst; }", "bzero_thunk": "void __fastcall bzero_thunk(int a0, int a1, int a2) { JUMPOUT(ADDR); }", "bzero": "void *__fastcall bzero(void *dst, unsigned int n) { int v0; char *v1; if ( n >= 4 ) { if ( ((unsigned __int8)dst & 3) != 0 ) { v0 = 4 - ((unsigned __int8)dst & 3); if ( v0 != 2 ) { *(_BYTE *)dst = 0; dst = (char *)dst + 1; } if ( v0 >= 2 ) *(_WORD *)dst = 0; } JUMPOUT(ADDR); } if ( __CFSHL__(n, 31) ) { *(_BYTE *)dst = 0; v1 = (char *)dst + 1; *v1 = 0; dst = v1 + 1; } if ( (n & 1) != 0 ) { *(_BYTE *)dst = 0; return (char *)dst + 1; } return dst; }", "bzero_core": "void *__fastcall bzero_core(void *dst, unsigned int n) { bool v0; unsigned int v1; _DWORD *v2; int v3; int v4; v0 = n >= 0x20; v1 = n - 32; do { if ( !v0 ) break; *(_DWORD *)dst = 0; *((_DWORD *)dst + 1) = 0; *((_DWORD *)dst + 2) = 0; *((_DWORD *)dst + 3) = 0; v2 = (char *)dst + 16; *v2 = 0; v2[1] = 0; v2[2] = 0; v2[3] = 0; dst = v2 + 4; v0 = v1 >= 0x20; v1 -= 32; } while ( v0 ); v0 = __CFSHL__(v1, 28); v3 = v1 << 28; if ( v0 ) { *(_DWORD *)dst = 0; *((_DWORD *)dst + 1) = 0; *((_DWORD *)dst + 2) = 0; *((_DWORD *)dst + 3) = 0; dst = (char *)dst + 16; } if ( v3 < 0 ) { *(_DWORD *)dst = 0; *((_DWORD *)dst + 1) = 0; dst = (char *)dst + 8; } v0 = __CFSHL__(v3, 2); v4 = 4 * v3; if ( v0 ) { *(_DWORD *)dst = 0; dst = (char *)dst + 4; } if ( v4 != 0 ) { if ( v4 < 0 ) { *(_WORD *)dst = 0; dst = (char *)dst + 2; } if ( (v4 & 0x40000000) != 0 ) { *(_BYTE *)dst = 0; return (char *)dst + 1; } } return dst; }", "strcmp_words": "_BYTE *__fastcall strcmp_words(_BYTE *a0, int *a1, signed int a2) { bool v3; _BYTE *v4; int v5; bool v6; int v7; int v8; int v9; v3 = ((unsigned __int8)a0 & 3) == 0; v4 = a0; if ( ((unsigned __int8)a0 & 3) == 0 ) v3 = ((unsigned __int8)a1 & 3) == 0; if ( v3 ) { v5 = SYM; while ( 1 ) { v6 = a2 < 4; a2 -= 4; if ( v6 ) goto LABEL_10; v8 = *a1++; v7 = v8; if ( ((v8 - v5) & ~v8 & (v5 << 7)) != 0 ) break; *(_DWORD *)a0 = v7; a0 += 4; } --a1; LABEL_10: a2 += 4; } while ( 1 ) { v6 = a2-- < 1; if ( v6 ) break; v9 = *(unsigned __int8 *)a1; a1 = (int *)((char *)a1 + 1); *a0++ = v9; if ( v9 == 0 ) { bzero(a0, a2); return v4; } } return v4; }", "udiv32": "unsigned int __fastcall udiv32(unsigned int a0, unsigned int a1) { unsigned int v2; int v3; bool v4; BOOL v5; bool v6; int v7; bool v8; int v9; bool v10; bool v11; unsigned int v12; bool v13; unsigned int v14; bool v15; unsigned int result; char v16; bool v17; unsigned int v18; bool v19; unsigned int v20; bool v21; unsigned int v22; bool v23; bool v24; unsigned int v25; bool v26; unsigned int v27; bool v28; if ( ((a0 | a1) & 0x80000000) == 0 ) { v2 = 0; if ( a0 >> 1 >= a1 ) { if ( a0 >> 4 >= a1 ) { if ( a0 >> 8 >= a1 ) { v3 = 0; goto LABEL_29; } v4 = a0 >> 7 >= a1; if ( a0 >> 7 >= a1 ) a0 -= a1 << 7; v5 = v4; v6 = a0 >> 6 >= a1; if ( a0 >> 6 >= a1 ) a0 -= a1 << 6; v7 = v5 + v6 + v5; v8 = a0 >> 5 >= a1; if ( a0 >> 5 >= a1 ) a0 -= 32 * a1; v9 = v7 + v8 + v7; v10 = a0 >> 4 >= a1; if ( a0 >> 4 >= a1 ) a0 -= 16 * a1; v2 = v9 + v10 + v9; } v11 = a0 >> 3 >= a1; if ( a0 >> 3 >= a1 ) a0 -= 8 * a1; v12 = v2 + v11 + v2; v13 = a0 >> 2 >= a1; if ( a0 >> 2 >= a1 ) a0 -= 4 * a1; v14 = v12 + v13 + v12; v15 = a0 >> 1 >= a1; if ( a0 >> 1 >= a1 ) a0 -= 2 * a1; v2 = v14 + v15 + v14; } return v2 + (a0 >= a1) + v2; } v2 = a1 & 0x80000000; if ( (a1 & 0x80000000) != 0 ) a1 = -a1; v3 = v2 ^ ((int)a0 >> 31); if ( (a0 & 0x80000000) != 0 ) a0 = -a0; if ( a0 >> 4 < a1 ) goto LABEL_45; if ( a0 >> 8 < a1 ) goto LABEL_36; LABEL_29: a1 <<= 6; v2 |= 0xFC000000; if ( a0 >> 8 < a1 ) goto LABEL_36; a1 <<= 6; v2 |= 0x3F00000u; if ( a0 >> 8 < a1 ) goto LABEL_36; a1 <<= 6; v2 |= 0xFC000u; if ( a0 >> 8 >= a1 ) { a1 <<= 6; v2 |= 0x3F00u; } v16 = a1 == 0; if ( a1 == 0 ) return 0; do { if ( v16 ) a1 >>= 6; LABEL_36: v17 = a0 >> 7 >= a1; if ( a0 >> 7 >= a1 ) a0 -= a1 << 7; v18 = v2 + v17 + v2; v19 = a0 >> 6 >= a1; if ( a0 >> 6 >= a1 ) a0 -= a1 << 6; v20 = v18 + v19 + v18; v21 = a0 >> 5 >= a1; if ( a0 >> 5 >= a1 ) a0 -= 32 * a1; v22 = v20 + v21 + v20; v23 = a0 >> 4 >= a1; if ( a0 >> 4 >= a1 ) a0 -= 16 * a1; v2 = v22 + v23 + v22; LABEL_45: v24 = a0 >> 3 >= a1; if ( a0 >> 3 >= a1 ) a0 -= 8 * a1; v25 = v2 + v24 + v2; v26 = a0 >> 2 >= a1; if ( a0 >> 2 >= a1 ) a0 -= 4 * a1; v27 = v26 + v25; v16 = __CFADD__(v26, v25) | __CFADD__(v25, v27); v2 = v25 + v27; } while ( v16 ); v28 = a0 >> 1 >= a1; if ( a0 >> 1 >= a1 ) a0 -= 2 * a1; result = v2 + v28 + v2 + (a0 >= a1) + v2 + v28 + v2; if ( v3 < 0 ) return -result; return result; }", "fmt_emit_padded": "int __fastcall fmt_emit_padded(int a0, int a1, int a2, int a3) { int v4; int v5; int v6; int v7; int i; bool v8; v4 = a0 + 36; v5 = *(_DWORD *)a0; if ( (*(_DWORD *)a0 & 0x20) != 0 ) { v6 = *(_DWORD *)(a0 + 28); *(_DWORD *)a0 = v5 & 0xFFFFFFEF; } else { v6 = 1; } if ( v6 <= a1 ) v7 = 0; else v7 = v6 - a1; *(_DWORD *)(a0 + 24) -= v7 + a1 + a3; if ( (*(_BYTE *)a0 & 0x10) == 0 ) fmt_emit_repeat((int *)a0); for ( i = 0; i < a3; ++i ) { (*(void (__fastcall **)(_DWORD, _DWORD))(a0 + 4))(*(unsigned __int8 *)(a2 + i), *(_DWORD *)(a0 + 8)); ++*(_DWORD *)(a0 + 32); } if ( (*(_BYTE *)a0 & 0x10) != 0 ) fmt_emit_repeat((int *)a0); while ( 1 ) { v8 = v7-- <= 0; if ( v8 ) break; (*(void (__fastcall **)(int, _DWORD))(a0 + 4))(48, *(_DWORD *)(a0 + 8)); ++*(_DWORD *)(a0 + 32); } while ( 1 ) { v8 = a1-- <= 0; if ( v8 ) break; (*(void (__fastcall **)(_DWORD, _DWORD))(a0 + 4))(*(unsigned __int8 *)(v4 + a1), *(_DWORD *)(a0 + 8)); ++*(_DWORD *)(a0 + 32); } fmt_pad_zeros((unsigned __int8 *)a0); if ( (*(_BYTE *)a0 & 0x80) != 0 ) return 2; else return 1; }", "fmt_getc": "int __fastcall fmt_getc(int a0) { unsigned __int8 *v1; v1 = *(unsigned __int8 **)(a0 + 16); *(_DWORD *)(a0 + 16) = v1 + 1; return *v1; }", "snprintf": "int __fastcall snprintf(int a0, int a1, int *a2, int a3) { _DWORD v4[15]; v4[1] = a3; v4[2] = a1; v4[5] = 0; v4[3] = (char *)SYM + 14687468; v4[4] = a0; return vfprintf_engine((int)v4, a2); }", "fmt_put_char": "char __fastcall fmt_put_char(char result, _BYTE **a0) { _BYTE *v1; v1 = *a0; *v1 = result; *a0 = v1 + 1; return result; }", "fmt_putc_bounded": "char __fastcall fmt_putc_bounded(char result, __int64 *a0) { __int64 v1; v1 = *a0; if ( (unsigned int)v1 < HIDWORD(v1) ) { *(_DWORD *)a0 = v1 + 1; *(_BYTE *)v1 = result; } return result; }", "fmt_out_string": "int __fastcall fmt_out_string(int a0, unsigned __int8 *a1, unsigned int a2) { if ( *(_DWORD *)(a0 + 20) == 0 ) fmt_emit_bytes(a0, a1, a2); return 1; }", "fmt_out_cstr": "int __fastcall fmt_out_cstr(int a0, int a1, unsigned __int8 **a2) { return fmt_out_string(a0, *a2, 0xFFFFFFFF); }", "fmt_out_char": "int __fastcall fmt_out_char(__int64 a0, int a1, int a2) { if ( *(_DWORD *)(a0 + 20) == 0 ) fmt_emit_u64(a0, a1, 0); return 1; }", "fmt_out_char_wrap": "int __fastcall fmt_out_char_wrap(__int64 a0, _DWORD *a1, int a2) { HIDWORD(a0) = *a1; return fmt_out_char(a0, -1, a2); }", "vsnprintf_dispatch": "int __fastcall vsnprintf_dispatch(_BYTE *a0, unsigned int a1, int a2) { int v3; int v4; v3 = fmt_ctx_get(); v4 = *(_DWORD *)v3; if ( *(_BYTE *)(*(_DWORD *)v3 + 257) == 1 ) return ((int (__fastcall *)(_BYTE *, unsigned int, int))(v4 + 263 + *(_DWORD *)(v4 + 263)))(a0, a1, a2); if ( a1 > 0xFF || *(_BYTE *)(v4 + a1) == 0 ) return -1; *a0 = a1; return 1; }", "div_by_10": "unsigned int __fastcall div_by_10(unsigned int a0) { unsigned int v1; unsigned int v2; unsigned int result; v1 = a0 - 10; v2 = a0 - (a0 >> 2) + ((a0 - (a0 >> 2)) >> 4); result = (v2 + (v2 >> 8) + ((v2 + (v2 >> 8)) >> 16)) >> 3; if ( (int)(v1 - 10 * result) >= 0 ) ++result; return result; }", "fmt_ctx_get": "int __fastcall fmt_ctx_get() { return ret_const_EB600C() + 4; }", "ret_const_EB600C": "int __fastcall ret_const_EB600C() { return SYM; }", "fmt_tail_jump": "void __fastcall fmt_tail_jump() { JUMPOUT(ADDR); }", "strcmp_bytes": "unsigned int __fastcall strcmp_bytes(unsigned int *a0, unsigned int *a1) { unsigned int v2; unsigned int v3; unsigned int v4; unsigned int v5; bool v6; int v7; bool v8; bool v9; unsigned int result; do { v3 = *a0++; v2 = v3; v5 = *a1++; v4 = v5; v7 = (v2 - SYM) & ~v2 & (SYM << 7); v6 = v7 == 0; if ( v7 == 0 ) v6 = v2 == v4; } while ( v6 ); v8 = v4 << 24 >= v2 << 24; result = (v4 << 24) - (v2 << 24); v9 = v4 << 24 == v2 << 24; if ( v4 << 24 == v2 << 24 ) { v8 = false; v9 = (v7 & 0xFF0) == 0; } if ( v9 ) { v8 = v4 << 16 >= v2 << 16; result = (v4 << 16) - (v2 << 16); v9 = v4 << 16 == v2 << 16; if ( v4 << 16 == v2 << 16 ) { v8 = false; v9 = (v7 & 0xFF00) == 0; } if ( v9 ) { v8 = v4 << 8 >= v2 << 8; result = (v4 << 8) - (v2 << 8); v9 = v4 << 8 == v2 << 8; if ( v4 << 8 == v2 << 8 ) { v8 = false; v9 = (v7 & 0xFF0000) == 0; } if ( v9 ) { v8 = v4 >= v2; result = v4 - v2; v9 = v4 == v2; } } } if ( !v9 ) return (result >> 1) | (v8 << 31); return result; }", "strcmp_bytes2": "int __fastcall strcmp_bytes2(unsigned __int8 *a0, unsigned __int8 *a1) { unsigned __int8 *v2; int v3; int v4; unsigned __int8 *v5; int v6; int v7; bool v8; int v9; int v10; bool v11; do { v4 = *a0; v2 = a0 + 1; v3 = v4; v7 = *a1; v5 = a1 + 1; v6 = v7; v8 = v3 == 1; if ( v3 != 0 ) v8 = v3 == v6; if ( !v8 ) break; v9 = *v2; a0 = v2 + 1; v3 = v9; v10 = *v5; a1 = v5 + 1; v6 = v10; v11 = v3 == 1; if ( v3 != 0 ) v11 = v3 == v6; } while ( v11 ); return v3 - v6; }", "udiv_select_shift": "void __fastcall udiv_select_shift(unsigned int a0, unsigned int a1) { if ( a0 >> 2 >= a1 ) { if ( a0 >> 5 >= a1 ) { if ( a0 >> 8 >= a1 ) JUMPOUT(ADDR); JUMPOUT(ADDR); } JUMPOUT(ADDR); } JUMPOUT(ADDR); }", "sysdrv_entry": "void __fastcall __noreturn sysdrv_entry(int a0, int a1, rpc_frame_t *a2) { SYM(a2, a1); __asm { SVC 0x75 ; 'u' } _stack_chk_fail(); }", "__stack_chk_fail": "void __fastcall __noreturn _stack_chk_fail() { JUMPOUT(ADDR); }", "__stack_chk_fail_veneer": "void __fastcall __noreturn _stack_chk_fail_veneer() { __asm { B __stack_chk_fail; __stack_chk_fail - dereferences 0xDEADBEEF to force a data abort, exactly like } }", "ret0": "int __fastcall ret0() { return 0; }", "frame_validate": "int __fastcall frame_validate(unsigned int *a0) { int result; unsigned int v1; _ZF = a0 == nullptr; result = SYM; if ( !_ZF ) { v1 = *a0; if ( *((_BYTE *)a0 + 8) == 4 ) { if ( fw_teardown_all(*a0) != 0 ) { result = v1; __asm { SVC 0x7B ; '{' } } else { return SYM - 5; } } } return result; }", "wait_service_ready": "_DWORD *__fastcall wait_service_ready() { int v0; _DWORD *v1; _DWORD *result; v0 = (int)*SYM; v1 = (_DWORD *)((char *)*SYM + 1372); *(_DWORD *)(v0 + 1376) = 1; *(_DWORD *)(v0 + 1380) = 0; result = (_DWORD *)(v0 + 1380); while ( *v1 != 0 && *result == 0 ) ; return result; }", "acquire_service_lock": "int __fastcall acquire_service_lock(int a0, int a1) { char *v2; int result; int v3; int v4; int v5; v2 = SYM[0]; result = *((_DWORD *)SYM[0] + 1); if ( result == 0 ) { __asm { SVC 0x5E ; '^' } v3 = *SYM; if ( *SYM != 0 ) goto LABEL_4; v5 = 3; v4 = reg_write_sized(SYM, 65533, (int)&v5, 2); __asm { SVC 0xA6 } __asm { SVC 0xA6 } v3 = v4; if ( v4 != 0 ) { LABEL_4: *((_DWORD *)v2 + 1) = v3; unlock_and_store_result(); } return v3; } return result; }", "dram_alloc_region": "int __fastcall dram_alloc_region(int a0, unsigned int a1, int a2, unsigned int a3, int a4) { int v5; int result; int v6; int v7; int v8; int v9; int v10; unsigned int v11; int v12; unsigned int i; unsigned int v13; unsigned int v14; unsigned int v15; unsigned int v16; unsigned int v17; unsigned int *v18; int v19; v5 = 0; result = SYM; v6 = 0; v7 = 0; if ( a4 == 2 ) { if ( a1 < 0x80000000 ) return result; LABEL_4: v8 = heap_pool_get(); v9 = v8; if ( v8 == 0 ) return v5; v10 = v8 + SYM; if ( *(_DWORD *)(v8 + SYM) != SYM || (v11 = *(_DWORD *)(v10 + 4)) > 0xFF ) { v5 = SYM - 1; LABEL_33: region_unmap_if(v9); LABEL_34: if ( v5 != 0 ) trace_event(0, 0xF01Du, v5, 0); return v5; } if ( a3 > 0x2A000 ) { v5 = SYM; *(_BYTE *)(v10 + 12) = 1; goto LABEL_33; } v19 = -v11; v12 = v10 - 16 * v11; for ( i = 0; ; ++i ) { if ( v11 <= i ) goto LABEL_21; if ( *(_DWORD *)(v12 + 16 * i) == a1 ) break; } v13 = v12 + 16 * i; if ( *(_DWORD *)(v13 + 8) != a3 ) { v5 = SYM; goto LABEL_32; } v14 = *(_DWORD *)(v13 + 4); v7 = 1; v6 = v14 + v9; if ( v14 + a3 < v14 || v14 + a3 > SYM - 16 * v11 ) goto LABEL_17; LABEL_21: v15 = (a3 + 31) & 0xFFFFFFE0; if ( v7 == 0 ) { if ( v11 + 1 > 0xFF ) { LABEL_23: v5 = SYM; goto LABEL_32; } v16 = *(_DWORD *)(v10 + 8); v17 = v15 + 16 + v16; if ( v17 < v16 ) { LABEL_17: v5 = SYM - 50; goto LABEL_32; } if ( v17 > 0x2A000 ) { *(_BYTE *)(v10 + 12) = 1; goto LABEL_23; } v6 = v16 + v9 + 16 * v19 - 16; } memcpy_thunk(v6); if ( v7 == 0 ) { v18 = (unsigned int *)(v9 - 16 * *(_DWORD *)(v10 + 4) + SYM - 16); *v18++ = a1; *v18 = v6 - v9; v18[1] = a3; v18[2] = v15; ++*(_DWORD *)(v10 + 4); *(_DWORD *)(v10 + 8) += v18[2] + 16; } LABEL_32: if ( v9 == 0 ) goto LABEL_34; goto LABEL_33; } if ( a4 == 1 && a1 < 0x80000000 ) goto LABEL_4; return result; }", "result_set": "int __fastcall result_set(int a0, int a1) { if ( a0 == 0 ) return 44; *(_DWORD *)(a0 + 4) = a1; return 0; }", "worker_ctx_alloc": "int __fastcall worker_ctx_alloc(_DWORD *a0) { _DWORD *v1; int v2; v1 = nullptr; __asm { SVC 0x5E ; '^' } v2 = 0; while ( *(_DWORD *)(SYM + 1100 * v2 + 4) != 0 ) { if ( (unsigned int)++v2 >= 4 ) goto LABEL_4; } v1 = (_DWORD *)(SYM + 1100 * v2); *v1 = v2; v1[1] = 1; v1[10] = 0; *a0 = v1; LABEL_4: __asm { SVC 0x5F ; '_' } if ( v1 != nullptr ) return 0; else return SYM; }", "worker_ctx_init": "int __fastcall worker_ctx_init(_DWORD *a0, char a1, char a2) { int v3; int v4; int v5; int v6; v3 = SYM; __asm { SVC 0x5E ; '^' } v4 = SYM; v5 = 0; while ( *(_BYTE *)(SYM + 8 * v5) != 0 ) { if ( (unsigned int)++v5 >= 0x80 ) goto LABEL_4; } v6 = SYM + 8 * v5; v3 = 0; *(_BYTE *)(v6 + 1) = a2; *(_BYTE *)(v6 + 2) = a1; *(_DWORD *)(v6 + 4) = 0; *(_BYTE *)(v4 + 8 * v5) = 1; *a0 = v5 + 16; LABEL_4: __asm { SVC 0x5F ; '_' } return v3; }", "hash_alg_setup": "int __fastcall hash_alg_setup(int a0, int a1, int a2, int a3) { int v4; int v5; int v6; int v7; int v8; int v9; int v10; int v11; int v12; int v13; int v14; int v15; int v16; int v17; int v18; int v19; int v20; unsigned int v21; int v22; __int16 *v23; int v24; int v25; unsigned int v26; unsigned int v27; int v28; unsigned int v29; int v30; int v31; v30 = a2; v31 = a3; v31 = *(_DWORD *)SYM; v4 = 0; v5 = a0 - SYM; v6 = 0; if ( a0 == SYM ) goto LABEL_65; if ( a0 > SYM ) { v14 = v5 - SYM; if ( v5 == SYM ) return v4; if ( v5 > SYM ) { v18 = v14 + SYM; if ( v14 == -SYM ) return v4; if ( v14 > -SYM ) { if ( v18 + SYM == 0 ) return v4; v19 = v18 + SYM + SYM; if ( v19 == 0 ) return v4; v20 = v19 + SYM; if ( v20 == 0 ) return v4; v11 = v20 + SYM; goto LABEL_62; } if ( v14 == 0x2000 ) return v4; if ( v14 <= 0x2000 ) { if ( v14 == 4096 ) return v4; v11 = v14 - 6162; goto LABEL_62; } if ( v14 == 12288 || v14 == 0x4000 ) return v4; } else { v15 = v5 - SYM; if ( v5 == SYM ) return v4; if ( v5 > SYM ) { if ( v15 == 0x100000 ) return v4; if ( v15 == 0x200000 ) return v4; v17 = v15 + SYM; if ( v17 == 0 ) return v4; v11 = v17 - 2305; goto LABEL_62; } v16 = v5 - SYM; if ( v5 == SYM ) return v4; if ( v5 <= SYM ) { if ( v5 != 1 ) { if ( v5 == 268435499 ) return v4; return SYM; } goto LABEL_65; } if ( v16 + SYM == 0 || v16 + SYM == 0x100000 ) return v4; } return SYM; } v7 = a0 - SYM; if ( a0 != SYM ) { if ( a0 <= SYM ) { v8 = a0 - SYM; if ( a0 != SYM ) { if ( a0 > SYM ) { if ( v8 != 2 && v8 != 255 ) { v12 = v8 - 511; if ( v12 != 0 && v12 != 256 ) return SYM; } } else { v9 = a0 - SYM; if ( a0 == SYM ) return v4; if ( a0 <= SYM ) { v10 = a0 + SYM; if ( v10 == 0 ) return v4; v11 = v10 + 1879048226; LABEL_62: if ( v11 == 0 ) return v4; return SYM; } if ( v9 == 2 ) return v4; if ( v9 != 255 ) return SYM; } } goto LABEL_64; } v13 = v7 - SYM; if ( v7 != SYM ) { if ( v7 <= SYM ) { if ( v7 != 3 ) { if ( v7 <= 3 ) { if ( v7 != 1 && v7 != 2 ) return SYM; goto LABEL_64; } if ( v7 != 4 ) { if ( v7 != 1550 ) return SYM; goto LABEL_64; } } LABEL_65: v21 = 2; goto LABEL_66; } if ( v13 != 256 && (unsigned int)(v13 + SYM) > 2 ) return SYM; } } LABEL_64: v21 = 1; LABEL_66: v22 = SYM; v4 = SYM - 10; v23 = SYM; v24 = 0; while ( 1 ) { v25 = (unsigned __int16)*v23; if ( *(_BYTE *)(v22 + v25) != 0 ) { v6 = 0; goto LABEL_69; } if ( v21 <= 1 || v6 != 0 || (unsigned int)(v25 + 70) >> 4 == (v25 + 70 + v21 - 1) >> 4 ) { *((_WORD *)&v30 + v6++) = v25; if ( v6 == v21 ) break; } LABEL_69: v26 = (unsigned __int16)(v25 + 1); *v23 = v26; if ( v26 >= 0x3A ) { v6 = 0; *v23 = 0; } if ( (unsigned int)++v24 >= 0x3A ) return v4; } v27 = 0; *(_BYTE *)(a1 + 33) = v21; while ( v27 < v21 ) { v28 = *((unsigned __int16 *)&v30 + v27); *(_BYTE *)(v22 + v28) = 1; *(_BYTE *)(a1 + v27++ + 35) = v28 + 70; } v29 = (unsigned __int16)(*v23 + 1); *v23 = v29; if ( v29 >= 0x3A ) *v23 = 0; return 0; }", "object_slot_alloc": "int __fastcall object_slot_alloc(unsigned __int8 owner) { int v0; int v1; int v2; v0 = -1; __asm { SVC 0x5E ; '^' } v1 = 0; while ( 1 ) { v2 = SYM + 8 * v1; if ( *(_BYTE *)v2 == 0 ) break; if ( (unsigned int)++v1 > 0xFF ) goto LABEL_4; } *(_BYTE *)v2 = 1; *(_DWORD *)(v2 + 4) = 0; v0 = v1; *(_BYTE *)(v2 + 1) = owner; LABEL_4: __asm { SVC 0x5F ; '_' } return v0; }", "object_slot_bind": "int __fastcall object_slot_bind(unsigned int a0, unsigned int a1, unsigned __int8 a2) { int v3; int v4; int v5; v3 = 0; __asm { SVC 0x5E ; '^' } v4 = 0; while ( 1 ) { v5 = SYM + 16 * v4; if ( *(_BYTE *)v5 == 0 ) break; if ( (unsigned int)++v4 > 0xFF ) goto LABEL_4; } *(_BYTE *)v5 = 1; *(_DWORD *)(v5 + 12) = a0; v3 = v4 + 16; *(_DWORD *)(v5 + 4) = a1; *(_DWORD *)(v5 + 8) = 0; *(_BYTE *)(v5 + 1) = a2; LABEL_4: __asm { SVC 0x5F ; '_' } return v3; }", "range_pair_get": "int __fastcall range_pair_get(_DWORD *a0, _DWORD *a1, int a2) { unsigned int v3; unsigned int v4; int *v5; int v6; unsigned int v7; int v8; v3 = *((_DWORD *)SYM + 271); v4 = *((_DWORD *)SYM + 272); if ( v3 == 0 && v4 == 0 ) return SYM - 2; v5 = SYM; v6 = SYM; v7 = ((a2 + 4095) & 0xFFFFF000) + 4096; v8 = *SYM; if ( ((*SYM + v7) | v7) == 0 ) { v6 = 0; *a0 = v3 - 1 + v8; *a1 = __CFADD__(v3 - 1, v8) + (v3 != 0) + ((__PAIR64__(v4, 0) + v3) >> 32); *v5 += v7; } return v6; }", "sysdrv_mbox_common_ack": "int __fastcall sysdrv_mbox_common_ack(int a0) { int v1; char *v2; int v3; v1 = 0; if ( get_client_ctx_field3() != 0 ) return SYM; v2 = SYM; if ( a0 == 1 ) { *((_DWORD *)SYM + 1) = 0; if ( is_recovery_state() != 0 ) { v1 = apply_reg_list_by_id(642); goto LABEL_14; } if ( debug_allowed() == 0 ) return v1; v1 = apply_platform_reg_list(517); v3 = *((_DWORD *)v2 + 1) | 2; LABEL_13: *((_DWORD *)v2 + 1) = v3; LABEL_14: if ( v1 != 0 ) { LABEL_15: status_word_store(0x5Bu, SYM); return v1; } return v1; } if ( a0 != 2 ) { if ( a0 == 3 ) { v1 = apply_platform_reg_list(528); *((_DWORD *)v2 + 1) |= 8u; if ( v1 == 0 ) { v1 = log_uart_init(); if ( v1 == 0 ) { power_rail_disable(); return v1; } } } else { v1 = SYM - 4; } goto LABEL_15; } fabric_config_apply(); if ( debug_allowed() != 0 ) { v1 = apply_platform_reg_list(518); v3 = *((_DWORD *)v2 + 1) | 4; goto LABEL_13; } return v1; }", "sysdrv_mbox_query_9": "int __fastcall sysdrv_mbox_query_9() { char *v0; int v1; int *v2; unsigned int v3; int v4; int client_ctx_alt; int v5; v0 = SYM[0]; v1 = 0; v2 = SYM[0]; *((_DWORD *)SYM[0] + 1) = 0; *v2 = 2; if ( get_client_ctx_field3() != 256 ) { fabric_config_apply(); if ( is_recovery_state() != 0 ) { v1 = apply_reg_list_by_id(642); } else { if ( debug_allowed() == 0 ) { LABEL_18: v5 = apply_platform_reg_list(528); v1 = v5; *((_DWORD *)v0 + 1) |= 8u; if ( v5 != 0 ) return v1; v4 = log_uart_init(); goto LABEL_22; } v1 = apply_platform_reg_list(517); *((_DWORD *)v0 + 1) |= 2u; if ( v1 != 0 ) return v1; v1 = apply_platform_reg_list(518); *((_DWORD *)v0 + 1) |= 4u; } if ( v1 != 0 ) return v1; goto LABEL_18; } *((_DWORD *)v0 + 1) = 1; if ( debug_disabled() ) goto LABEL_23; *SYM = 0; if ( *SYM != 0 ) { v1 = check_caller_permission(0xBu); if ( v1 != 0 ) return v1; v3 = 19; } else { vf_bringup(47); if ( is_recovery_state() == 0 ) { v1 = check_caller_permission(5u); if ( v1 != 0 ) return v1; if ( *v0 != 1 ) { LABEL_23: power_rail_disable(); return v1; } client_ctx_alt = get_client_ctx_alt(); v4 = check_client_permission(0xAu, client_ctx_alt); goto LABEL_22; } v3 = 11; } v4 = check_caller_permission(v3); LABEL_22: v1 = v4; if ( v4 == 0 ) goto LABEL_23; return v1; }", "flash_session_begin": "int __fastcall flash_session_begin(int a0) { int result; int stub; int *v1; int v2; int v3; _DWORD *v4; int v5; int *v6; int v7; int v8; int v9; int v10; int v11; int v12; int v13; int v14; unsigned int v15; int v16; v16 = 0; v15 = 0; result = debug_allowed(); if ( result != 0 ) { result = flash_access_acquire(100); if ( result == 0 ) { if ( get_client_ctx_field3() == 256 ) { if ( client_perm_check(0x17u) != 0 ) { boot_stage_advance(); stub = reg_read_stub(); v1 = SYM[0]; *SYM[0] = stub; *SYM = 0; v2 = check_caller_permission(4u); if ( *v1 == 2 ) { v3 = check_caller_permission(0xBu); if ( v3 != 0 ) v2 = v3; } v4 = SYM; if ( *((_DWORD *)SYM + 556) != 0 ) { v5 = check_caller_permission(0xFu); if ( v5 != 0 ) v2 = v5; } v6 = SYM; if ( *(unsigned __int8 *)SYM << 31 != 0 ) { v7 = check_caller_permission(0x10u); if ( v7 != 0 ) v2 = v7; } if ( (*(_BYTE *)v6 & 2) != 0 ) { v8 = check_caller_permission(0x11u); if ( v8 != 0 ) v2 = v8; } v9 = check_caller_permission(0x17u); if ( v9 != 0 ) v2 = v9; if ( *v1 == 2 ) { v10 = check_caller_permission(0x13u); if ( v10 != 0 ) v2 = v10; } if ( v4[556] != 0 ) { v11 = check_caller_permission(0x14u); if ( v11 != 0 ) v2 = v11; } if ( *(unsigned __int8 *)v6 << 31 != 0 ) { v12 = check_caller_permission(0x15u); if ( v12 != 0 ) v2 = v12; } if ( (*(_BYTE *)v6 & 2) == 0 ) goto LABEL_47; v13 = check_caller_permission(0x16u); LABEL_45: if ( v13 != 0 ) v2 = v13; goto LABEL_47; } v2 = SYM; } else { if ( client_config_find(560, &v16, &v15) == 0 && v16 != 0 && v15 != 0 ) { boot_stage_advance(); v2 = platform_reinit(); v14 = apply_reg_write_list(v16, v15); if ( v14 != 0 ) v2 = v14; if ( client_config_find(561, &v16, &v15) != 0 ) goto LABEL_47; v13 = apply_reg_write_list(v16, v15); goto LABEL_45; } v2 = SYM + 1; } LABEL_47: flash_access_release(100); return v2; } } return result; }", "sysdrv_mbox_set_lock": "int __fastcall sysdrv_mbox_set_lock() { int result; int v0; int client_ctx_alt; int stub; int *v1; int *v2; int v3; int v4; int client_ctx_field2; *SYM = 1; result = debug_allowed(); if ( result != 0 ) { __asm { SVC 0x7B ; '{' } if ( get_client_ctx_field3() == 256 ) { client_ctx_alt = get_client_ctx_alt(); if ( client_ctx_alt != 0 ) { stub = reg_read_stub(); v1 = SYM[0]; *SYM[0] = stub; *SYM = 0; v0 = check_client_permission(6u, client_ctx_alt); if ( v0 == 0 && (*v1 != 2 || (v0 = check_client_permission(0xAu, client_ctx_alt)) == 0) ) { v2 = SYM; if ( *(unsigned __int8 *)SYM << 31 == 0 || (v0 = check_client_permission(8u, client_ctx_alt)) == 0 ) { if ( (*(_BYTE *)v2 & 2) == 0 ) goto LABEL_25; v3 = check_client_permission(9u, client_ctx_alt); v0 = v3; if ( v3 == 0 ) goto LABEL_25; } } } else { v0 = SYM; } } else { v0 = apply_platform_reg_list(513); if ( v0 == 0 ) { v4 = apply_platform_reg_list(517); v0 = v4; if ( v4 == 0 ) { v0 = apply_platform_reg_list(515); if ( v0 == 0 ) { v0 = apply_platform_reg_list(522); if ( v0 == 0 ) { v0 = apply_platform_reg_list(523); if ( v0 == 0 ) { v0 = apply_platform_reg_list(528); if ( v0 == 0 ) { LABEL_25: client_ctx_field2 = get_client_ctx_field2(); status_word_store(0x5Bu, client_ctx_field2); return v0; } } } } } } } status_word_store(0x5Bu, SYM); trace_event(0, 0xF00Du, v0, 1); __asm { SVC 0x9A } return v0; } return result; }", "sysdrv_mbox_query_49": "int __fastcall sysdrv_mbox_query_49(int a0) { int v1; bool v2; int *v3; int result; char *v4; char *v5; int v6; unsigned int v7; int client_ctx_alt; int v8; unsigned int v9; int v10; v1 = 0; v2 = a0 << 31 == 0; v3 = SYM[0]; if ( !v2 ) *SYM[0] |= 1u; if ( (a0 & 2) != 0 ) *v3 |= 2u; v2 = !debug_disabled(); result = 0; if ( v2 ) { v4 = SYM[0]; v5 = SYM; *SYM = 0; if ( a0 << 31 == 0 ) goto LABEL_19; if ( *v4 != 0 ) { v6 = check_caller_permission(0x10u); if ( v6 == 0 ) { v7 = 21; LABEL_13: v6 = check_caller_permission(v7); goto LABEL_17; } } else { if ( is_recovery_state() != 0 ) { vf_bringup(12); v7 = 16; goto LABEL_13; } vf_bringup(12); v6 = check_caller_permission(0xDu); if ( v6 == 0 ) { if ( *v5 != 1 ) goto LABEL_19; client_ctx_alt = get_client_ctx_alt(); v6 = check_client_permission(8u, client_ctx_alt); LABEL_17: if ( v6 == 0 ) goto LABEL_19; } } v1 = v6; LABEL_19: if ( (a0 & 2) == 0 ) return v1; if ( *v4 != 0 ) { v8 = check_caller_permission(0x11u); if ( v8 == 0 ) { v9 = 22; LABEL_25: v8 = check_caller_permission(v9); LABEL_29: if ( v8 != 0 ) return v8; return v1; } } else { if ( is_recovery_state() != 0 ) { vf_bringup(276); v9 = 17; goto LABEL_25; } vf_bringup(276); v8 = check_caller_permission(0xEu); if ( v8 == 0 ) { if ( *v5 != 1 ) return v1; v10 = get_client_ctx_alt(); v8 = check_client_permission(9u, v10); goto LABEL_29; } } return v8; } return result; }", "apply_platform_reg_list": "int __fastcall apply_platform_reg_list(int a0) { unsigned int v1; int result; unsigned int v2; int v3; v1 = 0; v2 = 0; v3 = 0; result = client_config_find(a0, &v3, &v2); if ( result == 0 ) { if ( a0 == 515 || a0 == 535 ) { while ( v1 < v2 ) { **(_DWORD **)(v3 + 8 * v1) = *(_DWORD *)(v3 + 8 * v1 + 4); ++v1; } } else { while ( v1 < v2 ) { result = *(_DWORD *)(v3 + 8 * v1); __asm { SVC 0x7C ; '|' } ++v1; } } } return result; }", "apply_reg_write_list": "int __fastcall apply_reg_write_list(int a0, unsigned int a1) { int result; unsigned int i; unsigned int v2; result = 0; for ( i = 0; i < a1; ++i ) { v2 = *(_DWORD *)(a0 + 8 * i); if ( (unsigned __int8)(v2 >> 20) == 50 ) { *(_DWORD *)v2 = *(_DWORD *)(a0 + 8 * i + 4); } else { result = *(_DWORD *)(a0 + 8 * i); __asm { SVC 0x7C ; '|' } if ( result != 0 ) return result; } } return result; }", "check_caller_permission": "int __fastcall check_caller_permission(unsigned int a0) { int current_client_id; current_client_id = get_current_client_id(); return check_client_permission(a0, current_client_id); }", "check_client_permission": "int __fastcall check_client_permission(unsigned int a0, int a1) { unsigned int k; int v2; int result; int v3; unsigned int *v4; int v5; unsigned int i; int v6; int v7; unsigned int v8; int v9; int v10; int v11; int v12; unsigned int active_slot_id; int v13; unsigned int j; char v14; int v15; unsigned int v16; unsigned int v17; v2 = SYM; if ( a1 == 0 ) return SYM - 1; if ( a0 > 0x18 ) return SYM - 2; v3 = *(_DWORD *)(a1 + 272); v4 = (unsigned int *)(a1 + 256); v5 = a1 + 320; if ( v3 == 256 ) { *SYM = v4[1]; for ( i = 0; ; i = v16 + 1 ) { v16 = i; if ( *v4 <= i ) return v2; v6 = v5; v7 = v5 + 12 + 8 * *(unsigned __int16 *)(v5 + 4); v8 = *(_DWORD *)v5; if ( ((1 << a0) & (v8 >> 8)) != 0 ) { v2 = 0; v9 = v8 & 0xC0; if ( (v8 & 0xC0) != 0 ) { switch ( v9 ) { case 64: active_slot_id = get_active_slot_id(); if ( active_slot_id != 0 ) { v10 = *(unsigned __int16 *)(v6 + 6); v12 = 1; v11 = v7; goto LABEL_27; } while ( *(unsigned __int16 *)(v6 + 6) > active_slot_id ) { **(_DWORD **)(v7 + 8 * active_slot_id) = *(_DWORD *)(v7 + 8 * active_slot_id + 4); ++active_slot_id; } break; case 128: if ( *((_DWORD *)SYM + 561) != 0 ) { v13 = 0; v17 = (unsigned __int8)feature_entry_get(0); for ( j = 0; ; j = (unsigned __int8)(v14 + 1) ) { v14 = j; if ( j >= v17 ) break; if ( feature_enabled(0, j) ) { if ( get_active_slot_id() != 0 ) { result = objmap_lookup_cached(0, v13, v7, *(unsigned __int16 *)(v6 + 6) + 2); v2 = result; if ( result != 0 ) return result; } else { for ( k = 0; *(unsigned __int16 *)(v6 + 6) > k; ++k ) { result = *(_DWORD *)(v7 + 8 * k) + v13; __asm { SVC 0x7C ; '|' } v2 = result; if ( result != 0 ) return result; } } } v13 += select_mem_attr(0); } } break; case 192: if ( (v8 & 0x1F) == 0x10 ) { v15 = 2 * *(unsigned __int16 *)(v6 + 6); result = get_active_slot_id() != 0 ? objmap_lookup_cached(2, 0, v7, v15) : log_buffer_emit(a0, v7, v15); v2 = result; _ZF = result == 0; if ( result != 0 ) { LABEL_20: if ( _ZF ) goto LABEL_22; return result; } } break; default: return SYM + 2; } } else { if ( get_active_slot_id() != 0 ) { v10 = *(unsigned __int16 *)(v6 + 6); v11 = v7; v12 = 0; LABEL_27: v2 = objmap_lookup_cached(v12, 0, v11, v10 + 2); goto LABEL_49; } for ( k = 0; *(unsigned __int16 *)(v6 + 6) > k; ++k ) { if ( instance_id_in_use((*(_DWORD *)(v7 + 8 * k) >> 12) & 0x3FF) == 0 ) { result = *(_DWORD *)(v7 + 8 * k); __asm { SVC 0x7C ; '|' } v2 = result; _ZF = result == 0; goto LABEL_20; } LABEL_22: ; } } } LABEL_49: v5 = v7 + 8 * *(unsigned __int16 *)(v6 + 6); } } return SYM; }", "hexdigit_value": "int __fastcall hexdigit_value(int result) { if ( (unsigned int)(result - 48) <= 9 ) return (unsigned __int8)(result - 48); if ( (unsigned int)(result - 65) <= 5 ) { LOBYTE(result) = result - 55; return (unsigned __int8)result; } if ( (unsigned int)(result - 97) <= 5 ) { LOBYTE(result) = result - 87; return (unsigned __int8)result; } return 255; }", "persist_slot_find_free": "int __fastcall persist_slot_find_free() { int v0; int result; v0 = 0; result = -1; while ( *(_DWORD *)(SYM + 88 * v0 + 84) != -1 ) { if ( (unsigned int)++v0 > 0xFF ) return result; } return v0 + 256; }", "bn_add": "int __fastcall bn_add(bn_t *r, bn_t *a, bn_t *b) { bn_t *v0; bn_t *v1; unsigned int v2; unsigned int *limb; unsigned int v3; unsigned int *v4; unsigned int v5; int v6; unsigned int i; unsigned int v7; int v8; unsigned int v9; unsigned int j; if ( a->sign != b->sign ) JUMPOUT(ADDR); if ( a->nlimbs <= b->nlimbs ) { v0 = b; v1 = a; } else { v0 = a; v1 = b; } if ( v0->nlimbs + 1 > 0x12C ) return 32769; v2 = 0; limb = b->limb; v3 = 0; v4 = r->limb; while ( v1->nlimbs > v3 ) { v5 = v2 + a->limb[v3] + limb[v3]; v6 = v5 & 0xFFFFFFF; v2 = v5 >> 28; v4[v3++] = v6; } for ( i = v1->nlimbs; v0->nlimbs > i; ++i ) { v7 = v2 + v0->limb[i]; v8 = v7 & 0xFFFFFFF; v2 = v7 >> 28; v4[i] = v8; } v4[i] = v2; v9 = v0->nlimbs + 1; r->nlimbs = v9; r->sign = a->sign; if ( *(&r->rsvd + v9) == 0 ) { for ( j = v9; j != 0 && *(&r->rsvd + j) == 0; r->nlimbs = j ) --j; } return 0; }", "bn_is_zero": "int __fastcall bn_is_zero(bn_t *a) { unsigned int nlimbs; int v0; unsigned int v1; int result; nlimbs = a->nlimbs; if ( a->nlimbs == 0 ) return 0; v0 = 7 * (nlimbs - 1); v1 = *(&a->rsvd + nlimbs); result = 4 * v0; while ( v1 != 0 ) { v1 >>= 1; ++result; } return result; }", "bn_normalize": "void __fastcall bn_normalize(bn_t *a, int a0) { int v1; unsigned int v2; unsigned int v3; v1 = 0; v2 = 0; LABEL_6: if ( a->nlimbs > v2 ) { v3 = 0; while ( (a->limb[v2] & (1 << v3)) == 0 ) { ++v3; ++v1; if ( v3 >= 0x1C ) { ++v2; goto LABEL_6; } } } *(_DWORD *)a0 = v1; }", "bn_cmp": "int __fastcall bn_cmp(bn_t *a, bn_t *b) { unsigned int nlimbs; unsigned int *limb; unsigned int *v0; unsigned int v1; unsigned int v2; nlimbs = a->nlimbs; if ( a->nlimbs > b->nlimbs ) return 1; if ( a->nlimbs < b->nlimbs ) return 2; if ( b->nlimbs != 0 ) { limb = a->limb; v0 = b->limb; while ( (--nlimbs & 0x80000000) == 0 ) { v1 = limb[nlimbs]; v2 = v0[nlimbs]; if ( v1 > v2 ) return 1; if ( v1 < v2 ) return 2; } } return 3; }", "bn_copy": "void __fastcall bn_copy(bn_t *dst, bn_t *src) { if ( dst != src ) *dst = *src; }", "bn_divmod": "int __fastcall bn_divmod(bn_scratch_t *scratch, bn_t *quot, bn_t *num, bn_t *den, bn_t *rem) { int v0; bn_t *p_t4; unsigned int *limb; unsigned int v1; unsigned int *v2; unsigned int is_zero; unsigned int v3; int v4; bool v5; int v6; unsigned int v7; int v8; unsigned int v9; unsigned int i; unsigned int v10; unsigned int v11; unsigned __int64 v12; unsigned int *v13; unsigned int v14; unsigned int v15; unsigned int v16; int v17; unsigned int j; unsigned int k; bn_t *p_t3; bn_scratch_t *dst; int v18; unsigned int nbits; bn_t *b; bn_t *src; bn_t *r; unsigned int *v19; if ( den->nlimbs == 0 ) return 32770; if ( num->nlimbs == 0 ) { if ( rem != nullptr ) { rem->nlimbs = 0; rem->sign = 0; } if ( quot != nullptr ) { quot->nlimbs = 0; quot->sign = 0; } return 0; } v0 = bn_cmp(num, den); if ( v0 == 2 ) { if ( rem != nullptr ) bn_copy(rem, num); if ( quot != nullptr ) { quot->nlimbs = 0; quot->sign = 0; } return 0; } if ( v0 == 3 ) { if ( rem != nullptr ) { rem->nlimbs = 0; rem->sign = 0; } if ( quot != nullptr ) { quot->nlimbs = 1; quot->sign = 0; quot->limb[0] = 1; } return 0; } r = &scratch->t1; src = &scratch->t2; p_t3 = &scratch->t3; dst = scratch; p_t4 = &scratch->t4; b = &scratch->t5; limb = scratch->t2.limb; scratch->t2.nlimbs = 0; scratch->t2.sign = 0; scratch->t2.nlimbs = num->nlimbs - den->nlimbs; v1 = 0; v2 = scratch->t0.limb; v19 = scratch->t1.limb; while ( src->nlimbs > v1 ) limb[v1++] = 0; is_zero = bn_is_zero(den); udiv_select_shift(is_zero, 0x1Cu); if ( v3 >= 0x1B ) { bn_copy(&scratch->t0, num); bn_copy(r, den); nbits = 0; LABEL_29: v7 = scratch->t0.nlimbs - 1; v8 = r->nlimbs - 1; v18 = bn_shl_limbs(p_t3, r, v7 - v8); if ( v18 == 0 ) { while ( bn_cmp(&dst->t0, p_t3) != 2 ) { ++limb[v7 - v8]; bn_sub(&dst->t0, &dst->t0, p_t3); } v9 = v8 + 1; for ( i = v7; i >= v9; --i ) { if ( dst->t0.nlimbs >= i ) { v10 = v2[i]; v11 = v19[v8]; if ( v10 == v11 ) { limb[i - v8 - 1] = 0xFFFFFFF; } else { LODWORD(v12) = udivmod64(((unsigned __int64)v10 << 28) + v2[i - 1], v11, 0, (int)p_t3); if ( v12 > 0xFFFFFFF ) LODWORD(v12) = 0xFFFFFFF; limb[i - v8 - 1] = v12; } v13 = &limb[i - v8]; *(v13 - 1) = (*(v13 - 1) + 1) & 0xFFFFFFF; while ( 1 ) { *(v13 - 1) = (*(v13 - 1) - 1) & 0xFFFFFFF; b->sign = 0; b->nlimbs = 1; b->limb[0] = *(v13 - 1); p_t4->sign = 0; p_t4->nlimbs = 2; v14 = v8 != 0 ? v19[v8 - 1] : 0; p_t4->limb[0] = v14; p_t4->limb[1] = v19[v8]; v18 = bn_mul(p_t3, p_t4, b, 0); if ( v18 != 0 ) goto LABEL_65; p_t4->sign = 0; p_t4->nlimbs = 3; if ( i <= 1 ) v15 = 0; else v15 = v2[i - 2]; p_t4->limb[0] = v15; if ( i != 0 ) v16 = v2[i - 1]; else v16 = 0; p_t4->limb[1] = v16; p_t4->limb[2] = v2[i]; if ( bn_cmp(p_t3, p_t4) != 1 ) { v18 = bn_shl_limbs(p_t3, r, i - v8 - 1); if ( v18 == 0 ) { v18 = bn_mul(p_t4, p_t3, b, 0); if ( v18 == 0 ) { v18 = bn_sub(&dst->t0, &dst->t0, p_t4); if ( v18 == 0 ) { if ( dst->t0.sign != 1 ) break; v17 = bn_add(&dst->t0, &dst->t0, p_t3); v18 = v17; if ( v17 == 0 ) { *(v13 - 1) = (*(v13 - 1) - 1) & 0xFFFFFFF; break; } } } } goto LABEL_65; } } } v9 = v8 + 1; } } } else { nbits = 27 - v3; v4 = bn_shl_bits(r, den, 27 - v3); v5 = v4 == 0; v18 = v4; while ( v5 ) { v6 = bn_shl_bits(&scratch->t0, num, nbits); v5 = v6 == 0; v18 = v6; if ( v6 == 0 ) goto LABEL_29; } } LABEL_65: if ( quot != nullptr ) { bn_copy(quot, src); if ( *("->rsvd + quot->nlimbs) == 0 ) { for ( j = quot->nlimbs; j != 0 && *("->rsvd + j) == 0; quot->nlimbs = j ) --j; } } if ( rem != nullptr ) { bn_shr_bits(rem, &dst->t0, nbits); if ( *(&rem->rsvd + rem->nlimbs) == 0 ) { for ( k = rem->nlimbs; k != 0 && *(&rem->rsvd + k) == 0; rem->nlimbs = k ) --k; } } return v18; }", "bn_modinv_flag0": "void __fastcall bn_modinv_flag0(bn_t *r, int a0) { bn_t *v1; int v2; bn_modinv((int)r, a0, v1, v2, 0); }", "bn_modinv_flag1": "void __fastcall bn_modinv_flag1(bn_t *r, int a0) { bn_t *v1; int v2; bn_modinv((int)r, a0, v1, v2, 1); }", "bn_from_bytes_be": "int __fastcall bn_from_bytes_be(bn_t *r, const unsigned int *src, unsigned int nbytes) { unsigned int v0; int v1; int v2; unsigned int v3; unsigned int v4; int v5; unsigned int v6; int v7; unsigned int *v8; unsigned int i; v0 = nbytes; udiv_select_shift(nbytes, 7u); v2 = 2 * v1; if ( v0 << 30 != 0 || (unsigned int)(v2 + 2) > 0x12C ) return 32774; r->nlimbs = 0; r->sign = 0; bzero_core(r->limb, 0x4B0u); v3 = 0; v4 = 0; v5 = 0; do { while ( 1 ) { v6 = *src; r->limb[v4] = (v3 + (*src << (4 * v5))) & 0xFFFFFFF; v3 = v6 >> (28 - 4 * v5); ++v4; if ( ++v5 != 8 ) break; v5 = 0; v3 = 0; } v0 -= 4; ++src; } while ( v0 != 0 ); if ( v3 != 0 ) { v7 = v3 & 0xFFFFFFF; v8 = &r->nlimbs + v4++; v8[3] = v7; } r->nlimbs = v4; if ( *(&r->rsvd + v4) == 0 ) { for ( i = r->nlimbs; i != 0 && *(&r->rsvd + i) == 0; r->nlimbs = i ) --i; } return 0; }", "bn_mul": "int __fastcall bn_mul(bn_t *r, bn_t *a, bn_t *b, unsigned int nlimbs) { unsigned int v0; unsigned int *limb; unsigned int *v1; unsigned int v2; unsigned int *v3; unsigned int v4; unsigned int *v5; unsigned int v6; unsigned int i; unsigned int *v7; unsigned int *v8; unsigned int v9; unsigned int v10; unsigned int v11; unsigned __int64 v12; int v13; unsigned int v14; unsigned int *v15; unsigned int *v16; unsigned int v17; unsigned int v18; unsigned int v19; unsigned __int64 v20; int v21; unsigned int j; unsigned int v22; if ( r == a || r == b ) return 32770; if ( a->nlimbs != 0 && b->nlimbs != 0 ) { if ( nlimbs == 0 ) nlimbs = a->nlimbs + b->nlimbs; v0 = nlimbs; if ( nlimbs > 0x12C ) return 32772; r->sign = a->sign != b->sign; limb = r->limb; r->nlimbs = nlimbs; v1 = a->limb; v2 = a->nlimbs - 1; v3 = b->limb; v22 = b->nlimbs - 1; v4 = 0; v5 = &a->limb[1]; v6 = 0; for ( i = 0; ; ++i ) { v14 = v22; if ( i >= v22 ) break; v7 = v1; v8 = v3; while ( v7 < v5 ) { v10 = *v7++; v9 = v10; v11 = *v8--; v12 = v9 * (unsigned __int64)v11 + __PAIR64__(v6, v4); v6 = HIDWORD(v12); v4 = v12; } ++v3; if ( v2 > i ) ++v5; v13 = v4 & 0xFFFFFFF; v4 = (v4 >> 28) | (16 * v6); v6 >>= 28; limb[i] = v13; } while ( v14 < v0 ) { v15 = v1; v16 = v3; while ( v15 < v5 ) { v18 = *v15++; v17 = v18; v19 = *v16--; v20 = v17 * (unsigned __int64)v19 + __PAIR64__(v6, v4); v6 = HIDWORD(v20); v4 = v20; } ++v1; if ( v2 > v14 ) ++v5; v21 = v4 & 0xFFFFFFF; v4 = (v4 >> 28) | (16 * v6); v6 >>= 28; limb[v14++] = v21; } if ( *(&r->rsvd + r->nlimbs) == 0 ) { for ( j = r->nlimbs; j != 0 && *(&r->rsvd + j) == 0; r->nlimbs = j ) --j; } } else { r->nlimbs = 0; r->sign = 0; } return 0; }", "bn_shl_bits": "int __fastcall bn_shl_bits(bn_t *r, bn_t *a, unsigned int nbits) { bn_t *v0; int v1; unsigned int v2; int v3; char v4; unsigned int v5; unsigned int v6; unsigned int *limb; unsigned int v7; v0 = a; v1 = 0; if ( nbits != 0 && a->nlimbs != 0 ) { if ( nbits >= 0x1C ) { udiv_select_shift(nbits, 0x1Cu); v1 = bn_shl_limbs(r, v0, v2); if ( v1 != 0 ) return v1; v0 = r; } udiv_select_shift(nbits, 0x1Cu); v4 = v3; if ( v3 != 0 && v0->nlimbs != 0 ) { v5 = 0; v6 = 0; limb = r->limb; while ( v0->nlimbs > v6 ) { v7 = v0->limb[v6]; limb[v6] = v5 + ((v7 << v4) & 0xFFFFFFF); v5 = v7 >> (28 - v4); ++v6; } r->nlimbs = v0->nlimbs; r->sign = v0->sign; if ( v5 != 0 ) { limb[v6] = v5; ++r->nlimbs; } } return v1; } if ( a != r ) bn_copy(r, a); return 0; }", "bn_shr_bits": "void __fastcall bn_shr_bits(bn_t *r, bn_t *a, unsigned int nbits) { bn_t *v0; unsigned int v1; int v2; char v3; int v4; int v5; char i; unsigned int v6; unsigned int nlimbs; v0 = a; if ( nbits != 0 && a->nlimbs != 0 ) { if ( nbits >= 0x1C ) { udiv_select_shift(nbits, 0x1Cu); bn_shr_limbs(r, v0, v1); v0 = r; } udiv_select_shift(nbits, 0x1Cu); v3 = v2; if ( v2 != 0 && v0->nlimbs != 0 ) { v4 = 0; v5 = v0->nlimbs - 1; for ( i = 28 - v2; v5 >= 0; --v5 ) { v6 = v0->limb[v5]; r->limb[v5] = v4 + (v6 >> v3); v4 = (v6 & ((1 << v3) - 1)) << i; } nlimbs = v0->nlimbs; r->nlimbs = v0->nlimbs; r->sign = v0->sign; if ( *(&r->rsvd + v0->nlimbs) == 0 ) r->nlimbs = nlimbs - 1; } } else if ( a != r ) { bn_copy(r, a); } }", "bn_shl_limbs": "int __fastcall bn_shl_limbs(bn_t *r, bn_t *a, unsigned int nlimbs) { unsigned int v0; unsigned int *limb; unsigned int *i; unsigned int j; if ( nlimbs != 0 && a->nlimbs != 0 ) { v0 = a->nlimbs + nlimbs; if ( v0 > 0x12C ) return 32769; r->nlimbs = v0; r->sign = a->sign; limb = r->limb; for ( i = a->limb; --v0 >= nlimbs; limb[v0] = i[v0 - nlimbs] ) ; for ( j = 0; j < nlimbs; ++j ) limb[j] = 0; } else if ( a != r ) { bn_copy(r, a); } return 0; }", "bn_shr_limbs": "void __fastcall bn_shr_limbs(bn_t *r, bn_t *a, unsigned int nlimbs) { unsigned int sign; unsigned int i; unsigned int v0; unsigned int v1; if ( nlimbs != 0 ) { if ( a->nlimbs > nlimbs ) { for ( i = nlimbs; a->nlimbs > i; ++i ) { v0 = i - nlimbs; v1 = a->limb[i]; r->limb[v0] = v1; } r->nlimbs = a->nlimbs - nlimbs; sign = a->sign; } else { sign = 0; r->nlimbs = 0; } r->sign = sign; } else if ( a != r ) { bn_copy(r, a); } }", "bn_sqr": "int __fastcall bn_sqr(bn_t *r, bn_t *a) { unsigned int nlimbs; unsigned int *v0; unsigned int v1; unsigned int *v2; unsigned int *v3; unsigned int v4; unsigned int v5; unsigned int *v6; unsigned int i; unsigned int v7; unsigned int *v8; unsigned int v9; unsigned int *v10; unsigned int v11; unsigned int v12; unsigned int v13; unsigned __int64 v14; signed __int64 v15; unsigned int j; unsigned int v16; unsigned int *v17; unsigned int v18; unsigned int *v19; unsigned int v20; unsigned int v21; unsigned int v22; unsigned __int64 v23; signed __int64 v24; unsigned int k; unsigned int v25; unsigned int v26; unsigned int *limb; if ( r == a ) return 32770; nlimbs = a->nlimbs; if ( a->nlimbs != 0 ) { v25 = 2 * nlimbs; if ( 2 * nlimbs > 0x12C ) return 32772; r->sign = 0; r->nlimbs = v25; limb = r->limb; v1 = a->nlimbs; v0 = a->limb; v2 = v0; v26 = v1 - 1; v3 = v0; v4 = 0; v5 = 0; v6 = v0; for ( i = 0; i < v26; ++i ) { v7 = 0; v8 = v3; v9 = 0; v10 = v6; while ( v8 < v0 ) { v12 = *v8++; v11 = v12; v13 = *v10--; v14 = v11 * (unsigned __int64)v13 + __PAIR64__(v9, v7); v9 = HIDWORD(v14); v7 = v14; } v15 = __PAIR64__(v9 + __CFADD__(v7, v7) + v9, 2 * v7) + __PAIR64__(v5, v4); if ( i << 31 == 0 ) { ++v0; v15 += v2[i >> 1] * (unsigned __int64)v2[i >> 1]; } ++v6; v4 = v15 >> 28; limb[i] = v15 & 0xFFFFFFF; v5 = HIDWORD(v15) >> 28; } for ( j = v26; j < v25; ++j ) { v16 = 0; v17 = v3; v18 = 0; v19 = v6; while ( v17 < v0 ) { v21 = *v17++; v20 = v21; v22 = *v19--; v23 = v20 * (unsigned __int64)v22 + __PAIR64__(v18, v16); v18 = HIDWORD(v23); v16 = v23; } v24 = __PAIR64__(v18 + __CFADD__(v16, v16) + v18, 2 * v16) + __PAIR64__(v5, v4); if ( j << 31 == 0 ) { ++v0; v24 += v2[j >> 1] * (unsigned __int64)v2[j >> 1]; } v4 = v24 >> 28; limb[j] = v24 & 0xFFFFFFF; ++v3; v5 = HIDWORD(v24) >> 28; } if ( *(&r->rsvd + r->nlimbs) == 0 ) { for ( k = r->nlimbs; k != 0 && *(&r->rsvd + k) == 0; r->nlimbs = k ) --k; } } else { r->nlimbs = 0; r->sign = 0; } return 0; }", "bn_export_words": "int __fastcall bn_export_words(bn_t *a, unsigned int *out, unsigned int nbytes) { int v0; unsigned int i; int v1; unsigned int j; unsigned int v2; v0 = 0; if ( a == nullptr || out == nullptr ) return 32771; if ( nbytes << 30 != 0 ) return 32774; if ( a->nlimbs > 0x12C ) return 32769; if ( *(&a->rsvd + a->nlimbs) == 0 ) { for ( i = a->nlimbs; i != 0 && *(&a->rsvd + i) == 0; a->nlimbs = i ) --i; } v1 = 0; for ( j = 0; a->nlimbs - 1 > j; ++j ) { if ( nbytes == 0 ) return 35585; if ( v1 == 7 ) { *out = a->limb[j + 1] + (a->limb[j] >> 28); v1 = 0; } else { nbytes -= 4; v2 = (a->limb[j] >> (4 * v1)) + ((((1 << (4 * v1 + 4)) - 1) & a->limb[j + 1]) << (28 - 4 * v1)); ++v1; *out++ = v2; } } return v0; }", "bn_sub": "int __fastcall bn_sub(bn_t *r, bn_t *a, bn_t *b) { int v0; unsigned int *limb; unsigned int *v1; unsigned int nlimbs; __int64 v2; unsigned int sign; unsigned int v3; unsigned int i; unsigned int v4; unsigned int v5; unsigned int v6; unsigned int v7; unsigned int j; if ( a->sign != b->sign ) JUMPOUT(ADDR); v0 = bn_cmp(a, b); limb = a->limb; if ( v0 == 2 ) { v1 = b->limb; nlimbs = b->nlimbs; v2 = *(_QWORD *)&a->nlimbs; sign = a->sign == 0; } else { if ( v0 != 1 ) { r->nlimbs = 0; r->sign = 0; return 0; } v1 = a->limb; nlimbs = a->nlimbs; limb = b->limb; sign = a->sign; LODWORD(v2) = b->nlimbs; } r->sign = sign; v3 = 0; for ( i = 0; i < (unsigned int)v2; ++i ) { v4 = v1[i]; v5 = limb[i] + v3; v3 = v4 < v5; r->limb[i] = v4 + (v3 << 28) - v5; } while ( (unsigned int)v2 < nlimbs ) { v6 = v1[(_DWORD)v2]; v7 = v3; v3 = v6 < v3; r->limb[v2] = v6 + (v3 << 28) - v7; LODWORD(v2) = v2 + 1; } r->nlimbs = nlimbs; if ( *(&r->rsvd + nlimbs) == 0 ) { for ( j = nlimbs; j != 0 && *(&r->rsvd + j) == 0; r->nlimbs = j ) --j; } return 0; }", "bn_modinv": "int __fastcall bn_modinv(int a0, int a1, bn_t *a2, int a3, int a4) { int v5; bn_t *v6; int v7; int v8; int v9; bool v10; int v11; bn_t *v12; bn_t *v13; bn_t *v14; bn_t *v15; bn_t *v16; bn_t *v17; if ( a0 == 0 || a1 == 0 || a2 == nullptr || a3 == 0 ) return 32771; v5 = a0 + 4848; v6 = (bn_t *)(a0 + 2424); v7 = a0 + 3636; v8 = a0 + 6060; v9 = (*(unsigned __int8 *)(a3 + 12) << 31 >> 31) + 1; bn_copy((bn_t *)a0, (bn_t *)a3); bn_copy((bn_t *)a1, a2); while ( *(unsigned __int8 *)(a0 + 12) << 31 == 0 && *(unsigned __int8 *)(a1 + 12) << 31 == 0 ) { bn_shr_bits((bn_t *)a0, (bn_t *)a0, 1u); bn_shr_bits((bn_t *)a1, (bn_t *)a1, 1u); } *(_DWORD *)v7 = 0; *(_DWORD *)(v7 + 4) = 0; *(_DWORD *)v5 = 0; *(_DWORD *)(v5 + 4) = 0; v6->nlimbs = 1; v6->sign = 0; v6->limb[0] = 1; bn_copy((bn_t *)v8, v6); do { if ( v9 != 0 ) { while ( *(_DWORD *)a0 != 0 && *(unsigned __int8 *)(a0 + 12) << 31 == 0 ) { bn_shr_bits((bn_t *)a0, (bn_t *)a0, 1u); if ( LOBYTE(v6->limb[0]) << 31 != 0 || *(unsigned __int8 *)(v7 + 12) << 31 != 0 ) { v11 = bn_add(v6, v6, a2); v10 = v11 == 0; while ( v10 ) { v11 = bn_sub((bn_t *)v7, (bn_t *)v7, (bn_t *)a3); v10 = v11 == 0; if ( v11 == 0 ) goto LABEL_19; } return v11; } LABEL_19: bn_shr_bits(v6, v6, 1u); bn_shr_bits((bn_t *)v7, (bn_t *)v7, 1u); } while ( *(_DWORD *)a1 != 0 && *(unsigned __int8 *)(a1 + 12) << 31 == 0 ) { bn_shr_bits((bn_t *)a1, (bn_t *)a1, 1u); if ( *(unsigned __int8 *)(v5 + 12) << 31 != 0 || *(unsigned __int8 *)(v8 + 12) << 31 != 0 ) { v11 = bn_add((bn_t *)v5, (bn_t *)v5, a2); if ( v11 != 0 ) return v11; v11 = bn_sub((bn_t *)v8, (bn_t *)v8, (bn_t *)a3); if ( v11 != 0 ) return v11; } bn_shr_bits((bn_t *)v5, (bn_t *)v5, 1u); bn_shr_bits((bn_t *)v8, (bn_t *)v8, 1u); } if ( bn_cmp((bn_t *)a0, (bn_t *)a1) != 2 ) { v11 = bn_sub((bn_t *)a0, (bn_t *)a0, (bn_t *)a1); if ( v11 != 0 ) return v11; v12 = (bn_t *)v5; v13 = v6; goto LABEL_51; } v11 = bn_sub((bn_t *)a1, (bn_t *)a1, (bn_t *)a0); if ( v11 != 0 ) return v11; v16 = v6; v17 = (bn_t *)v5; } else { while ( *(_DWORD *)a0 != 0 && *(unsigned __int8 *)(a0 + 12) << 31 == 0 ) { bn_shr_bits((bn_t *)a0, (bn_t *)a0, 1u); if ( *(unsigned __int8 *)(v7 + 12) << 31 != 0 ) { v11 = bn_sub((bn_t *)v7, (bn_t *)v7, (bn_t *)a3); if ( v11 != 0 ) return v11; } bn_shr_bits((bn_t *)v7, (bn_t *)v7, 1u); } while ( *(_DWORD *)a1 != 0 && *(unsigned __int8 *)(a1 + 12) << 31 == 0 ) { bn_shr_bits((bn_t *)a1, (bn_t *)a1, 1u); if ( *(unsigned __int8 *)(v8 + 12) << 31 != 0 ) { v11 = bn_sub((bn_t *)v8, (bn_t *)v8, (bn_t *)a3); if ( v11 != 0 ) return v11; } bn_shr_bits((bn_t *)v8, (bn_t *)v8, 1u); } if ( bn_cmp((bn_t *)a0, (bn_t *)a1) != 2 ) { v12 = (bn_t *)a1; v13 = (bn_t *)a0; LABEL_51: v11 = bn_sub(v13, v13, v12); if ( v11 != 0 ) return v11; v14 = (bn_t *)v8; v15 = (bn_t *)v7; goto LABEL_35; } v16 = (bn_t *)a0; v17 = (bn_t *)a1; } v11 = bn_sub(v17, v17, v16); if ( v11 != 0 ) return v11; v14 = (bn_t *)v7; v15 = (bn_t *)v8; LABEL_35: v11 = bn_sub(v15, v15, v14); if ( v11 != 0 ) return v11; } while ( *(_DWORD *)a0 != 0 ); if ( a4 == 1 ) { if ( *(_DWORD *)a1 == 1 && *(_DWORD *)(a1 + 12) == 1 ) { bn_copy((bn_t *)a1, (bn_t *)v8); do { if ( *(_DWORD *)(a1 + 4) != 1 ) break; v11 = bn_add((bn_t *)a1, (bn_t *)a1, (bn_t *)a3); } while ( v11 == 0 ); } else { return 32773; } } return v11; }", "bytes_mod_u32": "int __fastcall bytes_mod_u32(unsigned int a0, int a1, unsigned int a2, _DWORD *a3) { unsigned int v4; unsigned int *v5; int v6; int v7; if ( (a1 | a0) << 30 != 0 ) return SYM; v5 = (unsigned int *)(a0 + a1 - 4); v4 = *v5; do { udiv_select_shift(v4, a2); v7 = *((unsigned __int16 *)v5 - 1); v5 = (unsigned int *)((char *)v5 - 2); v4 = v7 + (v6 << 16); } while ( (unsigned int)v5 >= a0 ); *a3 = v6; return 0; }", "bootrec_capture_platform_ids": "int __fastcall bootrec_capture_platform_ids() { int result; _WORD *v0; int *v1; result = config_find_type324(); if ( result == 0 ) { v0 = SYM; v1 = (int *)SYM; LOWORD((*SYM)[8]) = *((_WORD *)SYM + 984); *((_WORD *)v1 + 17) = v0[986]; v1[10] = *((_DWORD *)v0 + 494); v1[11] = *((_DWORD *)v0 + 495); v1[12] = *((_DWORD *)v0 + 497); *SYM = 1; } return result; }", "ccp_desc_hash_sha256": "int __fastcall ccp_desc_hash_sha256(int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) { return ccp_desc_hash_ex((_DWORD *)a0, a1, a2, a3, a4, a5, a6, 1, 0, a7, a8); }", "ccp_desc_set_fields": "int __fastcall ccp_desc_set_fields(_DWORD *a0, int a1, int a2, int a3, int a4, int a5) { int v6; *a0 = a5; a0[1] = a3; a0[2] = a2; v6 = *((_DWORD *)SYM + 2) << 16; a0[3] = v6; a0[4] = a1; a0[5] = v6; a0[6] = a4; return 0; }", "ccp_desc_hash_sha384": "int __fastcall ccp_desc_hash_sha384(int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7) { return ccp_desc_hash_ex((_DWORD *)a0, a1, a2, a3, a4, a5, a6, 4, 0, 1, a7); }", "ccp_desc_aes_with_iv": "int __fastcall ccp_desc_aes_with_iv(_DWORD *a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7) { int v8; int result; v8 = ccp_ctrl_aes_full(a5, 0, a6, 0, a7); result = ccp_desc_set_fields(a0, a1, a2, a3, a4, v8); a0[7] = *((_DWORD *)SYM + 2) << 16; return result; }", "ccp_desc_aes_keyed": "int __fastcall ccp_desc_aes_keyed(_DWORD *a0, int a1, int a2, int a3, int a4, int a5, int a6) { int result; int v7; int v8; int v9; v9 = a3; result = ccp_resolve_key_slot(1, &v9); if ( result == 0 ) { v8 = ccp_ctrl_aes_full(a5, 0, a6, 0, v7); result = ccp_desc_set_fields(a0, a1, a2, a3, 32 * a4, v8); a0[7] = v9 << 16; } return result; }", "ccp_desc_hash_ex": "int __fastcall ccp_desc_hash_ex( _DWORD *a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10) { int v11; int result; if ( a7 != 3 ) { if ( a7 == 4 || a7 == 7 ) a8 = 127; else a8 = 0; } v11 = ccp_ctrl_aes_full(a6, a7, a9, a8, a10); result = ccp_desc_set_fields_sha(a0, a1, a2, a3, a4, a5, v11); a0[7] = *((_DWORD *)SYM + 2) << 16; return result; }", "ccp_desc_set_fields_sha": "int __fastcall ccp_desc_set_fields_sha(_DWORD *a0, int a1, int a2, int a3, int a4, int a5, int a6) { int v7; *a0 = a6; a0[1] = a3; a0[2] = a2; v7 = *((_DWORD *)SYM + 2); a0[3] = (a5 << 18) | (v7 << 16); a0[4] = a1; a0[5] = v7 << 16; a0[6] = a4; return 0; }", "ccp_desc_aes_xts": "int __fastcall ccp_desc_aes_xts(int *a0, int a1, int a2, int a3, int a4, int a5, int a6) { int v7; int v8; char *v9; int v10; v7 = ccp_flags_to_ctrl(a6); a0[2] = a1; v8 = (32 * ((a4 << 13) | 0x580)) | v7 | 0x2000008; v9 = SYM; *a0 = v8; a0[1] = a2; v10 = *((_DWORD *)v9 + 2); a0[3] = (a5 << 18) | (v10 << 16); a0[4] = 0; a0[5] = 0; a0[6] = a3; a0[7] = v10 << 16; return 0; }", "ccp_desc_passthru": "int __fastcall ccp_desc_passthru(ccp_desc_t *d, int dst, int src, int len, int flags) { unsigned int v0; unsigned int v1; v0 = ccp_ctrl_passthru(0, flags); d->src_lo = src; d->ctrl = v0; d->length = len; v1 = *((_DWORD *)SYM + 2) << 16; d->src_hi = v1; d->dst_lo = dst; d->dst_hi = v1; d->key_lo = 0; d->key_hi = 0; return 0; }", "ccp_desc_aes_full": "int __fastcall ccp_desc_aes_full( int *a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11) { int v12; int v13; int v14; unsigned __int16 v15; unsigned __int16 v16; int v17; unsigned __int16 v18; unsigned __int16 v19; int v20; int v21; int v22; int v23; v22 = a2; v23 = a3; v12 = ccp_resolve_key_slot(a4, &v22); if ( v12 == 0 ) { v12 = ccp_resolve_key_slot(a8, &v23); if ( v12 == 0 ) { v14 = ccp_ctrl_aes_mode(a2, v13, a4); v16 = v15; v17 = ccp_ctrl_aes_mode(a6, a7, a8); v19 = v18; if ( (a11 & 2) != 0 ) v20 = 2; else v20 = (a11 & 4) != 0; *a0 = ccp_ctrl_passthru(v20, a11); a0[1] = a10; a0[2] = v17; a0[3] = ccp_pack_mem_attrs(v23, v21, v17, v19) | a9; a0[4] = v14; a0[5] = ccp_pack_mem_attrs(v22, a9, v14, v16) | a5; a0[6] = 0; a0[7] = 0; } } return v12; }", "ccp_queue_kick": "int __fastcall ccp_queue_kick(_DWORD *a0, int a1, int a2, int a3, int a4) { return ccp_desc_passthru_keyed(a0, a1, a2, 0, a3, a4); }", "ccp_desc_passthru_keyed": "int __fastcall ccp_desc_passthru_keyed(int *a0, int a1, int a2, int a3, int a4, int a5) { int v6; int v7; v7 = a3; if ( ccp_resolve_key_slot(1, &v7) == 0 ) { *a0 = ccp_ctrl_passthru(v6, a5); a0[1] = a4; a0[2] = 32 * a2; a0[3] = v7 << 16; a0[4] = a1; a0[5] = *((_DWORD *)SYM + 2) << 16; a0[6] = 0; a0[7] = 0; } return 0; }", "ccp_desc_aes_out_thunk": "int __fastcall ccp_desc_aes_out_thunk(_DWORD *a0, int a1, int a2, int a3, int a4) { return ccp_desc_aes_out(a0, a1, a2, 0, a3, a4); }", "ccp_desc_aes_out": "int __fastcall ccp_desc_aes_out(int *a0, int a1, int a2, int a3, int a4, int a5) { int v6; int v7; int v8; int v9; v9 = a3; v7 = ccp_resolve_key_slot(1, &v9); if ( v7 == 0 ) { v8 = ccp_ctrl_passthru(v6, a5); a0[2] = a2; *a0 = v8; a0[1] = a4; a0[3] = *((_DWORD *)SYM + 2) << 16; a0[4] = 32 * a1; a0[5] = v9 << 16; a0[6] = 0; a0[7] = 0; } return v7; }", "ccp_desc_zlib": "int __fastcall ccp_desc_zlib(ccp_desc_t *d, int dst, int src, int len, int flags) { int v0; unsigned int v1; v0 = ccp_flags_to_ctrl(flags); d->src_lo = src; d->ctrl = v0 | 0x600018; d->length = len; v1 = *((_DWORD *)SYM + 2) << 16; d->src_hi = v1; d->dst_lo = dst; d->dst_hi = v1; d->key_lo = 0; d->key_hi = 0; return 0; }", "ccp_desc_ecc": "int __fastcall ccp_desc_ecc(ccp_desc_t *d, int op, int dst, int src, int mode, int flags) { unsigned int v0; d->ctrl = (32 * ((op << 12) | (8 * mode))) | 0x700000 | ccp_flags_to_ctrl(flags) | 0x2000010; d->length = 576; d->src_lo = src; v0 = *((_DWORD *)SYM + 2) << 16; d->src_hi = v0; d->dst_lo = dst; d->dst_hi = v0; d->key_lo = 0; d->key_hi = 0; return 0; }", "ccp_desc_rsa": "int __fastcall ccp_desc_rsa(ccp_desc_t *d, int dst, int src, int len, int keysize, int key, int flags) { unsigned int v0; d->ctrl = ccp_flags_to_ctrl(flags) | 0x18 | (keysize << 8) | 0x400000; d->length = len + keysize; d->src_lo = src; v0 = *((_DWORD *)SYM + 2) << 16; d->src_hi = v0; d->dst_lo = dst; d->dst_hi = v0; d->key_lo = key; d->key_hi = v0; return 0; }", "ccp_desc_fill_common": "int __fastcall ccp_desc_fill_common(_DWORD *a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7) { int v8; unsigned __int16 v9; int v10; int v11; v11 = a3; v10 = ccp_resolve_key_slot(a4, &v11); if ( v10 == 0 ) { *a0 = a7; a0[1] = a5; a0[2] = a2; a0[3] = ccp_pack_mem_attrs(v11, v8, a2, v9) | (a6 << 18); a0[6] = 0; a0[7] = 0; } return v10; }", "ccp_desc_set_common": "ccp_desc_t *__fastcall ccp_desc_set_common(ccp_desc_t *d, int dst, int src, int attr, int ctrl) { d->ctrl = ctrl; d->length = src; d->src_lo = dst; d->src_hi = (attr << 18) | (*((_DWORD *)SYM + 2) << 16); d->key_lo = 0; d->key_hi = 0; return d; }", "ccp_desc_sha": "int __fastcall ccp_desc_sha(ccp_desc_t *a0, int a1, int a2, int a3, int a4, int a5, int a6) { int v7; int ctrl; v7 = ccp_flags_to_ctrl(a6); ctrl = ccp_ctrl_sha(a5, v7 | 0x10); ccp_desc_set_common(a0, a1, a2, a4, ctrl); a0->dst_lo = 8 * a3; a0->dst_hi = 0; return 0; }", "ccp_desc_aes": "int __fastcall ccp_desc_aes(_DWORD *a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9) { int v10; int v11; int v12; int v13; int v14; int v15; int result; v10 = ccp_flags_to_ctrl(a9) | 0x10; v11 = ccp_ctrl_aes_mode(a2, a3, a4); v13 = v12; v14 = ccp_ctrl_sha(a8, v10); result = ccp_desc_fill_common(a0, v15, v11, v13, a4, a5, a7, v14); a0[4] = 8 * a6; a0[5] = 0; return result; }", "ccp_queue_ready": "int __fastcall ccp_queue_ready(_DWORD *a0, int a1, int a2, int a3, int a4) { int v5; v5 = 1; if ( a3 == 4 || a3 == 5 ) v5 = 2; return ccp_desc_aes_out_thunk(a0, a1, a2, 32 * v5, a4); }", "ccp_desc_sha_init": "int __fastcall ccp_desc_sha_init(ccp_desc_t *a0, int a1, int a2, int a3, int a4, int a5) { int v6; int ctrl; v6 = ccp_flags_to_ctrl(a5); ctrl = ccp_ctrl_sha(a4, v6); ccp_desc_set_common(a0, a1, a2, a3, ctrl); a0->dst_lo = 0; a0->dst_hi = 0; return 0; }", "sysdrv_derive_debug_token_key": "int __fastcall sysdrv_derive_debug_token_key(int a0, _DWORD *a1, unsigned int a2) { char *v3; int v4; _DWORD v5[8]; _BYTE v6[225]; int v7; v7 = *(_DWORD *)SYM; if ( a2 >= 0x140 ) { v3 = SYM; if ( *SYM == 0 ) { v5[0] = 0; bzero((void *)((unsigned int)v6 & 0xFFFFFFE0), 0xE0u); v4 = kdf_derive_key_hkdf(a0, SYM, (int)v5, 4, SYM, 0x20u, (unsigned int)v6 & 0xFFFFFFE0); if ( v4 != 0 ) return v4; *v3 = 1; } bzero(a1, a2); memcpy_thunk((int)(a1 + 64)); a1[5] = 64; return 0; } return SYM; }", "buf_reverse_inplace": "void *__fastcall buf_reverse_inplace(void *buf, unsigned int n) { unsigned int v0; unsigned int v1; char v2; v0 = 0; v1 = n - 1; while ( v0 < n >> 1 ) { v2 = *((_BYTE *)buf + v1); *((_BYTE *)buf + v1) = *((_BYTE *)buf + v0); *((_BYTE *)buf + v0++) = v2; --v1; } return buf; }", "checksum16": "unsigned int __fastcall checksum16(unsigned __int16 *a0, unsigned int a1) { unsigned int v2; unsigned int v3; unsigned int v4; unsigned int v5; unsigned int i; int v6; v2 = a1 >> 1; v3 = 0xFFFF; v4 = 0xFFFF; while ( v2 != 0 ) { v5 = 360; if ( v2 <= 0x168 ) v5 = v2; v2 -= v5; for ( i = 0; i < v5; ++i ) { v6 = *a0++; v3 += v6; v4 += v3; } v3 = (unsigned __int16)v3 + HIWORD(v3); v4 = (unsigned __int16)v4 + HIWORD(v4); } return (unsigned __int16)v3 + HIWORD(v3) + ((v4 + HIWORD(v4)) << 16); }", "checksum8": "unsigned __int8 __fastcall checksum8(unsigned int n, const char *p) { unsigned __int8 result; unsigned int i; char v0; result = 0; for ( i = 0; i < n; ++i ) { v0 = *p++; result += v0; } return result; }", "cipher_feed_blocks": "int __fastcall cipher_feed_blocks(int a0, int a1, int a2, int a3) { int v4; int v5; unsigned int v6; int v7; _DWORD *v8; unsigned int v9; unsigned int v10; int v11; int v12; int v13; int v14; int v15; int v16; v4 = *(_DWORD *)(a0 + 76); v5 = 0; v6 = *(_DWORD *)(v4 + 64) + a2; v16 = a0 + 40; while ( v6 >= 0x10 ) { __asm { SVC 0x5E ; '^' } v7 = 1024; if ( v6 <= 0x400 ) v7 = v6 & 0x7F0; if ( *(_DWORD *)(v4 + 64) != 0 ) { v8 = SYM; memcpy_thunk((int)*SYM + 640); memcpy_thunk(*(_DWORD *)(v4 + 64) + *v8 + 640); a1 += v7 - *(_DWORD *)(v4 + 64); *(_DWORD *)(v4 + 64) = 0; } else { memcpy_thunk((int)*SYM + 640); a1 += v7; } v9 = *(_DWORD *)(a0 + 20) >> 3; v10 = 0; v11 = (int)*SYM; while ( v10 < v9 ) { v12 = v9 - v10 + v4; v13 = v11 + v10++; *(_BYTE *)(v13 + 512) = *(_BYTE *)(v12 - 1); } if ( result_set(v16, v7) != 0 ) { v5 = SYM; LABEL_13: __asm { SVC 0x5F ; '_' } return v5; } v5 = crypto_wait_completion(v16, 1, v14, v15); if ( v5 != 0 ) goto LABEL_13; memcpy_thunk(a3); v6 -= v7; a3 += v7; __asm { SVC 0x5F ; '_' } } if ( v6 != 0 ) { memcpy_thunk(*(_DWORD *)(v4 + 64) + v4 + 48); *(_DWORD *)(v4 + 64) = v6; } return v5; }", "ccp_ctrl_aes_full": "int __fastcall ccp_ctrl_aes_full(int a0, int a1, int a2, int a3, int a4) { return (32 * ((a0 << 13) | (a1 << 8) | (a2 << 7) | a3)) | ccp_flags_to_ctrl(a4) | 0x2000018; }", "cipher_ctx_load": "int __fastcall cipher_ctx_load(int a0, int a1, int a2) { int v3; int *v4; int v5; unsigned int v6; unsigned int i; int v7; int v8; int v9; int v10; int v11; v3 = *(_DWORD *)(a0 + 76); __asm { SVC 0x5E ; '^' } v4 = (int *)SYM; memcpy_thunk((int)*SYM + 640); v5 = *v4; v6 = *(_DWORD *)(a0 + 20) >> 3; for ( i = 0; i < v6; ++i ) { v7 = v6 - i + v3; v8 = v5 + i; *(_BYTE *)(v8 + 512) = *(_BYTE *)(v7 - 1); } if ( result_set(a0 + 40, 16) != 0 ) { v11 = SYM; } else { v11 = crypto_wait_completion(a0 + 40, 1, v9, v10); if ( v11 == 0 ) memcpy_thunk(a1); } __asm { SVC 0x5F ; '_' } return v11; }", "aes_keysize_to_mode": "int __fastcall aes_keysize_to_mode(_DWORD *a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7) { int v8; int v9; BOOL v10; int v11; int v12; int result; v8 = SYM; switch ( a2 ) { case 128: v9 = 0; break; case 192: v9 = 1; break; case 256: v9 = 2; break; default: return v8; } v10 = a3 == 0; v11 = SYM + 9; if ( a4 >= SYM ) return SYM + 9; v12 = *SYM + 512; switch ( a4 ) { case 268435472: if ( a1 != 0 ) result = ccp_desc_aes_keyed(a0, a6, a5, 0, *((_DWORD *)*SYM + 128), v9, v10); else result = ccp_desc_aes_with_iv(a0, a6, a5, 0, v12, v9, v10, 1); break; case 268435728: result = ccp_desc_hash_sha256((int)a0, a6, a5, 0, v12, a7, v9, v10, 1); break; case 268435984: result = ccp_desc_hash_sha384((int)a0, a6, a5, 0, v12, a7, v9, 1); break; default: return SYM + 9; } if ( result != 0 && result != v11 ) return v8; return result; }", "ecc_point_op": "int __fastcall ecc_point_op(int a0, int a1, int a2) { int v3; int v4; int v5; int v6[8]; if ( a2 << 30 != 0 ) return SYM; v3 = SYM << 30; if ( a1 != SYM << 30 && a1 != 0 ) return SYM; *((_DWORD *)*SYM + 1150) = 0; if ( ccp_desc_aes_full(v6, a1, a0, 0, 2, a1, *SYM + 4600, 0, 2, v3, a2, 1) != 0 ) return SYM - 6; else return crypto_wait_completion((int)v6, 1, v4, v5); }", "ccp_ctrl_clear_flags": "int __fastcall ccp_ctrl_clear_flags(unsigned int *a0, int a1) { int v2; unsigned int v3; if ( a0 == nullptr ) return 44; v2 = ccp_flags_to_ctrl(a1); v3 = *a0 & ~v2; *a0 = v3; if ( (v3 & 0x300000) != 0 && (v2 & 8) != 0 ) *a0 = v3 & 0xFFFFEFFF; return 0; }", "queue_flag_set": "int __fastcall queue_flag_set(unsigned int a0) { if ( a0 >= 3 ) return 48; *(_DWORD *)(*(_DWORD *)(SYM + 4 * a0) + 16) = 1; return 0; }", "mac_engine_run": "int __fastcall mac_engine_run(int a0) { int v1; unsigned int v2; int v3; int v4; int v5; int v6; int v7; unsigned int v8; int v9; int v10; int v11; int v12; int v13; int *v14; int v15; unsigned int i; char v16; int v17; unsigned int j; int v18; int v19; int v20; int v21; int v22; int v23[11]; v23[9] = a0; v1 = *(_DWORD *)(a0 + 76); v2 = *(_DWORD *)(a0 + 20) >> 3; v3 = *(_DWORD *)(v1 + 80); __asm { SVC 0x5E ; '^' } v4 = *(_DWORD *)(a0 + 20); v5 = SYM; switch ( v4 ) { case 128: v6 = 0; break; case 192: v6 = 1; break; case 256: v6 = 2; break; default: LABEL_21: v13 = v5; goto LABEL_24; } v7 = v6; if ( v3 == 16 ) { v10 = v1 + 32; } else { v8 = 16 - v3; v9 = v3 + v1; bzero((void *)(v9 + 64), v8); *(_BYTE *)(v9 + 64) = 0x80; v10 = v1 + 48; } if ( ccp_queue_kick(v23, *SYM + 2784, *(unsigned __int8 *)(a0 + 35), 32, 1) != 0 ) goto LABEL_21; v13 = crypto_wait_completion((int)v23, 1, v11, v12); if ( v13 == 0 ) { v14 = (int *)SYM; buf_reverse_inplace((char *)*SYM + 2784, 0x10u); v15 = *v14; for ( i = 0; i < 0x10; ++i ) { v16 = *(_BYTE *)(v1 + i + 64) ^ *(_BYTE *)(v10 + i); v17 = v15 + i; *(_BYTE *)(v17 + 2784) ^= v16; } for ( j = 0; j < v2; ++j ) { v18 = v2 - j + v1; v19 = v15 + j; *(_BYTE *)(v19 + 2752) = *(_BYTE *)(v18 - 1); } v20 = ccp_desc_aes_with_iv(v23, *SYM + 2816, *SYM + 2784, 16, *SYM + 2752, v7, 1, 1); if ( v20 != 0 ) goto LABEL_21; v13 = crypto_wait_completion((int)v23, 1, v21, v22); if ( v13 == 0 ) { memcpy_thunk(v23[10]); *(_DWORD *)(v1 + 80) = 0; } } LABEL_24: __asm { SVC 0x5F ; '_' } return v13; }", "mac_finalize": "int __fastcall mac_finalize(int a0, int a1) { unsigned int v2; int v3; unsigned int v4; int v5; int v6; unsigned int v7; int v8; int v9; int v10; int *v11; int v12; int v13; int v14; unsigned int i; char v15; int v16; int v17; _DWORD *v18; int v19; int v20; int v21; int v22; int v23; int v24; _DWORD v25[8]; _DWORD v26[8]; _DWORD v27[3]; int v28; _DWORD v29[3]; int v30; int v31; v31 = *(_DWORD *)SYM; __asm { SVC 0x5E ; '^' } v2 = *(_DWORD *)(a0 + 20); v3 = SYM; v4 = v2 >> 3; v5 = SYM; switch ( v2 ) { case 0x80u: v6 = 0; break; case 0xC0u: v6 = 1; break; case 0x100u: v6 = 2; break; default: goto LABEL_26; } v7 = 0; v8 = (int)*SYM; while ( v7 < v4 ) { v9 = v4 - v7 + a1; v10 = v8 + v7; v7 = (unsigned __int8)(v7 + 1); *(_BYTE *)(v10 + 2752) = *(_BYTE *)(v9 - 1); } bzero((void *)(v8 + 2784), 0x30u); v11 = SYM; if ( ccp_desc_aes_with_iv(v25, *SYM + 2784, *SYM + 2784, 16, *SYM + 2752, v6, 1, 0) == 0 && ccp_desc_aes_out_thunk(v26, *(unsigned __int8 *)(a0 + 35), *v11 + 2800, 32, 1) == 0 ) { v5 = crypto_wait_completion((int)v25, 2, v12, v13); if ( v5 == 0 ) { memcpy_thunk((int)v27); v14 = LOBYTE(v27[0]) >> 7; for ( i = 0; i < 0xF; i = (unsigned __int8)(i + 1) ) *((_BYTE *)v27 + i) = (2 * *((_BYTE *)v27 + i)) | (*((_BYTE *)v27 + i + 1) >> 7); v15 = 2 * HIBYTE(v28); HIBYTE(v28) *= 2; if ( v14 != 0 ) HIBYTE(v28) = v15 ^ 0x87; v16 = LOBYTE(v27[0]) >> 7; v17 = 0; do { *((_BYTE *)v29 + v17) = (2 * *((_BYTE *)v27 + v17)) | (*((_BYTE *)v27 + v17 + 1) >> 7); v17 = (unsigned __int8)(v17 + 1); } while ( (unsigned __int8)v17 < 0xFu ); HIBYTE(v30) = 2 * HIBYTE(v28); if ( v16 != 0 ) HIBYTE(v30) = (2 * HIBYTE(v28)) ^ 0x87; v18 = (_DWORD *)(a1 + 32); v19 = v27[1]; v20 = v27[2]; v21 = v28; *v18 = v27[0]; v18[1] = v19; v18[2] = v20; v18[3] = v21; v18 += 4; v22 = v29[1]; v23 = v29[2]; v24 = v30; *v18 = v29[0]; v18[1] = v22; v18[2] = v23; v18[3] = v24; if ( ccp_desc_aes_xts((int *)(a0 + 40), *v11 + 2784, 0, *v11 + 2752, v6, *(unsigned __int8 *)(a0 + 35), 1) != 0 ) v5 = v3; } } LABEL_26: __asm { SVC 0x5F ; '_' } return v5; }", "hash_feed_blocks_alt": "int __fastcall hash_feed_blocks_alt(int a0, int a1, int a2) { int v3; int *v4; int v5; unsigned int v6; unsigned int v7; int v8; unsigned int v9; unsigned int i; int v10; int v11; int v12; int v13; int v14; v3 = *(_DWORD *)(a0 + 76); v4 = (int *)SYM; v5 = 0; v6 = *(_DWORD *)(v3 + 80) + a2; v14 = a0 + 40; while ( v6 > 0x10 ) { __asm { SVC 0x5E ; '^' } v7 = 1024; if ( v6 <= 0x400 ) v7 = (v6 - 1) & 0xFFFFFFF0; if ( *(_DWORD *)(v3 + 80) != 0 ) { memcpy_thunk(*v4 + 2784); memcpy_thunk(*(_DWORD *)(v3 + 80) + *v4 + 2784); a1 += v7 - *(_DWORD *)(v3 + 80); *(_DWORD *)(v3 + 80) = 0; } else { memcpy_thunk(*v4 + 2784); a1 += v7; } v8 = *v4; v9 = *(_DWORD *)(a0 + 20) >> 3; for ( i = 0; i < v9; ++i ) { v10 = v9 - i + v3; v11 = v8 + i; *(_BYTE *)(v11 + 2752) = *(_BYTE *)(v10 - 1); } if ( result_set2(v14, v7) != 0 ) { v5 = SYM; LABEL_13: __asm { SVC 0x5F ; '_' } return v5; } v5 = crypto_wait_completion(v14, 1, v12, v13); if ( v5 != 0 ) goto LABEL_13; v6 -= v7; __asm { SVC 0x5F ; '_' } } if ( v6 != 0 ) { memcpy_thunk(*(_DWORD *)(v3 + 80) + v3 + 64); *(_DWORD *)(v3 + 80) = v6; } return v5; }", "desc_query_and_map": "int __fastcall desc_query_and_map(int a0, int a1, int a2, int a3) { int v4; __asm { SVC 0x78 ; 'x' } v4 = SYM; if ( SYM == nullptr && (unsigned int)a3 >= 0x11FC ) { __asm { SVC 0x5D ; ']' } *SYM[0] = a3; if ( a3 != -1 ) { __asm { SVC 0x5D ; ']' } *SYM[0] = a3 + 1; if ( a3 != -2 ) { __asm { SVC 0x5D ; ']' } *SYM[0] = a3 + 2; if ( a3 != -3 ) { __asm { SVC 0x5D ; ']' } *SYM[0] = a3 + 3; if ( a3 != -4 ) { __asm { SVC 0x5D ; ']' } *SYM[0] = a3 + 4; if ( a3 != -5 ) { __asm { SVC 0x5D ; ']' } *SYM[0] = a3 + 5; if ( a3 != -6 ) { __asm { SVC 0x5D ; ']' } *SYM[0] = a3 + 6; if ( a3 != -7 ) { __asm { SVC 0x79 ; 'y' } *SYM = MEMORY[0]; __asm { SVC 0x79 ; 'y' } *SYM = SYM; __asm { SVC 0x79 ; 'y' } *SYM[0] = SYM; __asm { SVC 0x59 ; 'Y' } *SYM = 129; return secure_channel_setup(130); } } } } } } } } return v4; }", "key_material_reverse": "int __fastcall key_material_reverse(int a0, int a1) { int *v2; int v3; unsigned int i; unsigned int v4; int v5; int v6; int v7; int v8; _DWORD v9[8]; __asm { SVC 0x5E ; '^' } v2 = (int *)SYM; bzero((char *)*SYM + 592, 0x10u); v3 = *v2; for ( i = 0; i < 0x10; ++i ) { v4 = 15 - i; v5 = v3 + i; *(_BYTE *)(v5 + 576) = *(_BYTE *)(a1 + v4); } v6 = SYM; if ( ccp_desc_aes_out_thunk(v9, a0, *SYM + 576, 32, 1) == 0 ) v6 = crypto_wait_completion((int)v9, 1, v7, v8); __asm { SVC 0x5F ; '_' } return v6; }", "mac_feed_blocks": "int __fastcall mac_feed_blocks(int a0, _DWORD *a1, int a2, int a3, int a4) { _DWORD *v5; unsigned int v6; int v7; int v8; _DWORD *v9; _DWORD *v10; int v11; int v12; int v13; int v14; int *v15; int v16; int v17; int v18; unsigned int v19; _DWORD *v20; unsigned int v21; int v22; ccp_desc_t v23; _DWORD v24[8]; unsigned int *v25; v5 = a1; v6 = a1[34] + a3; v7 = 0; v25 = (unsigned int *)(a0 + 40); while ( 1 ) { __asm { SVC 0x5E ; '^' } v8 = 1024; if ( v6 <= 0x400 ) v8 = v6; if ( v5[34] != 0 ) { v9 = SYM; memcpy_thunk((int)*SYM + 1728); v11 = v5[34]; v10 = v5 + 34; memcpy_thunk(v11 + *v9 + 1728); a2 += v8 - *v10; *v10 = 0; v5 = v10 - 34; } else { memcpy_thunk((int)*SYM + 1728); a2 += v8; } v6 -= v8; *(_QWORD *)v5 += (unsigned int)v8; if ( v6 == 0 ) break; if ( result_set_alt((int)v25, v8) != 0 ) goto LABEL_13; v22 = crypto_wait_completion((int)v25, 1, v12, v13); v16 = v22; if ( v22 != 0 ) goto LABEL_26; if ( *((_BYTE *)v5 + 144) != 0 ) { if ( ccp_ctrl_clear_flags(v25, 16) != 0 ) goto LABEL_13; *((_BYTE *)v5 + 144) = 0; } LABEL_24: __asm { SVC 0x5F ; '_' } if ( v6 == 0 ) return v16; } if ( *((_BYTE *)v5 + 144) != 0 ) v7 = 16; v14 = v8; v15 = SYM; if ( ccp_desc_sha(&v23, *SYM + 1728, v14, *v5, *(unsigned __int8 *)(a0 + 35), v5[35], v7) == 0 && ccp_queue_kick(v24, *v15 + 1728, *(unsigned __int8 *)(a0 + 35), *(_DWORD *)(a0 + 12), 1) == 0 ) { v19 = crypto_wait_completion((int)&v23, 2, v17, v18); v16 = v19; if ( v19 != 0 ) goto LABEL_26; v20 = SYM; while ( 1 ) { v21 = *(_DWORD *)(a0 + 12); if ( v21 <= v19 ) break; *(_BYTE *)(a4 + v19) = *(_BYTE *)(v21 - v19 + *v20 + 1727); ++v19; } v5[34] = 0; *v5 = 0; v5[1] = 0; *((_BYTE *)v5 + 144) = 1; goto LABEL_24; } LABEL_13: v16 = SYM; LABEL_26: __asm { SVC 0x5F ; '_' } return v16; }", "crypto_op_begin": "int __fastcall crypto_op_begin(int *a0, int a1) { int v2; _DWORD *v3; int v4; int v5; int *v6; int v7; int v8; int v9; int v10; _DWORD v11[8]; __asm { SVC 0x5E ; '^' } *(_DWORD *)(a1 + 140) = 1; v2 = *a0; v3 = SYM; v4 = v2 - SYM; if ( v2 != SYM ) { if ( v2 <= SYM ) { switch ( v2 ) { case 805306370: goto LABEL_11; case 805306371: goto LABEL_10; case 805306372: goto LABEL_13; case 805306373: goto LABEL_14; case 805306374: goto LABEL_15; default: goto LABEL_8; } } switch ( v4 ) { case 1: LABEL_10: *(_DWORD *)(a1 + 140) = 2; break; case 2: LABEL_13: *(_DWORD *)(a1 + 140) = 3; break; case 3: LABEL_14: *(_DWORD *)(a1 + 140) = 4; break; case 4: LABEL_15: *(_DWORD *)(a1 + 140) = 5; break; default: LABEL_8: v5 = SYM; goto LABEL_21; } } LABEL_11: memcpy_thunk(*v3 + 1664); v6 = SYM; v7 = SYM - 10; v5 = SYM - 10; if ( ccp_queue_ready(v11, *((unsigned __int8 *)a0 + 35), *SYM + 1664, *(_DWORD *)(a1 + 140), 1) == 0 ) { v10 = crypto_wait_completion((int)v11, 1, v8, v9); v5 = v10; if ( v10 == 0 ) { if ( ccp_desc_sha_init( (ccp_desc_t *)(a0 + 10), *v6 + 1728, 0, *((unsigned __int8 *)a0 + 35), *(_DWORD *)(a1 + 140), 17) != 0 ) v5 = v7; else *(_BYTE *)(a1 + 144) = 1; } } LABEL_21: __asm { SVC 0x5F ; '_' } return v5; }", "hash_feed_blocks": "int __fastcall hash_feed_blocks(int a0, int a1, int a2, int a3) { int v4; _DWORD *v5; unsigned int v6; int v7; int v8; int v9; int v10; unsigned int *v11; int v12; v4 = 0; v5 = SYM; v6 = *(_DWORD *)(a1 + 136) + a3; v11 = (unsigned int *)(a0 + 40); v12 = a1 + 8; while ( v6 >= 0x80 ) { __asm { SVC 0x5E ; '^' } v7 = 1024; if ( v6 <= 0x400 ) v7 = v6 & 0x780; if ( *(_DWORD *)(a1 + 136) != 0 ) { memcpy_thunk(*v5 + 1728); memcpy_thunk(*(_DWORD *)(a1 + 136) + *v5 + 1728); v8 = *(_DWORD *)(a1 + 136); *(_DWORD *)(a1 + 136) = 0; a2 += v7 - v8; } else { memcpy_thunk(*v5 + 1728); a2 += v7; } v6 -= v7; *(_QWORD *)a1 += (unsigned int)v7; if ( result_set_alt((int)v11, v7) != 0 ) { LABEL_8: v4 = SYM; LABEL_10: __asm { SVC 0x5F ; '_' } return v4; } v4 = crypto_wait_completion((int)v11, 1, v9, v10); if ( v4 != 0 ) goto LABEL_10; if ( *(_BYTE *)(a1 + 144) != 0 ) { if ( ccp_ctrl_clear_flags(v11, 16) != 0 ) goto LABEL_8; *(_BYTE *)(a1 + 144) = 0; } __asm { SVC 0x5F ; '_' } } if ( v6 != 0 ) { memcpy_thunk(*(_DWORD *)(a1 + 136) + v12); *(_DWORD *)(a1 + 136) = v6; } return v4; }", "queue_descriptor_thunk": "int __fastcall queue_descriptor_thunk(unsigned int a0, _DWORD *a1, int a2, unsigned int a3, _DWORD *a4, int *a5) { return queue_descriptor_get(a0, a1, a2, a3, a4, (unsigned int *)a5, 1); }", "queue_descriptor_thunk2": "int __fastcall queue_descriptor_thunk2(unsigned int a0, _DWORD *a1, int a2, unsigned int a3) { return queue_descriptor_thunk(a0, a1, a2, a3, nullptr, nullptr); }", "crypto_queue_prepare": "int __fastcall crypto_queue_prepare(int a0, int *a1, int a2, int a3) { int result; result = queue_descriptor_thunk2(a0, a1, a2, a3); if ( result == 0 ) return ccp_queue_submit_one(); return result; }", "rand_fill_bytes": "int __fastcall rand_fill_bytes(_BYTE *a0, unsigned int a1, int a2, int a3) { int v4; unsigned int v5; unsigned int i; unsigned int v6; v6 = a3; v4 = SYM; while ( a1 >= 4 ) { if ( ccp_trng_read32(&v6) != 0 ) return v4; v5 = v6; *a0 = HIBYTE(v6); a0[1] = BYTE2(v5); a0[2] = BYTE1(v5); a0[3] = v5; a0 += 4; a1 -= 4; } if ( ccp_trng_read32(&v6) != 0 ) return v4; for ( i = 0; i < a1; ++i ) a0[i] = v6 >> (8 * i); return 0; }", "queue_slot_info": "int __fastcall queue_slot_info(unsigned int a0, _DWORD *a1, int *a2) { int v3; int v4; *a1 = 0; *a2 = 0; if ( a0 >= 3 ) return 48; v3 = desc_field_get(*(_DWORD *)(SYM + 4 * a0), a0); v4 = SYM; *a2 = v3; *a1 = *(_DWORD *)(v4 - 84 + 28 * a0 + 24); return 0; }", "queue_base_get": "_DWORD *__fastcall queue_base_get(_DWORD *result, _DWORD *a0) { char *v1; v1 = SYM; if ( a0 != nullptr ) *a0 = *(_DWORD *)(*((_DWORD *)SYM + 1) + 16428); if ( result != nullptr ) *result = *(_DWORD *)(*((_DWORD *)v1 + 1) + 16424); return result; }", "ccp_key_slot_default": "int __fastcall ccp_key_slot_default() { int *v0; ccp_resolve_key_slot(2, SYM); v0 = SYM - 2; v0[3] = 1; v0[4] = 3; return 0; }", "ccp_base_set": "int __fastcall ccp_base_set(int a0) { int v1; unsigned int i; *((_DWORD *)SYM + 1) = a0; ccp_flags_or(1); v1 = SYM; for ( i = 0; i < 3; ++i ) *(_DWORD *)(v1 + 4 * i) = a0 + (i << 12) + 4096; return ccp_key_slot_default(); }", "ccp_queue_config": "int __fastcall ccp_queue_config(unsigned int a0, int a1, unsigned int a2, unsigned int a3) { unsigned int v4; _DWORD *v5; char *v6; unsigned int *v7; if ( ccp_is_enabled() == 0 ) return 49; if ( a3 < 4 || (a3 & (a3 - 1)) != 0 ) return 50; v4 = __clz(__rbit32(a3)); if ( __clz(__rbit32(a2)) < v4 + 5 ) return 46; if ( a0 >= 3 ) return 48; v5 = (_DWORD *)(SYM + 28 * a0); v5[3] = 0; v5[4] = a3; v5[5] = 0; v5[6] = 0; v6 = SYM; v5[1] = a2; v5[2] = a1; if ( *((_DWORD *)v6 + 4) != 1 ) *(_DWORD *)(*((_DWORD *)v6 + 1) + 4) = 6 << (3 * a0); v7 = *(unsigned int **)(SYM + 84 + 4 * a0); *v7 &= ~1u; v7[2] = a2; v7[1] = a2; *v7 = (8 * v4 - 8) | (4 * *((_DWORD *)v6 + 3)); v7[3] = 3; return 0; }", "ccp_flags_or": "int __fastcall ccp_flags_or(int a0) { int result; result = a0 | (unsigned __int8)*SYM; *SYM = result; return result; }", "ccp_queue_reset": "int __fastcall ccp_queue_reset() { int v0; _DWORD *v1; int v2; v0 = 0; if ( ccp_is_enabled() == 0 ) return 49; v1 = *((_DWORD **)SYM + 1); *v1 = 0; v1[1] = -1; v1[2] = 292; v1[13] = 0; v1[14] = 1; v1[23] = 0; v1[24] = 0; v1[25] = 0; v1[26] = 0; v1[27] = 0; v1[28] = 0; v1[29] = 0; v1[30] = 0; ccp_enable_write(); *(_DWORD *)(v2 + 0x4000) = 1; return v0; }", "rsa_modexp": "int __fastcall rsa_modexp(int a0, unsigned int a1, int a2, unsigned int a3, int a4, unsigned int a5, int a6, int a7) { unsigned int keysize; unsigned int v8; unsigned int v9; int v10; int v11; int v12; unsigned int v13; ccp_desc_t d; int v14; unsigned int v15; int v16; unsigned int v17; v14 = a0; v15 = a1; v16 = a2; v17 = a3; if ( a1 < 0x20 || a1 << 27 != 0 ) keysize = (a1 + 31) & 0xFFFFFFE0; else keysize = a1; if ( a5 > a1 || a3 > a1 ) return SYM; if ( keysize > 0x200 || a3 > 0x200 ) return SYM; __asm { SVC 0x5E ; '^' } bzero((void *)::a0, 2 * keysize); bzero((void *)::a2, 2 * keysize); memcpy_thunk(::a0); memcpy_thunk(::a2); v8 = 0; v9 = ::a0 + keysize; while ( v8 < a5 ) { *(_BYTE *)(v9 + v8) = *(_BYTE *)(a5 - v8 + a4 - 1); ++v8; } v10 = 1; if ( a3 > 4 && a7 == 0 ) v10 = 9; if ( ccp_desc_rsa(&d, *SYM[0] + keysize, *SYM, keysize, keysize, *SYM[0], v10) != 0 ) { v11 = SYM - 6; } else { __asm { SVC 0x68 ; 'h' } v12 = ::a2; __asm { SVC 0x68 ; 'h' } v13 = crypto_wait_completion((int)&d, 1, ::a2, 2 * keysize); v11 = v13; if ( v13 == 0 ) { while ( v13 < a1 ) { *(_BYTE *)(a6 + v13) = *(_BYTE *)(a1 - v13 + v12 + keysize - 1); ++v13; } } } __asm { SVC 0x5F ; '_' } return v11; }", "ccp_ctrl_passthru": "int __fastcall ccp_ctrl_passthru(int a0, int a1) { return ccp_flags_to_ctrl(a1) | 0x18 | (32 * a0) | 0x500000; }", "ccp_queue_submit_one": "int __fastcall ccp_queue_submit_one() { int v0; int v1; return ccp_queue_submit(v0, v1, 1); }", "ccp_ring_doorbell": "int __fastcall ccp_ring_doorbell(int result, int a0) { char *v1; v1 = SYM; *(_DWORD *)(*((_DWORD *)SYM + 1) + 16420) = a0; *(_DWORD *)(*((_DWORD *)v1 + 1) + 16416) = result; return result; }", "ccp_ctrl_sha": "int __fastcall ccp_ctrl_sha(int a0, int a1) { int result; result = a1 | (a0 << 15) | 0x300000; if ( (a1 & 8) != 0 ) return result | 0x1000; return result; }", "alg_to_engine_params": "int __fastcall alg_to_engine_params(int *a0, unsigned int *a1) { int result; int v2; int v3; int v4; int v5; unsigned int v6; int v7; int v8; unsigned int v9; unsigned int v10; int v11; result = 0; v2 = *a0; v3 = *a0 - SYM; if ( v3 == 0 ) goto LABEL_32; if ( *a0 > SYM ) { v4 = v2 - SYM; if ( v2 != SYM ) { if ( v2 > SYM ) { v5 = v2 + SYM; if ( v5 != 0 ) { if ( v5 != 15 && v5 != 16 ) return SYM; LABEL_59: v11 = a0[1]; if ( v11 != 192 && v11 != 224 && v11 != 256 && v11 != 384 && v11 != 521 ) return SYM; v9 = 320; goto LABEL_66; } if ( (unsigned int)(a0[1] - 256) <= 0x700 ) { v9 = 1148; goto LABEL_66; } } else { if ( v4 != -16777215 ) { if ( v4 != -16777199 && v4 != -16777198 ) return SYM; goto LABEL_59; } if ( a0[1] == 1024 ) { v9 = 644; goto LABEL_66; } } return SYM; } LABEL_32: v6 = a0[1]; if ( v6 != 256 && v6 != 512 && v6 != 768 && v6 != 1024 && v6 != 1536 && v6 != 2048 && v6 != 3072 && v6 != 4096 ) return SYM; v7 = 128; if ( v2 != SYM ) { v9 = ((2304 * v6) >> 12) + 128; goto LABEL_66; } goto LABEL_41; } if ( v3 == -44 ) goto LABEL_45; if ( v3 > -44 ) { if ( v3 == -43 || v3 == -42 ) goto LABEL_45; if ( v3 != -32 ) return SYM; v8 = a0[1]; if ( v8 != 128 && v8 != 192 && v8 != 256 ) return SYM; v9 = 144; LABEL_66: *a1 = v9; return result; } if ( v3 == -48 ) { v6 = a0[1]; if ( v6 > 0x1000 || v6 << 29 != 0 ) return SYM; v7 = 112; LABEL_41: v9 = v7 + (v6 >> 3); goto LABEL_66; } if ( v3 != -46 && v3 != -45 ) return SYM; LABEL_45: v10 = a0[1]; if ( v10 << 29 != 0 || v10 > 0x400 ) return SYM; switch ( v2 + SYM ) { case 0: if ( v10 - 80 > 0x1B0 ) goto LABEL_56; break; case 1: if ( v10 - 112 > 0x190 ) goto LABEL_56; break; case 2: if ( v10 - 192 > 0x340 ) goto LABEL_56; break; case 3: case 4: if ( v10 - 256 > 0x300 ) LABEL_56: result = SYM; break; default: break; } v9 = 240; if ( result == 0 ) goto LABEL_66; return result; }", "buffer_is_zero": "int __fastcall buffer_is_zero(int a0, int a1) { unsigned int v2; unsigned int i; v2 = *(unsigned __int8 *)(a0 + 11); for ( i = 0; v2 > i; i = (unsigned __int8)(i + 1) ) { if ( *(_BYTE *)(a1 + i) != 0 ) return 0; } return 1; }", "boot_mode_select": "int __fastcall boot_mode_select() { int v0; BOOL v1; int v2; int v3; BOOL v4; int v5; int v6; int v7; int v8; v0 = 3; v1 = is_boot_stage(1); v2 = SYM; v3 = 3; if ( !v1 ) { if ( is_boot_stage(2) ) { mbox_set_ready32(); return v0; } if ( is_boot_stage(32) ) { mbox_fault_report(); return v0; } v4 = is_boot_stage(33); if ( v4 ) { boot_mode_query(v4); return v0; } if ( !is_boot_stage(5) ) { if ( !is_boot_stage(6) ) { if ( is_boot_stage(7) ) { v8 = 7; } else if ( is_boot_stage(9) ) { v8 = 9; } else if ( is_boot_stage(8) ) { v8 = 8; } else if ( is_boot_stage(11) ) { v8 = 11; } else { if ( !is_boot_stage(10) ) return v0; v8 = 10; } log_ring_update(v8, v5, v6, v7); return v0; } return 2; } } v0 = 1; *(_DWORD *)(v2 + 8) = v3; return v0; }", "boot_path_select": "int __fastcall boot_path_select() { int v0; int v1; v0 = 0; v1 = boot_mode_select(); if ( v1 == 1 ) return provision_begin(); if ( v1 == 2 ) return SYM; return v0; }", "alg_key_size_check": "int __fastcall alg_key_size_check(int a0, int a1) { int v2; int v3; int v4; int v5; v2 = 0; v3 = a0 - SYM; if ( a0 == SYM ) { LABEL_21: if ( a1 == 8 ) return v2; return SYM; } if ( a0 > SYM ) { if ( v3 != 765 ) { if ( v3 > 765 ) { v5 = v3 - 765 + SYM; if ( v5 != 0 && v5 != 256 ) return SYM + 4; } else if ( v3 != 253 && v3 != 509 ) { return SYM + 4; } } LABEL_19: if ( a1 == 16 ) return v2; return SYM; } v4 = a0 - SYM; if ( a0 != SYM ) { if ( a0 <= SYM ) { if ( (unsigned int)(a0 - 268435472) <= 1 ) return v2; return SYM + 4; } if ( v4 != 253 ) { if ( v4 == 254 ) goto LABEL_21; return SYM + 4; } goto LABEL_19; } return v2; }", "crypto_validate_algorithm": "int __fastcall crypto_validate_algorithm(_DWORD *a0, int a1) { int result; int v2; int v3; int v4; int v5; int v6; int v7; int v8; int v9; int v10; bool v11; int v12; int v13; int v14; int v15; int v16; int v17; int v18; int v19; int v20; unsigned int v21; int v22; int v23; int v24; int v25; unsigned int v26; int v27; int v28; int v29; int v30; result = 0; v2 = 0; v3 = 0; v4 = a0[1]; v5 = 0; v6 = 0; v7 = v4 - SYM; if ( v4 == SYM ) goto LABEL_102; if ( v4 > SYM ) { v8 = 3072; v15 = v7 - SYM; if ( v7 != SYM ) { if ( v7 <= SYM ) { v16 = v7 - SYM; if ( v7 != SYM ) { if ( v7 > SYM ) { if ( v16 != 0x100000 && v16 != 0x200000 && v16 != 3145728 ) { if ( v16 + SYM != 0 || a0[3] != 1024 || a0[2] != 3 ) return SYM; v3 = 7; v30 = 532; goto LABEL_153; } } else { v17 = v7 - SYM; if ( v7 == SYM ) { v21 = a0[3]; if ( v21 - 256 <= 0xF00 ) { v28 = a0[2]; if ( v28 != 0 ) { if ( v28 != 1 ) return SYM; v2 = 20; } else { v2 = 34; } goto LABEL_161; } return SYM; } if ( v7 <= SYM ) { if ( v7 != 1 ) { v11 = v7 == 2; if ( v7 != 2 ) goto LABEL_11; } goto LABEL_102; } if ( v17 != 256 && v17 + SYM != 0 ) return SYM; } } v21 = a0[3]; if ( v21 - 1024 <= 0xC00 ) { v29 = a0[2]; if ( v29 != 0 ) { if ( v29 != 1 ) return SYM; v2 = 4; } else { v2 = 2; } LABEL_161: v3 = 6; LABEL_152: v30 = 9 * (v21 >> 4) + 16; goto LABEL_153; } return SYM; } v18 = v15 - SYM; if ( v15 != SYM ) { if ( v15 > SYM ) { if ( v18 + SYM != 0 ) { v19 = v18 + SYM + SYM; if ( v19 != 0 ) { v20 = v19 + SYM; if ( v20 != 0 && v20 + SYM != 0 ) return SYM; } } } else if ( v15 != 0x2000 ) { if ( v15 > 0x2000 ) { if ( v15 != 12288 && v15 != 0x4000 ) return SYM; } else if ( v15 != 4096 ) { if ( v15 != 6162 || a0[3] > 0x180u ) return SYM; v3 = 7; v30 = 208; goto LABEL_153; } } } } v21 = a0[3]; if ( v21 - 1024 > 0xC00 ) return SYM; v22 = a0[2]; if ( v22 == 2 ) { v2 = 16; } else { if ( v22 != 3 ) return SYM; v2 = 32; } v3 = 7; goto LABEL_152; } v8 = 68; v9 = v4 - SYM; if ( v4 == SYM ) goto LABEL_112; if ( v4 <= SYM ) { v10 = v4 - SYM; if ( v4 == SYM ) goto LABEL_93; if ( v4 <= SYM ) { v10 = v4 - SYM; if ( v4 != SYM ) { if ( v4 <= SYM ) { if ( v4 + SYM != 0 ) { v11 = v4 + SYM == -1879048226; goto LABEL_11; } if ( (unsigned int)(a0[3] - 256) > 0x700 || a0[2] != 6 ) return SYM; v3 = 8; v30 = 1036; LABEL_153: *(_DWORD *)(a1 + 72) = v30; goto LABEL_154; } LABEL_16: if ( v10 != 2 ) { v11 = v10 == 255; if ( v10 == 255 ) goto LABEL_79; LABEL_11: if ( !v11 ) return SYM; goto LABEL_79; } if ( (unsigned int)(a0[3] - 112) >= 0x39 ) return SYM; LABEL_98: v24 = a0[2]; if ( v24 != 0 ) { if ( v24 != 1 ) return SYM; v2 = 4; } else { v2 = 2; } LABEL_92: *(_DWORD *)(a1 + 72) = v8; LABEL_154: *(_DWORD *)(a1 + 24) = v2; *(_DWORD *)a1 = a0[1]; *(_DWORD *)(a1 + 4) = v3; *(_DWORD *)(a1 + 8) = a0[2]; *(_DWORD *)(a1 + 16) = a0[3]; *(_DWORD *)(a1 + 20) = 0; *(_DWORD *)(a1 + 28) = v6; *(_DWORD *)(a1 + 12) = v5; *(_DWORD *)(a1 + 80) = 0; return result; } LABEL_93: if ( a0[3] != 56 ) return SYM; goto LABEL_98; } if ( v10 != 511 ) { if ( v10 > 511 ) { v11 = v10 == 767; if ( v10 == 767 ) goto LABEL_79; goto LABEL_11; } goto LABEL_16; } LABEL_79: if ( (unsigned int)(a0[3] - 128) >= 0x81 ) return SYM; v23 = a0[2]; if ( v23 != 0 ) { if ( v23 != 1 ) return SYM; v2 = 4; } else { v2 = 2; } if ( v4 == SYM ) { v2 = 0; v6 = 0x80000; } if ( v4 == SYM || v4 == SYM ) v3 = 4; else v3 = 1; goto LABEL_92; } v12 = v9 - SYM; if ( v9 == SYM ) goto LABEL_79; if ( v9 <= SYM ) { if ( v9 != 3 ) { if ( v9 > 3 ) { if ( v9 != 4 ) { v13 = v9 - 1550; v11 = v13 == 0; if ( v13 != 0 ) goto LABEL_11; } } else if ( v9 != 1 ) { v11 = v9 == 2; if ( v9 != 2 ) goto LABEL_11; } } LABEL_112: v26 = a0[3]; if ( v4 == SYM ) { if ( v26 - 128 >= 0x81 ) return SYM; } else if ( v26 > 0x400 ) { return SYM; } if ( a0[2] != 4 ) return SYM; v27 = v4 - (SYM + 3); if ( v4 == SYM + 3 ) { if ( (unsigned int)(a0[3] - 256) > 0x300 ) goto LABEL_130; v5 = 48; } else { if ( v4 <= SYM + 3 ) { if ( v4 == 805306370 ) { if ( (unsigned int)(a0[3] - 80) <= 0x1B0 ) { v5 = 20; goto LABEL_140; } } else if ( v4 == 805306371 ) { if ( (unsigned int)(a0[3] - 112) <= 0x190 ) { v5 = 28; goto LABEL_140; } } else if ( v4 == 805306372 && (unsigned int)(a0[3] - 192) <= 0x340 ) { v5 = 32; goto LABEL_140; } goto LABEL_130; } if ( v27 != 1 ) { if ( v27 == 1547 ) { v5 = 16; goto LABEL_140; } goto LABEL_130; } if ( (unsigned int)(a0[3] - 256) > 0x300 ) { LABEL_130: result = SYM; goto LABEL_140; } v5 = 64; } LABEL_140: v2 = 8; v3 = 3; if ( v4 == SYM ) v25 = 84; else v25 = 696; goto LABEL_143; } if ( v12 == 256 ) goto LABEL_79; v14 = v12 + SYM; if ( v14 == 0 ) return SYM; if ( v14 != 1 ) { v11 = v14 == 2; if ( v14 != 2 ) goto LABEL_11; } LABEL_102: if ( a0[2] != 5 || a0[3] != 0 ) return SYM; switch ( v4 ) { case 1342177282: v5 = 20; break; case 1342177283: v5 = 28; break; case 1342177284: v5 = 32; break; case 1342177285: v5 = 48; break; case 1342177286: v5 = 64; break; default: result = SYM; break; } v25 = 360; v3 = 5; v6 = 393216; LABEL_143: *(_DWORD *)(a1 + 72) = v25; if ( result == 0 ) goto LABEL_154; return result; }", "object_usage_check": "int __fastcall object_usage_check(int a0) { int result; result = SYM; if ( (*(_DWORD *)(*(_DWORD *)(a0 + 4) + 108) & 0x30000) != 0 ) return 0; return result; }", "flag_pair_check": "int __fastcall flag_pair_check(int a0, int a1) { int v2; int v3; v2 = a0 | a1; v3 = SYM; if ( ((a0 | a1) & 4) == 0 && (v2 << 31 == 0 || (a0 & 0x10) != 0 && (a1 & 0x10) != 0) && ((v2 & 2) == 0 || (a0 & 0x20) != 0 && (a1 & 0x20) != 0) && a0 << 31 == a1 << 31 && (a0 & 2) == (a1 & 2) ) { return 0; } return v3; }", "opcode_range_find": "int __fastcall opcode_range_find(unsigned int a0) { int v1; v1 = 0; while ( (*SYM)[3 * v1] > a0 || (*SYM)[3 * v1 + 1] < a0 ) { if ( (unsigned int)++v1 >= 0xB ) { __asm { SVC 0x76 ; 'v' } return 0; } } __asm { SVC 0x76 ; 'v' } if ( (*SYM)[3 * v1 + 2] == 0 ) return SYM; return 0; }", "id_in_list": "int __fastcall id_in_list(int a0, int *a1) { int v2; unsigned int v3; unsigned int i; v2 = *a1; if ( *a1 != 0 ) { v3 = a1[1]; if ( v3 != 0 ) { for ( i = 0; v3 > i; ++i ) { if ( *(_DWORD *)(v2 + 4 * i) == a0 ) return 1; } } } return 0; }", "client_perm_check": "int __fastcall client_perm_check(unsigned int a0) { int v1; char v2; int current_client_id; unsigned int *v3; int v4; unsigned int i; v1 = 0; v2 = a0; if ( a0 <= 0x18 ) { current_client_id = get_current_client_id(); if ( current_client_id != 0 ) { v3 = (unsigned int *)(current_client_id + 256); v4 = current_client_id + 320; if ( v3[4] == 256 ) { for ( i = 0; *v3 > i; ++i ) { if ( ((1 << v2) & (*(_DWORD *)v4 >> 8)) != 0 && *(_WORD *)(v4 + 6) != 0 ) return 1; v4 += 12 + 8 * *(unsigned __int16 *)(v4 + 4) + 8 * *(unsigned __int16 *)(v4 + 6); } } } } return v1; }", "attr_permits_usage": "int __fastcall attr_permits_usage(int a0, unsigned int a1, char a2, unsigned int a3, char a4) { int v5; v5 = SYM; if ( a1 <= a3 && ((a2 & 2) != 0 && (a4 & 2) != 0 || ((a2 & 8) != 0 && (a4 & 8) != 0 || (a2 & 0x20) != 0 && (a4 & 0x20) != 0 && *((_DWORD *)SYM + 2) > 1u) && reg_allowlist_mode_gate() != 0) ) { return 0; } else { return v5; } }", "same_reg_group": "BOOL __fastcall same_reg_group(int a0, int a1) { return a0 == a1 || a0 >> 2 == a1 >> 2; }", "mp_wait_response": "int __fastcall mp_wait_response(int a0, int a1, int a2, int a3) { unsigned __int8 *v4; int v5; unsigned int v6; int result; int v7; int v8; int v9; v9 = a3; v4 = (unsigned __int8 *)SYM; v5 = 0; v6 = SYM; while ( 1 ) { result = mp_send_request(v4[32], 0, 0, (int)&v9, 1u); if ( result != 0 ) break; v7 = v4[11]; v8 = v4[12] == 1 ? (unsigned __int8)(v7 & v9) : v7 & ~(unsigned __int8)v9; if ( v8 != 0 ) break; if ( ++v5 > v6 ) return SYM; delay_us(1); } return result; }", "session_table_scan": "int __fastcall session_table_scan(int a0) { int v1; unsigned int i; unsigned int v2; int result; v1 = SYM; for ( i = 0; i < 0x20; ++i ) { v2 = v1 + 84 * i; result = *(unsigned __int8 *)(v2 + 34); if ( result == a0 ) { result = *(unsigned __int8 *)(v2 + 32); if ( result == 1 ) { result = session_release_buffers(v1 + 84 * i); *(_BYTE *)(v2 + 34) = 0; *(_BYTE *)(v2 + 32) = 0; } } } return result; }", "desc_table_find": "int __fastcall desc_table_find(int a0) { int v1; unsigned int i; unsigned int v2; int v3; unsigned int j; int result; v1 = SYM; for ( i = 0; i <= 0xFF; ++i ) { v2 = v1 + 8 * i; if ( *(unsigned __int8 *)(v2 + 1) == a0 && *(_BYTE *)v2 == 1 ) { *(_DWORD *)(v2 + 4) = 0; *(_BYTE *)(v2 + 1) = 0; *(_BYTE *)v2 = 0; } } v3 = SYM; for ( j = 0; j <= 0xFF; ++j ) { result = v3 + 16 * j; if ( *(unsigned __int8 *)(result + 1) == a0 ) { result = *(unsigned __int8 *)result; if ( result == 1 ) result = object_slot_release(j + 16); } } return result; }", "bit_scan_count": "unsigned int __fastcall bit_scan_count(unsigned int result) { int v0; int v1; _DWORD *v2; v0 = SYM; v1 = 0; while ( result != 0 ) { if ( result << 31 != 0 ) { v2 = (_DWORD *)(v0 + 8 * v1); *v2 = 0; v2[1] = 0; } result >>= 1; ++v1; } return result; }", "clock_domain_config": "int __fastcall clock_domain_config(int a0) { char v1; int result; int v2; v1 = a0; if ( a0 << 31 != 0 ) { __asm { SVC 0xA6 } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } } result = a0 << 30; if ( (v1 & 2) != 0 ) { result = SYM; __asm { SVC 0x7D ; '}' } v2 = SYM; if ( SYM != 0 ) { __asm { SVC 0x79 ; 'y' } ecc_point_op(SYM, 0, 0x80000); __asm { SVC 0x7E ; '~' } return v2; } } return result; }", "opcode_group_index": "int __fastcall opcode_group_index(int a0) { int v1; int v2; int v3; int v4; int result; if ( (unsigned int)(a0 - 768) <= 0x18 ) { v1 = 0; } else if ( (unsigned int)(a0 - 800) <= 0x18 ) { v1 = 1; } else if ( (unsigned int)(a0 - 832) <= 0x18 ) { v1 = 2; } else if ( (unsigned int)(a0 - 864) <= 0x18 ) { v1 = 3; } else if ( (unsigned int)(a0 - 896) <= 0x18 ) { v1 = 4; } else { if ( (unsigned int)(a0 - 928) > 0x18 ) { result = SYM + (a0 << 12); goto LABEL_16; } v1 = 5; } v2 = a0 << 12; if ( a0 == 778 || a0 == 810 || a0 == 842 || a0 == 874 || a0 == 906 || a0 == 938 ) { v3 = v2 - (v1 << 17) + (v1 << 25); v4 = SYM; } else { v3 = v2 - (v1 << 17) + (v1 << 25); v4 = SYM; } result = v3 + v4; LABEL_16: __asm { SVC 0x7C ; '|' } return result; }", "boot_stage_advance": "int __fastcall boot_stage_advance() { if ( platform_state_get(0) ) nop_hook_boot(); feature_regs_apply(); return clock_domain_config(3); }", "feature_regs_apply": "int __fastcall feature_regs_apply() { unsigned int i; int result; unsigned int j; for ( i = 0; i < 0x18; ++i ) { result = feature_enabled(0, i >> 2); if ( result != 0 ) { __asm { SVC 0x7C ; '|' } for ( j = 0; j < 4; ++j ) { result = (*SYM)[i + 24]; __asm { SVC 0x7C ; '|' } } } } return result; }", "nop_hook_boot": "void __fastcall nop_hook_boot() { ; }", "object_slot_release": "unsigned int __fastcall object_slot_release(int a0) { unsigned int result; int v1; result = handle_to_index(a0); if ( result != -1 ) { result = SYM + 16 * result; if ( *(unsigned __int8 *)(result + 1) == v1 ) { *(_DWORD *)(result + 12) = -1; *(_BYTE *)(result + 1) = 0; *(_BYTE *)result = 0; } } return result; }", "mbox_clear_ready": "void *__fastcall mbox_clear_ready() { void *result; result = *SYM; *((_DWORD *)*SYM + 41) &= ~0x80000000; return result; }", "result_set2": "int __fastcall result_set2(int a0, int a1) { if ( a0 == 0 ) return 44; *(_DWORD *)(a0 + 4) = a1; return 0; }", "key_id_decode": "int __fastcall key_id_decode(unsigned __int8 *a0, unsigned int a1) { int v2; unsigned __int8 *v3; int v4; int v5; int v6; bool v7; int v8; unsigned int v9; _DWORD v10[2]; v2 = 0; v3 = (unsigned __int8 *)v10; v10[0] = 0; v10[1] = 0; if ( a1 < 0x40 ) { v6 = shl_saturating(1, 0, a1); v7 = v6 != 0; v4 = v6 - 1; v5 = v7 + v8 - 1; } else { v4 = -1; v5 = -1; } v10[0] = v4; v10[1] = v5; v9 = 0; while ( *a0 <= (unsigned int)*v3 ) { ++v9; ++v3; ++a0; if ( v9 >= 8 ) return v2; } return SYM; }", "spi_reg_write_a": "int __fastcall spi_reg_write_a() { int v0; __asm { SVC 0x7C ; '|' } v0 = SYM; if ( SYM == 0 ) { __asm { SVC 0x7C ; '|' } v0 = 12; } log_event(8u, 4); log_event(6u, v0); return v0; }", "spi_reg_write_b": "int __fastcall spi_reg_write_b() { int v0; __asm { SVC 0x7C ; '|' } v0 = SYM; if ( SYM == 0 ) { __asm { SVC 0x7C ; '|' } v0 = 12; } log_event(8u, 6); log_event(6u, v0); return v0; }", "spi_reg_read": "int __fastcall spi_reg_read() { int v0; __asm { SVC 0x7B ; '{' } v0 = SYM; if ( SYM == 0 ) { __asm { SVC 0x7B ; '{' } v0 = 12; } log_event(8u, 5); log_event(6u, v0); return v0; }", "crc16_ccitt": "int __fastcall crc16_ccitt(unsigned __int8 *a0, int a1) { int v2; int i; v2 = 0; while ( a1 != 0 ) { v2 ^= *a0 << 8; for ( i = 8; i != 0; --i ) { if ( (v2 & 0x8000) != 0 ) v2 ^= 0x8380u; v2 *= 2; } ++a0; --a1; } return BYTE1(v2); }", "ccp_ctrl_aes_mode": "int __fastcall ccp_ctrl_aes_mode(int result, int a0, int a1) { if ( a1 == 1 ) *(_QWORD *)&result *= 32LL; return result; }", "spi_find_sector_desc": "int __fastcall spi_find_sector_desc(int *a0, int a1, int a2, int a3) { unsigned int v4; int v5; int v6; unsigned int v7; int v8; unsigned int v9; unsigned __int8 *v10; unsigned __int8 *v11; unsigned int v12; unsigned __int8 *v13; int v14; int v15; int v16; int v17; v15 = a1; v16 = a2; v17 = a3; v17 = *(_DWORD *)SYM; v4 = 0; v15 = 0; v16 = 0; v5 = 0; v6 = *a0; v7 = 0; v8 = 0; if ( v6 != 0 ) { v9 = v6 - 1; } else { v5 = a0[1]; v9 = -1; } v10 = *((unsigned __int8 **)SYM + 1); while ( v10[34] > v7 ) { v11 = &v10[12 * v7]; if ( *((unsigned __int16 *)v11 + 44) == v5 ) { v12 = *((unsigned __int16 *)v11 + 45); if ( v12 <= v9 && (v8 == 0 || v12 > *(unsigned __int16 *)&v10[12 * v4 + 90]) ) { v8 = 1; v4 = v7; } } ++v7; } if ( v8 != 0 ) { v13 = &v10[12 * v4]; LOBYTE(v15) = v13[80]; BYTE1(v15) = v13[84]; } LOBYTE(v16) = v10[36]; BYTE1(v16) = v10[40]; v14 = spi_program_verified((unsigned __int8 *)&v15, (int)&v16, 2u, v8); if ( v14 != 0 ) { log_event(8u, 11); log_event(7u, *a0); log_event(7u, a0[1]); log_event(6u, v14); } return v14; }", "vf_reg_setup": "int __fastcall vf_reg_setup(int a0) { int v1; __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } error_for_mode(a0); __asm { SVC 0x7C ; '|' } return v1; }", "vf_reg_enable": "int __fastcall vf_reg_enable(int a0) { __asm { SVC 0x7C ; '|' } __asm { SVC 0xA6 } return SYM + 4 + (a0 << 12); }", "vf_reg_init": "int __fastcall vf_reg_init(int a0) { int v1; int result; v1 = SYM + 4 + (a0 << 12); if ( *((_DWORD *)SYM + 142) == 3 ) { __asm { SVC 0x7C ; '|' } result = SYM + 4 + (a0 << 12); } else { result = debug_allowed(); if ( result == 0 ) return result; __asm { SVC 0x7C ; '|' } result = v1; } __asm { SVC 0x7C ; '|' } return result; }", "record_copy_tail": "_BYTE *__fastcall record_copy_tail(int a0, int a1, int a2) { memcpy_thunk(a0); return bzero((void *)(*(_DWORD *)(a1 + 68) + a0), a2 - *(_DWORD *)(a1 + 68)); }", "copy_dual_record": "_BYTE *__fastcall copy_dual_record(int a0, int a1, int a2) { record_copy_tail(a0, a1, a2); return record_copy_tail(a0 + 72, a1 + 72, a2); }", "bn_to_bytes_be": "int __fastcall bn_to_bytes_be(int a0, unsigned int a1, int a2, unsigned int *a3, _DWORD *a4, unsigned int a5, int a6) { int v7; _DWORD *param_by_id; unsigned int v8; int v9; unsigned int i; v7 = SYM; param_by_id = find_param_by_id(a4, a5, a2, a6); if ( param_by_id != nullptr ) { v8 = param_by_id[2]; if ( v8 <= a1 ) { v9 = param_by_id[1]; for ( i = 0; i < v8; ++i ) *(_BYTE *)(a0 + i) = *(_BYTE *)(v8 - i + v9 - 1); if ( a3 != nullptr ) *a3 = v8; return 0; } } return v7; }", "page_map_read_qword": "int __fastcall page_map_read_qword(unsigned int a0, int a1, int a2, int a3) { _QWORD *v4; _QWORD *v5; __int64 v6; _DWORD *v7; int v8; v8 = a3; v4 = (_QWORD *)map_page_and_flush(a0, a1, (unsigned int *)&v8); v5 = v4; if ( v4 == nullptr ) return SYM; v6 = v4[1]; v7 = (_DWORD *)SYM; if ( *v4 != 0 && *((_QWORD *)SYM + 273) == *v4 || v6 != 0 && *((_QWORD *)SYM + 274) == v6 ) v7 = nullptr; if ( v7 == nullptr ) { v7 = j_enum_pending_procs_1((int)(v4 + 4), 4316, a2); if ( *((_WORD *)v5 + 16) == 5424 ) v7 = j_enum_pending_procs_0((int)v5 + 4836, 620, a2 + 4804); __asm { SVC 0x63 ; 'c' } } return (int)v7; }", "map_region_pages": "int __fastcall map_region_pages(int a0, unsigned int a1, int a2) { int v3; unsigned int v4; int v5; int v6; unsigned int i; v3 = 0; v4 = (a0 | a1) << 20; if ( v4 != 0 ) { v5 = SYM; LABEL_9: v3 = v5; } else { __asm { SVC 0x73 ; 's' } v6 = (unsigned __int8)v4 + a0; for ( i = 0; i < a1 >> 12; ++i ) { __asm { SVC 0x88 } if ( v6 + (i << 12) == 0 ) { v5 = SYM - 6; goto LABEL_9; } memcpy_thunk(a2 + (i << 12)); __asm { SVC 0x63 ; 'c' } } } __asm { SVC 0x68 ; 'h' } return v3; }", "j_enum_pending_procs": "_DWORD *__fastcall j_enum_pending_procs(int a0, int a1, int a2) { return (_DWORD *)enum_pending_procs(a0, a1, a2); }", "copy_maybe_reverse": "int __fastcall copy_maybe_reverse(int a0, unsigned int *a1, int a2, unsigned int a3, int a4) { unsigned int i; if ( *a1 < a3 ) return SYM; if ( a4 != 0 ) { for ( i = 0; i < a3; ++i ) *(_BYTE *)(a0 + i) = *(_BYTE *)(a3 - i + a2 - 1); } else { memcpy_thunk(a0); } *a1 = a3; return 0; }", "queue_descriptor_get": "int __fastcall queue_descriptor_get( unsigned int a0, _DWORD *a1, int a2, unsigned int a3, _DWORD *a4, unsigned int *a5, int a6) { unsigned int v7; unsigned int v8; __int64 v9; unsigned int v10; int v11; int v12; unsigned int v13; if ( a1 == nullptr || a2 == 0 ) return 44; v7 = SYM + 28 * a0; if ( a0 >= 3 || *(_DWORD *)(v7 + 16) < a3 || a3 == 0 ) return 48; v8 = *(_DWORD *)(v7 + 20) + a3; *(_DWORD *)(v7 + 20) = v8; *a1 = v8 - 1; v9 = *(_QWORD *)(v7 + 12); v10 = HIDWORD(v9) - v9; v11 = *(_DWORD *)(v7 + 8) + 32 * v9; v12 = v11; if ( v10 >= a3 ) { memcpy_thunk(v11); if ( a5 != nullptr ) { v13 = v12 + 32 * a3; goto LABEL_13; } } else { memcpy_thunk(v11); memcpy_thunk(*(_DWORD *)(v7 + 8)); if ( a5 != nullptr ) { v13 = *(_DWORD *)(v7 + 8) + 32 * (a3 - v10); LABEL_13: *a5 = v13; } } if ( a4 != nullptr ) *a4 = v12; *(_DWORD *)(v7 + 12) = (*(_DWORD *)(v7 + 12) + a3) & (*(_DWORD *)(v7 + 16) - 1); if ( a6 != 0 ) **(_DWORD **)(SYM + 84 + 4 * a0) |= 1u; return 0; }", "enum_pending_procs": "int __fastcall enum_pending_procs(int a0, int a1, int a2) { int result; unsigned int v3; _DWORD v4[6]; unsigned int v5; unsigned int v6; v4[0] = 65533; v5 = 0; v4[2] = 5456; v4[3] = 0; v4[4] = 1; v4[5] = 0xFFFF; v4[1] = SYM; result = (int)v4; __asm { SVC 0x89 } if ( v4 == nullptr ) { v3 = map_page_and_flush(v5, 5456, &v6); if ( v3 != 0 ) { memcpy_thunk(a2 + v3); __asm { SVC 0x68 ; 'h' } __asm { SVC 0x63 ; 'c' } if ( v5 != 0 ) __asm { SVC 0x8A } return (int)v4; } else { return SYM; } } return result; }", "buffer_pair_validate": "int __fastcall buffer_pair_validate(int a0, int a1, int a2) { int v3; int v4; int v5[8]; if ( a0 == 0 || a1 == 0 ) return SYM + 6; __asm { SVC 0x79 ; 'y' } if ( ccp_desc_aes_full(v5, 0, a0, 0, 2, 0, a2, 0, 2, 0, (a1 + 15) & 0xFFFFFFF0, 1) != 0 ) return SYM; else return crypto_wait_completion((int)v5, 1, v3, v4); }", "map_and_flush_range": "int __fastcall map_and_flush_range(int a0, int a1, unsigned int a2, unsigned int a3) { unsigned int v4; v4 = a3; if ( a3 == 0 && map_page_and_flush(a2, a1, &v4) == 0 ) return SYM; memcpy_thunk(a0); __asm { SVC 0x68 ; 'h' } if ( a3 == 0 ) __asm { SVC 0x63 ; 'c' } return 0; }", "ecc_verify_wrapper": "int __fastcall ecc_verify_wrapper(int a0, int a1, int a2, int a3) { int v4; int v5; int v6[8]; if ( ccp_desc_aes_full(v6, a1, a0, 0, 2, a2, a3, 0, 2, 0, a1, 1) != 0 ) return SYM; else return crypto_wait_completion((int)v6, 1, v4, v5); }", "j_enum_pending_procs_0": "_DWORD *__fastcall j_enum_pending_procs_0(int a0, int a1, int a2) { return (_DWORD *)enum_pending_procs(a0, a1, a2); }", "param_types_apply": "void __fastcall param_types_apply(int a0, int a1) { unsigned int i; int v2; unsigned int v3; for ( i = 0; i < 4; ++i ) { v2 = (*(_DWORD *)(a1 + 28) >> (4 * i)) & 0xF; if ( v2 == 6 || v2 == 7 ) { v3 = *(_DWORD *)(a0 + 8 * i); if ( v3 >= *SYM[0] && *SYM - *(_DWORD *)(a0 + 8 * i + 4) > v3 ) memcpy_thunk(v3); } else if ( v2 == 2 || v2 == 3 ) { *(_QWORD *)(a0 + 8 * i) = *(_QWORD *)(a1 + 8 * i + 44); } } }", "j_enum_pending_procs_1": "_DWORD *__fastcall j_enum_pending_procs_1(int a0, int a1, int a2) { return (_DWORD *)enum_pending_procs(a0, a1, a2); }", "range_map_and_verify": "int __fastcall range_map_and_verify(int a0, int a1, unsigned __int64 a2, unsigned __int64 a3, int a4, int a5) { unsigned int *v6; int v7; int v8; unsigned __int64 v9; int *v10; int *v11; int *v12; unsigned int v13; unsigned __int8 v14[8]; int v15; int v16; unsigned __int64 v17; v15 = a0; v16 = a1; v17 = a2; v6 = (unsigned int *)SYM; v7 = a2; v13 = 0; v8 = 1; v12 = nullptr; v14[0] = -1; if ( *(_QWORD *)SYM == 0 ) { __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } v9 = ((unsigned __int64)v13 << 20) + (unsigned int)SYM; *SYM = v9; v6[1] = HIDWORD(v9) - 1; } if ( a2 < 0x400 ) { v8 = map_client_buffer(v6[1], *v6, a2 + 8, v14, &v12, 0, 1, 0xFFFFu); if ( v8 != 0 ) goto LABEL_9; v10 = (int *)((char *)v12 + v7); *v10 = v15; v10[1] = v16; } if ( a3 != 0 && a3 < 0x400 ) { v11 = (int *)((char *)v12 + a3); v12 = v11; *v11 = a4; v11[1] = a5; } LABEL_9: if ( v14[0] != 255 ) __asm { SVC 0x6C ; 'l' } return v8; }", "param_types_scan": "int __fastcall param_types_scan(int a0) { int v1; int v2; int v3; unsigned int v4; int v5; int v6; int v7; __int64 v8; v1 = SYM; v2 = 0; v3 = 0; v4 = 1024; v5 = 0; while ( 1 ) { v6 = (*(_DWORD *)(a0 + 28) >> (4 * v5)) & 0xF; if ( v6 == 5 || v6 == 6 || v6 == 7 ) break; if ( v6 != 0 && v6 != 2 && v6 != 1 && v6 != 3 ) goto LABEL_13; LABEL_24: if ( (unsigned int)++v5 >= 4 ) goto LABEL_25; } v7 = a0 + 8 * v5; v8 = *(_QWORD *)(v7 + 44); if ( (unsigned int)v8 >= *SYM[0] && *SYM[0] - v4 > (unsigned int)v8 ) { if ( HIDWORD(v8) > v4 ) goto LABEL_13; if ( v6 == 5 || v6 == 7 ) memcpy_thunk(a0 + v3 + 76); else bzero((void *)(a0 + v3 + 76), HIDWORD(v8)); v4 -= HIDWORD(v8); *(_DWORD *)(v7 + 44) = v3; v3 += HIDWORD(v8); goto LABEL_24; } if ( (unsigned int)v8 >= *SYM[0] && (unsigned int)v8 < *SYM && (int)v8 + HIDWORD(v8) >= (unsigned int)v8 && (int)v8 + HIDWORD(v8) <= (unsigned int)*SYM ) { goto LABEL_24; } LABEL_13: v2 = v1; LABEL_25: *(_DWORD *)(a0 + 40) = v3; return v2; }", "queue_table_scan": "int __fastcall queue_table_scan() { int v0; unsigned int v1; unsigned int i; unsigned int v2; unsigned int v3; unsigned int v4; unsigned int j; unsigned int v5; unsigned int v6; unsigned int v7; char *v8; const void *v9; v0 = 0; if ( *((_DWORD *)SYM + 417) != SYM ) return SYM; v1 = *((_DWORD *)SYM + 418); if ( v1 > 0x10 ) return SYM + 16; for ( i = 0; v1 > i; ++i ) { v2 = *((_DWORD *)SYM + 4 * i + 420); v3 = *((_DWORD *)SYM + 4 * i + 421); v4 = v2 + v3; if ( v2 + v3 < v2 || v2 > 0x8000000 || v4 > 0x8000000 || v3 > 0x100000 ) return SYM + 16; for ( j = i + 1; v1 > j; ++j ) { v5 = *((_DWORD *)SYM + 4 * j + 420); v6 = *((_DWORD *)SYM + 4 * j + 421); v7 = v5 + v6; if ( v5 + v6 < v5 || v5 > 0x8000000 || v7 > 0x8000000 || v6 > 0x100000 || v4 > v5 && v7 > v2 ) return SYM + 16; } } v8 = (char *)SYM; v9 = (const void *)SYM; *((_DWORD *)SYM + 18) = v1; memcpy(v8 + 76, v9, 0x100u); return v0; }", "tsu_write_region": "int __fastcall tsu_write_region(int *a0, int a1, int a2, int a3, int a4, unsigned int a5, unsigned int a6, int a7) { int v8; if ( a5 > a6 ) { v8 = SYM; *a0 = 12; LABEL_4: log_event(0xBu, 4); log_event(9u, v8); log_event(9u, *a0); return v8; } v8 = tsu_write_block(a0, a1, a3, a4, a5, a7, a2); if ( v8 != 0 ) goto LABEL_4; return v8; }", "j_enum_pending_procs_2": "_DWORD *__fastcall j_enum_pending_procs_2(int a0, int a1, int a2) { return (_DWORD *)enum_pending_procs(a0, a1, a2); }", "tsu_write_block": "int __fastcall tsu_write_block(int *a0, int a1, unsigned int a2, unsigned int a3, unsigned int a4, int a5, int a6) { int *v7; int v8; v7 = (int *)(a6 + 16 * a5 + 124); if ( a5 != 0 ) { v8 = tsu_verify_region(a2, a4, a1, a1, 0x200000u, v7); if ( v8 != 0 ) { *a0 = 13; LABEL_10: log_event(0xBu, 5); log_event(9u, v8); log_event(9u, *a0); return v8; } } v8 = spi_write_status((unsigned int *)(a1 + a2), a3, a4); if ( v8 != 0 ) { *a0 = 12; goto LABEL_10; } if ( a5 != 0 ) { __asm { SVC 0x7D ; '}' } v8 = tsu_verify_region(a3, a4, a1, 219152384, 0x200000u, v7); if ( v8 != 0 ) *a0 = 13; __asm { SVC 0x7E ; '~' } if ( !_ZF ) goto LABEL_10; } return v8; }", "apob_region_init": "int __fastcall apob_region_init() { int result; int v0; _BYTE *v1; char *v2; char *v3; _BYTE v4[4]; _BYTE v5[4]; int v6; char v7; char v8; char v9; char v10; char v11; int v12; int v13; int v14; unsigned __int8 v15; unsigned __int8 v16; _DWORD v17[11]; int v18; int v19; int v20; int v21; int v22; int v23; int v24; v24 = *(_DWORD *)SYM; bzero_core(SYM, 0x14Cu); result = map_region_pages(SYM, 0x1000u, (int)&v6); if ( result == 0 ) { v0 = SYM; if ( v6 == SYM ) { result = apob_header_validate((int)&v6); if ( result == 0 ) { v1 = SYM; v2 = (char *)SYM + 12; v3 = (char *)SYM + 11; *(_DWORD *)SYM = v0; v1[4] = v11; v1[5] = v7; v1[6] = v8; v1[7] = v9; v1[8] = v10; v1[15] = BYTE1(v18); *((_DWORD *)v1 + 4) = v12; *((_DWORD *)v1 + 6) = v13; *((_DWORD *)v1 + 7) = v14; result = bit_index_decode(v16, (int)v3, (int)v4, (int)v2); if ( result == 0 ) { result = bit_index_decode(v15, (int)(v1 + 9), (int)v5, (int)(v1 + 10)); if ( result == 0 ) { *((_DWORD *)v1 + 8) = v17[v4[0]]; *((_DWORD *)v1 + 9) = v17[v5[0]]; *((_DWORD *)v1 + 10) = v17[1]; *((_DWORD *)v1 + 14) = v18; *((_DWORD *)v1 + 13) = v17[8]; *((_DWORD *)v1 + 16) = v20; *((_DWORD *)v1 + 15) = v19; *((_DWORD *)v1 + 17) = v21; if ( (unsigned __int8)v1[4] <= 1u ) { v1[44] = 117; v1[48] = 122; } else { *((_DWORD *)v1 + 11) = v22; *((_DWORD *)v1 + 12) = v23; } } } } } } return result; }", "object_slot_reserve": "int __fastcall object_slot_reserve(int a0, int a1, int *a2, __int16 a3, unsigned __int8 owner) { int v4; int v5; int v6; v4 = SYM; if ( *a2 == -1 ) { v6 = object_slot_alloc(owner); if ( v6 != -1 ) { *a2 = v6; return 0; } } else { v5 = SYM + 8 * *a2; if ( (a3 & 0x400) != 0 ) { bzero_core( *(void **)(v5 + 4), *(_DWORD *)(*(_DWORD *)(v5 + 4) + 4) + 112 + *(_DWORD *)(*(_DWORD *)(v5 + 4) + 104)); heap_free(*(_DWORD *)(v5 + 4)); *(_DWORD *)(v5 + 4) = 0; return 0; } return SYM - 9; } return v4; }", "worker_task_launch": "int __fastcall worker_task_launch(int *a0) { __int64 v1; unsigned int v2; int v3; char *v4; int v5; unsigned int v6; int v7; int v8; int v9; _DWORD *v10; unsigned __int8 v11[4]; unsigned __int8 v12[4]; int v13; unsigned int v14; unsigned int v15; int v16; int v17; v14 = 0; v11[0] = -1; v12[0] = -1; v13 = 0; __asm { SVC 0x54 ; 'T' } __asm { SVC 0x9D } v1 = *(_QWORD *)(a0 + 1); v2 = *a0; v15 = 0x10000000; v3 = a0[3]; v4 = SYM; *SYM = 1; ++*((_DWORD *)v4 + 2); v5 = map_client_buffer(v2, v1, HIDWORD(v1), v11, &v17, 0, 1, 0xFFFFu); if ( v5 == 0 ) { __asm { SVC 0x6D ; 'm' } v5 = v11[0]; if ( v11[0] == 0 ) { v6 = *(_DWORD *)(SYM + 1632); v7 = *(_DWORD *)(SYM + 1636); if ( *(_QWORD *)(SYM + 1632) != 0 ) { v5 = map_client_buffer(*(_DWORD *)(SYM + 1636), v6, HIDWORD(v1), v12, &v16, 0, 0, 0xFFFFu); if ( v5 == 0 ) { __asm { SVC 0x6D ; 'm' } v5 = v12[0]; if ( v12[0] == 0 ) { v5 = signature_verify_core(v13, v15, v14, HIDWORD(v1)); if ( v5 == 0 ) { v8 = v16; *((_DWORD *)v4 + 3) = *(_DWORD *)(v16 + 140); v9 = *(_DWORD *)(v8 + 132); *((_DWORD *)v4 + 4) = v9; v10 = (_DWORD *)(v8 + v9 + 40960); *((_DWORD *)v4 + 5) = *(_DWORD *)(v8 + 136); *((_DWORD *)v4 + 6) = HIDWORD(v1); *((_DWORD *)v4 + 7) = v3; *v10 = 0; v10[1] = 0; v10[3] = 2; v10[4] = SYM; v10[8] = 0x10000000; v10[9] = 0; v10[10] = 50331648; v10[6] = v6; v10[7] = v7; v10[14] = 0x10000000; v10[15] = 0; v10[12] = v6; v10[13] = v7; } } } } else { v5 = SYM; } } } if ( v11[0] != 255 ) __asm { SVC 0x6C ; 'l' } if ( v12[0] != 255 ) __asm { SVC 0x6C ; 'l' } *((_DWORD *)v4 + 1) = v5; *v4 = 0; __asm { SVC 0x53 ; 'S' } return 255; }", "signature_verify_core": "int __fastcall signature_verify_core(int a0, unsigned int a1, unsigned int a2, unsigned int a3) { int v4; int v5; int record_retry; int a6; int v7; int v8; int v9; int v10; unsigned int v11; unsigned int v12; unsigned int v13; int v14; int v15; int v16; int v17[8]; int v18; unsigned int v19; unsigned int v20; unsigned int v21; unsigned int v22; int v23; int v24; unsigned int v25; int v26; int v27; int v28; unsigned int v29; unsigned int v30; unsigned int v31; int v32; _BYTE v33[1025]; _BYTE v34[48]; int v35; v4 = a0; v24 = *(_DWORD *)SYM; v35 = v24; v28 = a0; v30 = 0; v18 = (unsigned int)v33 & 0xFFFFFFE0; v5 = map_and_flush_range((unsigned int)v33 & 0xFFFFFFE0, 1024, a2, 0); if ( v5 != 0 ) return v5; __asm { SVC 0x79 ; 'y' } a6 = fw_type_to_class(64); record_retry = find_record_retry(v18, &v21, &v26, &v25, &v27, &v22, a6); if ( record_retry == 0 ) { record_retry = rsa_keygen_params(v18, a1, a3, v21, 0x40u, &v30, &v19, &v20, &v29, &v23); if ( record_retry == 0 ) { v32 = v20; v31 = v29 + a2; if ( v22 == 256 ) { v7 = 3; } else { if ( v22 != 512 ) return SYM; v7 = 4; } v8 = v7; record_retry = hash_ctx_init2(v7); if ( record_retry == 0 ) { record_retry = hash_oneshot_68(v18 + (v21 << 8), v23, v8, 1); if ( record_retry == 0 ) { v9 = v23; v10 = v23 + (v21 << 8) + a2; while ( 1 ) { v11 = v19; if ( v19 == 0 ) break; if ( v19 > 0x8000 ) v11 = 0x8000; v12 = v20; if ( v20 > v11 ) v12 = v11; v13 = v12; v9 += v11; if ( ccp_desc_aes_full(v17, 2, v4, 0, 2, 0, v10, 0, 2, 0, (v11 + 15) & 0xFFFFFFF0, 1) != 0 ) return SYM - 10; record_retry = crypto_wait_completion((int)v17, 1, v14, v15); if ( record_retry != 0 ) return record_retry; v16 = v19 <= 0x8000 ? hash_digest_sized(v4, v11, v9, v34, v8) : hash_oneshot_68(v4, v11, v8, 0); record_retry = v16; if ( v16 != 0 ) return record_retry; v10 += v11; v4 += v13; v20 -= v13; v19 -= v11; } record_retry = digest_dispatch(v31, 0, v26, v25, v27, v22, (int)v34, v8); if ( record_retry != 0 ) { ecc_point_op(v28, 0, v32); } else { *((_DWORD *)SYM + 64) = *(_DWORD *)(v18 + 96); *((_DWORD *)SYM + 64) = *(_DWORD *)(v18 + 76); } } } } } return record_retry; }", "ecc_scratch_init": "unsigned int __fastcall ecc_scratch_init(bn_t *a0, bn_t *a1, bn_t *a2, bn_t *a3) { unsigned int *v4; unsigned int *v5; int v6; int v7; unsigned int result; int v8; unsigned int v9; unsigned int v10; char v11; unsigned int v12; unsigned int *out; v4 = (unsigned int *)SYM; bzero_core((void *)SYM, 0xA0u); v5 = (unsigned int *)(SYM - 32); bzero_core((void *)(SYM - 32), 0x20u); v6 = SYM + 160; bzero_core((void *)(SYM + 160), 0xA0u); v7 = SYM; bzero_core((void *)SYM, 0xA0u); out = (unsigned int *)(SYM + 160); bzero_core((void *)(SYM + 160), 0xA0u); result = bn_export_words(a3, v4, 0xA0u); if ( result == 0 ) { result = bn_export_words(a2, v5, 0x20u); if ( result == 0 ) { result = bn_export_words(a1, out, 0xA0u); if ( result == 0 ) { v8 = SYM; do { v9 = 160 - result + v8 + 20480; v10 = v8 + result++ + 20480; *(_BYTE *)(v10 + 1528) = *(_BYTE *)(v9 + 1847); } while ( result < 0xA0 ); result = rsa_modexp((int)v4, 0xA0u, (int)v5, 0x20u, v6, 0xA0u, v7, 0); if ( result == 0 ) { do { v11 = *(_BYTE *)(160 - result + v8 + 22167); v12 = v8 + result++ + 20480; *(_BYTE *)(v12 + 1848) = v11; } while ( result < 0xA0 ); return bn_from_bytes_be(a0, out, 0xA0u); } } } } return result; }", "pk_op_dispatch": "int __fastcall pk_op_dispatch(unsigned int *a0, int r1_0, int a1, int a2) { int v3; bn_t *v4; bn_t *rem; char *v5; bn_t *v6; int v7; int v8; int v9; bn_t *b; bn_t *v10; bn_t *a11; bn_t *a; bn_t *v12; bn_t *v13; bn_t *r; bn_t *v14; unsigned int buf[11]; buf[7] = (unsigned int)a0; buf[8] = r1_0; buf[9] = a1; buf[10] = a2; buf[5] = *(_DWORD *)SYM; if ( a1 != 20 ) return SYM; __asm { SVC 0x5E ; '^' } v4 = (bn_t *)SYM; v14 = (bn_t *)((char *)SYM + 2424); r = (bn_t *)((char *)SYM + 3636); b = (bn_t *)((char *)SYM + 4848); v12 = (bn_t *)((char *)SYM + 6060); a = (bn_t *)((char *)SYM + 7272); a11 = (bn_t *)((char *)SYM + 8484); rem = (bn_t *)((char *)SYM + 9696); v5 = (char *)SYM + 10908; v10 = (bn_t *)((char *)SYM + 12120); v13 = (bn_t *)((char *)SYM + 13332); v6 = (bn_t *)((char *)SYM + 1212); v3 = bn_from_bytes_be((bn_t *)SYM + 3, a0, 0x80u); _ZF = v3 == 0; while ( _ZF ) { v3 = bn_from_bytes_be(b, a0 + 32, 0x14u); _ZF = v3 == 0; if ( v3 == 0 ) { v3 = bn_from_bytes_be(v14, a0 + 37, 0x80u); _ZF = v3 == 0; if ( v3 == 0 ) { v3 = bn_from_bytes_be(v12, a0 + 69, 0x80u); _ZF = v3 == 0; if ( v3 == 0 ) { memcpy_thunk((int)buf); buf_reverse_inplace(buf, 0x14u); v3 = bn_from_bytes_be(v4, buf, 0x14u); if ( v3 == 0 ) { memcpy_thunk((int)buf); buf_reverse_inplace(buf, 0x14u); v3 = bn_from_bytes_be(v6, buf, 0x14u); if ( v3 == 0 ) { memcpy_thunk((int)buf); buf_reverse_inplace(buf, 0x14u); v3 = bn_from_bytes_be(a, buf, 0x14u); if ( v3 == 0 ) { v7 = SYM; v3 = SYM; if ( v4->nlimbs != 0 && v6->nlimbs != 0 && bn_cmp(v4, b) == 2 && bn_cmp(v6, b) == 2 ) { bn_modinv_flag1((bn_t *)v5 + 3, (int)a11); v3 = v8; if ( v8 == 0 ) { v3 = bn_mul(v10, a, a11, 0); if ( v3 == 0 ) { v3 = bn_divmod((bn_scratch_t *)(v5 + 3636), nullptr, v10, b, rem); if ( v3 == 0 ) { v9 = bn_mul(v10, v4, a11, 0); v3 = v9; if ( v9 == 0 ) { v3 = bn_divmod((bn_scratch_t *)(v5 + 3636), nullptr, v10, b, (bn_t *)v5); if ( v3 == 0 ) { v3 = ecc_scratch_init(v10, v14, rem, r); if ( v3 == 0 ) { v3 = ecc_scratch_init(v13, v12, (bn_t *)v5, r); if ( v3 == 0 ) { v3 = bn_mul(rem, v10, v13, 0); if ( v3 == 0 ) { v3 = bn_divmod((bn_scratch_t *)(v5 + 3636), nullptr, rem, r, rem); if ( v3 == 0 ) { v3 = bn_divmod((bn_scratch_t *)(v5 + 3636), nullptr, rem, b, rem); if ( v3 == 0 && bn_cmp(v4, rem) != 3 ) v3 = v7; } } } } } } } } } } } } } break; } } } } __asm { SVC 0x5F ; '_' } return v3; }", "key_blob_bounds": "int __fastcall key_blob_bounds(int a0, unsigned int a1, int a2, int a3) { int result; _DWORD *v4; v4 = nullptr; if ( a1 > a3 + 544 ) return SYM; result = kek_context_init(&v4, a2, a3, a3); if ( result == 0 ) { result = hash_ctx_update(v4, a0, a1); if ( result == 0 ) return fw_hdr_parse((int)v4); } return result; }", "fw_hdr_parse": "int __fastcall fw_hdr_parse(int a0) { _DWORD *v1; int v2; int v3; int v4; int v5; int v6; int v7; int v8; v1 = (_DWORD *)(a0 + 4096); v2 = *(_DWORD *)(a0 + 4560); v5 = fw_hdr_magic_check((_DWORD *)a0); if ( v5 == 0 ) { v1[113] = 0; v6 = v1[114] + 544; v1[115] = v6; *(_DWORD *)(v2 + 72) = v6; __asm { SVC 0x66 ; 'f' } v5 = hmac_sha256((unsigned __int8)v6, SYM, a0, 32, v2, v1[115] - 32, v2 - 32 + v1[115], 32); } rand_fill_bytes((_BYTE *)a0, 0x20u, v3, v4); rand_fill_bytes((_BYTE *)(a0 + 64), 0x10u, v7, v8); return v5; }", "fw_hdr_magic_check": "int __fastcall fw_hdr_magic_check(_DWORD *a0) { _DWORD *v1; int v2; unsigned int v3; unsigned int v4; v1 = a0 + 1024; v2 = 0; v3 = a0[1136]; if ( v3 != 0 ) { v4 = (v3 + 31) & 0xFFFFFFE0; if ( v3 != v4 ) { bzero((char *)a0 + v3 + 448, v4 - v3); v3 = (v1[112] + 31) & 0xFFFFFFE0; v1[112] = v3; } return hash_ctx_update(a0, (int)(a0 + 112), v3); } return v2; }", "kek_context_init": "int __fastcall kek_context_init(_DWORD *a0, int a1, int a2, int a3) { int v4; int v5; _QWORD *v6; _DWORD *v7; int v8; int v9; int v10; _DWORD *v11; int v12; int v13; int v14; int v15; int v16; int v17; int v18; v4 = SYM; *a0 = SYM; v5 = derive_psp_kek((_BYTE *)v4, a1, a2, a3); if ( v5 == 0 ) { *(_DWORD *)(v4 + 4544) = 0; *(_DWORD *)(v4 + 4560) = a1; *(_DWORD *)(v4 + 4552) = 0; *(_DWORD *)(v4 + 4564) = a2; *(_DWORD *)(v4 + 4568) = 512; v6 = SYM; *(_DWORD *)(a1 + 72) = 0; *(_DWORD *)(a1 + 80) = 0; v7 = (_DWORD *)(v4 + 128); *(_QWORD *)(a1 + 64) = v6[110]; v8 = v7[1]; v9 = v7[2]; v10 = v7[3]; *(_DWORD *)a1 = *v7; *(_DWORD *)(a1 + 4) = v8; *(_DWORD *)(a1 + 8) = v9; *(_DWORD *)(a1 + 12) = v10; memcpy((void *)(a1 + 16), v7 - 24, 0x20u); v7 -= 8; v11 = (_DWORD *)(a1 + 48); v12 = v7[1]; v13 = v7[2]; v14 = v7[3]; *v11 = *v7; v11[1] = v12; v11[2] = v13; v11[3] = v14; v15 = *v7; v16 = v7[1]; v17 = v7[2]; v18 = v7[3]; v7 += 80; *v7 = v15; v7[1] = v16; v7[2] = v17; v7[3] = v18; } return v5; }", "hash_ctx_update": "int __fastcall hash_ctx_update(_DWORD *a0, int a1, int a2) { _DWORD *v3; int v4; int v5; _DWORD *v6; int v7; int v8; int v9; _DWORD v10[10]; v3 = a0 + 1024; v4 = a0[1140]; if ( ((a2 + 31) & 0xFFFFFFE0) != a2 ) return SYM; if ( (unsigned int)(a0[1138] + a2) > a0[1141] ) return SYM; v10[0] = a0 + 16; v10[4] = a2; v6 = a0 + 104; v10[1] = 0; v10[2] = 128; v10[3] = a1; v7 = a0[1142]; v8 = a0[1140]; v10[7] = 0; v10[8] = SYM; v10[5] = v8 + v7; v10[6] = a0 + 104; v5 = crypto_submit_op(v10); if ( v5 == 0 ) { v9 = v3[114] + a2; v3[114] = v9; v3[118] += a2; *(_DWORD *)(v4 + 72) = v9; memcpy_thunk((int)v6); } return v5; }", "derive_psp_kek": "int __fastcall derive_psp_kek(_BYTE *a0, int a1, int a2, int a3) { int v4; int v5; int v6; int v7; int v8; int v9; int v10; int v11; int v12; int v13; _DWORD v14[2]; int v15; _BYTE *v16; int v17; _BYTE *v18; int v19; int v20; int v21; int v22[6]; _BYTE *v23; int v24; int v25; v25 = 0; __asm { SVC 0x66 ; 'f' } v24 = (unsigned __int8)a0; rand_fill_bytes(a0, 0x20u, a2, a3); v23 = a0 + 64; rand_fill_bytes(a0 + 64, 0x10u, v4, v5); rand_fill_bytes(a0 + 96, 0x10u, v6, v7); v22[0] = 1; v22[3] = (int)(a0 + 32); v22[1] = 1; v22[2] = 32; v22[4] = 32; v22[5] = SYM; v10 = ecc_submit_op(v22); if ( v10 == 0 ) { v10 = kdf_sp800108_ctr( v24, (int)(a0 + 32), 32, aPspKeyEncrypti, (int)&v25, 4, (int)(a0 + 160), 0x20u, 1, (int)(a0 + 192)); if ( v10 == 0 ) { v15 = 256; v14[0] = a0 + 160; v14[1] = 0; v18 = a0 + 32; v19 = 0; v11 = SYM; v20 = 0; v21 = SYM; v16 = a0; v17 = 32; v10 = crypto_submit_op(v14); if ( v10 == 0 ) { v14[0] = a0 + 160; v14[1] = 0; v15 = 256; v18 = a0 + 128; v19 = 0; v20 = 0; v21 = v11; v16 = v23; v17 = 32; v10 = crypto_submit_op(v14); } } } rand_fill_bytes(a0 + 160, 0x20u, v8, v9); rand_fill_bytes(a0 + 192, 0xE0u, v12, v13); return v10; }", "key_slot_find": "int __fastcall key_slot_find(int a0, unsigned int a1) { __int16 *v2; unsigned int i; _WORD *v3; unsigned int j; if ( a0 == 0 ) return SYM; if ( a1 > 0xA000 ) return SYM; v2 = SYM; for ( i = 0; i < 5; i = (unsigned __int8)(i + 1) ) { if ( ((1 << i) & (unsigned __int16)*v2) != 0 ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7D ; '}' } if ( SYM + 8 + 864 * i == 0 ) return SYM - 6; v3 = (_WORD *)(SYM + 8 + 864 * i); for ( j = 0; j < a1 >> 1; j = (unsigned __int16)(j + 1) ) *v3 = *(_WORD *)(a0 + 2 * j); } __asm { SVC 0x7E ; '~' } } return 0; }", "key_slot_info": "int __fastcall key_slot_info(int a0, char a1, _DWORD *a2) { int v3; char *v4; int *v5; int v6; v3 = 0; if ( a2 == nullptr ) return SYM; v4 = SYM; switch ( a0 ) { case 0: *SYM = a1; v4[1] = 1; goto LABEL_6; case 1: SYM[2] = 0; goto LABEL_6; case 2: SYM[2] = 1; goto LABEL_6; case 5: SYM[1] = 0; LABEL_6: *a2 = 1; break; case 6: if ( is_recovery_state() != 0 || *SYM != 0 ) v6 = 3; else v6 = 2; *v5 = v6; break; default: v3 = SYM + 3; break; } return v3; }", "key_context_bootstrap": "int __fastcall key_context_bootstrap() { unsigned int v0; __int64 v1; _DWORD *v2; int v3; int v4; int v5; int v6; int v7; int v8; int v9; _UNKNOWN **v10; void *v11; int v12; v0 = 0; bzero_core((void *)SYM, 0x38u); v1 = (unsigned int)SYM | 0x10000000000LL; v2 = (_DWORD *)(SYM - 616); *(_QWORD *)(SYM + 4) = v1; if ( v2[142] == 4 || (LODWORD(v1) = buffer_all_zero(v1, HIDWORD(v1)), (_DWORD)v1 != 0) || (LODWORD(v1) = v2[218], (unsigned int)v1 <= 0x310000) ) { task_exit_self(v1); } v3 = v2[142]; if ( v3 == 3 || v3 == 5 ) { v4 = SYM + 20; v5 = *(_DWORD *)(SYM + 4); v6 = *(_DWORD *)(SYM + 8); *(_DWORD *)(SYM + 20) = *(_DWORD *)SYM; *(_DWORD *)(v4 + 4) = v5; *(_DWORD *)(v4 + 8) = v6; } mbox_set_busy(); v7 = SYM; v8 = SYM - 1; while ( 1 ) { __asm { SVC 0x56 ; 'V' } if ( v2[244] != 0 ) { v9 = flash_mode_read((unsigned int *)(SYM - 4)); if ( v9 == 0 ) { v2[244] = 0; goto LABEL_16; } if ( v9 == v7 || v9 == v8 ) ++v0; if ( v9 != v7 && v9 != v8 ) break; LABEL_16: if ( v0 > 0xA ) break; } if ( v2[142] != 3 && boot_path_select() != 0 ) { mbox_clear_status(); mbox_set_busy(); } mbox_set_busy(); v12 = boot_mode_select(); if ( v12 != 3 ) trace_event(9, 1u, v12, 0); } v10 = SYM; v2[244] = 0; *((_DWORD *)*v10 + 41) |= 0x8000000u; v11 = mbox_clear_ready(); return task_exit_self((int)v11); }", "key_unwrap": "int __fastcall key_unwrap(int a0, int a1, int a2, int a3) { int v4; unsigned int v5; _DWORD v6[9]; unsigned int v7; _BYTE dst[31]; _BYTE v8[33]; int v9; v9 = *(_DWORD *)SYM; bzero_core(dst, 0x40u); v7 = 0; if ( a1 << 27 != 0 ) return SYM; if ( a2 != 0 ) { v5 = a2 + (a3 << 8) + 256; } else { v5 = map_page_and_flush(a1 + 256, 4096, &v7); if ( v5 == 0 ) return SYM; } __asm { SVC 0x87 } memcpy_thunk((unsigned int)v8 & 0xFFFFFFE0); v4 = log_buffer_config((unsigned int)v8 & 0xFFFFFFE0, (unsigned int)v8 & 0xFFFFFFE0); if ( v4 == 0 ) { v6[2] = 128; v6[3] = v5; v6[0] = (unsigned int)v8 & 0xFFFFFFE0; v6[1] = 0; v6[4] = (*(_DWORD *)(a0 + 20) + 31) & 0xFFFFFFE0; v6[5] = v5; v6[6] = a0 + 32; v6[7] = 1; v6[8] = SYM; v4 = crypto_submit_op(v6); } if ( a2 == 0 && v5 != 0 ) __asm { SVC 0x63 ; 'c' } return v4; }", "persist_slot_reset": "int __fastcall persist_slot_reset(int a0) { unsigned int v1; int v2; v1 = a0 - 256; if ( v1 > 0xFF ) return SYM; v2 = SYM + 88 * v1; *(_DWORD *)(v2 + 84) = -1; *(_BYTE *)(v2 + 80) = 0; bzero_core((void *)v2, 0x40u); *(_DWORD *)(v2 + 64) = 0; *(_DWORD *)(v2 + 68) = 0; *(_DWORD *)(v2 + 72) = 0; *(_DWORD *)(v2 + 76) = 0; return 0; }", "key_slot_load": "int __fastcall key_slot_load(unsigned int *a0, unsigned int a1, unsigned int *a2) { int v3; int v4; if ( a1 == 0 ) return SYM; __asm { SVC 0x5E ; '^' } v3 = persist_find_by_uuid(a0, a1, a2); if ( v3 == -1 ) { v4 = SYM + 2; } else { v4 = svc_queue_wait_simple(); if ( v4 == 0 ) v4 = persist_slot_reset(v3); } __asm { SVC 0x5F ; '_' } return v4; }", "derive_apob_hmac_key_thunk": "void __fastcall derive_apob_hmac_key_thunk() { JUMPOUT(ADDR); }", "key_constants_load": "int __fastcall key_constants_load(int a0, unsigned int a1, int a2) { int v3; unsigned int v4; _DWORD v5[9]; int v6[13]; _BYTE v7[33]; int v8; int v9; int v10; int v11; int v12; int v13; int v14; int v15; int v16; int v17; int v18; int v19; _BYTE v20[32]; int v21; v21 = *(_DWORD *)SYM; v8 = SYM[0]; v9 = SYM[1]; v10 = SYM[2]; v11 = SYM[3]; v12 = SYM[0]; v13 = SYM[1]; v14 = SYM[2]; v15 = SYM[3]; v16 = SYM[0]; v17 = SYM[1]; v18 = SYM[2]; v19 = SYM[3]; if ( a1 << 28 != 0 ) return SYM; v6[0] = 1; v6[1] = 1; v6[2] = 32; v6[3] = (int)v20; v6[4] = 32; v6[5] = SYM; v3 = ecc_submit_op(v6); if ( v3 == 0 ) { memcpy_thunk((unsigned int)v7 & 0xFFFFFFE0); v5[0] = v20; v4 = 0; v5[1] = 0; v5[2] = 256; v5[3] = (unsigned int)v7 & 0xFFFFFFE0; v5[4] = 32; v5[5] = (unsigned int)v7 & 0xFFFFFFE0; v5[6] = 0; v5[7] = 0; v5[8] = SYM; while ( v4 < a1 >> 4 ) { v3 = crypto_submit_op(v5); if ( v3 != 0 ) break; memcpy_thunk(a0 + 16 * v4++); } } return v3; }", "derive_psp_dram_hmac_key": "int __fastcall derive_psp_dram_hmac_key(int a0, int a1, int a2) { char *v3; _DWORD v4[8]; _BYTE v5[225]; int v6; v3 = SYM; v6 = *(_DWORD *)SYM; v4[0] = 0; bzero((void *)((unsigned int)v5 & 0xFFFFFFE0), 0xE0u); return kdf_derive_key_hkdf(a0, v3, (int)v4, 4, a1, a2, (unsigned int)v5 & 0xFFFFFFE0); }", "aes_ecb_double": "int __fastcall aes_ecb_double(int a0, int a1, _DWORD *a2) { int result; _DWORD v3[16]; _BYTE v4[65]; int v5; v5 = *(_DWORD *)SYM; result = aes_ecb_oneshot(a0, (unsigned int)v4 & 0xFFFFFFE0); if ( result == 0 ) { result = aes_ecb_oneshot(a1, ((unsigned int)v4 & 0xFFFFFFE0) + 32); if ( result == 0 ) { v3[0] = (unsigned int)v4 & 0xFFFFFFE0; v3[1] = 0; v3[2] = 128; v3[3] = ((unsigned int)v4 & 0xFFFFFFE0) + 32; v3[4] = 32; v3[5] = a2; v3[6] = 0; v3[7] = 1; v3[8] = SYM; result = crypto_submit_op(v3); if ( result == 0 ) { *a2 ^= *(_DWORD *)(((unsigned int)v4 & 0xFFFFFFE0) + 0x20); a2[1] ^= *(_DWORD *)(((unsigned int)v4 & 0xFFFFFFE0) + 0x24); a2[2] ^= *(_DWORD *)(((unsigned int)v4 & 0xFFFFFFE0) + 0x28); a2[3] ^= *(_DWORD *)(((unsigned int)v4 & 0xFFFFFFE0) + 0x2C); } } } return result; }", "kdf_derive_key_hkdf": "int __fastcall kdf_derive_key_hkdf(int a0, char *a1, int a2, int a3, int a4, unsigned int a5, int a6) { int result; _DWORD v7[9]; int v8; char *v9; int v10; int v11; v8 = a0; v9 = a1; v10 = a2; v11 = a3; if ( a2 == 0 || a3 == 0 || a4 == 0 || a6 == 0 ) return SYM; memcpy_thunk(a6); v7[2] = 256; v7[3] = a6; v7[4] = 32; v7[0] = 0; v7[1] = 1; v7[5] = a6 + 32; v7[6] = 0; v7[7] = 0; v7[8] = SYM; result = crypto_submit_op(v7); if ( result == 0 ) return kdf_sp800108_ctr(v8, a6 + 32, 32, a1, a2, a3, a4, a5, 1, a6); return result; }", "kdf_sp800108_ctr": "int __fastcall kdf_sp800108_ctr( int a0, int a1, int a2, char *a3, int a4, int a5, int a6, unsigned int a7, int a8, int a9) { int v10; int v11; unsigned int v12; int v13; _DWORD *v14; char *v15; char *v16; int v17; unsigned int v18; int v19; unsigned int v20; int v21; int v22; v10 = 4; v11 = 1; v13 = a6; v12 = a7; v14 = (_DWORD *)(a9 + 64); if ( a1 == 0 || a2 == 0 || a4 == 0 || a5 == 0 || a6 == 0 || a7 == 0 ) return SYM + 1; if ( a6 << 30 != 0 ) return SYM; if ( a3 != nullptr ) { v15 = strlen(a3); v16 = v15 + 1; if ( (unsigned int)(v15 + 5) > 0x80 ) return SYM - 1; memcpy_thunk(a9 + 68); v10 = (int)(v16 + 4); } if ( (unsigned int)(a5 + v10) > 0x80 ) return SYM - 1; memcpy_thunk(a9 + v10 + 64); v17 = v10 + a5; if ( a8 != 0 ) { v18 = 8 * a7; if ( a8 == 2 ) v18 = bswap32(v18); if ( (unsigned int)(v17 + 4) > 0x80 ) return SYM - 1; v19 = a9 + v17; v17 += 4; *(_DWORD *)(v19 + 64) = v18; } __asm { SVC 0x68 ; 'h' } do { v20 = v11++; *v14 = bswap32(v20); __asm { SVC 0x68 ; 'h' } v21 = hmac_sha256(a0, SYM, a1, a2, (int)v14, v17, a9 + 192, 32); if ( v21 != 0 ) break; v22 = 32; if ( v12 <= 0x20 ) v22 = v12; memcpy_thunk(v13); v12 -= v22; v13 += v22; } while ( v12 != 0 ); return v21; }", "key_derive_fixed": "int __fastcall key_derive_fixed(int a0, int a1, int a2) { int v3; int v4; _DWORD v5[9]; int v6[6]; _BYTE dst[32]; _BYTE v7[32]; _BYTE v8[33]; _BYTE v9[32]; int v10; v10 = *(_DWORD *)SYM; memcpy(dst, SYM, sizeof(dst)); memcpy(v7, SYM, sizeof(v7)); v3 = SYM; if ( a1 << 28 == 0 && a1 == 32 ) { v6[0] = 1; v6[1] = 1; v6[2] = 32; v6[3] = (int)v9; v6[4] = 32; v6[5] = SYM; v4 = ecc_submit_op(v6); if ( v4 == 0 ) { memcpy_thunk((unsigned int)v8 & 0xFFFFFFE0); v5[0] = v9; v5[1] = 0; v5[2] = 256; v5[3] = (unsigned int)v8 & 0xFFFFFFE0; v5[4] = 32; v5[5] = (unsigned int)v8 & 0xFFFFFFE0; v5[6] = 0; v5[7] = 0; v5[8] = SYM; v4 = crypto_submit_op(v5); if ( v4 == 0 ) memcpy_thunk(a0); } return v4; } return v3; }", "key_slot_select": "int __fastcall key_slot_select(int a0, unsigned int a1, int a2) { return SYM; }", "find_default_key_record": "BOOL __fastcall find_default_key_record() { int v0; int v1; int v2; int v3; int v4; return config_blob_get(0x2000, (int)&v0) == 0 && find_record_by_uuid(v0, &v1, &v2, &v3, &v4) == 0; }", "ret_err_000A": "int __fastcall ret_err_000A() { return SYM; }", "hash_compare_digest": "int __fastcall hash_compare_digest(int a0, int a1, int a2, _BYTE *a3, int a4) { int v5; int result; unsigned int v6; int v7; int v8; _DWORD *v9; unsigned int i; unsigned int v10; ccp_desc_t v11; int v12[8]; v5 = 1; if ( a4 == 3 ) { v6 = 32; } else { if ( a4 != 4 ) return SYM; v6 = 48; } if ( a1 == a2 ) v5 = 17; result = ccp_desc_sha(&v11, a0, a1, a2, 65, a4, v5); if ( result == 0 ) { result = ccp_queue_kick(v12, *SYM + 1728, 65, v6, 1); if ( result == 0 ) { result = crypto_wait_completion((int)&v11, 2, v7, v8); if ( result == 0 ) { v9 = SYM; for ( i = 0; i < v6; ++i ) { v10 = v6 - i; *a3++ = *(_BYTE *)(v10 + *v9 + 1727); } } } } return result; }", "hash_digest_sized": "int __fastcall hash_digest_sized(int a0, int a1, int a2, _BYTE *a3, int a4) { int v5; unsigned int v6; int v7; int v8; int v9; _DWORD *v10; unsigned int i; unsigned int v11; ccp_desc_t v12; int v13[8]; v5 = 1; if ( a4 == 3 ) { v6 = 32; } else { if ( a4 != 4 ) return SYM; v6 = 48; } __asm { SVC 0x5E ; '^' } if ( a1 == a2 ) v5 = 17; v7 = ccp_desc_sha(&v12, a0, a1, a2, 68, a4, v5); if ( v7 == 0 ) { v7 = ccp_queue_kick(v13, *SYM + 1728, 68, v6, 1); if ( v7 == 0 ) { v7 = crypto_wait_completion((int)&v12, 2, v8, v9); if ( v7 == 0 ) { v10 = SYM; for ( i = 0; i < v6; ++i ) { v11 = v6 - i; *a3++ = *(_BYTE *)(v11 + *v10 + 1727); } } } } __asm { SVC 0x5F ; '_' } return v7; }", "hash_ctx_init": "int __fastcall hash_ctx_init(int a0) { int result; int v1; int v2; _DWORD v3[9]; if ( a0 != 3 && a0 != 4 ) return SYM; memcpy_thunk((int)*SYM + 1664); result = ccp_queue_ready(v3, 65, *SYM + 1664, a0, 1); if ( result == 0 ) return crypto_wait_completion((int)v3, 1, v1, v2); return result; }", "hash_ctx_init2": "int __fastcall hash_ctx_init2(int a0) { int result; int v1; int v2; _DWORD v3[8]; if ( a0 != 3 && a0 != 4 ) return SYM; memcpy_thunk((int)*SYM + 4536); result = ccp_queue_ready(v3, 68, *SYM + 4536, a0, 1); if ( result == 0 ) return crypto_wait_completion((int)v3, 1, v1, v2); return result; }", "hash_oneshot_65": "int __fastcall hash_oneshot_65(int a0, int a1, int a2, int a3) { int v4; int result; int v5; int v6; ccp_desc_t v7; v4 = 1; if ( a2 != 3 && a2 != 4 ) return SYM; if ( a3 != 0 ) v4 = 17; result = ccp_desc_sha_init(&v7, a0, a1, 65, a2, v4); if ( result == 0 ) return crypto_wait_completion((int)&v7, 1, v5, v6); return result; }", "hash_oneshot_68": "int __fastcall hash_oneshot_68(int a0, int a1, int a2, int a3) { int v4; int result; int v5; int v6; ccp_desc_t v7; v4 = 1; if ( a2 != 3 && a2 != 4 ) return SYM; if ( a3 != 0 ) v4 = 17; result = ccp_desc_sha_init(&v7, a0, a1, 68, a2, v4); if ( result == 0 ) return crypto_wait_completion((int)&v7, 1, v5, v6); return result; }", "flash_clock_enable": "int __fastcall flash_clock_enable(int a0) { __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } delay_us(1); if ( a0 == 0 ) return SYM; __asm { SVC 0x7B ; '{' } return 0; }", "nop_hook_power": "void __fastcall nop_hook_power() { ; }", "power_state_set": "__int64 __fastcall power_state_set(int a0, int a1) { if ( a0 == 0 ) { config_find_type113b(); __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } } __asm { SVC 0xA6 } __asm { SVC 0xA6 } return 55864; }", "reg_wait_change": "int __fastcall reg_wait_change(int a0) { int v1; int result; __asm { SVC 0x7B ; '{' } v1 = SYM; __asm { SVC 0x7C ; '|' } while ( 1 ) { __asm { SVC 0x7B ; '{' } --v1; if ( SYM == 0 ) break; if ( v1 == 0 ) goto LABEL_6; } if ( v1 != 0 ) goto LABEL_7; LABEL_6: trace_event(0, 0xF01Cu, 0, 0); __asm { SVC 0x96 } LABEL_7: result = 55864; if ( a0 == 0 ) { __asm { SVC 0xA6 } __asm { SVC 0xA6 } __asm { SVC 0xA6 } __asm { SVC 0xA6 } result = 56024; } __asm { SVC 0xA6 } return result; }", "fw_slots_release_all": "int __fastcall fw_slots_release_all() { int *v0; int result; v0 = SYM; if ( *SYM != 255 && fw_slot_operation(*SYM, 1u, 1) == 0 ) *v0 = 255; result = v0[1]; if ( result != 255 ) { result = fw_slot_operation(result, 0, 1); if ( result == 0 ) v0[1] = 255; } return result; }", "spirom_read_header": "int __fastcall spirom_read_header() { int *v0; __int64 v1; int v2; __int64 v3; __int64 v4; int v5; int v6; int v7; int v8; v0 = SYM; v1 = *((_QWORD *)SYM + 2); v5 = 0x40000; v4 = v1; v6 = 0; v7 = 104; v2 = spirom_xfer(&v4, 1); if ( v2 != 0 || (v0[1] = v8, v3 = *((_QWORD *)v0 + 2), v5 = 0x40000, v4 = v3, v6 = 0, v7 = 51, (v2 = spirom_xfer(&v4, 1)) != 0) ) { fw_slots_release_all(); } else { *v0 = v8; } return v2; }", "irq_dispatch_pending": "unsigned int __fastcall irq_dispatch_pending() { unsigned int result; int v0; unsigned int v1; unsigned int *v2; unsigned int v3; int v4; int v5; unsigned int v6; unsigned int v7; result = *((_DWORD *)*SYM + 694); v0 = 0; v1 = result; if ( (result & 0x80000000) == 0 ) { v2 = (unsigned int *)SYM; __asm { SVC 0x5E ; '^' } v3 = HIBYTE(result) & 0x3F; v4 = (unsigned __int16)(v1 >> 8); switch ( v3 ) { case 6u: if ( v4 == 59 || v4 == 365 ) { __asm { SVC 0xA6 } __asm { SVC 0xA6 } } else { v0 = 2; } break; case 7u: v5 = (unsigned __int16)*SYM[0]; if ( *SYM[0] == 0 ) { LABEL_19: v0 = 1; break; } *(_BYTE *)SYM = v4; v0 = config_offset_resolve(v5); break; case 8u: *SYM[0] = v4; break; case 9u: v6 = 0; v7 = feature_entry_get(0); while ( v6 < v7 ) { if ( feature_enabled(0, v6) ) { select_mem_attr(0); break; } ++v6; } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } break; default: goto LABEL_19; } __dsb(0xFu); *((_DWORD *)*SYM + 694) = v0 | 0x80000000; __asm { SVC 0x5F ; '_' } return *v2; } return result; }", "irq_route_setup": "int __fastcall irq_route_setup(int a0) { int v1; char *v2; int v3; int v4; _BYTE dst[408]; int v5; v5 = 0; v1 = SYM; *(_BYTE *)(a0 + 33) = 0; __asm { SVC 0x7B ; '{' } v5 |= 0x180u; __asm { SVC 0x7C ; '|' } v2 = SYM; v3 = v1; if ( v1 != 0 ) goto LABEL_2; __asm { SVC 0x7B ; '{' } if ( (v5 & 0x100) == 0 || (v5 & 0x80) == 0 ) { v3 = SYM; LABEL_2: *(_DWORD *)(a0 + 12) = 0x20000000; goto LABEL_18; } v3 = flash_access_acquire(100); if ( v3 == 0 ) { if ( spi_mode_select(1) != 0 ) *(_DWORD *)(a0 + 12) = 251658240; if ( v2[1] != 0 && (v3 = queue_drain(0x64u)) != 0 ) { v4 = 83886080; } else { boot_stage_advance(); instance_first_enabled(*(_DWORD *)(a0 + 20), *(_DWORD *)(a0 + 24)); memcpy(dst, SYM, sizeof(dst)); instance_iter_masked(0, (int)dst, 0x11u, *(_DWORD *)(a0 + 20)); instance_mask_build(0, SYM, *(_DWORD *)(a0 + 28)); __asm { SVC 0xA6 } *((_DWORD *)*SYM + 32) |= 0x80000000; *(_BYTE *)(a0 + 33) = 1; if ( platform_reinit() == 0 ) { LABEL_16: spi_mode_select(0); goto LABEL_17; } v4 = 201326592; } *(_DWORD *)(a0 + 12) = v4; goto LABEL_16; } *(_DWORD *)(a0 + 12) = 234881024; LABEL_17: flash_access_release(100); LABEL_18: if ( v2[2] != 0 ) __asm { SVC 0x57 ; 'W' } return v3; }", "get_default_ring": "int __fastcall get_default_ring() { if ( read_hw_status() != 0 ) __asm { SVC 0x7B ; '{' } return 0xFFFF; }", "map_page_and_flush": "unsigned int __fastcall map_page_and_flush(unsigned int a0, int a1, unsigned int *a2) { unsigned int v3; unsigned int v4; v3 = a0 & 0xFFFFF000; __asm { SVC 0x88 } v4 = v3; if ( v3 != 0 ) { v4 = a0; *a2 = (a1 + a0 - v3 + 4095) >> 12; } __asm { SVC 0x68 ; 'h' } return v4; }", "map_client_buffer_rw": "int __fastcall map_client_buffer_rw(unsigned int a0, unsigned int a1, unsigned int a2, _BYTE *a3, _DWORD *a4) { unsigned __int64 v5; unsigned int v6; unsigned int v7; unsigned int v8; int result; _DWORD v9[5]; int v10; v5 = __PAIR64__(a0, 0) + a1; v6 = (v5 + a2 + 4095) >> 32; v7 = ((unsigned int)v5 + a2 + 4095) >> 12 << 12; v8 = (unsigned int)v5 >> 12 << 12; v10 = 0; if ( __PAIR64__(v6, v7) < __PAIR64__(HIDWORD(v5), v8) ) return SYM; v9[2] = (unsigned int)v5 >> 12 << 12; v9[0] = 1; v9[1] = v7 - v8; v9[3] = a0; v9[4] = v7 - v8; result = (int)v9; __asm { SVC 0x6B ; 'k' } if ( v9 == nullptr ) { result = (unsigned __int8)*a3; __asm { SVC 0x6D ; 'm' } if ( *a3 == 0 ) *a4 = v10 + v5 - v8; } return result; }", "map_client_buffer_ex": "int __fastcall map_client_buffer_ex(unsigned int a0, unsigned int a1, unsigned int a2, _BYTE *a3, _DWORD *a4) { unsigned __int64 v5; unsigned int v6; unsigned int v7; unsigned int v8; int result; _DWORD v9[5]; int v10; v5 = __PAIR64__(a0, 0) + a1; v6 = (v5 + a2 + 4095) >> 32; v7 = ((unsigned int)v5 + a2 + 4095) >> 12 << 12; v8 = (unsigned int)v5 >> 12 << 12; v10 = 0; if ( __PAIR64__(v6, v7) < __PAIR64__(HIDWORD(v5), v8) ) return SYM; v9[2] = (unsigned int)v5 >> 12 << 12; v9[0] = 1; v9[1] = v7 - v8; v9[3] = a0; v9[4] = v7 - v8; result = (int)v9; __asm { SVC 0x98 } if ( v9 == nullptr ) { result = (unsigned __int8)*a3; __asm { SVC 0x6D ; 'm' } if ( *a3 == 0 ) *a4 = v10 + v5 - v8; } return result; }", "map_client_buffer_ro": "int __fastcall map_client_buffer_ro(unsigned int a0, unsigned int a1, unsigned int a2, _BYTE *a3, _DWORD *a4) { unsigned __int64 v5; unsigned int v6; unsigned int v7; int v8; int result; int v9; _DWORD v10[5]; int v11; v5 = __PAIR64__(a0, 0) + a1; v6 = (v5 + a2 + 4095) >> 32; v7 = (v5 + a2 + 4095) & 0xFFFFF000; v8 = v5 & 0xFFFFF000; v11 = 0; if ( __PAIR64__(v6, v7) < __PAIR64__(HIDWORD(v5), (unsigned int)v5 & 0xFFFFF000) ) return SYM; v10[2] = v5 & 0xFFFFF000; v9 = v5 - v8; v10[0] = 1; v10[1] = v7 - v8; v10[3] = a0; v10[4] = v7 - v8; result = __semihost((int)v10, a3); if ( result == 0 ) { result = (unsigned __int8)*a3; __asm { SVC 0x6D ; 'm' } if ( *a3 == 0 ) *a4 = v11 + v9; } return result; }", "map_client_buffer": "int __fastcall map_client_buffer( unsigned int a0, unsigned int a1, unsigned int a2, _BYTE *a3, _DWORD *a4, int a5, int a6, unsigned int a7) { unsigned __int64 v8; unsigned __int64 v9; unsigned int v10; int result; int v11; _DWORD v12[4]; unsigned int v13; int v14; v8 = __PAIR64__(a0, 0) + a1; HIDWORD(v9) = (v8 + a2 + 4095) >> 32; LODWORD(v9) = ((unsigned int)v8 + a2 + 4095) >> 12 << 12; v10 = (unsigned int)v8 >> 12 << 12; v14 = 0; if ( v9 < __PAIR64__(HIDWORD(v8), v10) ) return SYM; v12[2] = (unsigned int)v8 >> 12 << 12; v11 = v8 - v10; v12[0] = 1; v12[1] = v9 - v10; v12[3] = a0; v13 = v9 - v10; if ( a7 == 0xFFFF || (result = sysdrv_validate_ring_buffer(a7, a0, v10, v13)) == 0 ) { result = (int)v12; if ( a6 != 0 ) __asm { SVC 0x8B } else __asm { SVC 0x6B ; 'k' } if ( v12 == nullptr ) { result = (unsigned __int8)*a3; __asm { SVC 0x6D ; 'm' } if ( *a3 == 0 ) *a4 = v14 + v11; } } return result; }", "read_hw_status": "int __fastcall read_hw_status() { __asm { SVC 0x7B ; '{' } return 0; }", "heap_ready": "BOOL __fastcall heap_ready() { return *(unsigned __int8 *)SYM << 31 != 0; }", "sysdrv_message_handler": "int __fastcall sysdrv_message_handler(rpc_frame_t *frame, int client) { unsigned int opcode; unsigned int v0; int v1; int v2; int v3; _DWORD v4[32]; opcode = frame->opcode; v0 = SYM; if ( frame->opcode == 4096 ) goto LABEL_7; if ( *((_DWORD *)SYM + 3) == 1 ) { if ( opcode >= SYM ) { bzero_core(v4, 0x7Cu); goto LABEL_8; } LABEL_7: memcpy(v4, frame, 0x7Cu); LABEL_8: v4[0] = opcode; if ( opcode >= 0x1000 ) { v3 = sysdrv_rpc_dispatch((rpc_frame_t *)v4, client); if ( opcode >= v0 ) return v3; } else { v3 = gp_crypto_dispatch((rpc_frame_t *)v4, client, v1, v2); } memcpy(frame, v4, 0x7Cu); return v3; } return SYM + 7; }", "heap_pool_init": "int __fastcall heap_pool_init(unsigned int *a0, int a1) { unsigned int v2; v2 = ((unsigned int)a0 + 31) & 0xFFFFFFF0; a0[3] = v2; *(_DWORD *)v2 = a0; *(_DWORD *)(v2 + 4) = 0; *(_DWORD *)(v2 + 8) = 0; *(_BYTE *)(v2 + 16) = 1; *(_BYTE *)(v2 + 17) = 86; *(_DWORD *)(v2 + 12) = a1 - (a0[3] - (_DWORD)a0) - 32; *a0 = v2; a0[1] = v2; a0[2] = *(_DWORD *)(v2 + 0xC); return 0; }", "heap_alloc": "_BYTE *__fastcall heap_alloc(unsigned int a0, int a1, int a2) { void *v3; v3 = nullptr; __asm { SVC 0x72 ; 'r' } if ( a2 == 0 ) { __asm { SVC 0x5E ; '^' } if ( MEMORY[4] != 0 || heap_pool_init(nullptr, 0) == 0 ) { v3 = (void *)heap_alloc_from_pool(a0, nullptr, a1); __asm { SVC 0x5F ; '_' } if ( !_ZF && a1 == 0 ) bzero(v3, a0); } else { __asm { SVC 0x5F ; '_' } } } return v3; }", "heap_free": "int __fastcall heap_free(int result) { int *v0; if ( result != 0 ) { if ( *(_BYTE *)(result - 15) == 86 && *(_BYTE *)(result - 16) == 0 ) { v0 = SYM; __asm { SVC 0x5E ; '^' } heap_free_to_pool(result); __asm { SVC 0x5F ; '_' } return *v0; } else { return require_capability(SYM); } } return result; }", "object_buffer_realloc": "_BYTE *__fastcall object_buffer_realloc(int a0, unsigned int a1, int a2) { _BYTE *v3; _BYTE *v4; _BYTE *v5; v3 = (_BYTE *)a0; if ( a0 == 0 ) return heap_alloc(a1, 0, a2); if ( *(_BYTE *)(a0 - 15) != 86 || *(_BYTE *)(a0 - 16) == 1 ) { require_capability(SYM); } else { v4 = heap_alloc(a1, *(_DWORD *)(a0 - 12), a2); v5 = v4; if ( v4 != nullptr ) { memcpy_thunk((int)v4); heap_free((int)v3); return v5; } else { return nullptr; } } return v3; }", "key_derive_and_wrap": "int __fastcall key_derive_and_wrap( int r0_0, int a0, unsigned int a1, unsigned int a2, unsigned int a3, int a4, unsigned int a5) { _DWORD *v6; char *v7; bn_t *rem; char *v8; char *v9; unsigned int *v10; int v11; int *v12; int v13; const unsigned int *v14; bn_t *den; unsigned int v15; bn_scratch_t *scratch; int v16; unsigned int a[97]; int v17; int a18; unsigned int v19; int v20; v17 = r0_0; a18 = a0; v19 = a1; v20 = a2; a[96] = *(_DWORD *)SYM; v15 = 96; __asm { SVC 0x5E ; '^' } v6 = SYM; v7 = (char *)SYM + 360; den = (bn_t *)SYM; rem = (bn_t *)(SYM + 1212); v14 = (const unsigned int *)((char *)SYM + 696); scratch = (bn_scratch_t *)((char *)SYM - 7272); v8 = (char *)SYM + 72; v9 = (char *)SYM + 144; v10 = (unsigned int *)((char *)SYM + 216); if ( r0_0 != 4 ) { v11 = SYM; goto LABEL_26; } v12 = (int *)SYM; if ( a1 < 0x30 || a3 < 0x30 || a5 < 0x30 ) { v11 = SYM + 6; goto LABEL_26; } v11 = rand_fill_bytes(a, 0x30u, a1, a2); if ( v11 == 0 ) { v16 = (int)(v12 + 36); if ( memcmp_be(a, v12 + 36, 0x30u) > 0 ) { buf_reverse_inplace(a, 0x30u); v11 = bn_from_bytes_be(rem, a, 0x30u); if ( v11 != 0 ) goto LABEL_26; v11 = copy_maybe_reverse((int)v14, &v15, v16, v12[72], 1); if ( v11 != 0 ) goto LABEL_26; v11 = bn_from_bytes_be(den, v14, v12[72]); if ( v11 != 0 ) goto LABEL_26; v11 = bn_divmod(scratch, nullptr, rem, den, rem); if ( v11 != 0 ) goto LABEL_26; v11 = bn_export_words(rem, a, 0x30u); if ( v11 != 0 ) goto LABEL_26; buf_reverse_inplace(a, 0x30u); } memcpy_thunk(a18); v6[17] = 48; v11 = copy_maybe_reverse((int)v6, v6 + 17, (int)a, 0x30u, 1); if ( v11 == 0 ) { *((_DWORD *)v8 + 17) = v12[72]; v11 = copy_maybe_reverse((int)v8, (unsigned int *)v8 + 17, (int)v12, v12[72], 1); if ( v11 == 0 ) { *((_DWORD *)v9 + 17) = v12[72]; v11 = copy_maybe_reverse((int)v9, (unsigned int *)v9 + 17, (int)(v12 + 12), v12[72], 1); if ( v11 == 0 ) { *((_DWORD *)v7 + 17) = v12[72]; v13 = copy_maybe_reverse((int)v7, (unsigned int *)v7 + 17, (int)(v12 + 48), v12[72], 1); v11 = v13; if ( v13 == 0 ) { *((_DWORD *)v7 + 35) = v12[72]; v11 = copy_maybe_reverse((int)(v7 + 72), (unsigned int *)v7 + 35, (int)(v12 + 60), v12[72], 1); if ( v11 == 0 ) { v11 = crypto_dual_op((int)v8, (int)v9, (int)v6, (int)v7, (int)v10); if ( v11 == 0 ) { v11 = rsa_key_import(v17, v10); if ( v11 == 0 ) { v11 = copy_maybe_reverse(v20, &a3, (int)v10, 0x30u, 1); if ( v11 == 0 ) v11 = copy_maybe_reverse(a4, &a5, (int)(v10 + 18), 0x30u, 1); } } } } } } } } LABEL_26: __asm { SVC 0x5F ; '_' } return v11; }", "pk_bignum_core": "int __fastcall pk_bignum_core(int a0, int a1, _DWORD *a2, unsigned int *a3, unsigned int a4) { bn_t *v5; char *v6; char *v7; char *v8; bn_t *rem; int v9; int *v10; unsigned int v11; char *v12; unsigned int v13; int v14; int v15; unsigned int v16; int v17; int v18; int v19; bn_t *num; bn_t *r; bn_t *a; bn_scratch_t *scratch; _BYTE *v20; unsigned int *src; unsigned int v21[4]; bn_t *b; bn_t *v22; unsigned int *out; bn_t *v23; void *dst; int v24; unsigned int v25; _DWORD *v26; void *buf; v24 = a0; v25 = a1; v26 = a2; buf = a3; v21[0] = 48; __asm { SVC 0x5E ; '^' } r = (bn_t *)SYM; v23 = (bn_t *)SYM; a = (bn_t *)(SYM + 1212); b = (bn_t *)(SYM + 3636); v5 = (bn_t *)(SYM + 4848); v22 = (bn_t *)(SYM + 3636); num = (bn_t *)(SYM + 3636); scratch = (bn_scratch_t *)(SYM + 6060); out = (unsigned int *)SYM; v6 = (char *)SYM + 72; v7 = (char *)SYM + 144; src = (unsigned int *)((char *)SYM + 216); v8 = (char *)SYM + 360; v20 = (char *)SYM + 696; dst = (char *)SYM + 648; rem = (bn_t *)(SYM + 2424); if ( *a2 != 4 ) { v9 = SYM; goto LABEL_45; } v10 = (int *)SYM; v11 = (*SYM)[72]; if ( a4 < 2 * v11 || (bzero(dst, 0x30u), v11 > 0x30) || (v11 <= v25 ? (v12 = (char *)dst) : (v12 = (char *)dst + v11 - v25), memcpy_thunk((int)v12), buf_reverse_inplace(dst, v10[72]), (v13 = v10[72] + 8) > 0x60) ) { v9 = SYM + 6; goto LABEL_45; } bzero(v20, 0x60u); v9 = rand_fill_bytes(v20, v13, v14, v15); if ( v9 == 0 ) { v9 = bn_from_bytes_be(r, (const unsigned int *)v20, v10[72] + 8); if ( v9 == 0 ) { bzero(v20, 0x60u); v9 = copy_maybe_reverse((int)v20, v21, (int)(v10 + 36), v10[72], 1); if ( v9 == 0 ) { v9 = bn_from_bytes_be(a, (const unsigned int *)v20, v10[72]); if ( v9 == 0 ) { *(_QWORD *)&rem->nlimbs = 1; rem->rsvd = 0; rem->limb[0] = 1; v9 = bn_sub(num, a, rem); if ( v9 == 0 && (bn_cmp(r, num) == 2 || (v9 = bn_divmod(scratch, nullptr, r, num, r)) == 0) ) { v9 = bn_add(r, r, rem); if ( v9 == 0 ) { *((_DWORD *)v6 + 17) = v10[72]; v9 = copy_maybe_reverse((int)v6, (unsigned int *)v6 + 17, (int)v10, v10[72], 1); if ( v9 == 0 ) { *((_DWORD *)v7 + 17) = v10[72]; v9 = copy_maybe_reverse((int)v7, (unsigned int *)v7 + 17, (int)(v10 + 12), v10[72], 1); if ( v9 == 0 ) { *((_DWORD *)v8 + 17) = v10[72]; v9 = copy_maybe_reverse((int)v8, (unsigned int *)v8 + 17, (int)(v10 + 48), v10[72], 1); if ( v9 == 0 ) { *((_DWORD *)v8 + 35) = v10[72]; v9 = copy_maybe_reverse((int)(v8 + 72), (unsigned int *)v8 + 35, (int)(v10 + 60), v10[72], 1); if ( v9 == 0 ) { v16 = v10[72]; out[17] = v16; bn_export_words(r, out, v16); v9 = crypto_dual_op((int)v6, (int)v7, (int)out, (int)v8, (int)src); if ( v9 == 0 ) { v9 = bn_from_bytes_be(rem, src, src[17]); if ( v9 == 0 ) { v9 = bn_divmod(scratch, nullptr, rem, a, rem); if ( v9 == 0 ) { v17 = SYM - 10; if ( rem->nlimbs == 0 ) { LABEL_41: v9 = v17; goto LABEL_45; } v9 = bn_from_bytes_be(b, a2 + 2, a2[1] >> 3); if ( v9 == 0 ) { v9 = bn_mul(v5, rem, b, 0); if ( v9 == 0 ) { v9 = bn_from_bytes_be(v22, (const unsigned int *)dst, v10[72]); if ( v9 == 0 ) { v9 = bn_add(num, v22, v5); if ( v9 == 0 ) { v9 = bn_divmod(scratch, nullptr, num, a, num); if ( v9 == 0 ) { bn_modinv_flag1(&scratch->t0, (int)v5); v9 = v18; if ( v18 == 0 ) { v19 = bn_mul(v23, num, v5, 0); v9 = v19; if ( v19 == 0 ) { v9 = bn_divmod(scratch, nullptr, v23, a, v5); if ( v9 == 0 ) { if ( v5->nlimbs == 0 || rem->nlimbs != v5->nlimbs ) goto LABEL_41; v9 = bn_export_words(rem, (unsigned int *)buf, v10[72]); if ( v9 == 0 ) { buf_reverse_inplace(buf, v10[72]); v9 = bn_export_words( v5, (unsigned int *)((char *)buf + v10[72]), v10[72]); if ( v9 == 0 ) buf_reverse_inplace((char *)buf + v10[72], v10[72]); } } } } } } } } } } } } } } } } } } } } } } LABEL_45: __asm { SVC 0x5F ; '_' } return v9; }", "pk_verify_signature": "int __fastcall pk_verify_signature(int a0, int a1, int a2, unsigned int a3, _DWORD *a4) { _DWORD *v5; bn_t *v6; bn_t *v7; unsigned int *v8; char *v9; int v10; int *v11; bool v12; int v13; bool v14; bool v15; int v16; int v17; int v18; unsigned int v19; int v20; int v21; int v22; bn_t *b; bn_t *v23; char *dst; bn_t *a; bn_scratch_t *v24; char *buf; bn_t *r; char *v25; char *v26; char *v27; bn_t *rem; __asm { SVC 0x5E ; '^' } a = (bn_t *)SYM; rem = (bn_t *)SYM; r = (bn_t *)((char *)SYM + 1212); v23 = (bn_t *)((char *)SYM + 1212); v5 = SYM; v6 = (bn_t *)((char *)SYM + 3636); v7 = (bn_t *)((char *)SYM + 4848); b = (bn_t *)((char *)SYM + 2424); v24 = (bn_scratch_t *)((char *)SYM + 6060); v26 = (char *)SYM + 72; v25 = (char *)SYM + 144; v8 = (unsigned int *)((char *)SYM + 216); v9 = (char *)SYM + 360; v27 = (char *)SYM + 504; dst = (char *)SYM + 696; buf = (char *)SYM + 648; if ( *a4 == 4 ) { v11 = (int *)SYM; v10 = bn_from_bytes_be((bn_t *)SYM + 3, (_DWORD *)((char *)a4 + 74), a4[1] >> 3); if ( v10 == 0 ) { v10 = bn_from_bytes_be(v7, a4 + 35, a4[1] >> 3); if ( v10 == 0 ) { _ZF = v6->nlimbs == 0; do { if ( _ZF ) { LABEL_55: v10 = SYM; goto LABEL_56; } _ZF = v7->nlimbs == 0; } while ( v7->nlimbs == 0 ); memcpy_thunk((int)v8); v8[17] = a4[1] >> 3; memcpy(v8 + 18, a4 + 35, a4[1] >> 3); v8[35] = a4[1] >> 3; v10 = rsa_key_import(*a4, v8); v12 = v10 == 0; LABEL_10: if ( v12 ) { v13 = 1; *((_DWORD *)v26 + 17) = v11[72]; v10 = copy_maybe_reverse((int)v26, (unsigned int *)v26 + 17, (int)v11, v11[72], 1); v14 = v10 == 0; LABEL_13: if ( v14 ) { *((_DWORD *)v25 + 17) = v11[72]; v10 = copy_maybe_reverse((int)v25, (unsigned int *)v25 + 17, (int)(v11 + 12), v11[72], v13); if ( v10 == 0 ) { v5[17] = v11[72]; v10 = copy_maybe_reverse((int)v5, v5 + 17, (int)(v11 + 36), v11[72], 1); if ( v10 == 0 ) { v10 = crypto_dual_op((int)v26, (int)v25, (int)v5, (int)v9, (int)v27); v15 = v10 == 0; while ( !v15 ) { bzero(dst, 0x60u); if ( a3 > 0x60 ) goto LABEL_30; memcpy_thunk((int)dst); buf_reverse_inplace(dst, a3 >> 1); v13 = (int)&dst[a3 >> 1]; buf_reverse_inplace((void *)v13, a3 >> 1); v10 = bn_from_bytes_be(a, (const unsigned int *)dst, a3 >> 1); v12 = v10 == 0; if ( v10 != 0 ) goto LABEL_10; v16 = bn_from_bytes_be(r, (const unsigned int *)v13, a3 >> 1); v10 = v16; v12 = v16 == 0; if ( v16 != 0 ) goto LABEL_10; v15 = a->nlimbs == 0; if ( a->nlimbs != 0 ) { v15 = r->nlimbs == 0; if ( r->nlimbs != 0 ) { v10 = bn_from_bytes_be(b, v5, v11[72]); v12 = v10 == 0; if ( v10 != 0 ) goto LABEL_10; v17 = bn_cmp(a, b); v14 = v17 == 2; if ( v17 != 2 ) goto LABEL_13; v18 = bn_cmp(r, b); v14 = v18 == 2; if ( v18 != 2 ) goto LABEL_13; bzero(buf, 0x30u); v19 = v11[72]; if ( v19 > 0x30 ) { LABEL_30: v10 = SYM + 6; break; } if ( v19 <= a1 ) v20 = (int)buf; else v20 = (int)&buf[v19 - a1]; memcpy_thunk(v20); buf_reverse_inplace(buf, v11[72]); v10 = bn_from_bytes_be(v6, (const unsigned int *)buf, v11[72]); if ( v10 != 0 ) break; bn_modinv_flag1(&v24->t0, (int)v7); v10 = v21; if ( v21 != 0 ) break; v10 = bn_divmod(v24, nullptr, v6, b, v6); if ( v10 != 0 ) break; v10 = bn_mul(v23, v6, v7, 0); if ( v10 != 0 ) break; v10 = bn_divmod(v24, nullptr, v23, b, v6); if ( v10 != 0 ) break; v10 = bn_divmod(v24, nullptr, a, b, rem); if ( v10 != 0 ) break; v10 = bn_mul(v23, rem, v7, 0); if ( v10 != 0 ) break; v10 = bn_divmod(v24, nullptr, v23, b, v7); if ( v10 != 0 ) break; bn_export_words(v6, v5, v11[72]); v5[17] = v11[72]; *((_DWORD *)v9 + 17) = v11[72]; v10 = copy_maybe_reverse((int)v9, (unsigned int *)v9 + 17, (int)(v11 + 48), v11[72], 1); if ( v10 != 0 ) break; *((_DWORD *)v9 + 35) = v11[72]; v10 = copy_maybe_reverse((int)(v9 + 72), (unsigned int *)v9 + 35, (int)(v11 + 60), v11[72], 1); if ( v10 != 0 ) break; v10 = crypto_dual_op((int)v26, (int)v25, (int)v5, (int)v9, (int)v27); if ( v10 != 0 ) break; bn_export_words(v7, v5, v11[72]); v5[17] = v11[72]; v22 = crypto_dual_op((int)v26, (int)v25, (int)v5, (int)v8, (int)v9); v10 = v22; if ( v22 != 0 ) break; v10 = ecdh_shared_secret((int)v25, (int)v27, (int)v9, (int)v8); if ( v10 != 0 ) break; v10 = bn_from_bytes_be(v6, v8, v8[17]); if ( v10 != 0 ) break; v10 = bn_from_bytes_be(v7, v8 + 18, v8[35]); if ( v10 != 0 ) break; if ( v6->nlimbs != 0 && v7->nlimbs != 0 ) { v10 = bn_divmod(v24, nullptr, v6, b, v23); if ( v10 != 0 || bn_cmp(a, v23) == 3 ) break; } goto LABEL_55; } } } } } } } } } } else { v10 = SYM; } LABEL_56: __asm { SVC 0x5F ; '_' } return v10; }", "ecc_ctx_ready": "int __fastcall ecc_ctx_ready(int a0, int a1, unsigned int a2, int a3, int a4) { return ecc_sig_load(a0, a1, a2, a3, a2, a4, a2); }", "ecc_sig_load": "int __fastcall ecc_sig_load(int a0, int a1, unsigned int a2, int a3, unsigned int a4, int a5, unsigned int a6) { if ( a2 > 0x48 || a4 > a2 || a6 > a2 ) return 48; record_clear_tail(a0, a1, a2); record_clear_tail(a0 + 72, a3, a4); record_clear_tail(a0 + 144, a5, a6); bzero((void *)(a0 + 216), 0x168u); return 0; }", "ecc_ctx_clear": "_BYTE *__fastcall ecc_ctx_clear(int a0, int a1, int a2, int a3) { record_clear_tail(a0, a1, a2); ecc_pair_clear(a0 + 72, a3, a2); bzero((void *)(a0 + 216), 0x48u); return bzero((void *)(a0 + 432), 0x48u); }", "ecc_ctx_ready2": "int __fastcall ecc_ctx_ready2(int a0, int a1, unsigned int a2, int a3) { return ecc_sig_load2(a0, a1, a2, a3, a2); }", "ecc_sig_load2": "int __fastcall ecc_sig_load2(int a0, int a1, unsigned int a2, int a3, unsigned int a4) { if ( a2 > 0x48 || a4 > a2 ) return 48; record_clear_tail(a0, a1, a2); record_clear_tail(a0 + 72, a3, a4); bzero((void *)(a0 + 144), 0x1B0u); return 0; }", "ecc_ctx_load": "int __fastcall ecc_ctx_load(int a0, int a1, unsigned int a2, int a3, int a4) { if ( a2 > 0x48 ) return 48; ecc_ctx_clear(a0, a1, a2, a3); ecc_pair_clear(a0 + 288, a4, a2); return 0; }", "ecc_scalar_load": "int __fastcall ecc_scalar_load(int a0, int a1, unsigned int a2, int a3, unsigned int a4, int a5) { if ( a2 > 0x48 || a4 > a2 ) return 48; ecc_ctx_clear(a0, a1, a2, a5); record_clear_tail(a0 + 288, a3, a4); bzero((void *)(a0 + 360), 0x48u); return 0; }", "ecc_ctx_prepare": "_BYTE *__fastcall ecc_ctx_prepare(int a0, int a1, int a2, int a3, int a4, int a5, int a6) { record_clear_tail(a0, a1, a2); bzero((void *)(a0 + 216), 0x48u); record_clear_tail(a0 + 288, a3, a4); record_clear_tail(a0 + 360, a5, a6); return bzero((void *)(a0 + 432), 0x90u); }", "ecc_verify_core": "int __fastcall ecc_verify_core( int a0, int a1, unsigned int a2, int a3, unsigned int a4, int a5, unsigned int a6, int a7, unsigned int a8, int a9, unsigned int a10) { if ( a2 > 0x48 || a4 > a2 || a6 > a2 || a8 > a2 || a10 > a2 ) return 48; ecc_ctx_prepare(a0, a1, a2, a3, a4, a5, a6); record_clear_tail(a0 + 72, a7, a8); record_clear_tail(a0 + 144, a9, a10); return 0; }", "ecc_op_submit": "int __fastcall ecc_op_submit(int a0, int a1, int a2, int a3, int a4) { _UNKNOWN **v5; int v6; int v7; int v8; int v9; int v10; ccp_desc_t d; v5 = SYM; bzero((char *)*SYM + 4384, 0x98u); v6 = ecc_ctx_ready((int)*v5 + 3808, a3, *(_DWORD *)(a3 + 68), a1, a2); v7 = SYM; if ( v6 != 0 || ccp_desc_ecc(&d, a0, *SYM + 4384, *SYM + 3808, *(_DWORD *)(a3 + 68), 1) != 0 ) return v7; v10 = crypto_wait_completion((int)&d, 1, v8, v9); if ( v10 == 0 ) { if ( *((unsigned __int8 *)*v5 + 4456) << 31 != 0 ) { memcpy_thunk(a4); *(_DWORD *)(a4 + 68) = *(_DWORD *)(a3 + 68); return v10; } return v7; } return v10; }", "ecc_point_double": "int __fastcall ecc_point_double(int a0, int a1, int a2) { _UNKNOWN **v3; int v4; int v5; int v6; int v7; int v8; ccp_desc_t d; v3 = SYM; bzero((char *)*SYM + 4384, 0x98u); v4 = ecc_ctx_ready2((int)*v3 + 3808, a1, *(_DWORD *)(a1 + 68), a0); v5 = SYM; if ( v4 != 0 || ccp_desc_ecc(&d, 2, *SYM + 4384, *SYM + 3808, *(_DWORD *)(a1 + 68), 1) != 0 ) return v5; v8 = crypto_wait_completion((int)&d, 1, v6, v7); if ( v8 == 0 ) { if ( *((unsigned __int8 *)*v3 + 4456) << 31 != 0 ) { memcpy_thunk(a2); *(_DWORD *)(a2 + 68) = *(_DWORD *)(a1 + 68); return v8; } return v5; } return v8; }", "ecdsa_sign": "int __fastcall ecdsa_sign(int a0, int a1, int a2, int a3) { _UNKNOWN **v4; _DWORD *v5; int v6; int v7; int v8; int v9; int v10; _BYTE v11[144]; _BYTE v12[144]; ccp_desc_t d; v4 = SYM; v5 = SYM; bzero((char *)*SYM + 4384, 0x98u); copy_dual_record((int)v11, a1, *(_DWORD *)(a0 + 68)); copy_dual_record((int)v12, a2, *(_DWORD *)(a0 + 68)); v6 = ecc_ctx_load(*v5 + 3808, a0, *(_DWORD *)(a0 + 68), (int)v11, (int)v12); v7 = SYM; if ( v6 != 0 || ccp_desc_ecc(&d, 3, *SYM + 4384, *SYM + 3808, *(_DWORD *)(a0 + 68), 1) != 0 ) return v7; v10 = crypto_wait_completion((int)&d, 1, v8, v9); if ( v10 == 0 ) { if ( *((unsigned __int8 *)*v4 + 4456) << 31 != 0 ) { memcpy_thunk(a3); *(_DWORD *)(a3 + 68) = *(_DWORD *)(a0 + 68); memcpy_thunk(a3 + 72); *(_DWORD *)(a3 + 140) = *(_DWORD *)(a0 + 68); return v10; } return v7; } return v10; }", "ecc_point_mul_verify": "int __fastcall ecc_point_mul_verify(int a0, int a1, int a2, int a3) { _UNKNOWN **v4; _DWORD *v5; int v6; int v7; int v8; int v9; int v10; _BYTE v11[144]; ccp_desc_t d; v4 = SYM; v5 = SYM; bzero((char *)*SYM + 4384, 0x98u); copy_dual_record((int)v11, a2, *(_DWORD *)(a1 + 68)); v6 = ecc_scalar_load(*v5 + 3808, a1, *(_DWORD *)(a1 + 68), a0, *(_DWORD *)(a0 + 68), (int)v11); v7 = SYM; if ( v6 != 0 || ccp_desc_ecc(&d, 5, *SYM + 4384, *SYM + 3808, *(_DWORD *)(a1 + 68), 1) != 0 ) return v7; v10 = crypto_wait_completion((int)&d, 1, v8, v9); if ( v10 == 0 ) { if ( *((unsigned __int8 *)*v4 + 4456) << 31 != 0 ) { memcpy_thunk(a3); *(_DWORD *)(a3 + 68) = *(_DWORD *)(a1 + 68); memcpy_thunk(a3 + 72); *(_DWORD *)(a3 + 140) = *(_DWORD *)(a1 + 68); return v10; } return v7; } return v10; }", "ecdsa_verify": "int __fastcall ecdsa_verify(int a0, int a1, int a2, int a3, int a4) { _UNKNOWN **v5; int v6; int v7; int v8; int v9; int v10; ccp_desc_t d; v5 = SYM; bzero((char *)*SYM + 4384, 0x98u); v6 = ecc_verify_core( (int)*v5 + 3808, a1, *(_DWORD *)(a1 + 68), a0, *(_DWORD *)(a0 + 68), a2, *(_DWORD *)(a2 + 68), a3, *(_DWORD *)(a3 + 68), a3 + 72, *(_DWORD *)(a3 + 140)); v7 = SYM; if ( v6 != 0 || ccp_desc_ecc(&d, 4, *SYM + 4384, *SYM + 3808, *(_DWORD *)(a1 + 68), 1) != 0 ) return v7; v10 = crypto_wait_completion((int)&d, 1, v8, v9); if ( v10 == 0 ) { if ( *((unsigned __int8 *)*v5 + 4456) << 31 != 0 ) { memcpy_thunk(a4); *(_DWORD *)(a4 + 68) = *(_DWORD *)(a1 + 68); memcpy_thunk(a4 + 72); *(_DWORD *)(a4 + 140) = *(_DWORD *)(a1 + 68); return v10; } return v7; } return v10; }", "reg_unlock_sequence": "int __fastcall reg_unlock_sequence() { int v0; __asm { SVC 0xA6 } __asm { SVC 0xA6 } v0 = 1; return reg_write_sized(SYM, 65533, (int)&v0, 2); }", "reg_write_nop": "__int64 __fastcall reg_write_nop() { __int64 result; HIDWORD(result) = SYM; LODWORD(result) = -1; __asm { SVC 0x7C ; '|' } return result; }", "flash_clock_disable": "__int64 __fastcall flash_clock_disable() { __asm { SVC 0xA6 } return (unsigned int)SYM; }", "power_rail_disable": "int __fastcall power_rail_disable() { int result; result = (unsigned __int8)*SYM; if ( *SYM != 0 ) { result = *((_DWORD *)SYM + 263); if ( result != 2 ) { __asm { SVC 0xA6 } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0xA6 } __asm { SVC 0xA6 } return 25212; } } return result; }", "nop_hook_ecc": "void __fastcall nop_hook_ecc() { ; }", "reg_probe": "int __fastcall reg_probe(int a0, int a1) { int result; result = SYM; __asm { SVC 0x7B ; '{' } if ( SYM == 0 ) { __asm { SVC 0x7C ; '|' } result = link_train_step(-62, -61); if ( result == 0 ) return link_train_step(a0, a1); } return result; }", "power_rail_enable": "unsigned int __fastcall power_rail_enable() { char *v0; unsigned int result; __asm { SVC 0xA6 } v0 = SYM; if ( *SYM == 28 ) __asm { SVC 0xA6 } __asm { SVC 0xA6 } if ( *SYM == 28 ) __asm { SVC 0xA6 } *(_DWORD *)SYM |= 1u; result = (unsigned __int8)*v0; if ( result == 28 ) { result = *(_DWORD *)SYM | 1; *(_DWORD *)SYM = result; } else if ( result == 49 || result == 51 ) { return engine_regs_init(result); } return result; }", "engine_regs_init": "unsigned int __fastcall engine_regs_init(int a0) { unsigned int i; unsigned int result; int *v1; for ( i = 0; i < 0x17; ++i ) __asm { SVC 0xA6 } result = 0; v1 = &(*SYM)[-30]; do { *(_DWORD *)v1[3 * result] = v1[3 * result + 1] | *(_DWORD *)v1[3 * result] & ~v1[3 * result + 2]; ++result; } while ( result < 0xA ); return result; }", "mp_state_advance": "int __fastcall mp_state_advance(int a0, int a1, int a2, int a3) { _BYTE *v4; int result; v4 = SYM; if ( *((_BYTE *)SYM + 15) == 3 ) return 0; result = mp_send_and_wait(*((unsigned __int8 *)SYM + 68), a1, a2, a3); if ( result == 0 ) v4[15] = 4; return result; }", "lock_acquire_nop": "int __fastcall lock_acquire_nop() { __asm { SVC 0x5E ; '^' } return 0; }", "tsu_write_active_slot": "int __fastcall tsu_write_active_slot(int *a0, int a1, int a2, int a3) { int v4; unsigned int v5; int v6; BOOL v7; int v8; int v9; int v10; int i; int v11; v11 = 0; v4 = 0; v5 = *((unsigned __int8 *)SYM + 2132); if ( v5 <= 1 ) { v7 = v5 == 0; v8 = a3 + 12 * v7; if ( *(_BYTE *)(v8 + 48) != 0 ) { v6 = tsu_write_record_header(a0, a3, v7, 0); if ( v6 == 0 ) { v10 = spi_erase_range(*(_DWORD *)(v8 + 64), *(_DWORD *)(v8 + 68)); v6 = v10; if ( v10 != 0 ) { *a0 = 12; } else { v6 = tsu_write_region( a0, a1, a2, *(_DWORD *)(a2 + 12 * v7 + 64), *(_DWORD *)(v8 + 64), *(_DWORD *)(a2 + 12 * v7 + 68), *(_DWORD *)(v8 + 68), 5); if ( v6 == 0 ) { LABEL_16: for ( i = 6; ; i = 7 ) { v6 = tsu_write_region( a0, a1, a2, *(_DWORD *)(a2 + 12 * v4 + 88), *(_DWORD *)(a3 + 12 * v4 + 88), *(_DWORD *)(a2 + 12 * v4 + 92), *(_DWORD *)(a3 + 12 * v4 + 92), i); if ( v6 != 0 ) { spi_erase_range(*(_DWORD *)(a3 + 12 * v4 + 88), *(_DWORD *)(a3 + 12 * v4 + 92)); goto LABEL_20; } v6 = tsu_write_block( a0, a1, *(_DWORD *)(a2 + 16 * i + 136), *(_DWORD *)(a3 + 16 * i + 136), *(_DWORD *)(a3 + 16 * i + 132), 0, 0); if ( v6 != 0 ) goto LABEL_20; if ( (unsigned int)++v4 < 2 ) { if ( v4 != 1 ) goto LABEL_16; if ( *((_BYTE *)SYM + 2133) != 0 ) continue; } break; } v6 = tsu_write_record_header(a0, a3, v7, *((_DWORD *)SYM + 532) + 1); if ( v6 == 0 ) { clock_domain_config(1); return v6; } } } LABEL_20: v11 = spi_erase_range(*(_DWORD *)(v8 + 64), *(_DWORD *)(v8 + 68)); } } else { v9 = SYM; *a0 = 11; v6 = v9 + 2; } } else { v6 = SYM; *a0 = 2; } log_event(0xBu, 2); log_event(9u, v6); log_event(9u, *a0); log_event(9u, v11); return v6; }", "queue_drain": "int __fastcall queue_drain(unsigned int a0) { char *v1; int v2; int v3; v1 = SYM; v2 = 0; if ( SYM[1] != 0 ) { SYM[2] = 0; __asm { SVC 0x57 ; 'W' } v2 = (unsigned __int8)*v1; if ( *v1 == 0 ) { v3 = 0; while ( v1[2] == 0 ) { __asm { SVC 0x56 ; 'V' } if ( ++v3 > a0 ) return SYM; } } } return v2; }", "bit_index_decode": "int __fastcall bit_index_decode(unsigned int a0, int a1, int a2, int a3) { char v4; unsigned int v5; if ( (a0 & 0x80) != 0 ) *(_BYTE *)a3 = 1; v4 = a0 & 0x7F; v5 = SYM & (a0 >> 3); *(_BYTE *)a2 = v5; if ( v5 >= 4 ) return SYM; *(_BYTE *)a1 = 1 << (v4 - 8 * v5); return 0; }", "record_clear_tail": "_BYTE *__fastcall record_clear_tail(int a0, int a1, int a2) { memcpy_thunk(a0); return bzero((void *)(a0 + a2), 72 - a2); }", "ecc_pair_clear": "_BYTE *__fastcall ecc_pair_clear(int a0, int a1, int a2) { record_clear_tail(a0, a1, a2); return record_clear_tail(a0 + 72, a1 + 72, a2); }", "find_entry_by_id": "_DWORD *__fastcall find_entry_by_id(_DWORD *result, unsigned int a0, int a1) { unsigned int i; for ( i = 0; i < a0; ++i ) { if ( *result == a1 ) return result; result += 3; } return nullptr; }", "find_param_by_id": "_DWORD *__fastcall find_param_by_id(_DWORD *a0, unsigned int a1, int a2, int a3) { unsigned int i; _DWORD *result; for ( i = 0; ; ++i ) { if ( i >= a1 ) return nullptr; if ( *a0 == a2 ) break; a0 += 3; } result = (_DWORD *)validate_client_range(a0[1], a0[2], a3, 0); if ( result != nullptr ) return a0; return result; }", "find_object_by_uuid": "int __fastcall find_object_by_uuid(unsigned int *a0, unsigned int a1, int a2) { int v3; int v4; int v5; int v6; int v7; v3 = SYM; v4 = 0; v5 = -1; while ( 1 ) { v6 = v3 + 8 * v4; if ( *(unsigned __int8 *)(v6 + 1) == a2 && *(_BYTE *)v6 == 1 ) { v7 = *(_DWORD *)(v6 + 4); if ( (*(_DWORD *)(v7 + 108) & 0x10000) != 0 && *(unsigned __int8 *)(v7 + 1) == a1 && memcmp_be((const void *)(v7 + 8), a0, a1) == 0 ) { break; } } if ( (unsigned int)++v4 > 0xFF ) return v5; } return v4; }", "curve_table_find": "int __fastcall curve_table_find(int a0, int a1) { char *v2; int result; _DWORD *i; unsigned int v3; v2 = nullptr; result = SYM; for ( i = (_DWORD *)((char *)SYM + 256); (_DWORD *)((char *)SYM + *((_DWORD *)SYM + 5) + 256) > i; i += 2 ) { if ( *i == 1 ) { v3 = i[1]; if ( v3 < 0x8000 ) v2 = (char *)SYM + v3; *(_DWORD *)a1 = v2; return 0; } } return result; }", "ecc_curve_params_get": "int __fastcall ecc_curve_params_get(unsigned int *a0, unsigned int *a1, int a2, _DWORD *a3) { int v4; int v5; unsigned int i; unsigned int *v6; char *v7; int v8; v4 = SYM; v5 = SYM - 2; if ( a2 == 1 ) { for ( i = 0; *a0 > i; ++i ) { v6 = &a0[8 * i]; if ( *((_BYTE *)v6 + 149) == 1 && *((_BYTE *)v6 + 148) == 0 && memcmp_be(v6 + 33, a1, 0x10u) == 0 ) { v4 = 0; *a3 = a0[8 * i + 32]; return v4; } } if ( v4 == 0 ) return v4; v7 = (char *)SYM; v8 = 0; while ( memcmp_be(&v7[16 * v8], a1, 0x10u) != 0 ) { if ( (unsigned int)++v8 >= 4 ) return v4; } } return v5; }", "config_entry_read": "int __fastcall config_entry_read(int a0, const void *a1, unsigned int a2, _BYTE *a3) { int v4; unsigned int v5; int v6; unsigned __int8 *i; int v7; unsigned int v8; unsigned int v9; unsigned int v10; v4 = SYM; if ( a2 > 0x80 ) return SYM - 2; v5 = a0 + 3840; v6 = *(_DWORD *)(a0 + 1796); for ( i = (unsigned __int8 *)(a0 + 1808); v6 != 0; i += *i ) { if ( (unsigned int)i >= v5 ) break; v7 = *i; if ( *i == 0 ) break; v8 = i[2]; if ( i[2] == 0 ) break; if ( v8 > 0x80 ) break; v9 = i[3]; if ( i[3] == 0 || v9 > 0x80 || v8 + v9 + 4 != v7 || (unsigned int)&i[a2 + 4] >= v5 || (unsigned int)&i[v7] >= v5 ) { break; } if ( ct_memcmp(a1, i + 4, a2) == 0 ) { v10 = (unsigned int)&i[i[2] + 4]; if ( v10 >= v5 || i[3] + v10 >= v5 ) return SYM - 3; memcpy_thunk((int)(a3 + 4)); v4 = 0; *a3 = i[1]; a3[1] = i[3]; return v4; } --v6; } return v4; }", "session_release_buffers": "int __fastcall session_release_buffers(int result) { unsigned int v0; int v1; int v2; v0 = 0; v1 = SYM; while ( *(unsigned __int8 *)(result + 33) > v0 ) { v2 = *(unsigned __int8 *)(result + v0++ + 35) - 70; *(_BYTE *)(v1 + v2) = 0; } return result; }", "session_tables_release": "int __fastcall session_tables_release(int a0) { desc_table_find(a0); session_table_scan(a0); flash_slot_iterate(a0); return 0; }", "persist_handle_release": "unsigned int __fastcall persist_handle_release(int a0, int a1) { unsigned int result; result = a0 - 16; if ( result < 0x80 && *(unsigned __int8 *)(SYM + 8 * result + 1) == a1 ) *(_BYTE *)(SYM + 8 * result) = 0; return result; }", "psb_process_config_entry": "int __fastcall psb_process_config_entry(unsigned int a0, int a1, int a2) { unsigned int v3; int v4; int v5; int v6; int v7; int v8; int v9; int v10; unsigned int v11; bool v12; int *v13; __int64 v14; int is_blank; bool v15; char v16; unsigned int v17; char v18; unsigned int v19; char v20; unsigned int v21; unsigned int v22; unsigned int v23; unsigned int v24; unsigned int v25; unsigned int v26; unsigned int v27; unsigned int v28; char v29; unsigned int v30; int v31; char v32; int v33; signed int v34; unsigned int v35; unsigned int v36; unsigned int v37; int v38; char v39; int v40; int v41; int v42; int v43; int v44; int v45; int v46; int v47; int v48; char v49; int v50; int v51; _BYTE dst[36]; __int64 v52; __int64 v53; __int64 v54; int v55; int v56; _DWORD v57[2]; v57[1] = *(_DWORD *)SYM; v45 = 0; v46 = 0; v47 = 0; v3 = *(unsigned __int16 *)(a1 + 4); v49 = 0; v48 = 0; v51 = (v3 >> 11) & 0xF; v4 = (unsigned __int8)(v3 >> 3); v50 = 0; v43 = 0; v44 = 0; bzero_core(dst, 0x24u); if ( fuse_read_flag(&v45, v5, v6, v7) != 0 ) return SYM - 1; v10 = SYM; if ( v45 == 0 ) { v11 = a0; v12 = a0 >= 6; v13 = &v40; if ( v12 ) { return 0; } else { switch ( v11 ) { case 0u: return 0; case 1u: if ( fuse_read_pair(&v46, &v47, v8, v9) != 0 ) return SYM - 1; HIDWORD(v14) = &v44; LODWORD(v14) = &v43; is_blank = fuse_decode_flags(&v48, &v50, v14, v38); v15 = is_blank == 0; while ( 2 ) { if ( !v15 ) return is_blank; if ( v48 == 0 ) { v16 = *(_BYTE *)(a1 + 4); v40 = 0; v41 = 0; v42 = 0; v17 = bitmap_apply_for_each_bit(v16 & 1, 1u, 240, 3, 16, (int)v13); is_blank = apply_reg_range(143, v17, (int)&v40); v15 = is_blank == 0; LABEL_14: if ( v15 ) { v18 = *(_BYTE *)(a1 + 4); v40 = 0; v41 = 0; v42 = 0; v19 = bitmap_apply_for_each_bit((v18 & 2) != 0, 1u, 241, 3, 16, (int)v13); is_blank = apply_reg_range(143, v19, (int)&v40); v15 = is_blank == 0; LABEL_17: if ( v15 ) { v20 = *(_BYTE *)(a1 + 4); v40 = 0; v41 = 0; v42 = 0; v21 = bitmap_apply_for_each_bit((v20 & 4) != 0, 1u, 242, 3, 16, (int)v13); is_blank = apply_reg_range(143, v21, (int)&v40); v15 = is_blank == 0; while ( v15 ) { v22 = *(_DWORD *)(a1 + 4); v40 = 0; v41 = 0; v42 = 0; v23 = bitmap_apply_for_each_bit((v22 >> 15) & 0xF, 4u, 192, 3, 16, (int)v13); is_blank = apply_reg_range(142, v23, (int)&v40); v15 = is_blank == 0; if ( is_blank != 0 ) break; if ( v46 != 0 && v51 != 0 || v4 != 0 && v47 != 0 ) return v10; v24 = *(unsigned __int16 *)(a1 + 4); v4 = (int)v13; v13 = nullptr; v40 = 0; v41 = 0; v42 = 0; v25 = bitmap_apply_for_each_bit((unsigned __int8)(v24 >> 3), 8u, 200, 3, 16, v4); is_blank = apply_reg_range(142, v25, (int)&v40); v15 = is_blank == 0; if ( is_blank != 0 ) goto LABEL_14; v26 = (*(unsigned __int16 *)(a1 + 4) >> 11) & 0xF; v40 = 0; v41 = 0; v42 = 0; v27 = bitmap_apply_for_each_bit(v26, 4u, 196, 3, 16, v4); is_blank = apply_reg_range(142, v27, (int)&v40); v15 = is_blank == 0; if ( is_blank != 0 ) goto LABEL_17; if ( a2 == 0 ) return 0; a2 = *(_DWORD *)(a1 + 4); *(_DWORD *)(a1 + 4) = 1; v40 = 0; v41 = 0; v42 = 0; v28 = bitmap_apply_for_each_bit(1u, 1u, 224, 3, 1, v4); is_blank = apply_reg_range(103, v28, (int)&v40); v15 = is_blank == 0; if ( is_blank == 0 ) { *(_DWORD *)(a1 + 4) = a2; return 0; } } } } continue; } return v10; } case 2u: v29 = *(_BYTE *)(a1 + 4); v40 = 0; v41 = 0; v42 = 0; v30 = bitmap_apply_for_each_bit(v29 & 1, 1u, 243, 3, 16, (int)&v40); v31 = 143; goto LABEL_37; case 3u: is_blank = otp_block_is_blank(); if ( is_blank != 0 ) return is_blank; v33 = 0; break; case 4u: v32 = *(_BYTE *)(a1 + 4); v40 = 0; v41 = 0; v42 = 0; v30 = bitmap_apply_for_each_bit(v32 & 0xF, 4u, 64, 3, 4, (int)&v40); v31 = 138; goto LABEL_37; case 5u: if ( a2 == 0 ) return 0; *(_DWORD *)(a1 + 4) = 1; v40 = 0; v41 = 0; v42 = 0; v37 = bitmap_apply_for_each_bit(1u, 1u, 224, 3, 1, (int)&v40); goto LABEL_53; default: abort(); } while ( 1 ) { v52 = *(_QWORD *)&SYM; dst[v33] = parity_over_bits(*(unsigned __int8 *)(a1 + v33 + 8), (int)&v52, 5u); v53 = *(_QWORD *)&SYM; dst[v33] |= 2 * (unsigned __int8)parity_over_bits(*(unsigned __int8 *)(a1 + v33 + 8), (int)&v53, 5u); v55 = SYM; dst[v33] |= 4 * (unsigned __int8)parity_over_bits(*(unsigned __int8 *)(a1 + v33 + 8), (int)&v55, 4u); v56 = SYM; dst[v33] |= 8 * (unsigned __int8)parity_over_bits(*(unsigned __int8 *)(a1 + v33 + 8), (int)&v56, 4u); v54 = *(_QWORD *)&SYM; v39 = parity_over_bits(*(unsigned __int8 *)(a1 + v33 + 8), (int)&v54, 8u); v57[0] = SYM; dst[v33] |= 16 * (parity_over_bits((unsigned __int8)dst[v33], (int)v57, 4u) ^ v39); if ( v33 << 30 == 0 ) { v40 = *(_DWORD *)(a1 + v33 + 8) & 0xFFFFFF | (*(unsigned __int8 *)(a1 + v33 + 11) << 24); is_blank = fuse_program_bits(v33 / 4 + 105, v40); if ( is_blank != 0 ) break; } if ( ++v33 >= 32 ) { v34 = 0; while ( 1 ) { v40 = (unsigned __int8)dst[v34] | (32 * (unsigned __int8)dst[v34 + 1]) | ((unsigned __int8)dst[v34 + 2] << 10) | ((unsigned __int8)dst[v34 + 3] << 15) | ((unsigned __int8)dst[v34 + 4] << 20) | ((unsigned __int8)dst[v34 + 5] << 25); v35 = udiv32(v34, 6u); is_blank = fuse_program_bits(v35 + 17, v40); if ( is_blank != 0 ) break; v34 += 6; if ( v34 >= 36 ) { v36 = *(_BYTE *)(a1 + 4) & 1; v40 = 0; v41 = 0; v42 = 0; v37 = bitmap_apply_for_each_bit(v36, 1u, 224, 3, 1, (int)&v40); LABEL_53: v30 = v37; v31 = 103; LABEL_37: is_blank = apply_reg_range(v31, v30, (int)&v40); if ( is_blank != 0 ) return is_blank; return 0; } } return is_blank; } } return is_blank; } } return v10; }", "feature_bitmap_build": "int __fastcall feature_bitmap_build() { _DWORD v0[3]; memset(v0, 0, sizeof(v0)); bitmap_apply_for_each_bit(1u, 2u, 101, 3, 2, (int)v0); return 0; }", "otp_block_is_blank": "int __fastcall otp_block_is_blank() { int otp_block; int v0; int v1; int v2; int v3[8]; otp_block = read_otp_block(v3, 0xD20u, 256); v0 = SYM; if ( otp_block != 0 ) return v0; v1 = 0; while ( v3[v1] == 0 ) { if ( (unsigned int)++v1 >= 8 ) { if ( read_otp_block(v3, 0x220u, 192) != 0 ) return v0; v2 = 0; while ( v3[v2] == 0 ) { if ( (unsigned int)++v2 >= 6 ) return 0; } return v0 + 1; } } return v0 + 1; }", "otp_read_u64": "int __fastcall otp_read_u64(unsigned int *a0, int a1, int a2, int a3) { int result; unsigned int v4; int v5; v4 = a2; v5 = a3; result = read_otp_block((int *)&v4, 0x11C0u, 64); if ( result == 0 ) *a0 = (v5 | HIWORD(v4) | v4) & 0xF; return result; }", "fuse_read_flag": "int __fastcall fuse_read_flag(int *a0, int a1, int a2, int a3) { int result; int v4; int v5; v5 = 0; result = read_otp_block(&v5, 0xCE0u, 32); if ( result == 0 ) { v4 = v5 << 29; if ( v5 << 29 != 0 ) v4 = 1; *a0 = v4; } return result; }", "fuse_read_pair": "int __fastcall fuse_read_pair(int *a0, _DWORD *a1, int a2, int a3) { int result; unsigned int v4; unsigned int v5; int v6; v5 = a2; v6 = a3; result = read_otp_block((int *)&v5, 0x11C0u, 64); if ( result == 0 ) { v4 = (unsigned __int8)v6 | HIWORD(v5) | v5; *a1 = BYTE1(v4); *a0 = (unsigned __int8)v4 >> 4; } return result; }", "otp_read_u32": "int __fastcall otp_read_u32(_DWORD *a0, int a1, int a2, int a3) { int result; int v4; unsigned int v5; v5 = a3; result = read_otp_block((int *)&v5, 0x12E0u, 32); if ( result == 0 ) { v4 = 0; while ( ((v5 >> (4 * v4)) & 0xF) != 0 ) { if ( (unsigned int)++v4 >= 4 ) return result; } *a0 = v4; return 0; } return result; }", "otp_read_u32_b": "int __fastcall otp_read_u32_b(unsigned int *a0, int a1, int a2, int a3) { int result; unsigned int v4; v4 = 0; result = read_otp_block((int *)&v4, 0x1140u, 32); if ( result == 0 ) { v4 = ((unsigned __int8)(v4 | (v4 >> 4)) | BYTE1(v4)) & 0xF; *a0 = v4; } return result; }", "fuse_decode_flags": "int __fastcall fuse_decode_flags(int *a0, _DWORD *a1, __int64 a2, int a3) { _DWORD *v4; _DWORD *v5; int otp_block; unsigned int v6; __int64 v7; v7 = a2; v4 = (_DWORD *)HIDWORD(a2); v5 = (_DWORD *)a2; otp_block = read_otp_block((int *)&v7, 0x11E0u, 64); if ( otp_block == 0 ) { v6 = HIDWORD(v7) | (((unsigned int)v7 | HIDWORD(v7)) >> 16); *a0 = BYTE4(v7) & 1 | ((((unsigned int)v7 | HIDWORD(v7)) & 0x10000) != 0); *a1 = (v6 & 2) != 0; *v5 = (v6 & 4) != 0; *v4 = (v6 & 8) != 0; } return otp_block; }", "ret_sts_80000505": "int __fastcall ret_sts_80000505() { return SYM; }", "sysdrv_set_psb_mode": "int __fastcall sysdrv_set_psb_mode(unsigned int a0) { int result; unsigned int v1; unsigned int i; int v2[4]; v2[0] = a0; result = SYM; v1 = *SYM; if ( *((_DWORD *)SYM + 410) != 0 || a0 == 0 ) return fuse_feature_check(v1); if ( a0 <= v1 ) { result = sysdrv_query_47(v2, 0x10u); if ( result == 0 ) { for ( i = 0; i < 4; ++i ) { if ( v2[i] != 0 ) return SYM; } result = key_id_decode((unsigned __int8 *)v2, a0); if ( result == 0 ) { v1 = a0; return fuse_feature_check(v1); } } } return result; }", "fuse_read_config": "int __fastcall fuse_read_config(int a0, int a1, int a2, int a3) { int result; int v4; int v5; int v6; __int64 v7; int v8; int v9; int v10; int v11; int v12; int v13; int v14; unsigned int v15; int v16; int v17; int v18; int v19; int v20; int v21; int v22; int a4a; int v23; int v24; int v25; int v26; int v27; int v28; unsigned int v29; unsigned int v30; a4a = 0; v23 = 0; v24 = 0; v25 = 0; v26 = 0; v27 = 0; v28 = 0; v29 = 0; v30 = 0; result = fuse_read_pair(&a4a, &v23, a2, a3); if ( result == 0 ) { result = fuse_read_flag(&v24, v4, v5, v6); if ( result == 0 ) { HIDWORD(v7) = &v28; LODWORD(v7) = &v27; result = fuse_decode_flags(&v25, &v26, v7, a4a); if ( result == 0 ) { result = otp_read_u64(&v29, v8, v9, v10); if ( result == 0 ) result = otp_read_u32_b(&v30, v11, v12, v13); } } } v14 = v25; if ( v25 != 0 ) v14 = 0x1000000; v15 = v14 | v23 | (a4a << 8) | (v29 << 12) | (v30 << 16); v16 = v27; if ( v27 != 0 ) v16 = 0x2000000; v17 = v16 | v15; v18 = v26; if ( v26 != 0 ) v18 = 0x4000000; v19 = v18 | v17; v20 = v28; if ( v28 != 0 ) v20 = 0x8000000; v21 = v20 | v19; v22 = v24; if ( v24 != 0 ) v22 = 0x10000000; *((_DWORD *)*SYM + 613) = v22 | v21; return result; }", "slot_table_scan": "int __fastcall slot_table_scan(int a0, int a1, char a2, char a3) { unsigned int i; int v4; int v5; for ( i = 0; i < 0x20; ++i ) { if ( *(_WORD *)(a0 + 12 * i) != 0 ) { v4 = a0 + 12 * i; if ( *(_DWORD *)(v4 + 4) != 0 ) { v5 = a1 + 16 * i; *(_WORD *)v5 = *(_WORD *)(a0 + 12 * i); *(_WORD *)(v5 + 2) = -1; *(_WORD *)(v5 + 8) = *(_WORD *)(v5 + 8) & 0x7000 | 0x8000 | ((a2 & 0xF) << 8) | (16 * (a3 & 0xF)); *(_DWORD *)(v5 + 4) = *(_DWORD *)(v4 + 4); *(_WORD *)(v5 + 10) = *(_WORD *)(v4 + 8); *(_BYTE *)(v5 + 12) = *(_BYTE *)(v4 + 10); } } } return 0; }", "config_context_init": "int __fastcall config_context_init() { int v0; __int64 v1; char *v2; __int64 v3; int v4; int v5; _BYTE v6[1536]; int v7; int v8; int v9; if ( *SYM == -1 ) return SYM; v0 = 0; LOBYTE(v8) = -1; __asm { SVC 0x5E ; '^' } LODWORD(v1) = config_find_type256b(); v2 = SYM; *((_QWORD *)SYM + 1) = v1; LODWORD(v3) = config_find_type256(); *((_QWORD *)v2 + 2) = v3; if ( (*((_QWORD *)v2 + 1) | v3) != 0 ) { v0 = map_shared_config_blob(&v7, &v9, &v8); if ( v0 == 0 ) { bzero_core(v6, 0x600u); v0 = slot_table_scan(v7, (int)v6, 2, 1); if ( v0 == 0 ) { v4 = SYM; v5 = v7; *(_DWORD *)v7 = 0x20000; *(_DWORD *)(v5 + 4) = v4; memcpy((void *)(v5 + 8), v6, 0x600u); bzero_core((void *)(v7 + 1544), 0x3F00u); v2[1] = 1; } } } release_handle_if_valid((unsigned __int8)v8); __asm { SVC 0x5F ; '_' } return v0; }", "fuse_write_thunk": "int fuse_write_thunk(int a0, int a1, int a2, int a3, int a4, char a5, char a6, ...) { va_list va; va_start(va, a6); return fuse_write_field(a0, a1, a2, a3, a4, a5, a6, (int)va); }", "fuse_write_field": "int __fastcall fuse_write_field(int a0, int a1, int a2, int a3, int a4, __int16 a5, __int16 a6, int a7) { int v8; unsigned int v9; char v10; int v11; int v12; int v13; int v14; v11 = 0; v12 = 0; v13 = 0; v14 = 0; v8 = a3 | (a2 << 16); v9 = a3 != 0xFFFF; if ( a4 != 255 ) v9 = 2; if ( SYM[1] == 0 ) return SYM + 1; HIWORD(v13) = *(_WORD *)a7; v10 = *(_BYTE *)(a7 + 2); v12 = a0; LOBYTE(v14) = v10; LOWORD(v13) = v13 & 0x7000 | 0x8000 | ((a6 & 0xF) << 8) | (16 * (a5 & 0xF)) | v9 & 0xF; if ( v9 < 2 ) { LOWORD(v11) = HIWORD(v8); HIWORD(v11) = v8; } else { v11 = v8; } return config_blob_process((int)&v11); }", "map_shared_config_blob": "int __fastcall map_shared_config_blob(_DWORD *a0, _DWORD *a1, _BYTE *a2) { __int64 v3; int result; if ( *SYM != 0 ) v3 = *((_QWORD *)SYM + 1); else v3 = *((_QWORD *)SYM + 2); result = map_client_buffer(HIDWORD(v3), v3, 0x10000u, a2, a1, 0, (unsigned __int8)*SYM, 0xFFFFu); if ( result != 0 ) { *a0 = 0; *a2 = -1; } else { *a0 = *a1; } return result; }", "config_blob_read_entry": "int __fastcall config_blob_read_entry(unsigned __int16 a0, unsigned int a1, int a2, int a3) { int v4; int v5; unsigned int v6; int v7; unsigned int v8; unsigned int v9; _DWORD *v10; unsigned int v11; int v12; unsigned int v13; unsigned int v14; int v15; int v16; int v17; int v18; int v19; LOBYTE(v16) = -1; if ( SYM[0][1] == 0 ) return SYM; __asm { SVC 0x5E ; '^' } v4 = map_shared_config_blob(&v18, &v19, &v16); if ( v4 == 0 ) { v5 = config_entry_match(&v17, &v15, a1, a0, v18); v4 = v5; if ( v5 == 0 ) { v6 = 0; v7 = v17; while ( v6 < v15 ) { v8 = v7 + 16 * v6; v9 = *(unsigned __int16 *)(v8 + 8); if ( a2 == 3 ) { if ( (v9 & 0x8000) != 0 && *(_DWORD *)v8 == a1 && ((v9 >> 8) & 0xF) == a3 ) { v10 = (_DWORD *)(v7 + 16 * v6); *v10 = 0; v10[1] = 0; v10[2] = 0; v10[3] = 0; break; } } else if ( (v9 & 0x8000) != 0 && *(unsigned __int16 *)(v8 + 2) == (unsigned __int16)a1 ) { *(_DWORD *)v8 = 0; *(_DWORD *)(v8 + 4) = 0; *(_DWORD *)(v8 + 8) = 0; *(_DWORD *)(v8 + 12) = 0; } ++v6; } if ( (_WORD)a1 == 0xFFFF ) { v11 = 0; v15 = 960; v12 = v18 + 1544; v17 = v18 + 1544; do { v13 = v12 + 16 * v11; v14 = *(unsigned __int16 *)(v13 + 8); if ( (v14 & 0x8000) != 0 && ((v14 >> 8) & 0xF) == 2 ) { *(_DWORD *)v13 = 0; *(_DWORD *)(v13 + 4) = 0; *(_DWORD *)(v13 + 8) = 0; *(_DWORD *)(v13 + 12) = 0; } ++v11; } while ( v11 < v15 ); } } } release_handle_if_valid((unsigned __int8)v16); __asm { SVC 0x5F ; '_' } return v4; }", "release_handle_if_valid": "int __fastcall release_handle_if_valid(int result) { if ( result != 255 ) __asm { SVC 0x6C ; 'l' } return result; }", "ecc_params_load": "int __fastcall ecc_params_load(__int64 *a0, _DWORD *a1, _DWORD *a2, _DWORD *a3, int a4) { __int64 v5; int *v6; int v7; int v8; int v9; int v10; int v11; int v12; int v13; int v14; int v15; int v16; v5 = *a0; v6 = (int *)a1[1]; *a2 = *((_DWORD *)a0 + 1); a2[1] = v5; a2[2] = *a1; a2[3] = 0x1000000; v7 = v6[4]; *a3 = v6[3]; a3[1] = v7; a3[3] = v6[5]; v8 = v6[7]; a3[4] = v6[6]; a3[5] = v8; __asm { SVC 0x69 ; 'i' } v9 = v6[4]; if ( v9 != 0 ) { v10 = SYM; } else { __asm { SVC 0x69 ; 'i' } v9 = v6[7]; if ( v9 != 0 ) { v10 = SYM + 1; } else { a3[7] = v6[8]; v11 = v6[10]; a3[8] = v6[9]; a3[9] = v11; __asm { SVC 0x69 ; 'i' } v9 = v6[10]; if ( v9 != 0 ) { v10 = SYM + 2; } else { v12 = SYM; a3[11] = v6[11]; a2[14] = v12; a2[15] = 65533; __asm { SVC 0x84 } v9 = 65533; v10 = SYM + 3; } } } set_status_out(v10); region_protect_pair(a2, a3); region_unmap_pair(0, 0, v6[2]); a2[21] = v6[47]; v13 = v6[49]; a2[22] = v6[48]; a2[23] = v13; v14 = v6[51]; a2[24] = v6[50]; a2[25] = v14; v15 = v6[53]; a2[26] = v6[52]; a2[27] = v15; v16 = v6[55]; a2[28] = v6[54]; a2[29] = v16; memcpy_thunk((int)(a3 + 13)); a2[18] = a4; a3[12] = v6[15]; a2[19] = *((_DWORD *)*SYM + 8); memcpy_thunk((int)(a3 + 22)); a2[20] = v6[46]; return v9; }", "provision_hdr_build": "int __fastcall provision_hdr_build(int a0, int a1) { _BYTE *v2; _BYTE *v3; _WORD *v4; int v5; int v6; int v7; v2 = (_BYTE *)(a1 + 12); *(_WORD *)a1 = 72; *(_BYTE *)(a1 + 3) = 3; *(_BYTE *)(a1 + 4) = 1; v3 = (_BYTE *)(a1 + 8); v4 = SYM; v5 = 0; *(_BYTE *)(a1 + 15) = *((_BYTE *)SYM + 880); *(_BYTE *)(a1 + 14) = HIBYTE(v4[440]); *(_BYTE *)(a1 + 13) = BYTE2(*((_DWORD *)v4 + 220)); *v2 = HIBYTE(*((_DWORD *)v4 + 220)); v3[3] = *((_BYTE *)v4 + 884); v3[2] = HIBYTE(v4[442]); v6 = HIWORD(*((_DWORD *)v4 + 221)); v3[1] = v6; v7 = HIBYTE(*((_DWORD *)v4 + 221)); *v3 = v7; rand_fill_bytes((_BYTE *)(a1 + 16), 8u, v7, v6); if ( !hmac_verify_wrapper(a1, 24, a1 + 24) ) { v5 = SYM; *(_DWORD *)(a0 + 12) = 0x20000000; } return v5; }", "otp_block_read": "int __fastcall otp_block_read(int a0, unsigned int a1) { int v2; __int64 v3; unsigned __int8 v4[4]; int v5; v2 = SYM; v4[0] = -1; if ( a0 != 0 && a1 <= 0x1000 && a1 != 0 ) { LODWORD(v3) = config_find_type144(); if ( v3 != 0 ) { v2 = map_client_buffer(HIDWORD(v3), v3, 0x1000u, v4, &v5, 0, 1, 0xFFFFu); if ( v2 == 0 ) memcpy_thunk(a0); } if ( v4[0] != 255 ) __asm { SVC 0x6C ; 'l' } } return v2; }", "param_slot_lookup": "int __fastcall param_slot_lookup(int a0, int a1) { unsigned int i; for ( i = 0; i < 0x67; ++i ) { if ( SYM[i][0] == a0 ) return SYM[i][a1 + 1]; } return 0; }", "desc_count_get": "int __fastcall desc_count_get(_DWORD *a0) { char *v1; int v2; int v3; unsigned int v4; unsigned int v5; _DWORD *v6; v1 = SYM; v2 = *((unsigned __int16 *)SYM + 2); if ( a0 == nullptr ) return SYM; bzero_core(a0 + 7, 0x18u); v3 = SYM; v4 = 0; v5 = *((unsigned __int16 *)v1 + 1); while ( v4 <= v5 ) { v6 = (_DWORD *)(v3 + 16 * v4); if ( v6[1] != 0 ) { a0[12] = *v6; v2 = (unsigned __int16)(v2 - 1); a0[9] = v6[1]; a0[10] = v6[2]; a0[11] = v6[3]; } v4 = (unsigned __int16)(v4 + 1); } a0[7] = *((unsigned __int16 *)v1 + 2); a0[8] = v2; bzero_core((void *)SYM, 0x800u); *((_WORD *)v1 + 1) = 0; *((_WORD *)v1 + 2) = 0; return 0; }", "desc_clear": "int __fastcall desc_clear(int a0) { _BYTE *v1; char *v2; *(_DWORD *)(a0 + 4) = 0; *(_DWORD *)(a0 + 8) = 0; *(_DWORD *)(a0 + 12) = 0; v1 = SYM; *(_BYTE *)(a0 + 4) = *SYM[0]; *(_DWORD *)a0 = (unsigned __int8)*SYM; *(_BYTE *)(a0 + 5) = v1[992] == 1; *(_BYTE *)(a0 + 6) = *SYM != 0 || reg_read_stub() == 2; *(_BYTE *)(a0 + 7) = *((_DWORD *)v1 + 142) == 3; v2 = SYM; *(_BYTE *)(a0 + 8) = 0; *(_BYTE *)(a0 + 9) = 0; if ( *v2 == 1 ) *(_BYTE *)(a0 + 8) = 1; return 0; }", "desc_field_get": "int __fastcall desc_field_get(int a0, int a1) { int result; _DWORD *v2; unsigned int v3; unsigned int v4; result = *(_DWORD *)(a0 + 256) & 0x3F; v2 = (_DWORD *)(SYM + 28 * a1); v3 = v2[3]; v4 = (unsigned int)(*(_DWORD *)(a0 + 8) - v2[1]) >> 5; if ( v4 > v3 ) v3 += v2[4]; v2[6] = v2[5] - (v3 - v4); return result; }", "feature_entry_get": "int __fastcall feature_entry_get(unsigned int a0) { if ( a0 < 7 ) return *(_DWORD *)(SYM + 12 * a0 + 2240); else return 0; }", "select_mem_attr": "int __fastcall select_mem_attr(int a0) { bool v1; int result; v1 = a0 == 0; result = 0; if ( v1 ) return 0x2000000; return result; }", "read_boot_params": "int __fastcall read_boot_params(int *a0) { int v1; char v2; int v3; int v4; unsigned __int8 v5[4]; int v6; int v7; int v8; v5[0] = -1; v6 = 0; v7 = 0; v8 = 0; v4 = 0; __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } v1 = map_client_buffer(0xFFFFFFFF, SYM, 0x1000u, v5, &v4, 0, 1, 0xFFFFu); if ( v1 == 0 ) { if ( v4 != 0 ) { v2 = *(_BYTE *)(v4 + *(unsigned __int16 *)(v4 + 36) + 20); if ( v5[0] != 255 ) __asm { SVC 0x6C ; 'l' } if ( (*(_BYTE *)(v4 + *(unsigned __int16 *)(v4 + 36) + 20) & 4) != 0 || (*(_BYTE *)(v4 + *(unsigned __int16 *)(v4 + 36) + 20) & 8) != 0 || (*(_BYTE *)(v4 + *(unsigned __int16 *)(v4 + 36) + 20) & 2) != 0 || (v2 & 1) != 0 ) { v3 = ((v2 & 4) != 0) | (2 * ((v2 & 8) != 0)) | (4 * ((v2 & 2) != 0)) | (8 * (v2 & 1)); } else { v3 = (*SYM)[4]; } *a0 = v3; } else { return SYM + 7; } } return v1; }", "region_info_get": "int __fastcall region_info_get(int a0, int a1, _BYTE *a2, _QWORD *a3, unsigned int *a4) { int v5; int v6; unsigned int v7; _DWORD *v8; unsigned int v9; v5 = SYM; v6 = 0; *a2 = 1; v7 = region_size_lookup(a0); v8 = (_DWORD *)(v5 + 16 * a0); *a4 = v7; v9 = 4 * (*(v8 - 4) & 0x1FFFFFF) + 9437184; if ( a1 != 0xFFFF ) { v9 += (a1 + 1) * v7; if ( 4 * (*v8 & 0x1FFFFFFu) + 9437184 < v9 ) v6 = SYM; } *a3 = *(_QWORD *)SYM + v9; return v6; }", "time_to_ms": "__int64 __fastcall time_to_ms(unsigned int a0, unsigned int a1) { return 1000LL * a0 + a1; }", "flash_region_translate": "int __fastcall flash_region_translate(int a0, unsigned int a1, int a2, _DWORD *a3) { int v4; int v5; unsigned int v6; int v7; unsigned int i; v4 = 0; v5 = SYM; __asm { SVC 0x66 ; 'f' } if ( a1 >= 0x20 ) return SYM; v6 = a2 + (a1 << 12); if ( v6 < a1 << 12 ) return SYM; if ( a0 == 1 ) { v7 = 34; } else if ( (unsigned __int8)a0 == *SYM[0] ) { if ( a0 != 0 ) return SYM; v7 = 4; } else { if ( (unsigned __int8)a0 != *SYM || a0 != 5 ) return SYM; v7 = 84; } for ( i = 0; *((_DWORD *)SYM + 18) > i; ++i ) { if ( *((_DWORD *)SYM + 4 * i + 19) == v7 ) { v5 = 0; v4 = *((_DWORD *)SYM + 4 * i + 20); goto LABEL_19; } } if ( SYM == 0 ) { LABEL_19: if ( !__CFADD__(v6, v4) ) { *a3 = v4 + (a1 << 12) + a2; return v5; } } return SYM; }", "version_report_build": "int __fastcall version_report_build(_DWORD *a0, unsigned int *a1) { unsigned int v2; int v3; int v4; _DWORD *v5; int v6; int v7; _DWORD *v8; int v9; int v10; int v11; int v12; _DWORD v13[4]; __int128 v14; int v15; v15 = *(_DWORD *)SYM; v9 = 0; v10 = 0; v11 = 0; v12 = 0; v13[0] = SYM; v13[1] = SYM; v13[2] = SYM; v13[3] = SYM; v14 = *(_OWORD *)SYM; v2 = *a1; if ( *a1 < 6 ) return SYM; __asm { SVC 0x66 ; 'f' } v4 = (unsigned __int8)v2; gp_prop_get_fw_version((unsigned __int8)v2, (int)v13, &v9, &v11); gp_prop_get_fw_version(v4, (int)&v14, &v10, &v12); *a0 = 1; v5 = SYM; a0[1] = *((_DWORD *)SYM + 265); v6 = v5[266]; a0[8] = 2; a0[2] = v6; a0[9] = v5[267]; a0[10] = v5[268]; a0[16] = 3; a0[17] = v5[269]; v7 = SYM; a0[24] = 4; a0[18] = v7; a0[25] = v5[270]; a0[26] = v7; a0[32] = 5; a0[33] = v9; a0[34] = v11; v8 = a0 + 40; a0[40] = 6; v3 = 0; v8[1] = v10; v8[2] = v12; *a1 = 6; return v3; }", "sysdrv_get_boot_status": "int __fastcall sysdrv_get_boot_status() { return *((_DWORD *)SYM + 1); }", "config_blob_get": "int __fastcall config_blob_get(int a0, int a1) { int *v2; int result; unsigned int i; int *v3; v2 = (int *)SYM; result = SYM; for ( i = 0; i < 0xB; ++i ) { v3 = &v2[6 * i]; if ( (v3[5] & a0) != 0 ) { result = 0; *(_DWORD *)a1 = v3; } } return result; }", "get_dpm_index": "int __fastcall get_dpm_index() { return *SYM; }", "ccp_resolve_key_slot": "int __fastcall ccp_resolve_key_slot(int a0, int *a1) { int v2; v2 = 0; if ( a1 == nullptr ) return 44; if ( a0 == 0 ) { a0 = 3; LABEL_8: *a1 = a0; return v2; } if ( a0 == 1 || a0 == 2 ) goto LABEL_8; *a1 = 0xFFFF; return 12; }", "sysdrv_derive_key_a": "int __fastcall sysdrv_derive_key_a(int *a0, unsigned int a1) { int v2; int v3; _DWORD *v4; v2 = SYM; if ( a1 < 0x44C ) return SYM; v3 = 0; while ( *(_DWORD *)(SYM + 1100 * v3 + 4) != 2 ) { if ( (unsigned int)++v3 >= 4 ) return v2; } v4 = (_DWORD *)(SYM + 1100 * v3); memcpy(a0, v4, v4[10] + 76); v4[1] = 3; return 0; }", "handle_to_index": "unsigned int __fastcall handle_to_index(int a0) { unsigned int result; result = a0 - 16; if ( result > 0xFF ) return -1; return result; }", "object_from_handle": "int __fastcall object_from_handle(int a0, int *a1, int a2) { unsigned int v3; int v4; v3 = handle_to_index(a0); if ( v3 == -1 ) fatal_error(SYM); v4 = SYM + 16 * v3; if ( *(_BYTE *)v4 == 0 || *(unsigned __int8 *)(v4 + 1) != a2 || *(_DWORD *)(v4 + 12) > 0xFFu ) fatal_error(SYM); if ( a1 != nullptr ) *a1 = v4; return SYM + 8 * *(_DWORD *)(v4 + 12); }", "session_from_handle": "gp_session_t *__fastcall session_from_handle(int handle, int owner) { int v0; if ( (unsigned int)(handle - 16) >= 0x20 ) fatal_error(SYM); v0 = SYM + 84 * (handle - 16); if ( *(_BYTE *)(v0 + 32) == 0 || *(unsigned __int8 *)(v0 + 34) != owner ) fatal_error(SYM); return (gp_session_t *)(SYM + 84 * (handle - 16)); }", "mask_with_caps": "int __fastcall mask_with_caps(int a0) { return a0 & SYM; }", "reg_read_quad": "int __fastcall reg_read_quad(int a0) { unsigned int v1; int result; LOBYTE(v1) = 0; do { __asm { SVC 0x7B ; '{' } result = 0; v1 = (unsigned __int8)(v1 + 1); } while ( v1 < 4 ); return result; }", "flash_read_jedec_id": "int __fastcall flash_read_jedec_id(_DWORD *a0, _BYTE *a1) { int result; int v2; _DWORD v3[2]; v3[1] = *(_DWORD *)SYM; v2 = 0; v3[0] = 0; result = fifo_transfer(a0, 8, SYM, 2u, (int)v3, &v2, 1u); if ( result == 0 ) *a1 = v3[0]; return result; }", "persist_find_by_uuid": "int __fastcall persist_find_by_uuid(unsigned int *a0, unsigned int a1, unsigned int *a2) { int v3; int v4; int v5; int v6; v3 = SYM; v4 = 0; v5 = -1; while ( 1 ) { v6 = v3 + 88 * v4; if ( *(_DWORD *)(v6 + 84) != -1 && memcmp_be((const void *)(v6 + 64), a2, 0x10u) == 0 && *(unsigned __int8 *)(v6 + 80) == a1 && memcmp_be((const void *)(v3 + 88 * v4), a0, a1) == 0 ) { break; } if ( (unsigned int)++v4 > 0xFF ) return v5; } return *(_DWORD *)(v3 + 88 * v4 + 84); }", "dram_scratch_map": "int __fastcall dram_scratch_map(int a0, int a1, int a2, int a3) { int result; int v4; v4 = a3; result = *((_DWORD *)SYM + 545); if ( result == 0 ) { __asm { SVC 0x73 ; 's' } return SYM; } return result; }", "gp_prop_lookup": "int __fastcall gp_prop_lookup(int a0, int a1, int a2, int a3, __int64 a4) { int v5; __int64 v6; const void *v7; int v8; v8 = *(_DWORD *)SYM; if ( a2 != -1 ) { if ( a2 != -3 ) return SYM; v5 = SYM; v6 = a4; v7 = (const void *)a3; return config_entry_read(v5, v7, v6, (_BYTE *)HIDWORD(v6)); } if ( a1 != 0 ) { __asm { SVC 0xA4 } return SYM + 3; } __asm { SVC 0x81 } if ( a0 == 0 ) return SYM + 3; v5 = a0 + 256; v6 = a4; v7 = (const void *)a3; return config_entry_read(v5, v7, v6, (_BYTE *)HIDWORD(v6)); }", "gp_prop_get_fw_version": "int __fastcall gp_prop_get_fw_version(int a0, int a1, _DWORD *a2, _DWORD *a3) { char *v4; int result; char *v5; v4 = strlen(aAmdFwSecpatchl); result = gp_prop_get_u32(a0, -1, a1, (int)aAmdFwSecpatchl, (unsigned int)v4, a2); if ( result == 0 || result == -65528 ) { v5 = strlen(aAmdTaVersion); return gp_prop_get_u32(a0, -1, a1, (int)aAmdTaVersion, (unsigned int)v5, a3); } return result; }", "client_field3_get": "int __fastcall client_field3_get(int a0) { *(_DWORD *)a0 = *((_DWORD *)SYM + 3); return 0; }", "get_client_ctx_field3": "int __fastcall get_client_ctx_field3() { return SYM[3]; }", "config_lookup_u32": "int __fastcall config_lookup_u32(int a0, int a1, int a2) { int v3; unsigned int v4; unsigned int i; v3 = *(_DWORD *)(a1 + 8); if ( v3 != 0 ) { v4 = *(_DWORD *)(a1 + 12); for ( i = 0; v4 > i; ++i ) { if ( *(_DWORD *)(v3 + 8 * i) == a0 ) { *(_DWORD *)a2 = *(_DWORD *)(v3 + 8 * i + 4); return 1; } } } return 0; }", "get_current_client_id": "int __fastcall get_current_client_id() { return *SYM; }", "policy_table_scan": "int __fastcall policy_table_scan(int a0, int a1, int a2, _DWORD *a3) { int client_ctx_alt; unsigned int *v4; int v5; unsigned int v6; unsigned int i; int v7; unsigned int j; if ( (unsigned __int8)*SYM << 31 != 0 ) { client_ctx_alt = get_client_ctx_alt(); v4 = (unsigned int *)(client_ctx_alt + 256); v5 = client_ctx_alt + 320; if ( v4[4] == 256 ) { v6 = *v4; for ( i = 0; v6 > i; ++i ) { v7 = v5 + 12 + 8 * *(unsigned __int16 *)(v5 + 4); if ( ((*(_DWORD *)v5 >> 8) & 0x4000) != 0 && (*(_DWORD *)v5 & 0xC0) == a2 && a2 != 192 ) { for ( j = 0; *(unsigned __int16 *)(v5 + 6) > j; ++j ) { if ( *(_DWORD *)(v7 + 8 * j) == a0 ) { *a3 = *(_DWORD *)(v7 + 8 * j + 4); return 1; } } } v5 = v7 + 8 * *(unsigned __int16 *)(v5 + 6); } } } return 0; }", "get_client_ctx_alt": "int __fastcall get_client_ctx_alt() { int result; result = SYM[1]; if ( result == 0 ) return *SYM; return result; }", "get_client_ctx_field2": "int __fastcall get_client_ctx_field2() { return SYM[2]; }", "fw_type_to_class": "int __fastcall fw_type_to_class(int a0) { int result; result = -1; switch ( a0 ) { case 1: case 2: case 3: case 4: case 9: case 10: case 20: case 21: case 22: case 24: case 27: case 28: case 29: case 33: case 34: case 52: case 53: case 54: case 55: case 56: case 57: case 65: case 66: case 70: case 71: case 72: case 76: case 77: case 78: case 79: case 81: case 82: case 87: case 88: case 89: case 90: case 91: case 92: case 93: case 94: case 95: case 96: case 97: goto LABEL_5; case 7: case 8: case 25: case 26: case 48: if ( *((_DWORD *)SYM + 547) != 0 || *((_DWORD *)SYM + 546) != SYM ) LABEL_5: result = 10; else result = 187; break; case 11: case 12: result = 15; break; case 13: case 19: case 58: case 83: case 84: result = 6; break; case 16: result = 18; break; case 60: result = 45; break; case 64: result = 53; break; case 68: case 69: result = 139; break; case 73: result = 138; break; case 86: result = 48; break; default: return result; } return result; }", "key_blob_load": "int __fastcall key_blob_load(int a0, bn_t *a1, bn_t *a2, unsigned int a3) { int v4; int *v5; unsigned int v6; int v7; unsigned int v8; int v9; int v10[256]; int v11; int v12; unsigned int src[64]; _DWORD v13[7]; bn_t *v14; bn_t *r; unsigned int v15; v13[6] = a0; v14 = a1; r = a2; v15 = a3; v12 = *(_DWORD *)SYM; v13[4] = v12; if ( a3 <= 0x100 ) { if ( a0 != 0 ) { memcpy_thunk((int)src); } else { v4 = rand_fill_bytes(src, a3, (int)a2, a3); if ( v4 != 0 ) return v4; } LOBYTE(src[0]) |= 3u; *((_BYTE *)src + a3 - 1) |= 0xC0u; v4 = bn_from_bytes_be(r, src, a3); if ( v4 == 0 ) { v5 = (int *)SYM; v6 = 0; v7 = 0; v11 = 0; while ( 1 ) { v4 = bytes_mod_u32((unsigned int)src, a3, *((unsigned __int16 *)v5 + v7), &v10[v7]); if ( v4 != 0 ) break; if ( v10[v7] == 0 ) v11 = 1; if ( (unsigned int)++v7 > 0xFF ) { while ( 1 ) { while ( v11 != 0 ) { v8 = 0; v11 = 0; v6 += 4; do { udiv_select_shift(v10[v8] + 4, *((unsigned __int16 *)v5 + v8)); v10[v8] = v9; if ( v9 == 0 ) v11 = 1; ++v8; } while ( v8 <= 0xFF ); } if ( v6 >= 0x10000000 ) break; v13[0] = v6 != 0; v13[1] = 0; v13[2] = 0; v13[3] = v6; v4 = bn_add(r, (bn_t *)v13, r); if ( v4 == 0 ) { v6 = 0; v4 = bn_modexp(v14, r, a3, 0x10u, &v11); if ( v4 == 0 && v11 != 0 ) continue; } return v4; } return SYM - 6; } } } return v4; } return SYM; }", "error_for_mode": "int __fastcall error_for_mode(int a0) { if ( a0 == 11 ) return 32776; else return 0x8000; }", "default_key_or_fallback": "_DWORD *__fastcall default_key_or_fallback(int a0) { int v1; int v2; v2 = 0; if ( !find_default_key_record() && debug_allowed() != 0 ) { if ( *((_DWORD *)SYM + 545) != 0 ) v1 = 2; else v1 = 1; v2 = v1; } return j_enum_pending_procs_2((int)&v2, 4, a0); }", "persist_handle_lookup": "int __fastcall persist_handle_lookup(int a0, _DWORD *a1, _BYTE *a2, int a3) { unsigned int v4; int result; int v5; v4 = a0 - 16; result = SYM; if ( v4 < 0x80 ) { v5 = SYM + 8 * v4; if ( *(unsigned __int8 *)(v5 + 1) == a3 ) { *a1 = *(_DWORD *)(v5 + 4); *a2 = *(_BYTE *)(v5 + 2); return 0; } } return result; }", "range_to_sector_span": "int __fastcall range_to_sector_span(unsigned int a0, int a1, int a2, int a3) { unsigned int v4; int v5; int i; unsigned int v6; unsigned int v7; int result; v4 = 0; v5 = 0; for ( i = 0; ; ++i ) { v4 += a2; *(_DWORD *)a3 = i; if ( v4 > a0 ) break; } v6 = 0; v7 = a0 + a1; while ( 1 ) { v6 += a2; if ( v6 >= v7 ) break; ++v5; } result = v5 - i + 1; *(_DWORD *)(a3 + 4) = result; return result; }", "spi_check_alignment": "int __fastcall spi_check_alignment(unsigned int a0, int a1, _DWORD *a2, _DWORD *a3) { int v4; int v5; int v6; int v7; BOOL v8; BOOL v9; int v10; v4 = 0; v5 = *((_DWORD *)SYM + 1); v6 = *(_DWORD *)(v5 + 12); v7 = (v6 << 10) - 1; v8 = ((a0 + (v6 << 10) - 1) & ~v7) == a0; v9 = ((a0 + a1 + (v6 << 10) - 1) & ~v7) == a0 + a1; v10 = *(_DWORD *)(v5 + 16); *a2 = 0; a2[1] = 0; *a3 = 0; a3[1] = 0; if ( !v8 && ((a0 + (v10 << 10) - 1) & ~((v10 << 10) - 1)) != a0 || ((a0 + a1 + (v10 << 10) - 1) & ~((v10 << 10) - 1)) != a0 + a1 && !v9 ) { return SYM; } if ( v8 && v9 ) spi_sector_align(a0, a1, a2); else range_to_block_span(a0, a1, a3); return v4; }", "range_to_block_span": "int __fastcall range_to_block_span(unsigned int a0, int a1, _DWORD *a2) { return range_to_sector_span(a0, a1, *(_DWORD *)(*((_DWORD *)SYM + 1) + 16) << 10, (int)a2); }", "sysdrv_get_query2_value": "int __fastcall sysdrv_get_query2_value() { return *SYM; }", "timestamp_elapsed": "int __fastcall timestamp_elapsed() { unsigned int v0; unsigned int v1; v0 = 0; v1 = 0; gp_get_system_time((int *)&v0); return time_to_ms(v0, v1) - *((_DWORD *)SYM + 4); }", "timestamp_pair_get": "unsigned __int64 __fastcall timestamp_pair_get(_DWORD *a0) { unsigned __int64 result; result = read_hw_counter_us(); *a0 = HIDWORD(result); a0[1] = result; return result; }", "uuid_table_lookup": "int __fastcall uuid_table_lookup(unsigned int *a0, _DWORD *a1) { int *v2; int v3; int v4; int *v5; int v6; int v7; int *v8; v2 = (int *)SYM; v3 = 0; v4 = 0; while ( memcmp_be(a0, &v2[6 * v4], 0x10u) != 0 ) { if ( (unsigned int)++v4 >= 0xB ) return v3; } v5 = &v2[6 * v4]; *a1 = v5[5]; if ( v5[4] != 1 ) return 0; v6 = *((_DWORD *)SYM + 142); if ( v6 != 3 ) { __asm { SVC 0x87 } if ( v6 != 0 ) return SYM; } v7 = 0; v8 = &(*SYM)[-6]; while ( __PAIR64__(*((_DWORD *)SYM + 220), *((_DWORD *)SYM + 221)) != *(_QWORD *)&v8[3 * v7] ) { if ( (unsigned int)++v7 >= 2 ) return 0; } *a1 = v8[3 * v7 + 2]; return 0; }", "session_key_fetch": "int __fastcall session_key_fetch(int a0, unsigned int a1, unsigned int a2) { if ( a2 >= 0x20 ) return SYM; if ( *(_BYTE *)(SYM + 66 * a2 + 64) == 0 ) return SYM + 1; if ( a1 < 0x10 ) return SYM; memcpy_thunk(a0); return 0; }", "read_hw_counter_us": "unsigned __int64 __fastcall read_hw_counter_us() { return (unsigned __int64)(152LL * *((_QWORD *)*SYM + 60)) >> 12; }", "platform_word_get": "int __fastcall platform_word_get(int a0) { *(_DWORD *)a0 = *((_DWORD *)SYM + 250); return 0; }", "ccp_trng_read32": "int __fastcall ccp_trng_read32(_DWORD *a0) { char *v1; int v2; if ( a0 == nullptr ) return 44; if ( ccp_is_enabled() == 0 ) return 49; v1 = SYM; v2 = *(_DWORD *)(*((_DWORD *)SYM + 1) + 12); *a0 = v2; if ( (*(_DWORD *)(*((_DWORD *)v1 + 1) + 16392) & 0x20000000) != 0 || v2 == 0 ) return 53; else return 0; }", "ccp_trng_read32_unchecked": "int __fastcall ccp_trng_read32_unchecked() { return *(_DWORD *)(*((_DWORD *)SYM + 1) + 12); }", "ccp_field6_get": "int __fastcall ccp_field6_get() { return *((_DWORD *)SYM + 6); }", "platform_region_size": "int __fastcall platform_region_size(int a0) { int result; unsigned int v1; result = 0x100000; v1 = (unsigned __int8)SYM[12]; if ( v1 << 31 != 0 ) { switch ( a0 ) { case 13: return ((((unsigned __int8)SYM[12] >> 1) & 0x1F) << 20) + 0x100000; case 49: case 50: return (SYM + ((((v1 >> 1) & 0x1F) + 1) << 18)) & 0xFFF00000; case 58: return ((((unsigned __int8)SYM[12] >> 1) & 0x1F) << 20) + 0x100000; default: break; } } return result; }", "ccp_flags_to_ctrl": "int __fastcall ccp_flags_to_ctrl(int a0) { int result; result = 0; if ( a0 << 31 != 0 ) result = 2; if ( (a0 & 8) != 0 ) result |= 0x2000000u; if ( (a0 & 0x10) != 0 ) result |= 8u; if ( (a0 & 0x20) != 0 ) return result | 0x10; return result; }", "config_find_type144": "int __fastcall config_find_type144() { int result; int v0; result = 0; v0 = 0; while ( *(_DWORD *)(SYM + 32 * v0 + 1304) != 144 ) { if ( ++v0 >= 10 ) return result; } return *(_DWORD *)(SYM + 32 * v0 + 1308); }", "fifo_read_id": "int __fastcall fifo_read_id(_DWORD *a0) { int result; char *v1; int v2; int v3; int v4; int v5; int v6; int v7; int v8; v8 = *(_DWORD *)SYM; v4 = 0; v5 = 0; v6 = 0; v7 = 0; v3 = 0; result = fifo_transfer(a0, 8, SYM, 2u, (int)&v4, &v3, 0x10u); if ( result == 0 ) { v1 = SYM; v2 = SYM; *((_DWORD *)SYM + 7) = HIBYTE(v7); result = fifo_transfer(a0, 8, v2 + 2, 2u, (int)&v4, &v3, 8u); if ( result == 0 ) *((_DWORD *)v1 + 8) = HIBYTE(v5); } return result; }", "config_find_type113b": "int __fastcall config_find_type113b() { int result; int v0; result = 0; v0 = 0; while ( *(_DWORD *)(SYM + 32 * v0 + 1304) != 113 ) { if ( ++v0 >= 10 ) return result; } return *(_DWORD *)(SYM + 32 * v0 + 1316); }", "config_find_type113": "int __fastcall config_find_type113() { int result; int v0; result = 0; v0 = 0; while ( *(_DWORD *)(SYM + 32 * v0 + 1304) != 113 ) { if ( ++v0 >= 10 ) return result; } return *(_DWORD *)(SYM + 32 * v0 + 1308); }", "config_find_type256": "int __fastcall config_find_type256() { int result; int v0; result = 0; v0 = 0; while ( *(_DWORD *)(SYM + 32 * v0 + 1304) != 256 ) { if ( ++v0 >= 10 ) return result; } return *(_DWORD *)(SYM + 32 * v0 + 1316); }", "config_find_type256b": "int __fastcall config_find_type256b() { int result; int v0; result = 0; v0 = 0; while ( *(_DWORD *)(SYM + 32 * v0 + 1304) != 256 ) { if ( ++v0 >= 10 ) return result; } return *(_DWORD *)(SYM + 32 * v0 + 1308); }", "page_probe_signature": "int __fastcall page_probe_signature(int a0) { unsigned int v1; unsigned __int8 *v2; int v3; int v4; int v5; int v6; char *v7; char v8; char v9; unsigned int v10; v10 = 0; v1 = map_page_and_flush(a0 + 14, 4096, &v10); v2 = (unsigned __int8 *)v1; if ( v1 == 0 ) return SYM; v3 = hexdigit_value(*(unsigned __int8 *)(v1 + 3)) << 12; v4 = v3 | (hexdigit_value(v2[4]) << 8); v5 = v4 | (16 * hexdigit_value(v2[5])); v6 = hexdigit_value(v2[6]); v7 = SYM; if ( (v5 | v6) == 0x14 ) v8 = 1; else v8 = 2; *SYM = v8; v9 = hexdigit_value(v2[474]); v7[1] = v9 | (16 * hexdigit_value(v2[473])); __asm { SVC 0x63 ; 'c' } return 0; }", "fw_info_buffer_get": "int __fastcall fw_info_buffer_get() { int result; int v0; result = 0; v0 = 0; while ( *(_DWORD *)(SYM + 32 * v0 + 1304) != 257 ) { if ( ++v0 >= 10 ) return result; } return *(_DWORD *)(SYM + 32 * v0 + 1308); }", "config_find_type258": "int __fastcall config_find_type258(int *a0) { int i; for ( i = 0; i < 10; ++i ) { if ( *(_DWORD *)(SYM + 32 * i + 1304) == 258 ) { memcpy(a0, (const void *)(SYM + 32 * i + 1304), 0x20u); return 0; } } return SYM; }", "region_size_lookup": "unsigned int __fastcall region_size_lookup(int a0) { unsigned int result; unsigned int v1; result = 0; if ( (unsigned int)(a0 - 1) < 0x24 ) { v1 = *(_DWORD *)(SYM + 16 * a0 - 12); result = 4 * (v1 >> 14); if ( (v1 & 0x1000) != 0 ) return v1 >> 14 << 6; } return result; }", "region_base_by_id": "int __fastcall region_base_by_id(int a0, int a1) { int v2; _DWORD *v3; int v4; v2 = opcode_to_index(a0); if ( v2 == 0 ) return 4; *v3 = 9437184; *v3 = 4 * (*(_DWORD *)(v4 + 16 * v2 - 16) & 0x1FFFFFF) + 9437184; return 0; }", "region_size_by_id": "unsigned int __fastcall region_size_by_id(int a0) { _DWORD *v1; v1 = SYM; switch ( a0 ) { case 8: return (4 * *((_DWORD *)SYM + 80)) & 0x7FFFFFF; case 33: return region_size_lookup(16); case 34: return (region_size_lookup(36) + 4 * ((v1[140] & 0x1FFFFFF) - (v1[80] & 0x1FFFFFF)) + 0xFFFF) & 0xFFFF0000; default: break; } return 0x100000; }", "platform_info_get": "int __fastcall platform_info_get() { __int64 *v0; __int64 v1; int v2; int result; int v3; v0 = (__int64 *)((char *)*SYM + 2444); if ( *((_DWORD *)SYM + 556) == 0 ) { result = SYM; goto LABEL_14; } v1 = *v0; v2 = HIWORD(*(_DWORD *)v0) & 0x7FFF; if ( *(int *)v0 < 0 ) return 0; v3 = SYM - 10; if ( v2 == 128 ) goto LABEL_10; if ( v2 != 512 ) { if ( v2 != 1024 ) { if ( v2 != 1152 ) { LABEL_13: result = SYM + 3; goto LABEL_14; } field6_set(1); } LABEL_10: result = log_config_set(v2, HIDWORD(v1)); goto LABEL_12; } result = log_region_unmap((int *)*SYM + 612); LABEL_12: if ( result == v3 ) goto LABEL_13; LABEL_14: *(_DWORD *)v0 = (unsigned __int16)result | 0x80000000; return result; }", "irq_task_group1": "void __fastcall __noreturn irq_task_group1() { irq_enable_mask(); while ( 1 ) { __asm { SVC 0x5A ; 'Z' } platform_info_get(); } }", "ret_err_0009": "int __fastcall ret_err_0009() { return SYM; }", "hashtable_insert": "int __fastcall hashtable_insert(int *a0, int a1, _DWORD *a2) { int v3; unsigned int v4; int v5; int v6; int result; int v7; unsigned int v8; int v9; int v10; int v11; v3 = SYM; v4 = fnv1a_hash(a0, (const void *)a1); udiv_select_shift(v4, *((unsigned __int16 *)a0 + 4)); v6 = v5; if ( *((_BYTE *)a0 + 20) != 0 ) { if ( buffer_is_zero((int)a0, a1) != 0 ) { result = v3 + 4; *a2 = -1; } else { v8 = 0; v9 = SYM - 3; while ( *((unsigned __int16 *)a0 + 8) >= v8 ) { v10 = *((unsigned __int8 *)a0 + 10); v11 = *a0; *a2 = v6; if ( ct_memcmp((const void *)(v11 + v6 * v10), (const void *)a1, *((unsigned __int8 *)a0 + 11)) != 0 ) result = v3; else result = v9; if ( result == v9 ) return result; if ( *((unsigned __int16 *)a0 + 4) == ++v6 ) v6 = 0; ++v8; } *a2 = -1; return v3; } } else { v7 = SYM; *a2 = -1; return v7 + 3; } return result; }", "hashtable_entry_check": "int __fastcall hashtable_entry_check(int a0) { unsigned int v1; unsigned int v2; int v3; unsigned int v4; int v5; if ( *(_BYTE *)(a0 + 12) == 0 || *(_BYTE *)(a0 + 20) == 1 ) return SYM + 1; v1 = *(unsigned __int8 *)(a0 + 11); if ( v1 < 2 ) return SYM; v2 = *(unsigned __int8 *)(a0 + 10); if ( v1 > v2 ) return SYM; v3 = *(unsigned __int16 *)(a0 + 8); if ( *(_WORD *)(a0 + 8) == 0 ) return SYM; v4 = *(_DWORD *)(a0 + 4); udiv_select_shift(v4, v2); if ( v5 != v3 ) return SYM; bzero(*(void **)a0, v4); *(_DWORD *)(a0 + 16) = 0; *(_BYTE *)(a0 + 20) = 1; return 0; }", "hashtable_lookup": "int __fastcall hashtable_lookup(int a0, int a1, _DWORD *a2) { unsigned int v3; unsigned int v4; int v5; int v6; int result; int v7; unsigned int v8; int v9; int v10; int v11; const void *v12; LOWORD(v3) = 0; v4 = fnv1a_hash((void *)a0, (const void *)a1); udiv_select_shift(v4, *(unsigned __int16 *)(a0 + 8)); v6 = v5; if ( *(_BYTE *)(a0 + 20) != 0 ) { if ( buffer_is_zero(a0, a1) != 0 ) { result = SYM; *a2 = -1; } else { v8 = 0; v9 = SYM - 6; v10 = SYM - 7; while ( *(unsigned __int16 *)(a0 + 8) > v8 ) { v12 = (const void *)(*(_DWORD *)a0 + v6 * *(unsigned __int8 *)(a0 + 10)); *a2 = v6; if ( buffer_is_zero(a0, (int)v12) != 0 ) { result = v9; } else if ( ct_memcmp(v12, (const void *)a1, *(unsigned __int8 *)(a0 + 11)) != 0 ) { result = SYM - 4; } else { result = v10; } if ( result == v9 ) { memcpy_thunk(*(_DWORD *)a0 + *a2 * *(unsigned __int8 *)(a0 + 10)); ++*(_WORD *)(a0 + 18); return SYM - 5; } if ( result == v10 ) return result; v3 = (unsigned __int16)(v3 + 1); if ( *(unsigned __int16 *)(a0 + 16) < v3 ) *(_WORD *)(a0 + 16) = v3; if ( *(unsigned __int16 *)(a0 + 8) == ++v6 ) v6 = 0; ++v8; } v11 = SYM; *a2 = -1; return v11 - 3; } } else { v7 = SYM; *a2 = -1; return v7 - 1; } return result; }", "cache_op_select": "int __fastcall cache_op_select(int result) { if ( result == 62 ) { __asm { SVC 0x68 ; 'h' } return 2; } return result; }", "fuse_program_bits": "int __fastcall fuse_program_bits(unsigned int a0, int a1) { int v2; int v3; int v4; int v5; int v6; v2 = 0; v3 = a1; v4 = 0; v5 = 0; v6 = -1; if ( a0 >= 0x400 ) return SYM; if ( a1 == 0 ) return 0; __asm { SVC 0x7D ; '}' } if ( 4 * a0 == -380928 ) { v2 = SYM - 4; } else { __asm { SVC 0x7D ; '}' } v4 = 385024; v5 = 385028; if ( (*(_DWORD *)(4 * a0 + 0x5D000) & a1) == 0 || (v3 = a1 & ~*(_DWORD *)(4 * a0 + 0x5D000)) != 0 ) { __asm { SVC 0x7B ; '{' } v6 = 0; __asm { SVC 0x7C ; '|' } delay_us_busy(1000); if ( MEMORY[0x5E000] << 31 != 0 ) { *(_DWORD *)(4 * a0 + 0x5D000) = v3; __dsb(0xFu); __asm { SVC 0x7C ; '|' } if ( *SYM != 37 || *((_DWORD *)SYM + 323) != 0 ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } } MEMORY[0x5E004] |= 0x1000u; MEMORY[0x5E004] = MEMORY[0x5E004] & 0xF800FFFF | ((a0 & 0x7FF) << 16); delay_us_busy(1); MEMORY[0x5E004] |= 2u; __dsb(0xFu); delay_us_busy(1000); if ( (MEMORY[0x5E000] & 4) != 0 ) { if ( (MEMORY[0x5E000] & 0x100) != 0 ) v2 = SYM + 1; } else { v2 = SYM - 2; } if ( *SYM != 37 || *((_DWORD *)SYM + 323) != 0 ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } } MEMORY[0x5E004] &= SYM; delay_us_busy(1000); if ( v2 == 0 ) { MEMORY[0x5E004] |= 0x2000u; MEMORY[0x5E004] = MEMORY[0x5E004] & 0xF800FFFF | ((a0 & 0x7FF) << 16); MEMORY[0x5E004] |= 0x800u; __dsb(0xFu); delay_us_busy(1000); if ( MEMORY[0x5E000] << 31 != 0 ) { if ( (v3 & ~*(_DWORD *)(4 * a0 + 0x5D000)) != 0 ) v2 = SYM + 2; } else { v2 = SYM - 1; } } } else { v2 = SYM - 3; } } } if ( v6 != -1 ) { *(_DWORD *)v5 &= SYM; *(_DWORD *)v5 &= SYM; __asm { SVC 0x7C ; '|' } __dsb(0xFu); delay_us_busy(1000); } if ( 4 * a0 != -380928 ) __asm { SVC 0x7E ; '~' } if ( v4 != 0 ) __asm { SVC 0x7E ; '~' } __asm { SVC 0x7C ; '|' } return v2; }", "apply_reg_range": "int __fastcall apply_reg_range(int a0, unsigned int a1, int a2) { int v3; unsigned int i; v3 = 0; bus_settle_delay(1); for ( i = 0; i < a1; ++i ) { v3 = fuse_program_bits(a0 + i, *(_DWORD *)(a2 + 4 * i)); if ( v3 != 0 ) break; } bus_settle_delay(0); return v3; }", "fnv1a_hash": "unsigned int __fastcall fnv1a_hash(void *key_desc, const void *data) { unsigned int result; unsigned int i; result = SYM; for ( i = 0; *((unsigned __int8 *)key_desc + 11) > i; i = (unsigned __int8)(i + 1) ) result = (result ^ *((unsigned __int8 *)data + i)) * SYM; return result; }", "mac_oneshot": "int __fastcall mac_oneshot(int a0, int a1, unsigned int a2, unsigned int a3, int a4, int a5) { int v6; int v7; int v8; __int64 v9; int v10; int v11; int v12; char v13[56]; int v14; int v15; int v16; int v17; int v18; v17 = 0; v15 = a1; v16 = 5; v6 = gp_operation_allocate((int)v13, a0, a2, a3); if ( v6 == 0 ) { v7 = v14; v12 = v14; v9 = __PAIR64__(a3, a2); v10 = a4; v11 = a5; v6 = gp_mac_update((int)&v8, &v9, a0); if ( v7 != 0 ) { v18 = v7; gp_operation_free(&v18, a0); } } return v6; }", "flash_window_setup": "int *__fastcall flash_window_setup(int a0) { int *v1; int v2; __int64 v3; _DWORD v4[6]; int v5[6]; int v6; _DWORD src[9]; src[8] = *(_DWORD *)SYM; v1 = nullptr; v2 = *((_DWORD *)SYM + 2); v3 = *((_QWORD *)SYM + 3); v6 = 0; if ( *SYM == 1 ) { v4[5] = 0xFFFF; v4[0] = HIDWORD(v3); v4[1] = v3; v4[4] = 1; v4[2] = v2; v4[3] = 0; __asm { SVC 0x89 } v1 = v4; if ( v4 == nullptr ) { v5[0] = v6; v5[1] = 0; v5[2] = v2; v5[3] = (int)src; v5[4] = 32; v5[5] = SYM; v1 = (int *)ecc_submit_op(v5); if ( v1 == nullptr ) { if ( a0 != 0 ) { if ( a0 == 1 && memcmp_be(src, (const void *)SYM, 0x20u) != 0 ) v1 = (int *)SYM; } else { memcpy((void *)SYM, src, 0x20u); } } } if ( v6 != 0 ) __asm { SVC 0x8A } } return v1; }", "hmac_sha256": "int __fastcall hmac_sha256(int a0, int a1, int r2_0, int a2, int a3, int a4, int a5, int a6) { int v7; int v8; unsigned int v9; int v10; int v11; int v12; int v13; int v14[29]; char v15[8]; __int64 v16; unsigned int v17; char v18[8]; _DWORD v19[29]; char v20[56]; int v21; int v22; int v23; int v24; _DWORD v25[3]; int v26[2]; unsigned int v27; int v28[2]; int v29; int a30; int v31; int v32; int v33; a30 = a0; v31 = a1; v32 = r2_0; v33 = a2; v7 = 8 * a2; v26[0] = SYM; v26[1] = 8 * a2; v8 = gp_object_allocate(v26, a0); if ( v8 == 0 ) { v9 = v27; v17 = v27; v25[0] = -1073741824; v25[1] = r2_0; LODWORD(v16) = v25; v25[2] = a2; HIDWORD(v16) = 12; v8 = gp_object_populate_attrs((int)v15, &v16, a30, 1); if ( v8 == 0 ) { v22 = a1; v23 = 4; v24 = v7; v8 = gp_operation_allocate((int)v20, a30, v10, v11); if ( v8 == 0 ) { v12 = v21; v28[0] = v21; v28[1] = v9; v8 = gp_set_operation_key(v28, a30); if ( v8 == 0 ) { v19[0] = 0; v19[1] = 0; v19[12] = v12; gp_mac_or_digest_init((int)v18, (int)v19, a30); v14[0] = a3; v14[12] = 0; v14[13] = v12; v14[1] = a4; v14[2] = a5; v14[3] = a6; v8 = gp_cipher_do_final((int)&v13, v14, a30); } if ( v12 != 0 ) { v29 = v12; gp_operation_free(&v29, a30); } } } if ( v9 != 0 ) gp_object_free(v9, a30); } return v8; }", "aes_ecb_oneshot": "int __fastcall aes_ecb_oneshot(int a0, int a1) { _DWORD v2[9]; v2[0] = 2; v2[1] = 1; v2[2] = 256; v2[3] = a0; v2[4] = 32; v2[5] = a1; v2[6] = 0; v2[7] = 0; v2[8] = SYM; return crypto_submit_op(v2); }", "platform_caps_collect": "int __fastcall platform_caps_collect(int *a0) { int v1; int v2; int v3; int v4; _DWORD *v5; int v6; int v7; int v8; int v9; int v10; int v11; unsigned int v12; unsigned __int8 v13[2]; __int16 v14; _BYTE *v15; _BYTE *v16; int v17; _BYTE *v18; int v19; int v20; int v21[6]; int v22; int v23; _DWORD *v24; _BYTE a[63]; _BYTE v25[89]; _BYTE v26[32]; _BYTE b[32]; _BYTE v27[12]; int v28; v22 = *(_DWORD *)SYM; v28 = v22; v1 = (int)v25; v2 = 0; __asm { SVC 0x87 } if ( &v12 != (unsigned int *)-143 ) v1 = 1; v3 = v1; v24 = nullptr; *a0 = 0; if ( v1 != 0 ) v4 = 0; else v4 = 8; __asm { SVC 0x7D ; '}' } v5 = SYM; if ( SYM == nullptr ) { v6 = 1; goto LABEL_42; } v6 = fifo_program_and_start(&v23, SYM); if ( v6 == 0 ) { __asm { SVC 0x7D ; '}' } v2 = SYM; if ( SYM == 0 ) { v6 = 1; goto LABEL_40; } bits_set_masked((_BYTE *)(SYM + 113), 3, 1); bits_set_masked((_BYTE *)(v2 + 114), 3, 1); if ( fifo_start_transfer(v5) == 0 ) { if ( fifo_cmd_short(v5, 128, 2, 64, 0x23u) == 0 ) { memcpy_thunk((int)a); if ( memcmp_be(a, SYM, 0x20u) != 0 ) { if ( memcmp_be(a, &(*SYM)[8], 0x20u) != 0 ) { if ( memcmp_be(a, &(*SYM)[16], 0x20u) != 0 ) { v6 = 5; goto LABEL_40; } v8 = 4; v7 = 3; } else { v8 = 136; v7 = 2; } } else { v7 = 1; v8 = 268; } *a0 = v7; if ( fifo_cmd_short(v5, 0, 0, 0, 0x23u) == 0 ) { v27[0] = *(_BYTE *)SYM; v27[1] = *(_BYTE *)(SYM + 1); if ( fifo_cmd_short(v5, 0, 0, 3, 0x23u) == 0 ) { v27[8] = *(_BYTE *)SYM; if ( rand_fill_bytes(v26, 0x20u, v9, v10) != 0 ) { v6 = 7; goto LABEL_40; } if ( fifo_cmd_build(v5, 8, 0, v4, (int)v26, 32, 0x23u, 35) != 0 ) { v6 = 6; goto LABEL_40; } if ( v3 != 0 ) { v11 = v8 + 32 * v4; if ( log_record_prepare(v24) != 0 ) { v6 = 11; goto LABEL_40; } v16 = (_BYTE *)(v11 + 32); *((_DWORD *)*SYM + 31) |= 0x200000u; } else { v16 = a; } v15 = v26; v13[0] = 0; v14 = v4; v17 = 0; v18 = v27; v19 = 0; v20 = 0; v6 = tlv_request_validate(v13, (unsigned int)v25 & 0xFFFFFFE0); if ( v6 == 0 ) { __asm { SVC 0x68 ; 'h' } __asm { SVC 0x79 ; 'y' } v21[0] = (unsigned int)v25 & 0xFFFFFFE0; v21[1] = 0; v21[2] = 88; v21[3] = (int)b; v21[4] = 32; v21[5] = SYM; if ( ecc_submit_op(v21) != 0 ) { v6 = 12; } else if ( ct_memcmp((const void *)SYM, b, 0x20u) != 0 ) { v6 = 10; } } goto LABEL_40; } } } v6 = 3; goto LABEL_40; } v6 = 2; } LABEL_40: v5[27] = 0; __asm { SVC 0x7E ; '~' } if ( v2 != 0 ) { bits_set_masked((_BYTE *)(v2 + 113), 3, 0); bits_set_masked((_BYTE *)(v2 + 114), 3, 0); __asm { SVC 0x7E ; '~' } } LABEL_42: if ( (v23 & 2) == 0 ) { __asm { SVC 0x7C ; '|' } if ( SYM != 0 ) v6 = 1; } *((_DWORD *)*SYM + 31) |= v6 << 28; return v6; }", "fifo_transfer": "int __fastcall fifo_transfer(_DWORD *a0, int a1, int a2, unsigned int a3, int a4, _DWORD *a5, unsigned int a6) { int v7; int v8; int v9; unsigned int v10; unsigned __int64 hw_counter_us; v7 = 0; v8 = 0; if ( a6 == 0 || a3 == 0 ) return SYM; v9 = retry_op_3x(a0, a1, a2, a3); if ( v9 == 0 ) { fifo_wait_idle((int)a0); a0[1] = a1; a0[27] = 1; v10 = 0; LABEL_11: if ( v10 < a6 ) { if ( v10 == a6 - 1 ) v7 = 1; a0[4] = (v7 << 9) | 0x100; hw_counter_us = read_hw_counter_us(); do { if ( a0[30] != 0 ) { *(_BYTE *)(a4 + v10++) = a0[4]; ++v8; goto LABEL_11; } } while ( read_hw_counter_us() - hw_counter_us < 0x61A8 ); v9 = SYM - 6; } *a5 = v8; } return v9; }", "fifo_write_bytes": "int __fastcall fifo_write_bytes(_DWORD *a0, int a1, unsigned int a2) { int v3; int v4; unsigned int i; unsigned __int64 hw_counter_us; int v5; unsigned __int64 v6; v3 = 0; v4 = 0; for ( i = 0; i < a2; ++i ) { if ( i == a2 - 1 ) v4 = 1; hw_counter_us = read_hw_counter_us(); while ( a0[29] >= 8u ) { if ( read_hw_counter_us() - hw_counter_us >= 0x1388 ) { v5 = SYM; LABEL_10: v3 = v5; goto LABEL_13; } } a0[4] = *(unsigned __int8 *)(a1 + i) | (v4 << 9); if ( (a0[13] & 0x40) != 0 ) { v5 = SYM + 5; goto LABEL_10; } } LABEL_13: v6 = read_hw_counter_us(); while ( (a0[28] & 0x20) != 0 ) { if ( read_hw_counter_us() - v6 >= (unsigned int)SYM ) return SYM + 5; } return v3; }", "retry_op_3x": "int __fastcall retry_op_3x(_DWORD *a0, int a1, int a2, unsigned int a3) { unsigned int i; int result; for ( i = 0; i < 3; ++i ) { fifo_wait_idle((int)a0); a0[1] = a1; a0[27] = 1; result = fifo_write_bytes(a0, a2, a3); if ( result == 0 ) break; } return result; }", "fifo_reset": "int __fastcall fifo_reset(_DWORD *a0) { bool v1; int v2; unsigned __int64 hw_counter_us; v1 = (a0[27] & 1) == 0; v2 = a0[39] & 1; if ( v1 && v2 != 0 ) { a0[27] |= 2u; hw_counter_us = read_hw_counter_us(); while ( (a0[23] & 1) != 0 ) { if ( read_hw_counter_us() - hw_counter_us >= 0x1388 ) return SYM; } } return 0; }", "fifo_wait_idle": "int __fastcall fifo_wait_idle(int a0) { unsigned __int64 hw_counter_us; int v1; unsigned __int64 v2; *(_DWORD *)(a0 + 108) = 0; hw_counter_us = read_hw_counter_us(); v1 = SYM; v2 = hw_counter_us; while ( *(_DWORD *)(a0 + 156) << 31 != 0 ) { if ( read_hw_counter_us() - v2 >= 0x3E8 ) return v1; } return 0; }", "engine_clock_init": "int __fastcall engine_clock_init() { __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } return fw_info_publish(*SYM != 0); }", "engine_clock_and_cfg": "int __fastcall engine_clock_and_cfg() { int result; result = engine_clock_init(); if ( result == 0 ) return config_apply_type258(); return result; }", "reg_rmw_nop": "__int64 __fastcall reg_rmw_nop() { __asm { SVC 0xA6 } return (unsigned int)SYM; }", "irq_status_scan": "void *__fastcall irq_status_scan() { _UNKNOWN **v0; void *result; int v1; void **v2; unsigned __int8 v3; v0 = SYM; result = *SYM; v1 = *((_DWORD *)*SYM + 693); if ( v1 >= 0 ) { v2 = (void **)SYM; __asm { SVC 0x5E ; '^' } if ( BYTE1(v1) == 1 ) v3 = sysdrv_mbox_query_9(); else v3 = -1; *((_DWORD *)*v0 + 693) = v3 | 0x80000000; result = *v2; __asm { SVC 0x5F ; '_' } } return result; }", "irq_task_group2": "void __fastcall __noreturn irq_task_group2() { irq_enable_group2(); while ( 1 ) { __asm { SVC 0x5A ; 'Z' } irq_status_scan(); } }", "nop_hook_irq1": "void __fastcall nop_hook_irq1() { ; }", "irq_enable_group1": "unsigned int __fastcall irq_enable_group1() { _UNKNOWN **v0; v0 = SYM; *((_DWORD *)*SYM + 430) |= 0x3000u; *((_DWORD *)*v0 + 694) = 0x80000000; return 0x80000000; }", "irq_enable_mask": "unsigned int __fastcall irq_enable_mask() { _DWORD *v0; unsigned int result; v0 = (_DWORD *)((char *)*SYM + 2444); *((_DWORD *)*SYM + 425) |= 0x3C0u; __asm { SVC 0x59 ; 'Y' } *SYM = 67; result = *v0 | 0x80000000; *v0 = result; return result; }", "irq_enable_group2": "unsigned int __fastcall irq_enable_group2() { _UNKNOWN **v0; v0 = SYM; *((_DWORD *)*SYM + 430) |= 0xC00u; *((_DWORD *)*v0 + 693) = 0x80000000; return 0x80000000; }", "object_delete_by_id": "int __fastcall object_delete_by_id(unsigned int a0) { int v1; unsigned int v2; _DWORD v3[2]; _DWORD *v4; int v5; _BYTE *v6; int v7; int v8; int v9; unsigned int v10; unsigned int v11; _BYTE dst[68]; _DWORD v12[2]; v12[0] = SYM; bzero_core(dst, 0x44u); v8 = 1; v9 = 3; v4 = v12; v5 = 4; v1 = gp_object_lookup_or_create((int)v3, (int)&v4, a0); v2 = v10; if ( v1 != 0 || v10 == 0 ) { v4 = v12; v8 = 1; v9 = 3; v10 = 0; v5 = 4; v6 = dst; v7 = 68; v1 = gp_object_enumerate(v3, (int)&v4, a0); v2 = v11; if ( v11 == 0 ) return SYM; } gp_object_close(v2, a0); return v1; }", "page_map_and_init": "int __fastcall page_map_and_init(int a0) { int v1; unsigned int v2; unsigned int v3; int v4; unsigned int v5; _DWORD *v6; unsigned int v7; int v8; unsigned int v9; unsigned int v10; v1 = 0; v10 = 0; __asm { SVC 0x73 ; 's' } v2 = a0 + SYM; v3 = map_page_and_flush(a0 + SYM, 4096, &v10); v4 = SYM; v5 = v3; if ( v3 == 0 ) return v4; v6 = (_DWORD *)(v3 + 256); if ( *(_DWORD *)(v5 + 264) != SYM ) { v1 = SYM - 4; LABEL_15: __asm { SVC 0x63 ; 'c' } return v1; } v7 = *v6 + 256; if ( v7 > 0x8000 ) { v1 = SYM; goto LABEL_15; } v8 = SYM; if ( *v6 == -256 ) goto LABEL_15; while ( 1 ) { v9 = v7 <= 0x1000 ? v7 : 4096; memcpy_thunk(v8); v7 -= v9; v8 += v9; v2 += v9; if ( v7 == 0 ) break; __asm { SVC 0x63 ; 'c' } v5 = map_page_and_flush(v2, 4096, &v10); if ( v5 == 0 ) return v4; } if ( v5 != 0 ) goto LABEL_15; return v1; }", "init_mailbox_state": "void *__fastcall init_mailbox_state() { void *result; bzero_core((void *)SYM, 0x40u); result = *SYM; *((_DWORD *)*SYM + 430) |= 0xFu; return result; }", "reg_allowlist_build": "int __fastcall reg_allowlist_build() { int v0; void *v1; int result; unsigned int *v2; __int64 v3; __int64 v4; char *v5; int v6; unsigned int v7; unsigned int *v8; unsigned int v9; int v10; unsigned int v11; int v12; int v13; int v14; int v15; int v16; int v17; v0 = SYM; v1 = SYM; v14 = 0; v15 = 0; v16 = 0; *(_DWORD *)SYM = (char *)SYM + 16; *(_DWORD *)(v0 + 4) = 49188; *(_WORD *)(v0 + 8) = 4099; *(_BYTE *)(v0 + 10) = 12; *(_BYTE *)(v0 + 11) = 8; *(_BYTE *)(v0 + 12) = 1; *(_BYTE *)(v0 + 20) = 0; result = hashtable_entry_check(v0); if ( result == 0 ) result = 0; if ( result == 0 ) { v2 = (unsigned int *)SYM; v3 = *((_QWORD *)SYM - 2048); v4 = *((_QWORD *)SYM - 2047); *((_QWORD *)SYM + 1) = v4; v5 = SYM; *(_QWORD *)v2 = v3; if ( (_DWORD)v4 == (unsigned __int8)*v5 ) { v6 = SYM; v7 = 0; v8 = v2; while ( *v8 > v7 ) { if ( *(_DWORD *)v6 != SYM ) return SYM - 5; v9 = v6 + 8 * *(_DWORD *)(v6 + 4) + 16; if ( v9 > (unsigned int)v1 ) return SYM + 6; if ( *(_BYTE *)(v6 + 9) == 0 ) { v10 = SYM; v11 = 0; v12 = SYM - 2; while ( *(_DWORD *)(v6 + 4) > v11 ) { v13 = v6 + 8 * v11; v14 = *(_DWORD *)(v13 + 16); LOBYTE(v15) = *(_BYTE *)(v6 + 8); LOWORD(v16) = *(_WORD *)(v13 + 20); result = hashtable_lookup(SYM, (int)&v14, &v17); if ( result != v10 && result != v12 ) return result; ++v11; } result = 0; } v6 = v9; ++v7; } } else { return SYM; } } return result; }", "irq_enable_group3": "unsigned int __fastcall irq_enable_group3() { _UNKNOWN **v0; v0 = SYM; *((_DWORD *)*SYM + 430) |= 0xC000000u; *((_DWORD *)*v0 + 701) = 0x80000000; return 0x80000000; }", "init_fw_tables": "int __fastcall init_fw_tables() { int result; bzero_core((void *)SYM, 0x2000u); SYM[2] = 0; result = *((_DWORD *)SYM + 556); if ( result != 0 ) return fw_table_populate(170); return result; }", "dma_transfer": "int __fastcall dma_transfer(int a0, int a1, int a2, int a3) { int *v4; int v5; _DWORD *v6; _DWORD *v7; __int64 v8; unsigned int v9; int *v10; unsigned int v11; int v12; int v13; unsigned int v14; __int64 v15; unsigned int v16; int v17; v17 = a3; v4 = SYM; v5 = 0; if ( *SYM != 2 ) return SYM; __asm { SVC 0x73 ; 's' } v6 = (_DWORD *)map_page_and_flush(0x7E0002u, 4096, (unsigned int *)&v17); if ( v6 == nullptr ) return SYM + 2; v7 = v6 + 1; if ( *v6 == SYM ) { v8 = *(_QWORD *)v7; v4[1] = v6[2]; v9 = v6[3]; v7 = v6 + 4; if ( v9 > 0x100 ) v9 = 256; v10 = v4; v11 = 16; v4[1] = 0; while ( 1 ) { v16 = v10[1]; if ( v16 >= v9 ) break; v11 += 32; if ( v11 > 0x1000 ) { v5 = SYM; break; } v12 = SYM + 32 * v16; *(_DWORD *)(v12 + 8) = *v7; *(_DWORD *)(v12 + 12) = v7[1]; v13 = v7[2]; v7 += 3; *(_DWORD *)(v12 + 16) = v13; if ( (_DWORD)v8 != 0 ) { *(_DWORD *)(v12 + 20) = *v7; *(_DWORD *)(v12 + 24) = v7[1]; v14 = v7[2]; v7 += 3; LODWORD(v15) = udivmod64(1000LL * v14, 0xA0u, 0, v17); *(_QWORD *)v12 = v15; } v10[1] = v16 + 1; } if ( (_DWORD)v8 == 0 && v16 != 0 ) *v10 = 0; } else { v5 = SYM - 2; } if ( v7 != nullptr ) __asm { SVC 0x63 ; 'c' } return v5; }", "sram_window_map": "int __fastcall sram_window_map(int a0) { int v1; int v2; unsigned int v3; unsigned int v4; int v5; unsigned int v6; unsigned int v7; unsigned int v8; unsigned int v9; v1 = 0; v9 = 0; if ( a0 != 0 ) return SYM; v2 = SYM; __asm { SVC 0x73 ; 's' } v3 = 8355840; v4 = map_page_and_flush(0x7F8000u, 4096, &v9); v5 = SYM; v6 = v4; if ( v4 == 0 ) return SYM; v7 = *(_DWORD *)(v4 + 20); if ( v7 > 0x880 ) { v1 = SYM; LABEL_15: __asm { SVC 0x63 ; 'c' } return v1; } *SYM = *(_DWORD *)(v4 + 76); if ( v7 != 0 ) { while ( 1 ) { v8 = v7 <= 0x1000 ? v7 : 4096; memcpy_thunk(v2); v7 -= v8; v2 += v8; v3 += v8; if ( v7 == 0 ) break; __asm { SVC 0x63 ; 'c' } v6 = map_page_and_flush(v3, 4096, &v9); if ( v6 == 0 ) { v1 = v5; break; } } } SYM[1] = 1; if ( v6 != 0 ) goto LABEL_15; return v1; }", "task_id_publish": "int __fastcall task_id_publish(int a0) { char *v1; __asm { SVC 0x54 ; 'T' } v1 = SYM; *SYM = a0; __asm { SVC 0x5D ; ']' } *((_DWORD *)v1 + 1) = a0; if ( a0 == -1 ) return SYM; bzero_core((void *)SYM, 0x1130u); bzero_core((void *)SYM, 0x400u); *SYM = 1; return 0; }", "init_dram_windows": "unsigned int *__fastcall init_dram_windows() { unsigned int *result; int v0; int v1; bzero_core(SYM, 0x38u); result = (unsigned int *)SYM; *((_DWORD *)SYM + 4) = SYM; v0 = SYM - 164; result[5] = SYM - 164; result[6] = v0 - 4; result[11] = SYM; v1 = SYM - 164; result[12] = SYM - 164; result[13] = v1 - 4; return result; }", "dram_window_probe": "int __fastcall dram_window_probe() { _DWORD *v0; int result; bool v1; v0 = (_DWORD *)SYM; result = map_region_pages(SYM, 0x4000u, SYM); v1 = result == 0 && (*v0 == SYM || *v0 == -1); *SYM = v1; return result; }", "init_flags_clear": "char *__fastcall init_flags_clear() { char *result; result = SYM; *SYM = 0; result[1] = 0; result[2] = 0; return result; }", "fifo_cmd_setup": "int __fastcall fifo_cmd_setup(_DWORD *a0, int a1, int a2) { int result; result = fifo_reset(a0); if ( result == 0 ) { a0[27] = 0; a0[1] = 50; *a0 = 357; a0[7] = a1; a0[8] = a2; a0[40] = 16; a0[12] = 2303; a0[14] = 0; a0[15] = 0; a0[31] = 31; a0[27] = 1; } return result; }", "secure_channel_setup": "int __fastcall secure_channel_setup(int a0) { int v1; v1 = SYM; __asm { SVC 0xAC } if ( a0 != 0 && ccp_base_set(a0) == 0 && ccp_queue_reset() == 0 && ccp_queue_config(0, (int)*SYM, *SYM, 0x10u) == 0 ) { return 0; } return v1; }", "spi_probe_controller": "int __fastcall spi_probe_controller(int a0, int a1, int a2, int a3) { int v4; unsigned int v5; int v6; int v7; int device_desc; _DWORD *v8; unsigned int v9; unsigned int i; int v10; int v11; v11 = a3; v4 = 0; v5 = 0; v6 = 0; v10 = 0; while ( *(_DWORD *)(SYM + 16 * v6 + 1676) != 307 ) { if ( (unsigned int)++v6 >= 0x10 ) goto LABEL_5; } v4 = *(_DWORD *)(SYM + 16 * v6 + 1680); v5 = *(_DWORD *)(SYM + 16 * v6 + 1684); LABEL_5: v7 = SYM; if ( v6 != 16 ) { if ( v5 > 0x2000 ) { device_desc = SYM + 8; LABEL_18: log_event(8u, 2); log_event(6u, device_desc); return device_desc; } device_desc = spi_load_device_desc(SYM, v4, v5, 1); if ( device_desc != 0 ) goto LABEL_18; v8 = SYM; LOBYTE(v10) = -97; device_desc = ((int (__fastcall *)(int *, _DWORD, _DWORD, _DWORD, int *, int))SYM)(&v10, 0, 0, 0, &v11, 3); if ( device_desc != 0 ) goto LABEL_18; v9 = v8[65]; for ( i = 0; v9 > i; ++i ) { if ( v8[128 * i + 81] == (v11 & SYM | (unsigned __int8)v11) ) { memcpy((void *)SYM, &v8[128 * i + 80], 0x200u); *((_DWORD *)SYM + 1) = SYM; break; } } if ( v9 != i ) return device_desc; } device_desc = v7; goto LABEL_18; }", "ccp_enable_write": "_DWORD *__fastcall ccp_enable_write() { _DWORD *result; result = (_DWORD *)(*((_DWORD *)SYM + 1) + 16392); *result = SYM; return result; }", "config_blob_process": "int __fastcall config_blob_process(int a0) { _DWORD *v1; int v2; int v3; unsigned int i; int v4; int v5; int v6; int v7; int v8; int v9; int v10; int v11; int v12; v1 = nullptr; LOBYTE(v11) = -1; v2 = 0; v8 = 0; v9 = 0; v10 = 0; if ( SYM[0][1] == 0 ) return SYM; __asm { SVC 0x5E ; '^' } v3 = map_shared_config_blob(&v8, &v12, &v11); if ( v3 == 0 ) { if ( *(_DWORD *)(v8 + 4) == SYM ) { v3 = config_entry_match(&v9, &v10, *(_DWORD *)a0, *(_BYTE *)(a0 + 8) & 0xF, v8); if ( v3 == 0 ) { for ( i = 0; i < v10; ++i ) { v4 = v9 + 16 * i; if ( (*(_WORD *)(v4 + 8) & 0x8000) != 0 && *(_DWORD *)(v4 + 4) == *(_DWORD *)(a0 + 4) && *(_DWORD *)v4 == *(_DWORD *)a0 && ct_memcmp((const void *)(v4 + 10), (const void *)(a0 + 10), 3u) == 0 ) { v1 = (_DWORD *)(v9 + 16 * i); break; } if ( v2 == 0 && (*(_WORD *)(v9 + 16 * i + 8) & 0x8000) == 0 ) { v2 = 1; v1 = (_DWORD *)(v9 + 16 * i); } } if ( v1 != nullptr ) { v5 = *(_DWORD *)(a0 + 4); v6 = *(_DWORD *)(a0 + 8); v7 = *(_DWORD *)(a0 + 12); *v1 = *(_DWORD *)a0; v1[1] = v5; v1[2] = v6; v1[3] = v7; } else { v3 = SYM; } } } else { v3 = SYM; } } release_handle_if_valid((unsigned __int8)v11); __asm { SVC 0x5F ; '_' } return v3; }", "objmap_insert": "int __fastcall objmap_insert(int a0, int a1, __int64 a2, int a3) { int v4; int result; unsigned int v5; int v6; unsigned int i; unsigned int v7; v4 = SYM; result = SYM; v5 = 0; while ( *(_DWORD *)(SYM + 16 * v5 + 4) != a1 ) { v5 = (unsigned __int16)(v5 + 1); if ( v5 >= 0x80 ) goto LABEL_5; } v6 = SYM + 16 * v5; *(_DWORD *)v6 = a0; *(_QWORD *)(v6 + 8) = a2; result = 0; LABEL_5: for ( i = 0; result != 0 && i < 0x80; i = (unsigned __int16)(i + 1) ) { if ( *(_DWORD *)(v4 + 16 * i + 4) == 0 ) { v7 = v4 + 16 * i; *(_DWORD *)v7 = a0; v7 += 4; *(_DWORD *)v7 = a1; *(_QWORD *)(v7 + 4) = a2; if ( i > *((unsigned __int16 *)SYM + 1) ) *((_WORD *)SYM + 1) = i; return 0; } } return result; }", "fw_table_populate": "int __fastcall fw_table_populate(int a0) { int result; int v1; int v2; result = 0; v1 = 81; v2 = 0; while ( *((unsigned __int16 *)SYM + v2) != a0 ) { if ( *((_WORD *)SYM + v2) == 0 && v1 == 81 ) v1 = v2; if ( (unsigned int)++v2 >= 0x51 ) goto LABEL_8; } v1 = v2; LABEL_8: if ( v1 == 81 ) return SYM; *((_WORD *)SYM + v1) = a0; return result; }", "record_copy_tail_alt": "_BYTE *__fastcall record_copy_tail_alt(int a0, int a1, int a2) { memcpy_thunk(a0); return bzero((void *)(*(_DWORD *)(a1 + 68) + a0), a2 - *(_DWORD *)(a1 + 68)); }", "ecc_pair_copy": "_BYTE *__fastcall ecc_pair_copy(int a0, int a1, int a2) { record_copy_tail_alt(a0, a1, a2); return record_copy_tail_alt(a0 + 72, a1 + 72, a2); }", "ecdh_shared_secret": "int __fastcall ecdh_shared_secret(int a0, int a1, int a2, int a3) { _UNKNOWN **v4; _DWORD *v5; int v6; int v7; int v8; int v9; int v10; _BYTE v11[144]; _BYTE v12[144]; ccp_desc_t d; v4 = SYM; v5 = SYM; bzero((char *)*SYM + 4384, 0x98u); ecc_pair_copy((int)v11, a1, *(_DWORD *)(a0 + 68)); ecc_pair_copy((int)v12, a2, *(_DWORD *)(a0 + 68)); v6 = ecc_ctx_load(*v5 + 3808, a0, *(_DWORD *)(a0 + 68), (int)v11, (int)v12); v7 = SYM; if ( v6 != 0 || ccp_desc_ecc(&d, 3, *SYM + 4384, *SYM + 3808, *(_DWORD *)(a0 + 68), 1) != 0 ) return v7; v10 = crypto_wait_completion((int)&d, 1, v8, v9); if ( v10 == 0 ) { if ( *((unsigned __int8 *)*v4 + 4456) << 31 != 0 ) { memcpy_thunk(a3); *(_DWORD *)(a3 + 68) = *(_DWORD *)(a0 + 68); memcpy_thunk(a3 + 72); *(_DWORD *)(a3 + 140) = *(_DWORD *)(a0 + 68); return v10; } return v7; } return v10; }", "crypto_dual_op": "int __fastcall crypto_dual_op(int a0, int a1, int a2, int a3, int a4) { _UNKNOWN **v5; int v6; int v7; int v8; int v9; int v10; ccp_desc_t d; v5 = SYM; bzero((char *)*SYM + 4384, 0x98u); v6 = ecc_verify_core( (int)*v5 + 3808, a1, *(_DWORD *)(a1 + 68), a0, *(_DWORD *)(a0 + 68), a2, *(_DWORD *)(a2 + 68), a3, *(_DWORD *)(a3 + 68), a3 + 72, *(_DWORD *)(a3 + 140)); v7 = SYM; if ( v6 != 0 || ccp_desc_ecc(&d, 4, *SYM + 4384, *SYM + 3808, *(_DWORD *)(a1 + 68), 1) != 0 ) return v7; v10 = crypto_wait_completion((int)&d, 1, v8, v9); if ( v10 == 0 ) { if ( *((unsigned __int8 *)*v5 + 4456) << 31 != 0 ) { memcpy_thunk(a4); *(_DWORD *)(a4 + 68) = *(_DWORD *)(a1 + 68); memcpy_thunk(a4 + 72); *(_DWORD *)(a4 + 140) = *(_DWORD *)(a1 + 68); return v10; } return v7; } return v10; }", "spi_identify": "int __fastcall spi_identify() { unsigned __int8 v0; int v1; int *v2; unsigned int v3; int device_desc; int *v4; unsigned int a[8]; _BYTE v5[4]; int v6; unsigned int v7; _BYTE dst[56]; _BYTE v8[32]; int v9; v9 = *(_DWORD *)SYM; bzero_core(dst, 0x38u); bzero_core(a, 0x38u); v0 = (unsigned __int8)bzero_core(v8, 0x20u); __asm { SVC 0x66 ; 'f' } if ( *SYM == nullptr ) return SYM + 6; v1 = SYM; if ( *(_DWORD *)(SYM + 4) > 0xAu ) return SYM; v2 = (int *)SYM; v3 = (*SYM)[10]; if ( v3 > *((_DWORD *)*SYM + 2) ) return SYM; v6 = 0; v7 = v3 + 1; device_desc = hmac_sha256(v0, SYM, SYM, 32, (int)v5, 24, (int)v8, 32); if ( device_desc != 0 ) return device_desc; v4 = (int *)(SYM + 8); device_desc = spi_write_status(a, *(_DWORD *)(SYM + 8), 0x38u); if ( device_desc != 0 ) return device_desc; device_desc = spi_load_device_desc(dst, *v4, 0x38u, 0); if ( device_desc != 0 ) return device_desc; if ( memcmp_be(a, dst, 0x38u) != 0 ) return SYM; ++*(_DWORD *)(v1 + 4); v2[10] = v7; v2[9] = v6; return 0; }", "digest_dispatch": "int __fastcall digest_dispatch( unsigned int a0, int a1, int a2, unsigned int a3, int a4, unsigned int a5, int a6, int a7) { int v8; unsigned int v9; unsigned int v10; _BYTE v11[512]; int v12; v12 = *(_DWORD *)SYM; v10 = 0; if ( a7 == 3 ) { v9 = 32; } else { if ( a7 != 4 ) return SYM; v9 = 48; } if ( a1 == 0 && map_page_and_flush(a0, 512, &v10) == 0 ) return SYM + 2; memcpy_thunk((int)v11); v8 = rsa_pad_and_verify(a6, v9, a4, a5, a2, a3, (int)v11); if ( v10 != 0 ) __asm { SVC 0x63 ; 'c' } return v8; }", "nop_hook_plat": "void __fastcall nop_hook_plat() { ; }", "ret_zero": "int __fastcall ret_zero() { return 0; }", "ret_err_000A_1": "int __fastcall ret_err_000A_1() { return SYM; }", "dram_range_query": "int __fastcall dram_range_query(int a0) { int v1; unsigned __int64 v2; int result; int v3; int *v4; int v5; int v6; v1 = 0; if ( *SYM == 0 || is_recovery_state() != 0 ) return v1; v2 = *(_QWORD *)a0; if ( *(_DWORD *)(a0 + 4) >> 12 << 12 != 0 ) return SYM; v3 = 0; result = SYM - 5; while ( 1 ) { v4 = &SYM[4 * v3]; if ( v2 >= *(_QWORD *)v4 && *(_QWORD *)v4 + (unsigned __int64)(unsigned int)v4[2] >= v2 ) break; if ( (unsigned int)++v3 >= 3 ) { v5 = 0; while ( 1 ) { v6 = SYM + 32 * v5; if ( *(_DWORD *)(v6 + 1304) != 0 && v2 >= *(_QWORD *)(v6 + 1316) && *(_QWORD *)(v6 + 1316) + (unsigned __int64)*(unsigned int *)(v6 + 1324) >= v2 ) { break; } if ( (unsigned int)++v5 >= 0xA ) return v1; } return SYM - 5; } } return result; }", "platform_rev_match": "int __fastcall platform_rev_match() { int result; unsigned int v0; char *v1; _UNKNOWN **v2; result = 0; v0 = *((_DWORD *)SYM + 301); v1 = SYM; if ( SYM == v0 >> 8 && ((unsigned __int8)v0 == 2 || (unsigned __int8)v0 == 3 || (unsigned __int8)v0 == 255) ) { v2 = SYM; result = 1; *SYM = 1; v1[1] = 1; *((_DWORD *)*v2 + 31) |= (unsigned __int8)v0; v1[4] = 1; } v1[3] = 1; return result; }", "is_rev_34330": "BOOL __fastcall is_rev_34330() { return *((_DWORD *)SYM + 493) == 34330; }", "buffer_all_zero": "int __fastcall buffer_all_zero(int a0, unsigned int a1) { unsigned int i; for ( i = 0; i < a1; ++i ) { if ( *(_BYTE *)(a0 + i) != 0 ) return 0; } return 1; }", "ccp_is_enabled": "int __fastcall ccp_is_enabled() { return ccp_flags_or(0); }", "queue_flag_test": "BOOL __fastcall queue_flag_test() { int v0; return (*(_DWORD *)(*(_DWORD *)(SYM + 4 * v0) + 16) & 2) != 0; }", "ring_is_full": "BOOL __fastcall ring_is_full(int a0, int a1) { return !ring_has_space(a0, a1); }", "feature_enabled": "BOOL __fastcall feature_enabled(unsigned int a0, char a1) { unsigned int v2; return a0 < 7 && *(_DWORD *)((v2 = SYM + 12 * a0) + 2244) != 0 && (*(_DWORD *)(v2 + 2248) & (1 << a1)) != 0; }", "is_recovery_state": "int __fastcall is_recovery_state() { if ( *((_DWORD *)SYM + 142) == 3 ) return 1; else return (unsigned __int8)SYM[3]; }", "platform_state_get": "BOOL __fastcall platform_state_get(char a0) { return (*((_DWORD *)SYM + 325) & (1 << a0)) != 0; }", "vbios_find_flash_header": "__int64 __fastcall vbios_find_flash_header(_BYTE *a0) { __int64 result; *a0 = 0; HIDWORD(result) = 12; __asm { SVC 0x7D ; '}' } if ( SYM != 0 ) { if ( ct_memcmp((const void *)SYM, SYM, 0xCu) == 0 ) *a0 = 1; __asm { SVC 0x7E ; '~' } return 0xC00000000LL; } else { LODWORD(result) = SYM; } return result; }", "is_valid_opcode_index": "BOOL __fastcall is_valid_opcode_index(unsigned int a0) { return a0 < 0x62; }", "ring_has_space": "BOOL __fastcall ring_has_space(int a0, int a1) { _DWORD *v2; unsigned int v3; unsigned int v4; unsigned int v5; unsigned int v6; v2 = (_DWORD *)(SYM - 84 + 28 * a0); v3 = v2[4]; v4 = a1 & (v3 - 1); v5 = v2[3]; v6 = (unsigned int)(*(_DWORD *)(*(_DWORD *)(SYM + 4 * a0) + 8) - v2[1]) >> 5; return v2[5] - a1 < v3 && v6 != v5 && (v6 >= v5 || v4 >= v6 && v4 < v5) && (v6 <= v5 || v4 < v5 || v4 >= v6); }", "caps_to_mode": "int __fastcall caps_to_mode(int a0, int a1, int a2, int a3) { int v4; int v5; char *v6; char *v7; int v8; int *v9; int v10; int v11; v4 = 0; v11 = 0; if ( platform_caps_collect(&v11) == 0 ) { v5 = v11; v6 = SYM[0]; switch ( v11 ) { case 1: *SYM[0] = 0; break; case 2: v7 = SYM; *SYM[0] = 0; v8 = (unsigned __int8)*v7; if ( v8 == 37 || v8 == 45 || v8 == 43 || v8 == 53 ) { LABEL_14: v6[1] = 1; goto LABEL_13; } break; case 3: *SYM[0] = 1; goto LABEL_14; default: *SYM[0] = 0; v6[1] = 0; v6[5] = 0; return v4; } v6[1] = 0; LABEL_13: v4 = 1; v9 = (int *)SYM; v6[5] = 1; v10 = *v9; *(_DWORD *)(v10 + 124) &= 0xFFF00000; *(_DWORD *)(v10 + 124) |= v5 | 0xB0000; } return v4; }", "debug_disabled": "BOOL __fastcall debug_disabled() { return *SYM == 0 && *((_BYTE *)SYM + 992) == 0; }", "rsa_key_import": "int __fastcall rsa_key_import(int a0, unsigned int *a1) { bn_t *v2; bn_t *rem; bn_t *v3; bn_t *v4; bn_t *v5; int result; int *v6; int v7; char *dst; unsigned int v8; bn_t *r; bn_scratch_t *v9; v2 = (bn_t *)SYM; v8 = 48; rem = (bn_t *)((char *)SYM + 3636); r = (bn_t *)SYM; v3 = (bn_t *)((char *)SYM + 1212); v4 = (bn_t *)((char *)SYM + 2424); v9 = (bn_scratch_t *)((char *)SYM + 6060); v5 = (bn_t *)((char *)SYM + 4848); dst = (char *)SYM + 14028; if ( a0 != 4 ) return SYM; v6 = (int *)SYM; result = bn_from_bytes_be((bn_t *)SYM, a1, a1[17]); if ( result == 0 ) { result = bn_from_bytes_be(v3, a1 + 18, a1[35]); if ( result == 0 ) { bzero(dst, 0x60u); result = copy_maybe_reverse((int)dst, &v8, (int)v6, v6[72], 1); if ( result == 0 ) { result = bn_from_bytes_be(v4, (const unsigned int *)dst, v6[72]); if ( result == 0 ) { v7 = SYM - 10; if ( v2->sign == 1 ) return v7; if ( v3->sign == 1 ) return v7; bzero(dst, 0x60u); result = copy_maybe_reverse((int)dst, &v8, (int)(v6 + 12), v6[72], 1); if ( result == 0 ) { result = bn_from_bytes_be(v5, (const unsigned int *)dst, v6[72]); if ( result == 0 ) { if ( bn_cmp(v2, v5) != 2 ) return v7; if ( bn_cmp(v3, v5) != 2 ) return v7; result = bn_sqr(rem, v2); if ( result == 0 ) { result = bn_add(rem, rem, v4); if ( result == 0 ) { result = bn_mul(v4, v2, rem, 0); if ( result == 0 ) { bzero(dst, 0x60u); result = copy_maybe_reverse((int)dst, &v8, (int)(v6 + 24), v6[72], 1); if ( result == 0 ) { result = bn_from_bytes_be(rem, (const unsigned int *)dst, v6[72]); if ( result == 0 ) { result = bn_add(v4, v4, rem); if ( result == 0 ) { result = bn_sqr(rem, v3); if ( result == 0 ) { result = bn_sub(r, v4, rem); if ( result == 0 ) { result = bn_divmod(v9, nullptr, r, v5, rem); if ( result == 0 && rem->nlimbs != 0 ) return v7; } } } } } } } } } } } } } } return result; }", "client_ctx_present": "BOOL __fastcall client_ctx_present() { return SYM[1] != 0; }", "debug_port_enabled": "BOOL __fastcall debug_port_enabled() { return *SYM != 0 && *((_BYTE *)SYM + 993) != 0; }", "debug_allowed": "int __fastcall debug_allowed() { char *v0; v0 = SYM; if ( *SYM == 0 ) goto LABEL_4; if ( is_recovery_state() == 0 ) return 1; if ( *v0 == 0 ) { LABEL_4: if ( *((_BYTE *)SYM + 992) != 0 ) return 1; } return 0; }", "validate_client_range": "int __fastcall validate_client_range(unsigned int a0, unsigned int a1, int a2, int a3) { if ( a2 == 1 || a3 == 0 ) return 1; if ( a1 <= 0x10000000 && a0 <= 0x40000000 ) __asm { SVC 0xB5 } return 0; }", "clock_gate_set": "int __fastcall clock_gate_set(int a0) { int v1; int result; _ZF = a0 == 0; v1 = *SYM; if ( _ZF ) { result = v1 << 31; if ( result == 0 ) return result; __asm { SVC 0x7B ; '{' } return 0; } if ( a0 != 1 ) return 0; if ( (v1 & 2) != 0 ) { __asm { SVC 0x7B ; '{' } return 0; } return 0; }", "find_record_retry": "int __fastcall find_record_retry(int a0, unsigned int *a1, _DWORD *a2, _DWORD *a3, _DWORD *a4, _DWORD *a5, int a6) { unsigned int i; int result; for ( i = 0; i < 4; ++i ) { result = find_record_by_uuid(a0 + 56, a2, a3, a4, a5); if ( result == 0 || *(_BYTE *)(a0 + 127) == 0 || *(_DWORD *)(a0 + 24) != 0 ) break; if ( i < 3 ) a0 += 256; } *a1 = i; return result; }", "find_record_by_uuid": "int __fastcall find_record_by_uuid(int a0, _DWORD *a1, _DWORD *a2, _DWORD *a3, _DWORD *a4) { int v5; _DWORD *v6; _DWORD *i; v5 = SYM; v6 = (_DWORD *)(SYM + 256); for ( i = (_DWORD *)(SYM + 336); (_DWORD *)((char *)v6 + *v6) > i; i = (_DWORD *)((char *)i + *i) ) { if ( ct_memcmp(i + 4, (const void *)a0, 0x10u) == 0 ) { __asm { SVC 0x87 } *a1 = i + 3; *a2 = 4; *a3 = i + 20; *a4 = i[8] >> 3; return 0; } } return v5; }", "task_exit_self": "int __fastcall task_exit_self(int result) { __asm { SVC 0x54 ; 'T' } result = (unsigned __int8)result; __asm { SVC 0x53 ; 'S' } if ( (_BYTE)result != 0 ) { while ( 1 ) __asm { SVC 0x56 ; 'V' } } return result; }", "delay_us64": "unsigned int __fastcall delay_us64(unsigned int a0, int a1) { unsigned int result; unsigned __int64 hw_counter_us; unsigned __int64 v2; _BOOL1 v3; result = a0 | a1; if ( result != 0 ) { hw_counter_us = read_hw_counter_us(); do { v2 = read_hw_counter_us() - hw_counter_us; v3 = (unsigned int)v2 >= a0; result = v2 - a0; } while ( !__CFSUB__(HIDWORD(v2), a1, v3) ); } return result; }", "fifo_program_seq": "int __fastcall fifo_program_seq(_DWORD *a0) { int v1; int v2; int v3; int v4; int v5; int v6; unsigned int i; _DWORD v7[4]; v7[0] = a0; v1 = 0; v2 = (*SYM)[1]; v3 = (*SYM)[2]; v4 = (*SYM)[3]; v7[0] = (*SYM)[0]; v7[1] = v2; v7[2] = v3; v7[3] = v4; __asm { SVC 0x7D ; '}' } v5 = SYM; if ( SYM == 0 ) return 1; v6 = *(_DWORD *)(SYM + 160); *a0 = v6; if ( (v6 & 2) == 0 ) *(_DWORD *)(v5 + 160) = v6 | 2; for ( i = 0; i < 2; ++i ) { bits_set_masked((_BYTE *)(v7[2 * i] + v5), 3, 8); while ( ~*(unsigned __int8 *)(v7[2 * i + 1] + v5) << 29 != 0 ) ; } if ( v5 != 0 ) __asm { SVC 0x7E ; '~' } return v1; }", "fifo_write_seq": "int __fastcall fifo_write_seq(_DWORD *a0, int a1, unsigned int a2, int a3) { int result; int v4; unsigned int v5; unsigned int i; result = 0; if ( a3 == 0 ) return 7; a0[27] = 0; a0[1] = 100; a0[27] = 1; v4 = 0; v5 = a2 - 1; for ( i = 0; i < a2; ++i ) { if ( i == v5 ) v4 = 1; a0[4] = (v4 << 9) | 0x100; result = ctrl_wait_status((int)a0, 4); if ( result != 0 ) break; *(_BYTE *)(a3 + i) = a0[4]; result = ctrl_wait_status((int)a0, 16); if ( result != 0 ) break; } return result; }", "fifo_start_transfer": "int __fastcall fifo_start_transfer(_DWORD *a0) { int v1; int v2; char v3[4]; char v4[4]; v1 = 0; a0[4] = 1792; v2 = ctrl_wait_status((int)a0, 4); if ( v2 == 5 ) { fifo_reset_sequence(a0); a0[4] = 768; v2 = ctrl_wait_status((int)a0, 4); if ( v2 == 5 ) { delay_us64(SYM, 0); a0[4] = 768; v2 = ctrl_wait_status((int)a0, 4); } } if ( v2 != 0 || ctrl_wait_status((int)a0, 16) != 0 ) return 3; v3[0] = 2; if ( fifo_write_cmd(a0, 100, 1u, (int)v3) != 0 ) return 4; v4[0] = 1; if ( fifo_write_cmd(a0, 100, 1u, (int)v4) != 5 ) return 2; fifo_reset_sequence(a0); return v1; }", "fifo_write_cmd": "int __fastcall fifo_write_cmd(_DWORD *a0, int a1, unsigned int a2, int a3) { int result; int v4; unsigned int v5; unsigned int i; result = 0; if ( a3 == 0 ) return 7; a0[27] = 0; a0[1] = 100; a0[27] = 1; v4 = 0; v5 = a2 - 1; for ( i = 0; i < a2; ++i ) { if ( i == v5 ) v4 = 1; a0[4] = *(unsigned __int8 *)(a3 + i) | (v4 << 9); result = ctrl_wait_status((int)a0, 16); if ( result != 0 ) break; } return result; }", "fifo_program_and_start": "int __fastcall fifo_program_and_start(_DWORD *a0, _DWORD *a1) { int v2; v2 = fifo_program_seq(a0); if ( v2 == 0 ) { a1[27] = 0; a1[12] = 2303; a1[14] = 0; a1[15] = 0; a1[31] = 48; fifo_desc_fill(a1, 572, 760, 20, 24, 100, 355); a1[27] = 1; } return v2; }", "fifo_desc_fill": "_DWORD *__fastcall fifo_desc_fill(_DWORD *result, int a0, int a1, int a2, int a3, int a4, int a5) { result[1] = a4; *result = a5; *(_DWORD *)((char *)result + a2) = a0; *(_DWORD *)((char *)result + a3) = a1; return result; }", "fifo_cmd_short": "int __fastcall fifo_cmd_short(_DWORD *a0, char a1, char a2, __int16 a3, unsigned int a4) { return fifo_cmd_build(a0, 2, a1 | a2, a3, 0, 0, a4, 4); }", "fifo_cmd_build": "int __fastcall fifo_cmd_build(_DWORD *a0, char a1, char a2, __int16 a3, int a4, int a5, unsigned int a6, int a7) { int result; _BYTE *v8; int v9; int v10; if ( a4 == 0 && a5 != 0 ) return 7; v8 = SYM; v9 = (unsigned __int8)(a5 + 7); *(_BYTE *)SYM = 3; v8[1] = v9; v8[2] = a1; v8[3] = a2; *((_WORD *)v8 + 2) = a3; memcpy_thunk((int)(v8 + 6)); v10 = (int)&v8[v9 - 1]; *(_BYTE *)v10 = 0; *(_BYTE *)(v10 + 1) = 0; tlv_field_scan((unsigned __int8)(a5 + 5), (int)(v8 + 1), (_WORD *)v10); result = fifo_write_cmd(a0, 100, v9 + 1, (int)v8); if ( result == 0 ) { delay_us64(1000 * a7, 0); return fifo_write_seq(a0, 100, a6, (int)(v8 + 64)); } return result; }", "ctrl_wait_status": "int __fastcall ctrl_wait_status(int a0, int a1) { int v2; int result; int v3; int v4; v2 = a1 | 0x40; result = 0; do v3 = *(_DWORD *)(a0 + 52); while ( (v2 & v3) == 0 ); if ( (v3 & 0x40) != 0 ) { v4 = *(_DWORD *)(a0 + 128); if ( v4 << 31 != 0 ) { return 5; } else if ( (v4 & 0x10) != 0 ) { return 8; } } return result; }", "fifo_reset_sequence": "int __fastcall fifo_reset_sequence(_DWORD *a0) { a0[27] = 0; fifo_desc_fill(a0, 572, 760, 20, 24, 2148, 355); a0[27] = 1; a0[4] = 512; delay_us64(0xBB8u, 0); a0[27] = 0; a0[1] = 100; a0[27] = 1; return 1; }", "set_status_out": "int __fastcall set_status_out(int result) { if ( *SYM != nullptr ) *(_DWORD *)*SYM = result; return result; }", "monitor_task": "void __fastcall __noreturn monitor_task() { while ( 1 ) { __asm { SVC 0x86 } __asm { SVC 0x56 ; 'V' } } }", "fifo_init": "int __fastcall fifo_init(int a0, int a1) { char *v2; int v3; int v4; unsigned int v5; unsigned int v6; v2 = SYM; v3 = 0; if ( *SYM != 0 ) return SYM; v4 = *((_DWORD *)SYM + 2); *((_DWORD *)SYM + 1) = 0; __asm { SVC 0x51 ; 'Q' } v5 = 0; while ( v4 == *((_DWORD *)v2 + 2) ) { __asm { SVC 0x56 ; 'V' } v6 = v5++; if ( v6 > 0x64 ) return SYM; } return v3; }", "config_offset_resolve": "int __fastcall config_offset_resolve(int a0) { int v1; int v2; _DWORD v3[3]; int v4; _DWORD v5[4]; if ( a0 == 0 ) return SYM; v5[0] = config_find_type113() + a0; v5[1] = v1; v5[3] = 86; v5[2] = 0x10000; v3[0] = v5; v3[1] = &v2; v3[2] = 0; v4 = 0xFFFF; return sysdrv_tee_load_firmware((__int64 *)v3); }", "fw_type_is_known": "int __fastcall fw_type_is_known(int a0) { if ( a0 == 52 ) return 1; if ( a0 > 52 ) { switch ( a0 ) { case '5': case '6': case '7': case '8': case '9': case ':': case '>': return 1; default: return 0; } } if ( a0 == 9 ) return 1; if ( a0 > 9 ) { if ( a0 == 10 || a0 == 13 || a0 == 33 ) return 1; } else if ( a0 == 1 || a0 == 2 || a0 == 3 || a0 == 4 ) { return 1; } return 0; }", "scratch_page_map": "int __fastcall scratch_page_map(int a0) { int v1; int v2; int *v3; int v4; unsigned int v5; int v6; int v7; unsigned int v8; int v9; int v10; unsigned int v11; v1 = SYM; __asm { SVC 0x73 ; 's' } v2 = a0 + SYM; __asm { SVC 0x88 } v3 = SYM; *SYM = v2; if ( v2 == 0 ) { v1 = SYM; goto LABEL_22; } if ( *(_DWORD *)(v2 + 16) != SYM ) { v1 = SYM - 6; goto LABEL_22; } if ( debug_disabled() && *(_DWORD *)(v4 + 20) == 0 ) v5 = *(_DWORD *)(v4 + 112); if ( v5 == 0 ) { LABEL_22: if ( v3[1] == 0 ) goto LABEL_24; goto LABEL_23; } if ( v5 + 256 >= v5 ) { v6 = *v3; v3[2] = *(_DWORD *)(*v3 + 260); v3[3] = *(_DWORD *)(v6 + 272); v3[4] = (unsigned __int8)BYTE2(*(_DWORD *)(v6 + 284)); v7 = debug_unlock_apply(); v8 = SYM; v1 = v7; v9 = a0 + SYM; __asm { SVC 0x88 } v3[1] = a0 + SYM; if ( v9 == 0 ) { v1 = SYM + 1; goto LABEL_25; } if ( *(_DWORD *)(v9 + 16) != SYM ) { LABEL_23: __asm { SVC 0x63 ; 'c' } v3[1] = 0; goto LABEL_24; } if ( debug_disabled() && *(_DWORD *)(v10 + 20) == 0 ) v11 = *(_DWORD *)(v10 + 112); if ( v11 != 0 && v11 <= v8 && v11 + 256 >= v11 && *(_DWORD *)(v3[1] + 272) == v3[3] ) { LABEL_24: if ( v1 == 0 ) goto LABEL_29; goto LABEL_25; } goto LABEL_22; } v1 = SYM; LABEL_25: if ( *v3 != 0 ) { __asm { SVC 0x63 ; 'c' } *v3 = 0; } if ( v3[1] != 0 ) { __asm { SVC 0x63 ; 'c' } v3[1] = 0; } LABEL_29: if ( debug_disabled() ) return 0; return v1; }", "copy_words_swapped": "unsigned __int16 *__fastcall copy_words_swapped(unsigned __int16 *result, _DWORD *a0, unsigned int a1) { unsigned int i; int v2; for ( i = 0; i < a1; i += 2 ) { v2 = *result++; *a0 = v2; } return result; }", "region_window_open": "int __fastcall region_window_open(_DWORD *a0, int a1, unsigned int a2) { unsigned int v3; int *v4; _DWORD *v5; _DWORD *v6; unsigned int i; int v7; if ( a0 == nullptr || a1 == 0 ) return SYM; __asm { SVC 0x7D ; '}' } v3 = a0[5] & 0xFFF00000; if ( v3 == 0 ) return SYM - 6; v4 = (int *)((a0[6] & 0xFFFFF) + v3); v5 = (_DWORD *)a0[5]; v6 = (_DWORD *)((a0[4] & 0xFFFFF) + v3); for ( i = 0; i < a2 >> 3; ++i ) { v7 = (*(unsigned __int16 *)(a1 + 8 * i) << 16) + 1; *v5 = *(_DWORD *)(a1 + 8 * i + 4); *v4 = v7; } *v6 = SYM; __asm { SVC 0x7E ; '~' } __dsb(0xFu); return 0; }", "golia_log_timestamped": "int __fastcall golia_log_timestamped(unsigned int a0, _DWORD *a1, _DWORD *a2, unsigned int a3) { unsigned __int64 hw_counter_us; int result; int v4; unsigned int *v5; unsigned int v6[17]; bzero_core(v6, 0x44u); hw_counter_us = read_hw_counter_us(); result = golia_log_write((unsigned int)v6, 1, a3); if ( result == 0 ) { udiv_select_shift(v6[0], 5u); v5 = &v6[3 * v4 + 2]; *(_QWORD *)v5 = hw_counter_us; v5[2] = a0; ++v6[0]; v6[1] = 5; result = golia_log_write((unsigned int)v6, 0, a3); } *a1 = hw_counter_us; *a2 = HIDWORD(hw_counter_us); return result; }", "sysdrv_ta_image_prepare": "int __fastcall sysdrv_ta_image_prepare(int a0, int a1, int a2, int a3, unsigned int a4) { unsigned int v5; unsigned int i; if ( a4 >= 0x20 || a1 != 32 || a3 != 16 ) return SYM; v5 = SYM + 66 * a4; memcpy_thunk(v5 + 16); memcpy_thunk(v5 + 48); for ( i = 0; i < 0x10; ++i ) *(_BYTE *)(v5 + i) = *(_BYTE *)(v5 + i + 48) ^ *(_BYTE *)(v5 + i + 16); *(_BYTE *)(v5 + 64) = 1; *(_BYTE *)(v5 + 65) = 0; return 0; }", "session_hmac_verify": "int __fastcall session_hmac_verify(unsigned int a0) { int v1; unsigned int v2; int v3; int v4; _BYTE v5[32]; _BYTE v6[32]; int v7; v7 = *(_DWORD *)SYM; v1 = 0; if ( a0 >= 0x20 ) return SYM; v2 = SYM + 66 * a0; if ( *(_BYTE *)(v2 + 64) == 0 ) return SYM + 5; if ( *(_BYTE *)(v2 + 65) == 0 ) { v3 = SYM + 96 * a0; v1 = hmac_sha256(a0, SYM, SYM - 64, 32, v2 + 16, 32, (int)v5, 32); if ( v1 == 0 ) { memcpy_thunk(v3 + 48); v1 = hmac_sha256(a0, SYM, (int)v5, 32, v2 + 48, 16, (int)v6, 32); if ( v1 == 0 ) { memcpy_thunk(v3); v4 = SYM; v1 = hmac_sha256(a0, SYM, SYM - 32, 32, v2 + 16, 32, (int)v5, 32); if ( v1 == 0 ) { memcpy_thunk(v3 + 64); v1 = hmac_sha256(a0, v4, (int)v5, 32, v2 + 48, 16, (int)v6, 32); if ( v1 == 0 ) { memcpy_thunk(v3 + 16); *(_BYTE *)(v2 + 65) = 1; } } } } } return v1; }", "fifo_exchange": "int __fastcall fifo_exchange(int a0, int a1, unsigned int a2, int a3, _BYTE *a4) { int v5; _DWORD v6[5]; if ( a3 == 0 || a4 == nullptr ) return 10; if ( a1 << 6 != 0 ) { set_status_out(result); return 10; } if ( a2 == 0 || a2 > 0x1000000 ) return 5; v6[4] = a2; v6[0] = 1; v6[1] = a2; v6[2] = a1; v6[3] = a0; __asm { SVC 0x6B ; 'k' } v5 = (int)v6; if ( v6 == nullptr ) { __asm { SVC 0x6D ; 'm' } v5 = (unsigned __int8)*a4; if ( *a4 != 0 ) __asm { SVC 0x6C ; 'l' } } return v5; }", "loadfw_iterate_entries": "int __fastcall loadfw_iterate_entries(int a0, int a1, __int64 a2, _DWORD *a3, _DWORD *a4, int *a5, int *a6, _DWORD *a7) { int v8; unsigned int v9; int v10; int v11; int v12; int v13; int v14; int v15; __int64 v16; unsigned int v17; unsigned int v18; int v19; int v20; int v21; int v22; int v23; int v24; __int64 v25; int v26; __int16 *v27; __int64 v28; v28 = a2; v8 = 0; v28 = *(_QWORD *)SYM; v9 = 0; if ( a0 == 60 ) { *(_BYTE *)a2 = 1; *a3 = 0x100000; *a4 = 0; *a6 = 0; *a5 = 0; phys_range_compose(&v28); v17 = HIDWORD(v28); v18 = v28; *(_DWORD *)HIDWORD(a2) = v28 + 0x400000; v19 = (__PAIR64__(v17, v18) + 0x400000) >> 32; LABEL_38: *(_DWORD *)(HIDWORD(a2) + 4) = v19; goto LABEL_50; } if ( a0 <= 60 ) { v10 = SYM; if ( a0 != 18 ) { if ( a0 <= 18 ) { switch ( a0 ) { case 11: v24 = loadfw_configure_engine(11, a1, SYM); *(_BYTE *)a2 = 0; *a3 = 65248; v8 = v24; *a4 = 4; __asm { SVC 0x7D ; '}' } *a6 = 54928; *a5 = 54928; break; case 12: v23 = loadfw_configure_engine(12, a1, SYM); *(_BYTE *)a2 = 0; *a3 = 32; v8 = v23; *a4 = 4; __asm { SVC 0x7D ; '}' } *a6 = 54928; *a5 = 54928; break; case 13: *(_BYTE *)a2 = 1; v20 = *(_DWORD *)(v10 + 4); LABEL_39: *a3 = 0x100000; *a4 = 0; *a6 = 0; *a5 = 0; if ( a1 != 0xFFFF ) v20 += (a1 << 20) + 0x100000; v21 = HIDWORD(v28); _CF = __CFADD__((_DWORD)v28, v20); *(_DWORD *)HIDWORD(a2) = v28 + v20; v19 = _CF + v21; goto LABEL_38; default: return SYM; } goto LABEL_42; } if ( a0 == 19 ) { v8 = loadfw_configure_engine(19, a1, SYM); *(_BYTE *)a2 = 0; *a3 = 0x4000; v22 = SYM; *a4 = 4; __asm { SVC 0x7D ; '}' } *a6 = v22; *a5 = v22; LABEL_42: __asm { SVC 0x7C ; '|' } *a7 = 0x80000000; goto LABEL_47; } if ( a0 != 51 ) { if ( a0 == 58 ) { *(_BYTE *)a2 = 1; v20 = *(_DWORD *)(v10 + 32); goto LABEL_39; } return SYM; } v8 = loadfw_configure_engine(51, a1, SYM); *(_BYTE *)a2 = 1; LODWORD(v25) = config_find_type113(); *(_QWORD *)HIDWORD(a2) = v25; *a3 = 0x100000; v26 = 0; *a4 = 0; LABEL_45: *a6 = v26; *a5 = v26; LABEL_47: if ( v8 != 0 ) return v8; goto LABEL_50; } *(_BYTE *)a2 = 0; v11 = 0x40000; *a3 = 0x40000; *a4 = 0x40000; __asm { SVC 0x7D ; '}' } *a6 = 62914560; *a5 = 62914560; v12 = 18; LABEL_26: v8 = loadfw_configure_engine(v12, v11, v10); goto LABEL_47; } if ( a0 == 73 ) { *(_BYTE *)a2 = 0; *a3 = 6176; *a4 = 0; v13 = SYM; *a6 = 0; LABEL_49: __asm { SVC 0x79 ; 'y' } goto LABEL_34; } if ( a0 > 73 ) { switch ( a0 ) { case 'S': *(_BYTE *)a2 = 1; v16 = v28 + 0x800000; break; case 'T': *(_BYTE *)a2 = 1; v16 = v28 + 7340032; break; case 'V': v27 = SYM; *(_BYTE *)a2 = 0; *a3 = 40960; *a4 = 2; while ( ((1 << v9) & *(unsigned __int8 *)v27) == 0 ) { v9 = (unsigned __int8)(v9 + 1); if ( v9 >= 5 ) goto LABEL_47; } v26 = SYM + 864 * v9; __asm { SVC 0x7D ; '}' } goto LABEL_45; default: return SYM; } *(_QWORD *)HIDWORD(a2) = v16; *a3 = 0x100000; v13 = 0; *a4 = 0; *a6 = 0; LABEL_34: *a5 = v13; goto LABEL_50; } if ( a0 == 67 ) { *(_BYTE *)a2 = 0; *a3 = 0x4000; *a4 = 0; v13 = SYM; *a6 = 0; goto LABEL_49; } if ( a0 == 68 ) { *(_BYTE *)a2 = 0; *a3 = 0x10000; v14 = SYM; *a4 = 4; __asm { SVC 0x7D ; '}' } *a6 = v14; v10 = 4; *a5 = v14; *a7 = 0x80000000; v11 = 0; __asm { SVC 0x7C ; '|' } v12 = 68; goto LABEL_26; } if ( a0 != 69 ) return SYM; *(_BYTE *)a2 = 0; *a3 = 0x10000; v15 = SYM; *a4 = 4; __asm { SVC 0x7D ; '}' } *a6 = v15; *a5 = v15; *a7 = 0x80000000; __asm { SVC 0x7C ; '|' } LABEL_50: if ( *(_BYTE *)a2 == 0 && *a5 == 0 ) return SYM + 6; return v8; }", "reserve_region_stub": "int __fastcall reserve_region_stub(int a0, int a1, int a2, int a3) { int v4; v4 = 0; __asm { SVC 0x8F } if ( a0 != 0 ) return 32; return v4; }", "reserve_region_stub2": "int __fastcall reserve_region_stub2(int a0, int a1, int a2, int *a3) { int v4; int v5; __asm { SVC 0x8F } v4 = a0; if ( a0 != 0 ) return 32; v5 = *a3; __asm { SVC 0x88 } a3[1] = *a3; if ( v5 == 0 ) { __asm { SVC 0x6A ; 'j' } return 2; } return v4; }", "heap_pool_get": "__int64 __fastcall heap_pool_get() { __asm { SVC 0x7D ; '}' } return (unsigned int)SYM | 0x2A00000000000LL; }", "heap_alloc_from_pool": "int __fastcall heap_alloc_from_pool(int a0, int *a1, int a2) { int v3; unsigned int v4; int v5; int v6; unsigned int v7; int v8; int v9; int v10; v3 = 0; v4 = (a0 + 15) & 0xFFFFFFF0; if ( v4 == 0 ) return 0; v5 = a1[1]; v6 = v5; while ( *(_BYTE *)(v6 + 16) == 0 || *(_DWORD *)(v6 + 12) < v4 ) { v6 = *(_DWORD *)(v6 + 4); if ( v6 == 0 ) v6 = *a1; if ( v6 == v5 ) goto LABEL_15; } if ( *(_DWORD *)(v6 + 12) < v4 + 32 ) { *(_BYTE *)(v6 + 16) = 0; } else { v7 = v6 + v4; *(_DWORD *)(v7 + 32) = a1; *(_DWORD *)(v7 + 36) = v6; *(_DWORD *)(v7 + 40) = *(_DWORD *)(v6 + 8); *(_BYTE *)(v7 + 48) = 1; *(_DWORD *)(v7 + 44) = *(_DWORD *)(v6 + 12) - v4 - 32; *(_BYTE *)(v7 + 49) = 86; v8 = v6 + v4 + 32; *(_BYTE *)(v6 + 16) = 0; *(_DWORD *)(v6 + 24) = a0; *(_DWORD *)(v6 + 8) = v8; *(_DWORD *)(v6 + 12) = v4; v9 = *(_DWORD *)(v6 + v4 + 40); if ( v9 != 0 ) *(_DWORD *)(v9 + 4) = v8; else *a1 = v8; } *(_DWORD *)(v6 + 20) = a2; a1[2] = a1[2] - *(_DWORD *)(v6 + 12) - 32; v3 = v6 + 32; LABEL_15: v10 = *(_DWORD *)(v5 + 8); if ( v10 == 0 ) v10 = a1[3]; a1[1] = v10; return v3; }", "ct_memcmp": "int __fastcall ct_memcmp(const void *a, const void *b, unsigned int n) { int result; unsigned int i; result = 0; for ( i = 0; i < n; ++i ) result |= *((unsigned __int8 *)a + i) ^ *((unsigned __int8 *)b + i); return result; }", "heap_free_to_pool": "int __fastcall heap_free_to_pool(int result) { int *v0; int v1; int v2; int v3; int v4; int v5; int v6; int v7; int v8; if ( result != 0 ) { v0 = *(int **)(result - 32); v0[2] += *(_DWORD *)(result - 20) + 32; *(_BYTE *)(result - 16) = 1; v1 = v0[1]; result -= 32; if ( v1 == result ) { v2 = *(_DWORD *)(v1 + 8); if ( v2 == 0 ) v2 = v0[3]; v0[1] = v2; } v3 = *(_DWORD *)(result + 4); if ( v3 != 0 && *(_BYTE *)(v3 + 16) != 0 ) { *(_DWORD *)(v3 + 12) += *(_DWORD *)(result + 12) + 32; v4 = *(_DWORD *)(result + 8); *(_DWORD *)(v3 + 8) = v4; if ( v4 != 0 ) *(_DWORD *)(v4 + 4) = v3; else *v0 = v3; *(_BYTE *)(result + 17) = 0; result = v3; } v5 = *(_DWORD *)(result + 8); if ( v5 != 0 && *(_BYTE *)(v5 + 16) != 0 ) { v6 = v0[1]; if ( v6 == v5 ) { v7 = *(_DWORD *)(v6 + 8); if ( v7 == 0 ) v7 = v0[3]; v0[1] = v7; } *(_DWORD *)(result + 12) += *(_DWORD *)(v5 + 12) + 32; v8 = *(_DWORD *)(v5 + 8); *(_DWORD *)(result + 8) = v8; if ( v8 != 0 ) *(_DWORD *)(v8 + 4) = result; else *v0 = result; *(_BYTE *)(v5 + 17) = 0; } } return result; }", "bn_modexp": "int __fastcall bn_modexp(bn_t *a0, bn_t *a1, unsigned int a2, unsigned int a3, int *b_76) { int v4; bn_t *v5; bn_t *v6; bn_t *v7; int v8; unsigned int i; int v9; unsigned int j; unsigned int v10; unsigned int v11; bn_t *r; unsigned int *out; unsigned int *p_nlimbs; int v12; __int16 v13; char v14[4]; _DWORD v15[8]; unsigned int v16; unsigned int v17; v15[6] = a0; v15[7] = a1; v16 = a2; v17 = a3; v12 = *(_DWORD *)SYM; v15[4] = v12; v14[0] = 2; v4 = 0; v5 = a0 + 1; v6 = a0 + 2; r = a0; out = &a0[4].nlimbs; v7 = a0 + 3; p_nlimbs = &a0[5].nlimbs; v15[0] = 1; v15[1] = 0; v15[2] = 0; v15[3] = 1; v8 = bn_sub(a0, a1, (bn_t *)v15); if ( v8 == 0 ) { bn_normalize(r, (int)&v11); bn_shr_bits(v5, r, v11); bn_export_words(a1, out, 0x4BCu); bn_export_words(v5, p_nlimbs, 0x4BCu); for ( i = 0; ; i = v10 + 1 ) { v10 = i; if ( i >= v17 ) break; v13 = (*((_WORD *)SYM + i) << 8) + HIBYTE(*((_WORD *)SYM + i)); v8 = rsa_modexp((int)out, v16, (int)p_nlimbs, v16, (int)&v13, 2u, (int)v7, 1); if ( v8 != 0 ) break; buf_reverse_inplace(v7, v16); v8 = bn_from_bytes_be(v6, &v7->nlimbs, v16); if ( v8 != 0 ) break; v9 = bn_cmp(v6, r); if ( (v6->nlimbs != 1 || v6->limb[0] != 1) && v9 != 3 ) { for ( j = 1; j < v11; ++j ) { v8 = rsa_modexp((int)out, v16, (int)v14, 1u, (int)v7, v16, (int)v7, 1); if ( v8 != 0 ) break; buf_reverse_inplace(v7, v16); v8 = bn_from_bytes_be(v6, &v7->nlimbs, v16); if ( v8 != 0 || v6->nlimbs == 1 && v6->limb[0] == 1 ) break; if ( bn_cmp(v6, r) == 3 ) goto LABEL_19; } v4 = 1; break; } LABEL_19: ; } } *b_76 = v4; return v8; }", "sysdrv_legacy_cmd_a_nop": "int __fastcall sysdrv_legacy_cmd_a_nop() { return 0; }", "param_quad_check": "int __fastcall param_quad_check(_DWORD *a0, int a1, int a2, _DWORD *a3, unsigned int a4) { if ( a0 == nullptr || a1 == 0 || a3 == nullptr || a4 < a2 + 8 ) return SYM; *a3 = *a0; a3[1] = a0[1]; memcpy_thunk((int)(a3 + 2)); return 0; }", "flash_status_decode": "int __fastcall flash_status_decode(_DWORD *a0, int a1, int a2) { int result; char *v3; int v4; int v5; int v6; v5 = a2; v6 = 0; result = flash_read_status_byte(a0, (int)&v5); if ( result == 0 ) { v3 = SYM; v4 = (unsigned __int8)*SYM; if ( v4 == 1 ) { if ( (v5 & 3) == 2 ) return result; } else if ( v4 == 2 && (v5 & 3) == 1 ) { return result; } result = retry_op_3x(a0, 8, SYM, 3u); if ( result == 0 ) { __asm { SVC 0x56 ; 'V' } result = retry_with_timeout(a0, &v6); if ( result == 0 ) { if ( v6 == 128 || v6 == 2 ) { result = retry_op_3x(a0, 8, SYM - 6, 3u); if ( result == 0 ) { __asm { SVC 0x56 ; 'V' } result = retry_with_timeout(a0, &v6); if ( result == 0 ) { result = flash_read_status_byte(a0, (int)&v5); if ( result == 0 && *v3 == (v5 & 3) ) return SYM + 6; } } } else { return SYM; } } } } return result; }", "platform_reg_write": "int __fastcall platform_reg_write(int a0, unsigned int a1) { unsigned __int16 v2; int result; int v3; unsigned int v4; int v5; v2 = a1; result = *((_DWORD *)SYM + 605); if ( result != 0 ) { __asm { SVC 0x7D ; '}' } v3 = *((_DWORD *)SYM + 605); v4 = HIWORD(a1); v5 = result + HIWORD(a1) + 812; if ( v5 + (unsigned int)v2 <= v3 + 1380 ) { if ( a0 == 2 ) { msmu_handle_param(1, v5, v2, v4, 0); } else if ( a0 == 3 ) { msmu_handle_param(2, v5, v2, v4, 0); } } else { trace_event(11, 0xF024u, SYM, 0); } __asm { SVC 0x7E ; '~' } return v3; } return result; }", "platform_range_get": "void __fastcall platform_range_get() { _UNKNOWN **v0; int v1; int v2; int v3; unsigned int v4; int v5; v0 = SYM; v1 = 0; v2 = 0; v3 = *((_DWORD *)*SYM + 688); v4 = *((_DWORD *)*SYM + 689); if ( v3 >= 0 ) { v5 = BYTE1(v3); trace_event(11, 1u, BYTE1(v3), 0); switch ( v5 ) { case 1: __asm { SVC 0xAF } break; case 2: case 3: platform_reg_write(v5, v4); break; case 6: v2 = 1; break; default: v1 = SYM; break; } trace_event(11, 2u, v1, 0); if ( v2 == 0 ) *((_DWORD *)*v0 + 688) = (unsigned __int8)v1 | 0x80000000; } }", "range_service_task": "void __fastcall __noreturn range_service_task() { while ( 1 ) { __asm { SVC 0x5A ; 'Z' } __asm { SVC 0x5E ; '^' } platform_range_get(); __asm { SVC 0x5F ; '_' } } }", "phys_range_compose2": "unsigned __int64 __fastcall phys_range_compose2(unsigned int a0, int a1, unsigned int a2) { unsigned __int64 v3; __asm { SVC 0x7D ; '}' } v3 = __PAIR64__(a2, a0); memcpy_thunk(a1); __asm { SVC 0x7E ; '~' } return v3; }", "phys_range_compose3": "unsigned __int64 __fastcall phys_range_compose3(int a0, unsigned int a1, unsigned int a2) { unsigned __int64 v3; __asm { SVC 0x7D ; '}' } v3 = __PAIR64__(a2, a1); memcpy_thunk(a1); __asm { SVC 0x7E ; '~' } return v3; }", "msmu_handle_param": "int __fastcall msmu_handle_param(int a0, int a1, unsigned int a2, unsigned int a3, int a4) { int v5; int v6; int v7; _DWORD *v8; unsigned int v9; __int64 v10; v5 = 0; log_event(0xDu, a0); log_event(0xEu, a4); v6 = *((_DWORD *)SYM + 606); if ( v6 != 0 ) { __asm { SVC 0x7D ; '}' } v7 = *((_DWORD *)SYM + 606); v8 = (_DWORD *)(v6 + 20 * a4); if ( v8[203] >= a2 ) { if ( a0 == 1 ) { v9 = *(_DWORD *)(v7 + 808); phys_range_compose3(a1, v9, a2); scratch_region_clear(); v8[206] = a3; v8[207] = 1; v8[204] = a2; v8[205] = v9; *(_DWORD *)(v7 + 808) += a2; goto LABEL_8; } if ( a0 != 2 ) { v5 = 5; goto LABEL_8; } if ( v8[207] == 0 ) { v5 = 3; goto LABEL_8; } v10 = *(_QWORD *)(v8 + 205); if ( a3 < HIDWORD(v10) ) { v5 = 7; goto LABEL_8; } if ( a3 - HIDWORD(v10) + a2 <= v8[204] ) { phys_range_compose2(HIDWORD(v10) + v10, a1, a2); scratch_region_clear(); goto LABEL_8; } } v5 = 6; LABEL_8: __asm { SVC 0x7E ; '~' } goto LABEL_9; } v5 = 9; LABEL_9: log_event(0xFu, v5); return v5; }", "reg_probe_nop": "int __fastcall reg_probe_nop() { __asm { SVC 0x7B ; '{' } return 0; }", "scratch_region_clear": "int __fastcall scratch_region_clear() { int v0; v0 = 0; if ( reg_probe_nop() == 1 ) { __asm { SVC 0xA6 } __asm { SVC 0x7D ; '}' } bzero_core(*((void **)SYM + 606), 0x340u); __asm { SVC 0x7E ; '~' } return 1; } return v0; }", "ret_err_000A_2": "int __fastcall ret_err_000A_2() { return SYM; }", "flash_session_open": "int __fastcall flash_session_open(int a0) { int v1; v1 = flash_session_begin(a0); if ( v1 == 0 ) { *SYM = 1; status_word_store(0x5Bu, 0); } return v1; }", "sysdrv_derive_key_b": "int __fastcall sysdrv_derive_key_b(unsigned int *a0, unsigned int a1) { _DWORD *v2; if ( a1 < 0x44C ) return SYM; if ( *a0 >= 4 ) return SYM; v2 = (_DWORD *)(SYM + 1100 * *a0); if ( a0[3] != v2[3] ) return SYM; memcpy((void *)(SYM + 1100 * *a0), a0, v2[10] + 76); v2[1] = 4; __asm { SVC 0x57 ; 'W' } return 0; }", "attr_pack_4": "int __fastcall attr_pack_4(int a0, int a1, int *a2, unsigned int a3) { int v4; int v5; unsigned int v6; int v7; _DWORD *entry_by_id; int v8; int v9; unsigned int v10; unsigned int v11; _DWORD v12[12]; _BYTE dst[256]; int v13; v13 = *(_DWORD *)SYM; bzero_core(dst, 0x100u); v4 = SYM; v5 = *(_DWORD *)(a0 + 4) + 112; if ( a3 <= 4 ) { memcpy(v12, a2, 12 * a3); if ( a3 >= 2 ) { v4 = bn_to_bytes_be(v5, 0x100u, SYM, (unsigned int *)(v5 + 1024), v12, a3, 2); if ( v4 == 0 ) { v4 = bn_to_bytes_be(v5 + 256, 0x100u, SYM, (unsigned int *)(v5 + 1028), v12, a3, 2); if ( v4 == 0 ) { v6 = *(_DWORD *)(v5 + 1028); if ( v6 >= 0x20 && v6 <= *(_DWORD *)(*(_DWORD *)(a0 + 4) + 96) >> 3 ) { v7 = SYM; *(_DWORD *)(v5 + 1032) = v6; entry_by_id = find_entry_by_id(v12, a3, v7); if ( entry_by_id != nullptr ) *(_DWORD *)(v5 + 1032) = entry_by_id[1] >> 3; v10 = rand_fill_bytes((_BYTE *)(v5 + 512), *(_DWORD *)(v5 + 1032), v8, v9); v4 = v10; if ( v10 == 0 ) { while ( 1 ) { v11 = *(_DWORD *)(v5 + 1024); if ( v11 <= v10 ) break; dst[v10] = *(_BYTE *)(v11 - v10 + v5 - 1); ++v10; } v4 = rsa_modexp( v5 + 256, *(_DWORD *)(v5 + 1028), v5 + 512, *(_DWORD *)(v5 + 1032), (int)dst, *(_DWORD *)(v5 + 1024), v5 + 768, 0); if ( v4 == 0 ) { buf_reverse_inplace((void *)(v5 + 768), *(_DWORD *)(v5 + 1028)); *(_DWORD *)(*(_DWORD *)(a0 + 4) + 4) = 1036; *(_DWORD *)(*(_DWORD *)(a0 + 4) + 92) = 8 * *(_DWORD *)(v5 + 1028); } } } else { return SYM + 6; } } } } } return v4; }", "attr_unpack_4": "int __fastcall attr_unpack_4(int a0, int a1, int *a2, unsigned int a3) { int v4; _DWORD *v5; _DWORD *entry_by_id; int v6; _DWORD dst[12]; _BYTE v7[384]; _BYTE v8[384]; _BYTE v9[384]; int v10; v10 = *(_DWORD *)SYM; v4 = SYM; v5 = (_DWORD *)(*(_DWORD *)(a0 + 4) + 112); if ( a3 <= 4 ) { memcpy(dst, a2, 12 * a3); if ( a3 != 0 ) { entry_by_id = find_entry_by_id(dst, a3, SYM); if ( entry_by_id != nullptr ) { if ( entry_by_id[1] == 4 ) { if ( a1 == 384 ) { v5[1] = 384; v4 = key_derive_and_wrap(4, (int)v7, 0x30u, (unsigned int)v8, 0x30u, (int)v9, 0x30u); if ( v4 == 0 ) { dst[3] = SYM; dst[4] = v7; dst[5] = 48; v4 = bn_to_bytes_be((int)(v5 + 2), 0x42u, SYM, nullptr, dst, 4u, 2); if ( v4 == 0 ) { dst[8] = 48; dst[6] = SYM; dst[7] = v8; v6 = bn_to_bytes_be((int)v5 + 74, 0x42u, SYM, nullptr, dst, 4u, 2); v4 = v6; if ( v6 == 0 ) { dst[11] = 48; dst[9] = SYM; dst[10] = v9; v4 = bn_to_bytes_be((int)(v5 + 35), 0x42u, SYM, nullptr, dst, 4u, 2); if ( v4 == 0 ) { *v5 = 4; *(_DWORD *)(*(_DWORD *)(a0 + 4) + 4) = 208; *(_DWORD *)(*(_DWORD *)(a0 + 4) + 92) = v5[1]; } } } } } } else { return SYM + 10; } } } } return v4; }", "random_fill_object": "int __fastcall random_fill_object(int a0, unsigned int a1, int a2, int a3) { unsigned int v4; int result; v4 = a1 >> 3; result = rand_fill_bytes((_BYTE *)(*(_DWORD *)(a0 + 4) + 112), a1 >> 3, a2, a3); if ( result == 0 ) { *(_DWORD *)(*(_DWORD *)(a0 + 4) + 92) = a1; *(_DWORD *)(*(_DWORD *)(a0 + 4) + 4) = v4; } return result; }", "object_attr_store": "int __fastcall object_attr_store(int a0, unsigned int a1, int a2, int a3) { _DWORD *v4; int v5; _DWORD *v6; _BYTE *v7; unsigned int *v8[8]; _BYTE dst[512]; int v9; v9 = *(_DWORD *)SYM; v4 = *(_DWORD **)(a0 + 4); v5 = SYM; v6 = v4 + 28; v7 = nullptr; if ( a1 > 0x1000 ) return v5; if ( v4[22] == SYM && v4[24] >= a1 ) { v4[30] = 65537; v4[29] = a1; v4[31] = 4; if ( rsa_key_get_components((int)v6, (int)v8) == 0 ) { if ( a3 == 1 ) { v5 = key_constants_load((int)dst, a1 >> 3, 0); if ( v5 != 0 ) { LABEL_15: bzero_core(dst, 0x200u); return v5; } } else { if ( a3 != 2 ) { LABEL_12: v5 = rsa_crt_exponentiate(a1, (int)v7, v8); if ( v5 == 0 ) { *(_DWORD *)(*(_DWORD *)(a0 + 4) + 4) = 5 * (a1 >> 4) + 2 * (a1 >> 3) + 16; *(_DWORD *)(*(_DWORD *)(a0 + 4) + 92) = v6[1]; *v6 = 1; } goto LABEL_14; } v5 = key_slot_select((int)dst, 0x20u, 1); if ( v5 != 0 ) return v5; } v7 = dst; goto LABEL_12; } } LABEL_14: if ( a3 == 1 ) goto LABEL_15; return v5; }", "object_find_by_type": "int __fastcall object_find_by_type(unsigned int a0, unsigned int a1, int *a2, int a3) { int v4; unsigned __int8 v5; int v6; int v7; int v8; v4 = 0; v5 = a3; if ( a0 == -1 ) goto LABEL_9; v6 = 0; while ( 1 ) { v7 = SYM + 16 * v6; if ( *(unsigned __int8 *)(v7 + 1) == a3 && *(_BYTE *)v7 == 1 && *(_DWORD *)(v7 + 12) == a0 ) break; if ( (unsigned int)++v6 > 0xFF ) goto LABEL_8; } v4 = flag_pair_check(*(_DWORD *)(v7 + 4), a1); LABEL_8: if ( v4 == 0 ) { LABEL_9: v8 = object_slot_bind(a0, a1, v5); if ( v8 != 0 ) *a2 = v8; else return SYM; } return v4; }", "nop_hook_hash": "void __fastcall nop_hook_hash() { ; }", "hash_by_digest_size": "int __fastcall hash_by_digest_size(int a0, unsigned int a1, int a2, int a3, int a4, unsigned int a5) { int v6; int v7; int v8; int v9; _BYTE *v10; _BYTE v11[512]; _BYTE v12[64]; int v13; int v14; unsigned int v15; int v16; int v17; v14 = a0; v15 = a1; v16 = a2; v17 = a3; v13 = *(_DWORD *)SYM; v6 = SYM; v7 = 0; if ( (unsigned int)(a3 + 4) > 0x200 ) return v6; v8 = 0; memcpy_thunk((int)v11); if ( a1 != 20 ) { switch ( a1 ) { case 0x1Cu: v9 = SYM + 1; goto LABEL_16; case 0x20u: v9 = SYM + 2; goto LABEL_16; case 0x30u: v9 = SYM + 3; goto LABEL_16; case 0x40u: v9 = SYM + 4; goto LABEL_16; default: break; } return v6; } v9 = SYM; LABEL_16: while ( a5 != 0 ) { v10 = &v11[a3]; *v10 = HIBYTE(v8); v10[1] = BYTE2(v8); v10[2] = BYTE1(v8); v10[3] = v8++; v7 = mac_oneshot(v14, v9, (unsigned int)v11, a3 + 4, (int)v12, 64); if ( v7 != 0 ) break; if ( a5 <= a1 ) { memcpy_thunk(a4); return v7; } memcpy_thunk(a4); a5 -= a1; a4 += a1; } return v7; }", "require_capability": "int __fastcall require_capability(int a0) { __asm { SVC 0x76 ; 'v' } return 1; }", "fatal_error": "void __fastcall __noreturn fatal_error(int a0) { *((_DWORD *)*SYM + 663) = a0; bzero_core((void *)0xFFFFFF00, 0x40u); while ( 1 ) ; }", "param_list_scan": "int __fastcall param_list_scan(_DWORD *a0, int a1, unsigned int a2) { unsigned int v3; int v4; int v5; int v6; int v7; __int64 v8; int v9; int v10; v3 = 0; v4 = SYM; v5 = 0; v6 = 0; v10 = 0; while ( v3 < a2 ) { v7 = -1; if ( *a0 == 316 ) { v7 = 0; } else if ( *a0 == 317 ) { v7 = 1; } if ( v7 != -1 ) { if ( *((_BYTE *)&v10 + v7) == 1 ) return SYM; *((_BYTE *)&v10 + v7) = 1; LODWORD(v8) = a0[1]; HIDWORD(v8) = a0[3]; ++v6; if ( (unsigned __int64)(unsigned int)a0[2] + v8 <= 0x200000 && (_DWORD)v8 == 32 ) v5 = 0; else v5 = v4; if ( v5 != 0 ) return v5; v9 = a1 + 12 * v7; *(_DWORD *)(v9 + 40) = a0[2]; *(_DWORD *)(v9 + 44) = a0[1]; *(_BYTE *)(v9 + 48) = 1; } if ( v6 == 2 ) break; a0 += 4; ++v3; } if ( v6 != 2 ) return SYM; return v5; }", "fw_tail_scan": "int __fastcall fw_tail_scan(_BYTE *a0, int a1, int a2) { int v3; int v4; int result; int v5; _BYTE *v6; v3 = 0; v4 = *(_DWORD *)(a1 + 20); result = 0; while ( 1 ) { if ( (unsigned int)(v4 + 16) <= 0x200000uLL ) { v5 = a2 + v4; if ( *(_DWORD *)(a2 + v4) == SYM ) { if ( *(_DWORD *)(v5 + 8) >= 2u ) { v6 = &a0[12 * v3]; *((_DWORD *)v6 + 4) = v4; *((_DWORD *)v6 + 5) = 16 * *(_DWORD *)(v5 + 8) + 16; v6[24] = 1; goto LABEL_14; } result = SYM + 3; } else { result = SYM; } } else { result = SYM; } a0[12 * v3 + 24] = 0; if ( v3 != 0 || *a0 != 0 ) return result; result = 0; LABEL_14: if ( (unsigned int)++v3 >= 2 ) return result; if ( v3 == 1 ) v4 = *(_DWORD *)(a1 + 44); } }", "rsa_keygen_params": "int __fastcall rsa_keygen_params( int a0, unsigned int a1, unsigned int a2, unsigned int a3, unsigned int a4, unsigned int *a5, unsigned int *a6, _DWORD *a7, unsigned int *a8, _DWORD *a9) { unsigned int v10; int v11; unsigned int i; unsigned int v12; BOOL v13; unsigned int v14; unsigned int v15; unsigned int v16; BOOL v17; int v18; int v19; unsigned int v20; BOOL v21; int v22; unsigned int v23; int v24; BOOL v25; int v26; int v27; BOOL v28; int v29; int v30; v10 = 0; v11 = 0; for ( i = a3; i < 4; ++i ) { v11 += 256; if ( *(_BYTE *)(a0 + (i << 8) + 127) == 0 ) { v10 = i; break; } } if ( i == 4 ) return SYM; v12 = (a3 << 8) + 256; v13 = v12 < a3 << 8; v14 = a0 + (a3 << 8); v15 = *(_DWORD *)(v14 + 20); v16 = v15 + v12; v17 = __CFADD__(v15, v12); v18 = *(_DWORD *)(v14 + 112); v19 = v17 || v13; v20 = v18 + v16; v21 = __CFADD__(v18, v16); v22 = v21 | v19; if ( v20 > a2 || v22 != 0 ) return SYM; v23 = v15 + 256 - v11; v24 = a0 + (v10 << 8); v25 = v23 > v15 + 256 || v15 + 256 < v15; v26 = *(_DWORD *)(v24 + 112); v27 = *(_DWORD *)(v24 + 20); v28 = __CFADD__(v27, v26); v29 = v26 + v27; v30 = v28 || v25; if ( v26 + v27 > a1 || v30 != 0 || v23 > a2 ) return SYM; if ( !is_valid_opcode_index(a4) ) return SYM - 3; *a8 = v20; *a5 = v10; *a9 = v11; *a6 = v23; *a7 = v29; return 0; }", "ring_entry_validate": "int __fastcall ring_entry_validate(int a0, int a1, int a2) { int v3; int v4; int v5; v3 = a0 + 12 * a2; if ( *(_BYTE *)(v3 + 48) == 0 ) return SYM; v4 = a1 + *(_DWORD *)(v3 + 40); v5 = *(_DWORD *)(v4 + 16); if ( (unsigned int)(v5 + *(_DWORD *)(v4 + 24)) > 0x200000 ) return SYM; *(_DWORD *)(v3 + 64) = v5; *(_DWORD *)(v3 + 68) = *(_DWORD *)(v4 + 24); *(_BYTE *)(v3 + 72) = 1; return 0; }", "rsa_key_get_components": "int __fastcall rsa_key_get_components(int a0, int a1) { int v2; int v3; int v4; int v5; int v6; int v7; int v8; int v9; int v10; int v11; int v12; int v13; int v14; int v15; int v16; int v17; *(_DWORD *)a1 = a0 + 8; v2 = *(_DWORD *)(a0 + 4); v3 = a0 + 16; v4 = a0 + 80; v5 = 0; v6 = a0 + 112; v7 = a0 + 144; if ( v2 == 256 ) { *(_DWORD *)(a1 + 4) = v3; *(_DWORD *)(a1 + 8) = a0 + 48; *(_DWORD *)(a1 + 12) = v4; *(_DWORD *)(a1 + 28) = v7; *(_DWORD *)(a1 + 16) = a0 + 96; *(_DWORD *)(a1 + 20) = v6; *(_DWORD *)(a1 + 24) = a0 + 128; return v5; } v8 = a0 + 208; v9 = a0 + 272; if ( v2 == 512 ) { *(_DWORD *)(a1 + 4) = v3; *(_DWORD *)(a1 + 8) = v4; *(_DWORD *)(a1 + 12) = v7; *(_DWORD *)(a1 + 24) = a0 + 240; *(_DWORD *)(a1 + 28) = v9; *(_DWORD *)(a1 + 16) = a0 + 176; *(_DWORD *)(a1 + 20) = v8; return v5; } v10 = a0 + 400; if ( v2 == 768 ) { *(_DWORD *)(a1 + 4) = v3; *(_DWORD *)(a1 + 8) = v6; *(_DWORD *)(a1 + 12) = v8; *(_DWORD *)(a1 + 16) = a0 + 256; v15 = a0 + 304; *(_DWORD *)(a1 + 28) = v10; v16 = a0 + 352; LABEL_19: *(_DWORD *)(a1 + 20) = v15; *(_DWORD *)(a1 + 24) = v16; return v5; } v11 = a0 + 528; if ( v2 == 1024 ) { *(_DWORD *)(a1 + 4) = v3; *(_DWORD *)(a1 + 8) = v7; *(_DWORD *)(a1 + 28) = v11; *(_DWORD *)(a1 + 20) = v10; *(_DWORD *)(a1 + 24) = a0 + 464; *(_DWORD *)(a1 + 12) = v9; *(_DWORD *)(a1 + 16) = a0 + 336; return v5; } v12 = a0 + 784; if ( v2 == 1536 ) { *(_DWORD *)(a1 + 4) = v3; *(_DWORD *)(a1 + 8) = v8; v17 = a0 + 496; v16 = a0 + 688; *(_DWORD *)(a1 + 12) = v10; *(_DWORD *)(a1 + 16) = v17; v15 = v17 + 96; *(_DWORD *)(a1 + 28) = v12; goto LABEL_19; } v13 = a0 + 1040; if ( v2 == 2048 ) { *(_DWORD *)(a1 + 4) = v3; *(_DWORD *)(a1 + 8) = v9; *(_DWORD *)(a1 + 20) = v12; *(_DWORD *)(a1 + 24) = a0 + 912; *(_DWORD *)(a1 + 28) = v13; *(_DWORD *)(a1 + 12) = v11; *(_DWORD *)(a1 + 16) = a0 + 656; return v5; } v14 = a0 + 1552; if ( v2 == 3072 ) { *(_DWORD *)(a1 + 4) = v3; *(_DWORD *)(a1 + 8) = v10; *(_DWORD *)(a1 + 12) = v12; *(_DWORD *)(a1 + 16) = a0 + 976; v15 = a0 + 1168; *(_DWORD *)(a1 + 28) = v14; v16 = a0 + 1360; goto LABEL_19; } if ( v2 == 4096 ) { a1 += 4; *(_DWORD *)a1 = v3; *(_DWORD *)(a1 + 4) = v11; *(_DWORD *)(a1 + 8) = v13; *(_DWORD *)(a1 + 12) = a0 + 1296; *(_DWORD *)(a1 + 16) = v14; v15 = a0 + 1808; v16 = a0 + 2064; goto LABEL_19; } return SYM; }", "fw_tail_record_check": "int __fastcall fw_tail_record_check(int a0, int a1) { int v2; int result; int v3; int v4; unsigned int i; unsigned int v5; unsigned int v6; int *v7; int v8; int v9; int v10; int v11; _DWORD *v12; _DWORD *v13; v2 = *(_DWORD *)(a1 + 4096); if ( (unsigned int)(v2 + 16) > 0x200000 ) return SYM; v3 = a1 + v2; v4 = SYM; if ( *(_DWORD *)(a1 + v2) != SYM ) return SYM; for ( i = 1; i < 8; ++i ) { v5 = *(_DWORD *)(v3 + 8); v6 = 0; v7 = (int *)(v3 + 16); while ( v6 < v5 ) { if ( *v7 == i ) { v8 = *v7; v12 = v7 + 1; v9 = v7[1]; v10 = *++v12; v11 = v12[1]; *(_DWORD *)(a0 + 16 * i + 124) = v8; v13 = (_DWORD *)(a0 + 16 * i + 128); *v13 = v9; v13[1] = v10; v13[2] = v11; break; } v7 += 4; ++v6; } if ( v6 == v5 ) result = v4; else result = 0; if ( result != 0 ) break; } *(_DWORD *)(a0 + 112) = v2; *(_DWORD *)(a0 + 116) = 16 * *(_DWORD *)(v3 + 8) + 16; *(_BYTE *)(a0 + 120) = 1; return result; }", "flash_cmd_sequence": "int __fastcall flash_cmd_sequence(_DWORD *a0, unsigned int a1, int a2) { unsigned int v3; int v4; __int16 v5; unsigned int v6; unsigned int v7; unsigned int v8; int v9; int i; int v10; int v11; unsigned int j; int v12; char v13; int v14; unsigned int v15; int v16; __int16 v17[2]; _BYTE dst[256]; int v18; _DWORD *v19; unsigned int v20; int v21; v19 = a0; v20 = a1; v21 = a2; v16 = *(_DWORD *)SYM; v18 = v16; bzero_core(dst, 0x100u); v3 = 0; v14 = 0; v15 = 0; v4 = retry_op_3x(v19, 8, SYM, 3u); if ( v4 == 0 ) { __asm { SVC 0x56 ; 'V' } v4 = retry_with_timeout(v19, &v14); if ( v4 == 0 ) { bzero_core(dst, 0x100u); v5 = *SYM == 1 ? 511 : 510; v4 = fifo_cmd_with_wait(v19, v5, (int)dst); if ( v4 == 0 ) { udiv_select_shift(a2 - 14, 0x20Fu); v7 = v6; v20 = a1 + 14; while ( v3 < v7 ) { v8 = map_page_and_flush(v20, 0x2000, &v15); if ( v8 == 0 ) return SYM; v9 = 0; for ( i = 0; i < 7; ++i ) { if ( v3 >= v7 ) break; v10 = hexdigit_value(*(unsigned __int8 *)(v8 + v9 + 3)) << 16; v11 = v10 | (hexdigit_value(*(unsigned __int8 *)(v8 + v9 + 4)) << 8); LOWORD(v11) = v11 | (16 * hexdigit_value(*(unsigned __int8 *)(v8 + v9 + 5))); *(_DWORD *)v17 = (unsigned __int16)(v11 | hexdigit_value(*(unsigned __int8 *)(v8 + v9 + 6))); for ( j = 0; j <= 0xFF; ++j ) { v12 = v9 + 2 * j + 11; v13 = hexdigit_value(*(unsigned __int8 *)(v8 + v12 + 1)); dst[j] = v13 | (16 * hexdigit_value(*(unsigned __int8 *)(v8 + v12))); } v4 = fifo_cmd_with_wait(v19, v17[0], (int)dst); if ( v4 != 0 ) break; __asm { SVC 0x56 ; 'V' } ++v3; v9 += 527; } __asm { SVC 0x63 ; 'c' } if ( v4 != 0 ) return v4; v20 += 3689; } } } } return v4; }", "client_handle_validate": "int __fastcall client_handle_validate(int a0, int a1, int a2) { int v3; int v4; _DWORD v5[9]; __asm { SVC 0x79 ; 'y' } if ( a0 == -1 ) return SYM + 6; __asm { SVC 0x68 ; 'h' } if ( ccp_desc_aes_out_thunk(v5, a1, a0, a2, 1) != 0 ) return SYM; else return crypto_wait_completion((int)v5, 1, v3, v4); }", "vf_table_lookup": "int __fastcall vf_table_lookup(int a0, int a1, unsigned int a2) { int v3; unsigned int v4; _DWORD *v5; __int64 v6; __int64 v7; unsigned int i; int v8; int v9; _QWORD v10[64]; v3 = SYM; v4 = -1; if ( a0 == 49 ) { v5 = SYM; } else { if ( a0 != 50 ) return v3; v5 = (_DWORD *)((char *)SYM + 28); } if ( a2 > 0x200 ) return SYM; if ( a2 << 29 != 0 ) return v3; if ( *v5 == 0 ) return SYM + 1; memcpy_thunk((int)v10); v6 = (unsigned int)v5[1] + *(_QWORD *)SYM; v7 = (unsigned int)v5[2] + *(_QWORD *)SYM + 4096LL; for ( i = 0; i < a2 >> 3; ++i ) { v8 = 4 * LODWORD(v10[i]); if ( v8 == 1552 ) { HIDWORD(v10[i]) = v6; } else if ( v8 > 1552 ) { v9 = v8 - 1556; if ( v9 != 0 ) { if ( v9 == 172 ) { HIDWORD(v10[i]) = v7; } else if ( v9 == 176 ) { HIDWORD(v10[i]) = HIDWORD(v7); } } else { HIDWORD(v10[i]) = HIDWORD(v6); } } else { switch ( v8 ) { case 768: goto LABEL_23; case 772: HIDWORD(v10[i]) = *v5; break; case 776: LABEL_23: HIDWORD(v10[i]) = 0; continue; case 780: v4 = HIDWORD(v10[i]); break; default: break; } } } if ( v4 > 0x100000 ) return v3; return region_window_open(v5, (int)v10, a2); }", "buffer_copy_bounded": "int __fastcall buffer_copy_bounded(int a0, unsigned int a1) { int v2; unsigned int i; int v3; int v4; _QWORD v5[64]; bzero_core(v5, 0x200u); v2 = SYM; if ( a0 == 0 ) return v2; if ( a1 > 0x200 ) return SYM; if ( a1 << 29 != 0 ) return v2; memcpy_thunk((int)v5); for ( i = 0; i < a1 >> 3; ++i ) { v3 = v5[i]; v4 = v3 + SYM; if ( v3 + SYM != 0 && v4 != 4 && v4 != 16 && v4 != 20 && (unsigned int)(SYM + v3) > 0x678 ) return v2; __asm { SVC 0x7C ; '|' } } return 0; }", "engine_reset_all": "int __fastcall engine_reset_all() { int i; __asm { SVC 0xA6 } __asm { SVC 0x7C ; '|' } for ( i = 0; i < 4; ++i ) { __asm { SVC 0xA6 } __asm { SVC 0xA6 } } __asm { SVC 0xA6 } __asm { SVC 0x7B ; '{' } __asm { SVC 0xA6 } __asm { SVC 0x7B ; '{' } return SYM + 60; }", "queue_state_poll": "int __fastcall queue_state_poll() { int result; int v0; int v1; int v2; int v3; int v4; int v5; v5 = 0; svc_queue_state_get((int)&v5); if ( v5 == 1 ) { v0 = 0; v1 = SYM; v2 = SYM + 72; v3 = SYM + 8; v4 = SYM - 22528; while ( 1 ) { result = svc_queue_submit(v0 + 256, SYM, 0x2000u); if ( result != 0 ) { if ( result != v1 ) return result; *(_DWORD *)(v4 + 88 * v0 + 84) = -1; result = 0; } else { result = persist_slot_init(v3, *(_BYTE *)(SYM + 1), v2, v0 + 256); if ( result != 0 ) return result; } if ( (unsigned int)++v0 > 0xFF ) return result; } } return 0; }", "link_train_step": "int __fastcall link_train_step(int a0, int a1) { int v2; __asm { SVC 0x7B ; '{' } v2 = a0; if ( a0 == 0 ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } read_hw_counter_us(); __asm { SVC 0x7B ; '{' } return a1; } return v2; }", "loadfw_configure_engine": "int __fastcall loadfw_configure_engine(int a0, int a1, int a2) { int v3; bool v4; int j; int i; int v5; int v6; v3 = 0; if ( a0 == 19 ) { v5 = loadfw_engine_step(0); v3 = v5; if ( v5 != 0 ) goto LABEL_41; __asm { SVC 0xA6 } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } v5 = loadfw_engine_step(1); v3 = v5; if ( v5 != 0 ) { LABEL_41: log_event(0xCu, v5); } else { __asm { SVC 0xA6 } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } } return v3; } if ( a0 <= 19 ) { switch ( a0 ) { case 1: case 2: case 3: case 5: case 6: case 9: case 10: case 12: case 13: case 16: return v3; case 4: case 18: __asm { SVC 0xA6 } break; case 7: __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } for ( i = 1024000; i != 0; --i ) __asm { SVC 0x7B ; '{' } return SYM; case 8: __asm { SVC 0xA6 } __asm { SVC 0xA6 } for ( j = 1024000; j != 0; --j ) __asm { SVC 0x7B ; '{' } return SYM; case 11: __asm { SVC 0x7B ; '{' } __asm { SVC 0xA6 } __asm { SVC 0xA6 } __asm { SVC 0xA6 } __asm { SVC 0x7B ; '{' } break; default: return SYM; } return v3; } _ZF = a0 == 55; v4 = a0 <= 55; while ( 1 ) { if ( _ZF ) return v3; if ( !v4 ) break; if ( a0 == 51 ) { reg_wait_change(0); return v3; } if ( a0 > 51 ) { if ( a0 == 52 || a0 == 53 || a0 == 54 ) return v3; return SYM; } _ZF = a0 == 20; v4 = a0 <= 20; if ( a0 != 20 ) { if ( a0 == 21 ) { __asm { SVC 0x7C ; '|' } return v3; } if ( a0 == 22 ) return v3; return SYM; } } if ( a0 == 68 ) return engine_clock_and_cfg(); if ( a0 <= 68 ) { if ( a0 == 56 || a0 == 57 || a0 == 58 ) return v3; return SYM; } if ( a0 != 83 && a0 != 84 ) return SYM; if ( *(unsigned __int8 *)SYM << 31 != 0 ) return v3; v6 = SYM; log_event(0xCu, SYM); return v6; }", "ecc_params_prepare": "int __fastcall ecc_params_prepare(__int64 *a0, _DWORD *a1, _DWORD *a2, _DWORD *a3, int a4) { int v5; _DWORD *v6; _DWORD *v7; _DWORD *v8; v5 = ecc_params_load(a0, a1, a2, a3, a4); if ( v5 == 0 ) { desc_init_type5(a1[1] + 256); desc_init_type4(&v6[*v6], (int)a2); v8 = &v7[*v7]; v8[1] = SYM; *v8 = 32; v8[33] = 0; v8[32] = 0; } return v5; }", "engine_state_check": "int __fastcall engine_state_check(int a0) { int v1; v1 = 0; if ( *((_DWORD *)SYM + 151) == 0 ) { __asm { SVC 0x84 } return 32; } return v1; }", "engine_state_latch": "int __fastcall engine_state_latch() { char *v0; char v1; int v2; __asm { SVC 0x5E ; '^' } v0 = SYM; v1 = SYM[1]; if ( v1 != 0 ) { v1 = 1; v2 = (int)*SYM; *(_DWORD *)(v2 + 1792) = 1; *(_DWORD *)(v2 + 1820) = 0x80000000; } v0[2] = v1; __asm { SVC 0x5F ; '_' } return 0; }", "sysdrv_rpc_dispatch": "int __fastcall sysdrv_rpc_dispatch(rpc_frame_t *frame, int client) { int result; int v0; char *v1; unsigned int v2; unsigned __int64 *param; int v3; signed int opcode; unsigned int *v4; int v5; unsigned int *arg; unsigned int *v6; int v7; bool v8; int v9; bool v10; int v11; signed int v12; bool v13; bool v14; bool v15; bool v16; bool v17; bool v18; int default_ring; __int64 v19; unsigned int v20; __int64 v21; unsigned int v22; int v23; __int64 v24; unsigned int v25; unsigned int v26; unsigned int v27; _DWORD *v28; int v29; int v30; unsigned int *v31; int client_ctx_field2; int v32; __int64 *v33; _DWORD *v34; unsigned __int64 v35; __int64 *v36; unsigned int v37; int v38; int v39; _BYTE v40[4]; rpc_frame_t *v41; unsigned int v42; v41 = frame; v42 = client; HIDWORD(v35) = 2; result = opcode_range_find(frame->opcode); v0 = result; if ( result == 0 ) { v1 = SYM; if ( frame->opcode - 0x4000 <= 0xF && *SYM == 0 ) { boot_stage_advance(); *v1 = 1; } v2 = 0; param = frame->param; v36 = (__int64 *)frame->param; do { if ( LODWORD(param[v2]) != 0 && (frame->opcode != 4098 || frame->f18[5] != 1 || v2 != 0) ) { v3 = param_slot_lookup(frame->opcode, v2); if ( v3 == 0 ) return SYM + 5; LODWORD(v35) = v3; if ( validate_client_range(param[v2], HIDWORD(param[v2]), SHIDWORD(v35), v42) == 0 ) return SYM + 5; } ++v2; } while ( v2 < 4 ); opcode = frame->opcode; v4 = (unsigned int *)SYM; v5 = frame->opcode - 4239; arg = frame->arg; v6 = &frame->arg[1]; if ( frame->opcode == 4239 ) return SYM; if ( (int)frame->opcode <= 4239 ) { v7 = 4157; if ( opcode == 4157 ) { if ( frame->arg[2] != 0 ) return sysdrv_get_rpc_abi_version(&frame->f18[4], *(_DWORD *)param, (unsigned int *)frame->param + 1); else return tlv_field_write(&frame->f18[4], frame->param[0], HIDWORD(frame->param[0])); } else { if ( opcode > 4157 ) { _CF = (unsigned int)(opcode - 4157) >= 0x52; switch ( opcode ) { case 4157: case 4162: case 4196: case 4197: case 4198: case 4200: case 4201: case 4203: case 4205: case 4208: case 4222: case 4223: case 4224: case 4227: case 4232: case 4233: case 4234: case 4235: return SYM; case 4158: LODWORD(v35) = 2; return dram_alloc_region(v42, frame->f18[4], frame->param[0], HIDWORD(frame->param[0]), v35); case 4159: v29 = (int)&frame->f18[4]; __asm { SVC 0x9E } return v29; case 4160: frame->f18[4] = *(_DWORD *)param; frame->f18[5] = frame->param[1]; frame->arg[0] = HIDWORD(frame->param[1]); return session_record_verify(&frame->f18[4], v42); case 4161: return cert_blob_parse((unsigned int *)frame->param[0], HIDWORD(frame->param[0])); case 4163: client_ctx_field2 = get_client_ctx_field2(); goto LABEL_334; case 4164: return tee_ctx_lookup(&frame->f18[4], &frame->f18[5], 1); case 4165: frame->f18[4] = *(_DWORD *)param; return sysdrv_tee_cmd9_unsupported(); case 4166: return sysdrv_ring_reset_unsupported(); case 4167: LODWORD(v35) = 1; return dram_alloc_region(v42, frame->f18[4], frame->param[0], HIDWORD(frame->param[0]), v35); case 4168: return ret_zero_10(); case 4169: frame->f18[4] = get_default_ring(); return 0; case 4170: return ret_zero_13(); case 4171: return ret_zero_11(); case 4172: v35 = *(unsigned __int64 *)((char *)&frame->param[2] + 4); return ret_zero_1(); case 4173: return gp_prop_get_u32( v42, frame->f18[4], (int)arg, *(_DWORD *)param, HIDWORD(frame->param[0]), &frame->f18[5]); case 4174: return sysdrv_legacy_cmd_a_nop(); case 4175: return cert_blob_parse2((unsigned int *)frame->param[0], HIDWORD(frame->param[0])); case 4176: return ret_err_0009_3(); case 4177: case 4193: case 4194: case 4236: case 4237: case 4238: return SYM; case 4178: return ret_err_0008(); case 4179: return ret_err_0008_1(); case 4180: return session_record_update( *(_DWORD *)param, HIDWORD(frame->param[0]), frame->param[1], HIDWORD(frame->param[1]), v42); case 4181: v28 = SYM; frame->f18[4] = *((_BYTE *)SYM + 1004) & 1; frame->f18[5] = v28[253]; return v0; case 4182: return sysdrv_tee_query_32(frame->f18[4], frame->f18[5], frame->arg[0], frame->arg[1], &frame->arg[2]); case 4183: return sysdrv_get_tee_capability((bool *)&frame->f18[4]); case 4184: return tee_state_check(frame->f18[4]); case 4185: return sysdrv_tee_query_33((int *)&frame->f18[4], 0); case 4186: return sysdrv_mbox_common_ack(frame->f18[4]); case 4187: return ret0(); case 4188: return const12_out((int)&frame->f18[4]); case 4189: return spirom_xfer((__int64 *)&frame->f18[4], 1); case 4190: return fw_slot_operation(frame->f18[4], frame->f18[5], 1); case 4191: return sysdrv_tee_session_query(*(_DWORD *)param); case 4192: return ret_err_0009_2(); case 4195: return version_report_build(*(_DWORD **)param, &frame->f18[4]); case 4199: return flash_access_toggle(LOBYTE(frame->f18[4]), frame->f18[5]); case 4202: return sysdrv_tee_query_34(*(_DWORD *)param, frame->param[1]); case 4204: return range_pair_get(&frame->f18[4], &frame->f18[5], frame->arg[0]); case 4206: return slot_count_get((int)&frame->f18[4]); case 4207: return slot_id_get(&frame->f18[4]); case 4209: return spirom_read_checked(v42, &frame->f18[4], 0, 2); case 4210: return spirom_write_dispatch(v42, frame->f18[4], nullptr, &frame->f18[5], 2); case 4211: return spirom_erase_checked(v42, frame->f18[4], nullptr, frame->f18[5], 2); case 4212: return spirom_write_checked(v42, frame->f18[4], 0, 2); case 4213: return slot_id_get2(&frame->f18[4]); case 4214: return context_state_reset((int *)frame->param[0]); case 4215: return desc_clear((int)&frame->f18[4]); case 4216: return sysdrv_get_fw_state((int *)&frame->f18[4], frame->f18[5]); case 4217: trace_unless_ee(frame->f18[4]); return v0; case 4218: return platform_word_get((int)&frame->f18[4]); case 4219: return desc_count_get((_DWORD *)frame->param[0]); case 4220: return ring_state_check(&frame->f18[4]); case 4221: return ret_err_000A(); case 4225: return crypto_aligned_op( *(_DWORD *)param, HIDWORD(frame->param[0]), frame->param[1], HIDWORD(frame->param[1]), &frame->f18[4]); case 4226: client_ctx_field2 = *((_DWORD *)v1 + 1); goto LABEL_334; case 4228: return buffer_triplet_check(&frame->f18[4], &frame->f18[5], frame->param[0], HIDWORD(frame->param[0])); case 4229: return chip_id_build(frame->param[0], HIDWORD(frame->param[0])); case 4230: v0 = zero_byte_out((int)v40); client_ctx_field2 = v40[0]; goto LABEL_334; case 4231: return sysdrv_feature_commit(&frame->f18[4]); default: goto LABEL_44; } } v7 = 4121; if ( opcode == 4121 ) { return spi_write_verified( frame->f18[4], frame->f18[5], frame->arg[0], HIDWORD(frame->param[0]), (unsigned int *)frame->param[0], LOBYTE(frame->arg[3])); } else { if ( opcode > 4121 ) { _CF = (unsigned int)(opcode - 4121) >= 0x24; switch ( opcode ) { case 4121: case 4128: case 4133: case 4139: case 4149: return SYM; case 4122: return flash_read_dispatch(frame->f18[4], frame->f18[5], frame->arg[0], LOBYTE(frame->arg[1])); case 4123: return version_word_get((int)&frame->f18[4]); case 4124: frame->f18[4] = *(_DWORD *)param; frame->f18[5] = HIDWORD(frame->param[0]); frame->arg[0] = frame->param[1]; frame->arg[1] = HIDWORD(frame->param[1]); return session_record_store(&frame->f18[4], v42); case 4125: frame->f18[4] = *(_DWORD *)param; frame->f18[5] = frame->param[1]; frame->arg[0] = HIDWORD(frame->param[1]); return session_record_read((int *)&frame->f18[4], v42); case 4126: return sysdrv_get_system_info(1); case 4127: return sysdrv_enable_feature(frame->f18[4], frame->f18[5], frame->arg[0], v42); case 4129: return key_slot_info(frame->f18[4], frame->f18[5], *(_DWORD **)param); case 4130: return SYM; case 4131: return rsa_modexp( *(_DWORD *)param, HIDWORD(frame->param[0]), frame->param[1], HIDWORD(frame->param[1]), frame->param[2], HIDWORD(frame->param[2]), frame->param[3], 0); case 4132: frame->f18[4] = *(_DWORD *)param; frame->f18[5] = frame->param[1]; return sysdrv_tee_register_shared_mem((__int64 *)&frame->f18[4]); case 4134: return sysdrv_mbox_query_9(); case 4135: return sysdrv_boot_done_notify(&frame->f18[4]); case 4136: return slot_index_validate(&frame->f18[4]); case 4137: status_invalidate(); break; case 4138: return object_alloc_type7(&frame->f18[4]); case 4140: frame->f18[5] = *(_DWORD *)param; frame->arg[0] = frame->param[1]; frame->arg[1] = HIDWORD(frame->param[1]); return key_unwrap_alt(&frame->f18[4], v42); case 4141: return gp_object_set_attributes((int)frame, v36, v42, 2); case 4142: return slot_value_get(&frame->f18[4]); case 4143: frame->f18[4] = *(_DWORD *)param; frame->f18[5] = HIDWORD(frame->param[0]); return scratch_map_sized((int)&frame->f18[4]); case 4144: return sysdrv_set_platform_state(&frame->f18[4]); case 4145: return sysdrv_get_platform_state(&frame->f18[4]); case 4146: return sysdrv_mbox_set_lock(); case 4147: return psb_entry_apply(frame->f18[4]); case 4148: return sysdrv_set_rsm_info(frame->f18[4]); case 4150: goto LABEL_335; case 4151: return smu_mailbox_xfer(frame->f18[4], frame->f18[5], 0, &frame->arg[1], frame->arg[0]); case 4152: frame->f18[4] = *(_DWORD *)param; frame->f18[5] = HIDWORD(frame->param[0]); return key_slot_select_wrap((int)&frame->f18[4]); case 4153: ta_slot_acquire(frame->f18[4], (int *)&frame->f18[5], (int)arg, opcode); break; case 4154: return ret_zero_2(); case 4155: goto LABEL_258; case 4156: goto LABEL_333; default: goto LABEL_44; } return v0; } if ( opcode == 4105 ) { return config_entry_read( *(_DWORD *)param, (const void *)frame->param[1], HIDWORD(frame->param[1]), (_BYTE *)frame->param[2]); } else if ( opcode > 4105 ) { switch ( opcode ) { case 4106: return sysdrv_derive_debug_token_key(v42, (_DWORD *)frame->param[0], HIDWORD(frame->param[0])); case 4107: frame->f18[4] = *(_DWORD *)param; frame->f18[5] = frame->param[1]; return sysdrv_mgmt_query_9((unsigned int **)&frame->f18[4]); case 4108: sysdrv_mgmt_release_context(frame->f18[4]); return v0; case 4109: return derive_psp_dram_hmac_key(v42, frame->param[0], HIDWORD(frame->param[0])); case 4110: return client_buffer_validate(frame->param[0], frame->param[1], HIDWORD(frame->param[0])); case 4111: return client_range_validate(frame->param[0], frame->param[1], HIDWORD(frame->param[0]), frame->f18[4]); case 4112: case 4113: frame->f18[5] = *(_DWORD *)param; frame->arg[0] = frame->param[1]; frame->arg[1] = frame->param[2]; v26 = frame->param[3]; goto LABEL_205; case 4114: frame->f18[5] = *(_DWORD *)param; frame->arg[0] = frame->param[1]; v26 = frame->param[2]; LABEL_205: frame->arg[5] = v26; goto LABEL_206; case 4115: frame->f18[5] = *(_DWORD *)param; frame->arg[3] = frame->param[1]; frame->arg[4] = frame->param[2]; goto LABEL_209; case 4116: frame->f18[4] = *(_DWORD *)param; frame->f18[5] = frame->param[1]; frame->arg[3] = frame->param[2]; LABEL_209: frame->arg[6] = frame->param[3]; LABEL_206: v27 = opcode; goto LABEL_212; case 4117: frame->f18[5] = *(_DWORD *)param; frame->arg[2] = frame->param[1]; frame->arg[3] = frame->param[2]; frame->arg[6] = frame->param[3]; LODWORD(v35) = 1; if ( validate_client_range(frame->f18[4], 0x48u, SHIDWORD(v35), v42) == 0 ) return SYM; v27 = frame->opcode; LABEL_212: v29 = ecc_op_dispatch((int *)&frame->f18[4], v27); break; case 4118: return spirom_range_check( *(_QWORD *)&frame->f18[4], frame->arg[0], (int *)frame->param[0], (int *)frame->param[1]); case 4119: return flash_op_wrapper2( frame->f18[4], frame->f18[5], *(_DWORD **)param, (_DWORD *)frame->param[1], LOBYTE(frame->arg[2])); case 4120: return flash_op_bounded( frame->f18[4], frame->f18[5], frame->arg[0], HIDWORD(frame->param[0]), frame->param[0], LOBYTE(frame->arg[3])); } } else { v7 = opcode - 4097; if ( opcode == 4097 ) { return session_tables_release(LOBYTE(frame->f18[4])); } else { if ( opcode > 4097 ) { _CF = (unsigned int)v7 >= 8; LABEL_44: if ( !_CF ) { switch ( v7 ) { case 0: return SYM; case 1: frame->f18[4] = *(_DWORD *)param; frame->arg[0] = 8 * HIDWORD(frame->param[0]); frame->arg[1] = frame->param[1]; frame->arg[2] = HIDWORD(frame->param[1]); frame->arg[3] = frame->param[2]; frame->arg[4] = frame->param[3]; return crypto_submit_op(&frame->f18[4]); case 2: frame->arg[1] = *(_DWORD *)param; frame->arg[2] = HIDWORD(frame->param[0]); return ecc_submit_op((int *)&frame->f18[4]); case 3: return hmac_sha256( v42, frame->f18[4], frame->param[0], HIDWORD(frame->param[0]), frame->param[1], HIDWORD(frame->param[1]), frame->param[2], HIDWORD(frame->param[2])); case 4: frame->arg[0] = *(_DWORD *)param; frame->arg[1] = HIDWORD(frame->param[0]); frame->arg[2] = frame->param[1]; return sysdrv_verify_signed_image((int)&frame->f18[4], 0, v42, 0); case 5: frame->f18[4] = *(_DWORD *)param; return SYM(&frame->f18[4]); case 6: frame->f18[4] = *(_DWORD *)param; frame->f18[5] = frame->param[1]; return sysdrv_tee_load_firmware((__int64 *)&frame->f18[4]); case 7: frame->f18[4] = *(_DWORD *)param; frame->arg[0] = 8 * HIDWORD(frame->param[0]); frame->arg[1] = frame->param[1]; frame->arg[2] = HIDWORD(frame->param[1]); frame->arg[3] = frame->param[2]; frame->arg[4] = frame->param[3]; return request_header_check(&frame->f18[4]); default: abort(); } } return SYM; } _ZF = opcode == SYM; v8 = opcode <= SYM; v9 = opcode - SYM; while ( 1 ) { if ( _ZF ) return subsystem_reinit(frame->opcode); if ( !v8 ) break; if ( v9 == -5 ) return ret_zero_6(); _ZF = v9 == -4; v8 = v9 <= -4; if ( v9 != -4 ) { if ( v9 == -3 ) return v0; v10 = v9 == -1; LABEL_36: if ( !v10 ) return SYM; return ret_zero_6(); } } v11 = opcode + 65530; if ( opcode == -65530 ) { return lock_acquire_nop(); } else if ( opcode == -65529 ) { return subsystem_unlock(); } else { v10 = v11 + SYM == 0; if ( v11 + SYM != 0 ) goto LABEL_36; return SYM(&frame->f18[4], v42, arg); } } } } } return v29; } v12 = frame->opcode - 12571; if ( frame->opcode == 12571 ) return mbox_buffer_map(); if ( v5 <= 8332 ) { v7 = frame->opcode - 12297; if ( frame->opcode == 12297 ) return sysdrv_get_module_config_unsupported(); if ( v5 <= 8058 ) { if ( frame->opcode != 4262 ) { if ( v5 <= 23 ) { _CF = frame->opcode - 4241 >= 0x14; switch ( frame->opcode ) { case 0x1091u: return ret_err_0009_1(); case 0x1092u: case 0x109Fu: case 0x10A0u: case 0x10A1u: return SYM; case 0x1093u: return sysdrv_tee_cmd48_nop(); case 0x1094u: return spi_write_dispatch( frame->f18[4], frame->f18[5], frame->arg[0], HIDWORD(frame->param[0]), (unsigned int *)frame->param[0], LOBYTE(frame->arg[3]), frame->arg[4]); case 0x1095u: return dram_window_describe(frame->f18[4], &frame->f18[5], arg, 1); case 0x1096u: return client_field3_get((int)&frame->f18[4]); case 0x1097u: return sysdrv_set_misc_param(frame->f18[4]); case 0x1098u: v34 = (_DWORD *)frame->param[3]; __asm { SVC 0x79 ; 'y' } v35 = *param; v36 = *((__int64 **)param + 2); v37 = *((_DWORD *)param + 3); v38 = *((_DWORD *)param + 4); v0 = sysdrv_verify_signed_image((int)&v35, 0, v42, *(_DWORD *)param); if ( v0 == 0 ) *v34 = HIDWORD(v35); break; case 0x1099u: return ret_err_0009_4(); case 0x109Au: return feature_mask_get(&frame->f18[4]); case 0x109Bu: return get_chip_id_pair((_DWORD *)frame->param[0], HIDWORD(frame->param[0])); case 0x109Cu: frame->f18[4] = *(_DWORD *)param; frame->f18[5] = HIDWORD(frame->param[0]); return digest_size_for_alg(&frame->f18[4]); case 0x109Du: frame->f18[4] = *(_DWORD *)param; frame->f18[5] = HIDWORD(frame->param[0]); frame->arg[0] = frame->param[1]; frame->arg[1] = frame->param[2]; frame->arg[2] = HIDWORD(frame->param[2]); frame->arg[3] = frame->param[3]; frame->arg[4] = HIDWORD(frame->param[3]); return key_unwrap_ctx((int)&frame->f18[4], v42); case 0x109Eu: frame->f18[4] = *(_DWORD *)param; frame->f18[5] = HIDWORD(frame->param[0]); frame->arg[0] = frame->param[1]; frame->arg[1] = HIDWORD(frame->param[1]); return sysdrv_vccc_request((__int64 *)&frame->f18[4]); case 0x10A2u: frame->f18[5] = *(_DWORD *)param; frame->arg[0] = frame->param[1]; frame->arg[1] = HIDWORD(frame->param[1]); frame->arg[2] = frame->param[2]; frame->arg[3] = HIDWORD(frame->param[2]); return key_unwrap_fixed((int)&frame->f18[4], v42); case 0x10A3u: return smu_version_get((bool *)&frame->f18[4], (_BYTE *)&frame->f18[4] + 1); case 0x10A4u: return secure_boot_state(&frame->f18[4]); default: goto LABEL_44; } return v0; } v7 = frame->opcode - 12289; v6 = &frame->arg[5]; v4 = &frame->arg[4]; if ( frame->opcode == 12289 ) return ret_err_000A_9(); if ( v5 > 8050 ) { v14 = (unsigned int)v7 >= 8; LABEL_91: if ( !v14 ) { switch ( v7 ) { case 0: return SYM; case 1: return ret_err_000A_20(); case 2: LABEL_258: frame->f18[4] = 2; return v0; case 3: return map_client_buffer_rw(frame->f18[4], frame->f18[5], frame->arg[0], v4, v6); case 4: return ret_err_000A_11(); case 5: return ret_err_000A_13(); case 6: return ret_err_000A_19(); case 7: return flash_guard_check((int *)&frame->f18[4]); default: abort(); } } return SYM; } if ( frame->opcode == 8194 ) { v21 = *(_QWORD *)&frame->arg[2]; v36 = (__int64 *)frame->arg[2]; v37 = 0xFFFF; v38 = HIDWORD(v21); v39 = -5; v22 = frame->arg[1]; LODWORD(v35) = &frame->arg[5]; HIDWORD(v35) = v22; } else { if ( v5 <= 3955 ) { if ( frame->opcode == 4352 ) return key_blob_fetch(frame->param[0], HIDWORD(frame->param[0]), (int *)arg); if ( frame->opcode != 4353 ) { v13 = frame->opcode == 8193; LABEL_75: if ( !v13 ) return SYM; default_ring = get_default_ring(); v19 = *(_QWORD *)&frame->arg[2]; v36 = (__int64 *)frame->arg[2]; v37 = default_ring; v38 = HIDWORD(v19); v39 = -1; v20 = frame->arg[1]; LODWORD(v35) = &frame->arg[5]; HIDWORD(v35) = v20; return map_client_buffer( frame->f18[4], frame->f18[5], frame->arg[0], v4, (_DWORD *)v35, SHIDWORD(v35), (int)v36, v37); } return feature_flag_set(frame->f18[4]); } if ( frame->opcode != 8195 ) { if ( frame->opcode == 8196 ) { v29 = LOBYTE(frame->f18[4]); __asm { SVC 0x6C ; 'l' } } else { v13 = frame->opcode == 8197; if ( frame->opcode != 8197 ) goto LABEL_75; return map_client_buffer_ex(frame->f18[4], frame->f18[5], frame->arg[0], v4, v6); } return v29; } v23 = get_default_ring(); v24 = *(_QWORD *)&frame->arg[2]; v36 = (__int64 *)frame->arg[2]; v37 = v23; v38 = HIDWORD(v24); v39 = -1; v25 = frame->arg[1]; LODWORD(v35) = &frame->arg[5]; HIDWORD(v35) = v25; } return map_client_buffer( frame->f18[4], frame->f18[5], frame->arg[0], v4, (_DWORD *)v35, SHIDWORD(v35), (int)v36, v37); } field4_set(frame->f18[4]); return v0; } if ( frame->opcode == 12550 ) return sysdrv_ring_notify(frame->f18[4], frame->f18[5], frame->arg[0], frame->arg[1]); if ( v7 > 253 ) { v7 = frame->opcode - 12551; v14 = (unsigned int)v7 >= 0x14; switch ( frame->opcode ) { case 0x3107u: return sysdrv_ta_image_commit(&frame->f18[4], frame->arg[2], LOBYTE(frame->arg[3])); case 0x3108u: return sysdrv_set_psb_mode(frame->f18[4]); case 0x3109u: case 0x310Au: case 0x310Bu: case 0x3110u: case 0x3118u: return SYM; case 0x310Cu: return sysdrv_tee_query_12(frame->f18[4], frame->f18[5], *(_DWORD *)param); case 0x310Du: ret_err_000A_27(); break; case 0x310Eu: case 0x310Fu: return SYM; case 0x3111u: return sysdrv_set_protected_region(&frame->f18[4]); case 0x3112u: return sysdrv_load_verify_fw_segment( v42, *(_DWORD *)param, HIDWORD(frame->param[0]), frame->param[1], HIDWORD(frame->param[1]), LOBYTE(frame->f18[4])); case 0x3113u: return triple_store(&frame->f18[4]); case 0x3114u: return ret_err_000A_23(); case 0x3115u: LODWORD(v35) = HIDWORD(frame->param[0]); return sysdrv_ta_image_check_unsupported(); case 0x3116u: return ret_err_0009_5(); case 0x3117u: return ret_err_0009_7(); case 0x3119u: return ret_err_000A_25(); case 0x311Au: return sysdrv_tee_query_18(frame->f18[4]); default: goto LABEL_91; } return v0; } if ( frame->opcode == 12305 ) return ret_err_000A_7(); if ( v7 <= 8 ) { v14 = (unsigned int)v7 >= 8; switch ( frame->opcode ) { case 0x300Au: return ret_err_000A_4(); case 0x300Bu: return ret_err_000A_18(); case 0x300Cu: return ret_err_000A_3(); case 0x300Du: return ret_err_000A_8(); case 0x300Eu: return dram_base_get(&frame->f18[4]); case 0x300Fu: return ret_err_000A_5(); case 0x3010u: return ret_err_000A_6(); default: goto LABEL_91; } } if ( frame->opcode == 12546 ) return sysdrv_derive_key_a((int *)frame->param[0], HIDWORD(frame->param[0])); if ( v7 > 249 ) { if ( frame->opcode == 12547 ) return sysdrv_derive_key_b((unsigned int *)frame->param[0], HIDWORD(frame->param[0])); if ( frame->opcode == 12548 ) return sysdrv_copy_image_to_sram(frame->f18[4], frame->f18[5], frame->arg[0]); v15 = v7 == 252; if ( frame->opcode == 12549 ) return sysdrv_ta_image_prepare( *(_DWORD *)param, HIDWORD(frame->param[0]), frame->param[1], HIDWORD(frame->param[1]), LOBYTE(frame->arg[2])); } else { if ( frame->opcode == 12306 ) return ret_err_000A_26(); if ( frame->opcode == 12307 ) return ret_err_0009_6(); v15 = v7 == 248; } LABEL_105: if ( !v15 ) return SYM; return task_id_publish(v5); } if ( frame->opcode == 12626 ) return sysdrv_mbox_query_58((int *)&frame->f18[4], 55, (int)arg, 8332); if ( v12 <= 55 ) { v7 = frame->opcode - 12575; v14 = (unsigned int)v7 >= 0x33; switch ( frame->opcode ) { case 0x311Fu: return sysdrv_query_47((int *)frame->param[0], HIDWORD(frame->param[0])); case 0x3120u: case 0x3121u: case 0x3122u: case 0x3123u: case 0x3128u: case 0x312Cu: case 0x3134u: case 0x3135u: case 0x313Au: case 0x313Bu: case 0x313Cu: case 0x313Du: case 0x3143u: case 0x3146u: case 0x3147u: case 0x3148u: case 0x3149u: case 0x314Au: case 0x314Eu: case 0x314Fu: return SYM; case 0x3124u: return sysdrv_set_index_and_read(frame->f18[4], &frame->f18[5]); case 0x3125u: client_ctx_field2 = sysdrv_get_boot_status(); goto LABEL_334; case 0x3126u: return sysdrv_c2p_hook(frame->f18[4], v7, (int)arg, 8332); case 0x3127u: return sysdrv_get_dram_range(&frame->f18[5], (int)&frame->f18[4]); case 0x3129u: return sysdrv_key_op_unsupported(); case 0x312Au: return sysdrv_set_protect_unsupported(); case 0x312Bu: return SYM; case 0x312Du: return sysdrv_ta_lifecycle_notify(); case 0x312Eu: return sysdrv_mbox_query_37_unsupported(); case 0x312Fu: sysdrv_ring_complete(frame->f18[4], frame->f18[5], frame->arg[0], 8332); break; case 0x3130u: return sysdrv_register_range(&frame->f18[4]); case 0x3131u: *SYM = frame->f18[4]; break; case 0x3132u: client_ctx_field2 = sysdrv_get_query2_value(); goto LABEL_334; case 0x3133u: *((_DWORD *)v1 + 1) = frame->f18[4]; break; case 0x3136u: return ret_zero_5(); case 0x3137u: return sysdrv_validate_ring_buffer(frame->f18[4], frame->f18[5], frame->arg[0], frame->arg[1]); case 0x3138u: return sysdrv_get_counter((int)&frame->f18[4]); case 0x3139u: return sysdrv_set_counter(&frame->f18[4]); case 0x313Eu: return ret_err_000A_12(); case 0x313Fu: return ret_err_000A_28(); case 0x3140u: return sysdrv_set_dram_info(&frame->f18[4], v42); case 0x3141u: frame->arg[1] = *(_DWORD *)param; frame->arg[2] = HIDWORD(frame->param[0]); return sysdrv_platform_notify((int)&frame->f18[4], v42); case 0x3142u: return sysdrv_psb_directory(); case 0x3144u: return sysdrv_set_value(frame->f18[4], v42); case 0x3145u: return sysdrv_mbox_query_49(frame->f18[4]); case 0x314Bu: return ret_err_000A_1(); case 0x314Cu: return flash_access_release(frame->f18[4]); case 0x314Du: return flash_access_acquire(frame->f18[4]); case 0x3150u: return engine_state_latch(); case 0x3151u: return ret_sts_80000505(); default: goto LABEL_91; } return v0; } v5 = frame->opcode - 28674; if ( frame->opcode == 28674 ) { v30 = 0; v31 = &frame->f18[4]; return ta_reg_access_simple(v30, (int)v31); } if ( v12 <= 16103 ) { v5 = frame->opcode - 16390; if ( frame->opcode == 16390 ) { LABEL_333: client_ctx_field2 = SYM; goto LABEL_334; } if ( v12 <= 3819 ) { v16 = v12 == 3815; v17 = v12 <= 3815; v5 = frame->opcode - 16386; do { if ( v16 ) return ret_err_000A_2(); if ( v17 ) { if ( frame->opcode == 12627 ) return sysdrv_mbox_hash_op(); if ( frame->opcode != 12640 ) { v15 = v12 == 3814; goto LABEL_133; } return sysdrv_log_write(&frame->f18[4]); } v16 = v5 == 1; v17 = v5 <= 1; } while ( frame->opcode == 16387 ); if ( frame->opcode == 16388 ) return desc_clear((int)&frame->f18[4]); v15 = v5 == 3; if ( frame->opcode != 16389 ) goto LABEL_133; LABEL_335: timestamp_pair_get(&frame->f18[4]); return v0; } if ( frame->opcode == 24577 ) return otp_block_read(frame->param[0], HIDWORD(frame->param[0])); if ( v5 <= 8187 ) { if ( frame->opcode == 16391 ) return ret_zero_11(); if ( frame->opcode != 16403 ) { v15 = v5 == 14; if ( frame->opcode == 16404 ) { sysdrv_vbios_flash_begin(); return v0; } goto LABEL_133; } client_ctx_field2 = find_default_key_record(); LABEL_334: frame->f18[4] = client_ctx_field2; return v0; } if ( frame->opcode == 24578 ) return tlv_buffer_copy((int *)frame->param[0], HIDWORD(frame->param[0])); if ( frame->opcode == 24579 ) return frame_validate(&frame->f18[4]); v15 = frame->opcode == 28673; if ( frame->opcode == 28673 ) { v30 = 1; v31 = &frame->f18[4]; return ta_reg_access_simple(v30, (int)v31); } LABEL_133: if ( v15 ) return flash_session_open(v5); goto LABEL_105; } if ( frame->opcode == 32771 ) return ret_err_000A_21(); if ( v5 > 4097 ) { switch ( frame->opcode ) { case 0x8004u: return shared_buffer_map(&frame->f18[4]); case 0x8005u: return ret_err_000A_22(); case 0x8006u: return ret_err_000A_16(); case 0x8007u: return ret_err_000A_14(); case 0x8008u: return ret_err_000A_15(); case 0x8009u: return ret_err_000A_17(); case 0x800Au: return stub_svc8F(frame->f18[4], frame->f18[5], frame->arg[0]); default: return SYM; } } if ( frame->opcode == 28679 ) { v32 = 0; v33 = (__int64 *)&frame->f18[4]; } else { if ( v5 > 5 ) { if ( frame->opcode == 28680 ) return dram_range_query((int)&frame->f18[4]); v5 = frame->opcode - 32769; if ( frame->opcode == 32769 ) return ret_err_000A_10(); v15 = v5 == 1; if ( frame->opcode == 32770 ) return ret_err_000A_24(); goto LABEL_133; } v18 = v5 == 1; do { if ( v18 ) return 0; v18 = v5 == 2; } while ( frame->opcode == 28676 ); v15 = v5 == 4; if ( frame->opcode != 28678 ) goto LABEL_133; v32 = 1; v33 = (__int64 *)&frame->f18[4]; } return ta_reg_access_chiplet(v32, v33); } return result; }", "ret_zero_1": "int __fastcall ret_zero_1() { return 0; }", "crypto_submit_op": "int __fastcall crypto_submit_op(_DWORD *a0) { int v1; int v2; unsigned int v3; int v4; unsigned int i; char v5; int v6; int v7; _DWORD v8[8]; if ( *((unsigned __int8 *)a0 + 16) << 27 != 0 || *((unsigned __int8 *)a0 + 12) << 27 != 0 || *((unsigned __int8 *)a0 + 20) << 27 != 0 ) { return SYM; } __asm { SVC 0x5E ; '^' } __asm { SVC 0x79 ; 'y' } v1 = a0[3]; __asm { SVC 0x79 ; 'y' } v2 = a0[5]; v3 = a0[2] >> 3; if ( a0[1] != 0 ) { *((_DWORD *)*SYM + 128) = *a0; } else { v4 = (int)*SYM; for ( i = 0; i < v3; ++i ) { v5 = *(_BYTE *)(*a0 + v3 - i - 1); v6 = v4 + i; *(_BYTE *)(v6 + 512) = v5; } } if ( a0[8] == 268435472 || (v7 = key_material_reverse(64, a0[6])) == 0 ) { v7 = aes_keysize_to_mode(v8, a0[1], a0[2], a0[7], a0[8], v1, v2, 64); if ( v7 == 0 ) { if ( result_set((int)v8, a0[4]) != 0 ) { v7 = SYM - 6; } else { __asm { SVC 0x68 ; 'h' } v7 = crypto_wait_completion((int)v8, 1, 0, -1); } } } __asm { SVC 0x5F ; '_' } return v7; }", "aes_cmac_compute": "int __fastcall aes_cmac_compute( int a0, int a1, int a2, unsigned int a3, unsigned int a4, int a5, int a6, int a7, int a8, int a9) { int v10; int v11; int v12; unsigned int v13; int v14; int v15; int v16; _DWORD v17[29]; char v18[8]; __int64 v19; unsigned int v20; char v21[8]; __int64 v22; int v23; char v24[56]; int v25; int v26; int v27; int v28; _DWORD v29[3]; int v30[2]; unsigned int v31; int v32[2]; int v33; int v34; int v35; int v36; unsigned int v37; v34 = a0; v35 = a1; v36 = a2; v37 = a3; v10 = 8 * a2; v11 = 0; v30[1] = 8 * a2; v30[0] = SYM; v12 = gp_object_allocate(v30, a0); if ( v12 == 0 ) { v13 = v31; v20 = v31; v29[0] = -1073741824; v29[1] = a1; LODWORD(v19) = v29; v29[2] = a2; HIDWORD(v19) = 12; v12 = gp_object_populate_attrs((int)v18, &v19, v34, 1); if ( v12 == 0 ) { v26 = a5; v28 = v10; v27 = a9; v12 = gp_operation_allocate((int)v24, v34, v14, v15); if ( v12 == 0 ) { v11 = v25; v32[0] = v25; v32[1] = v13; v12 = gp_set_operation_key(v32, v34); if ( v12 == 0 ) { v23 = v11; LODWORD(v22) = a3; HIDWORD(v22) = a4; gp_operation_set_key((int)v21, &v22, v34); v17[0] = a6; v17[1] = a7; v17[12] = v11; v17[2] = a8; v17[3] = a7; v12 = gp_cipher_update((int)&v16, (int)v17, v34, 1); } } } if ( v13 != 0 ) gp_object_free(v13, v34); if ( v11 != 0 ) { v33 = v11; gp_operation_free(&v33, v34); } } return v12; }", "request_header_check": "int __fastcall request_header_check(_DWORD *a0) { int v1; int v2; int v3; int v4; int *v5; int v6; unsigned int v7; int v8; unsigned int i; char v9; int v10; int v11; unsigned int j; char v12; int v13; int *v14; int v15; int v16; _DWORD v17[8]; _BYTE v18[32]; int v19; v1 = 0; if ( *((unsigned __int8 *)a0 + 16) << 28 != 0 || a0[8] != SYM ) return SYM; v2 = a0[2]; switch ( v2 ) { case 128: v3 = 0; break; case 192: v3 = 1; break; case 256: v3 = 2; break; default: return SYM; } __asm { SVC 0x79 ; 'y' } v4 = a0[3]; __asm { SVC 0x79 ; 'y' } v5 = (int *)SYM; v6 = a0[5]; v7 = a0[2] >> 3; v8 = (int)*SYM; for ( i = 0; i < v7; ++i ) { v9 = *(_BYTE *)(*a0 + v7 - i - 1); v10 = v8 + i; *(_BYTE *)(v10 + 544) = v9; } bzero((void *)(v8 + 624), 0x10u); v11 = *v5; for ( j = 0; j < 0x10; ++j ) { v12 = *(_BYTE *)(a0[6] + 15 - j); v13 = v11 + j; *(_BYTE *)(v13 + 608) = v12; } v14 = SYM[0]; v15 = ccp_desc_aes_out_thunk(v17, 67, *SYM[0] + 608, 32, 0); v16 = SYM - 6; if ( v15 != 0 || ccp_desc_hash_sha384((int)v18, v6, v4, a0[4], *v14 + 544, 67, v3, 0) != 0 ) return v16; __asm { SVC 0x5E ; '^' } if ( crypto_queue_prepare(0, &v19, (int)v17, 2) != 0 ) v1 = v16; __asm { SVC 0x5F ; '_' } return v1; }", "ret_err_000A_3": "int __fastcall ret_err_000A_3() { return SYM; }", "sysdrv_tee_query_33": "int __fastcall sysdrv_tee_query_33(int *a0, int a1) { int v2; unsigned int v3; int v4; int v5; v3 = a0[1]; v2 = *a0; v4 = a0[2]; if ( v3 == 0xFFFF ) { if ( (a1 | v4) != 0 ) { if ( v2 == -1 && a1 != 0 ) v2 = (*SYM)[2]; } else { (*SYM)[2] = v2; } } if ( v4 == 0 ) slot_table_set(v2, v3); if ( v3 != 0xFFFF ) return SYM; v5 = mbox_region_init(); if ( v5 == 0 ) reg_rmw_nop(); return v5; }", "sysdrv_copy_image_to_sram": "int __fastcall sysdrv_copy_image_to_sram(int a0, int a1, int a2) { int v3; int v4; ccp_desc_t d; if ( ((a0 + 31) & 0xFFFFFFE0) != a0 || ((a1 + 31) & 0xFFFFFFE0) != a1 ) return SYM; __asm { SVC 0x68 ; 'h' } if ( ccp_desc_passthru(&d, a0, a1, a2, 1) != 0 ) return SYM - 6; else return crypto_wait_completion((int)&d, 1, v3, v4); }", "secure_boot_state": "int __fastcall secure_boot_state(_BYTE *a0) { int v1; int v2; v1 = SYM; v2 = 0; *a0 = 1; if ( *SYM != 0 && feature_bitmap_build() == 0 ) { *a0 = 0; return smu_mailbox_xfer(30, 1, 0, &v2, 0x3E8u); } return v1; }", "ret_err_0009_1": "int __fastcall ret_err_0009_1() { return SYM; }", "ret_err_000A_4": "int __fastcall ret_err_000A_4() { return SYM; }", "feature_mask_get": "int __fastcall feature_mask_get(_DWORD *a0) { _DWORD *v1; v1 = (_DWORD *)(SYM + 12 * *a0); a0[1] = v1[560]; a0[2] = v1[561] & v1[562]; return 0; }", "ret_err_000A_5": "int __fastcall ret_err_000A_5() { return SYM; }", "sysdrv_log_write": "int __fastcall sysdrv_log_write(_DWORD *a0) { __int64 v1; unsigned __int64 v2; unsigned __int64 v3; if ( *((_DWORD *)SYM + 416) != 0 ) { LODWORD(v1) = 0; HIDWORD(v1) = a0[4]; v2 = __PAIR64__(*a0, 0) + (unsigned int)a0[1]; LODWORD(v3) = a0[5]; HIDWORD(v3) = (v1 + (unsigned __int64)(unsigned int)v3) >> 32; range_map_and_verify( v2, SHIDWORD(v2), __PAIR64__(a0[2], a0[3]), v3, a0[7], (__PAIR64__(a0[6], 0) + (unsigned int)a0[7]) >> 32); } return 0; }", "ret_err_000A_6": "int __fastcall ret_err_000A_6() { return SYM; }", "crypto_aligned_op": "int __fastcall crypto_aligned_op(unsigned int a0, int a1, int a2, int a3, _DWORD *a4) { int v5; ccp_desc_t d; int v6; __asm { SVC 0x5E ; '^' } if ( ((a0 + 31) & 0xFFFFFFE0) != a0 ) goto LABEL_8; if ( ((a2 + 31) & 0xFFFFFFE0) != a2 ) goto LABEL_8; if ( ((a3 + 31) & 0xFFFFFFE0) != a3 ) goto LABEL_8; __asm { SVC 0x79 ; 'y' } if ( a2 == -1 ) goto LABEL_8; __asm { SVC 0x79 ; 'y' } if ( a0 != -1 ) { if ( ccp_desc_zlib(&d, a2, a0, a1, 9) != 0 ) { v5 = SYM - 6; } else { ccp_ring_doorbell(a3, 0); __asm { SVC 0x68 ; 'h' } v5 = crypto_wait_completion((int)&d, 1, a0, a1); if ( v5 == 0 ) { queue_base_get(&v6, nullptr); __asm { SVC 0x68 ; 'h' } if ( a4 != nullptr ) *a4 = v6; } } } else { LABEL_8: v5 = SYM; } __asm { SVC 0x5F ; '_' } return v5; }", "key_unwrap_ctx": "int __fastcall key_unwrap_ctx(int a0, int a1) { int v2; char v3; int v4; v4 = *(_DWORD *)SYM; bzero((void *)((unsigned int)&v3 & 0xFFFFFFE0), 0xE0u); bzero(*(void **)(a0 + 20), *(_DWORD *)(a0 + 24)); a0 += 20; return kdf_sp800108_ctr( a1, *(_DWORD *)(a0 - 20), *(_DWORD *)(a0 - 16), *(char **)(a0 - 12), *(_DWORD *)(a0 - 8), *(_DWORD *)(a0 - 4), *(_DWORD *)a0, *(_DWORD *)(a0 + 4), *(_DWORD *)(a0 + 8), (int)&v2); }", "key_unwrap_fixed": "int __fastcall key_unwrap_fixed(int a0, int a1) { int result; _BYTE v2[256]; _BYTE v3[33]; int v4; v4 = *(_DWORD *)SYM; bzero((void *)((unsigned int)v2 & 0xFFFFFFE0), 0xE0u); result = key_derive_fixed((unsigned int)v3 & 0xFFFFFFE0, 32, *(_DWORD *)a0); if ( result == 0 ) return kdf_sp800108_ctr( a1, (unsigned int)v3 & 0xFFFFFFE0, 32, *(char **)(a0 + 4), *(_DWORD *)(a0 + 8), *(_DWORD *)(a0 + 12), *(_DWORD *)(a0 + 16), *(_DWORD *)(a0 + 20), *(_DWORD *)(a0 + 24), (unsigned int)v2 & 0xFFFFFFE0); return result; }", "key_slot_select_wrap": "int __fastcall key_slot_select_wrap(int a0) { return key_slot_select(*(_DWORD *)a0, *(_DWORD *)(a0 + 4), *(unsigned __int8 *)(a0 + 8)); }", "sysdrv_get_system_info": "int __fastcall sysdrv_get_system_info(int a0) { unsigned int v1; char *v2; int v3; int v4; int v5; unsigned int i; v2 = SYM[0]; v3 = 0; if ( *((_QWORD *)SYM[0] + 4) == 0 ) return SYM; __asm { SVC 0x5E ; '^' } v4 = flash_access_acquire(1000); if ( v4 == 0 ) { v5 = SYM; for ( i = 1; i < 0x10; ++i ) { if ( *(_BYTE *)(v5 + i) != 0 ) { v1 = v1 & 0xFFFFFF00 | (unsigned __int8)a0; v4 = fw_slot_operation(i, v1, 0); if ( v4 != 0 ) break; *(_BYTE *)(v5 + i) = 0; } } } if ( v4 != SYM && v4 != SYM + 1 ) v3 = flash_access_release(1000); if ( v4 == 0 ) v4 = v3; if ( a0 != 0 ) { *((_DWORD *)v2 + 6) = 0; *((_DWORD *)v2 + 7) = 0; *((_DWORD *)v2 + 8) = 0; *((_DWORD *)v2 + 9) = 0; config_blob_read_entry(0, 0xFFFFu, 2, 2); } *((_DWORD *)v2 + 1) = 0; *v2 = 0; *((_DWORD *)v2 + 2) = 0; __asm { SVC 0xA1 } __asm { SVC 0x5F ; '_' } return v4; }", "sysdrv_ring_reset_unsupported": "int __fastcall sysdrv_ring_reset_unsupported() { return SYM; }", "sysdrv_psb_directory": "int __fastcall sysdrv_psb_directory() { int v0; int v1; int v2; __int64 v3; int v4; int v5; int v6; int v7; int v8[10]; int v9; int v10; int v11; char v12; char v13; v10 = 0; bzero_core(v8, 0x28u); if ( fuse_read_flag(&v10, v0, v1, v2) != 0 ) return 10; HIDWORD(v3) = &v13; LODWORD(v3) = &v12; v4 = fuse_decode_flags(&v9, &v11, v3, v8[0]); if ( v4 == 0 ) { if ( v10 != 0 ) { if ( v9 == 0 ) return 14; } else if ( v9 == 0 ) { if ( psb_process_config_entry(5u, (int)v8, 1) != 0 ) return 13; if ( fuse_read_config(0, v5, v6, v7) == 0 ) return v4; return 10; } return 15; } return v4; }", "ecc_op_dispatch": "int __fastcall ecc_op_dispatch(int *a0, int a1) { int v2; int v3; v2 = 0; __asm { SVC 0x5E ; '^' } switch ( a1 ) { case 4112: v3 = ecc_op_submit(1, a0[2], a0[3], a0[1], a0[7]); goto LABEL_4; case 4113: v3 = ecc_op_submit(0, a0[2], a0[3], a0[1], a0[7]); goto LABEL_4; case 4114: v3 = ecc_point_double(a0[2], a0[1], a0[7]); goto LABEL_4; case 4115: v3 = ecdsa_sign(a0[1], a0[5], a0[6], a0[8]); goto LABEL_4; case 4116: v3 = ecc_point_mul_verify(*a0, a0[1], a0[5], a0[8]); goto LABEL_4; case 4117: v3 = ecdsa_verify(*a0, a0[1], a0[4], a0[5], a0[8]); LABEL_4: v2 = v3; break; default: break; } __asm { SVC 0x5F ; '_' } return v2; }", "sysdrv_set_protect_unsupported": "int __fastcall sysdrv_set_protect_unsupported() { return SYM; }", "sysdrv_ta_image_check_unsupported": "int __fastcall sysdrv_ta_image_check_unsupported() { return SYM; }", "sysdrv_tee_register_shared_mem": "int __fastcall sysdrv_tee_register_shared_mem(__int64 *a0) { __int64 v1; int v2; unsigned int v3; unsigned int v4; int v5; int *v6; unsigned int v7; int v8; unsigned int v9; unsigned int v10; unsigned int v11; _DWORD *v12; _DWORD *v13; int *v14; int v15; int v16; int v17; int v18; int v19; int v20; int v21; int v22; int v23; unsigned int v24; int v25; int v26[8]; __int64 v27; int v28; int v29; unsigned __int8 v30[4]; unsigned __int8 v31[4]; int v32; int v33; int v34; int v35; void *a; int v36; unsigned int v37; _BYTE b[32]; _BYTE v38[32]; int v39; v36 = *(_DWORD *)SYM; v39 = v36; v30[0] = -1; v31[0] = -1; v35 = 0; v32 = 0; v29 = 0; v33 = 0; v1 = *a0; v28 = *((_DWORD *)a0 + 1); v37 = *(_DWORD *)(v1 + 8); a = *(void **)(v1 + 4); v2 = *(_DWORD *)(v1 + 12); v3 = *(_DWORD *)(v1 + 16); v4 = v2 & 0xFFFFFFF0; __asm { SVC 0x66 ; 'f' } v34 = (unsigned __int8)v2; if ( v3 >= 0x62 ) { v5 = SYM; goto LABEL_42; } v5 = derive_psp_dram_hmac_key((unsigned __int8)v2, (int)v38, 32); if ( v5 == 0 ) { v6 = SYM; if ( v3 == 13 ) { v7 = *SYM; v8 = platform_region_size(13); v9 = 0x100000 - v7; } else { if ( v3 != 58 ) { LABEL_10: v5 = SYM; goto LABEL_42; } v7 = platform_region_size(13) + *v6; v8 = platform_region_size(58); v9 = 3145728 - v7; } v10 = v8 + 0x100000; v11 = v9; if ( v4 > v8 + 0x100000 ) goto LABEL_10; v27 = *(_QWORD *)SYM + v7; v5 = map_client_buffer(v37, (unsigned int)a, v4, v30, &v35, 0, 1, 0xFFFFu); if ( v5 == 0 ) { v5 = map_client_buffer(HIDWORD(v27), v27, v10, v31, &v29, 0, 1, 0xFFFFu); if ( v5 == 0 ) { a = (void *)(v35 + v4 - 32); if ( v4 < 0x100C ) goto LABEL_10; __asm { SVC 0x6D ; 'm' } v5 = v30[0]; if ( v30[0] == 0 ) { __asm { SVC 0x6D ; 'm' } v5 = v31[0]; if ( v31[0] == 0 ) { v12 = (_DWORD *)(v29 + v4 - 44); v13 = SYM; v14 = SYM; if ( *(_DWORD *)v1 != 0 ) { if ( v3 == 13 ) { *v12 = *(_DWORD *)SYM; v15 = v13[13]; } else { *v12 = *((_DWORD *)SYM + 7); v15 = v13[58]; } v12[1] = v15; v12[2] = *v14; __asm { SVC 0x68 ; 'h' } v16 = v4 - 32; v5 = hmac_sha256(v34, SYM, (int)v38, 32, v29, v16, (int)b, 32); if ( v5 == 0 ) { if ( ccp_desc_aes_full(v26, v33, v32, 0, 2, 0, v33, 0, 2, 0, v16, 1) != 0 ) { LABEL_22: v5 = SYM - 6; goto LABEL_42; } v5 = crypto_wait_completion((int)v26, 1, v17, v18); if ( v5 != 0 ) goto LABEL_42; memcpy_thunk((int)a); *(_BYTE *)(SYM + v3) = 0; LABEL_41: *(_QWORD *)(v28 + 8) = v27; } } else { v19 = spirom_region_read(v3, v7, 0x100000); v5 = v19; if ( v19 == 0 ) { v20 = v3 == 13 ? 49 : 50; v5 = spirom_region_read(v20, v7 + v11, 0x100000); if ( v5 == 0 ) { v21 = v4 - 32; if ( ccp_desc_aes_full(v26, v32, v33, 0, 2, 0, v32, 0, 2, 0, v21, 1) != 0 ) goto LABEL_22; v5 = crypto_wait_completion((int)v26, 1, v22, v23); if ( v5 == 0 ) { v5 = hmac_sha256(v34, SYM, (int)v38, 32, v29, v21, (int)b, 32); if ( v5 == 0 ) { if ( ct_memcmp(a, b, 0x20u) != 0 ) goto LABEL_22; if ( v3 == 13 ) { *(_DWORD *)SYM = *v12; v24 = 0; v13[13] = v12[1]; } else { *((_DWORD *)SYM + 7) = *v12; v24 = 1; v13[58] = v12[1]; } v25 = v12[2]; *v14 = v25; v5 = dram_window_get(v24, v25); if ( v5 == 0 ) { *(_BYTE *)(SYM + v3) = 1; goto LABEL_41; } } } } } } } } } } } LABEL_42: if ( v30[0] != 255 ) __asm { SVC 0x6C ; 'l' } if ( v31[0] != 255 ) __asm { SVC 0x6C ; 'l' } return v5; }", "sysdrv_verify_signed_image": "int __fastcall sysdrv_verify_signed_image(int a0, int a1, int a2, unsigned int a3) { int v4; unsigned int *v5; unsigned int v6; int record_retry; unsigned int v7; int v8; int v9; int v10; unsigned int v11; unsigned int v12; unsigned int v13; unsigned int v14; unsigned int v15; int v16; int v17; unsigned int v18; unsigned int v19; unsigned int v20; unsigned int v21; unsigned int v22; int v23[6]; int v24; int v25; _BYTE v26[24]; int v27; int v28; int v29; _BYTE v30[512]; _BYTE v31[64]; int v32; int v33; int v34; int v35; unsigned int v36; v33 = a0; v34 = a1; v35 = a2; v36 = a3; v24 = *(_DWORD *)SYM; v32 = v24; v4 = 256; v16 = 0; v17 = 0; v5 = (unsigned int *)v26; v18 = 0; v6 = 0; v25 = 0; v19 = 0; v20 = 0; v21 = 256; record_retry = map_and_flush_range((int)v26, 1024, *(_DWORD *)a0, a3); if ( record_retry != 0 ) goto LABEL_47; __asm { SVC 0x87 } if ( v28 == 0 ) { v7 = *(_DWORD *)(a0 + 12); if ( v7 <= 0x20 ) bzero(*(void **)(a0 + 8), v7); else record_retry = SYM; goto LABEL_47; } if ( v34 != 0 && v27 != 1 ) { record_retry = SYM; goto LABEL_47; } if ( (v29 & 5) == 0 ) { record_retry = find_record_retry((int)v26, &v20, &v17, &v16, &v18, &v21, -1); if ( record_retry != 0 || (v5 = (unsigned int *)&v26[256 * v20], (record_retry = uuid_table_lookup(v5 + 14, &v25)) != 0) ) { LABEL_47: if ( a3 != 0 ) return record_retry; goto LABEL_48; } } if ( v5[13] != 0 ) { v8 = SYM; v9 = 48; v4 = 512; } else { v9 = 32; v8 = SYM - 1; } v10 = v9; if ( v5[18] != 0 ) v11 = (v5[21] + 15) & 0xFFFFFFF0; else v11 = v5[5]; v12 = *(_DWORD *)(a0 + 4); if ( v12 < v11 || v11 + v4 + 256 > v12 ) { record_retry = SYM; goto LABEL_47; } v13 = *(_DWORD *)a0 + (v20 << 8); v22 = v11 + 256; v14 = v13 + v11 + 256; if ( a3 != 0 ) { v6 = a3 + (v20 << 8) + v11 + 256; } else { v6 = map_page_and_flush(v13 + v11 + 256, 0x2000, &v19); if ( v6 == 0 ) return SYM + 6; } if ( v34 != 0 ) { if ( memcmp_be(v5 + 14, SYM, 0x10u) != 0 ) { record_retry = SYM - 8; goto LABEL_47; } } else if ( (v5[30] & 5) != 0 ) { record_retry = param_bounds_check(v14 + v4, v6 + v4, &v17, &v16, &v18, (int *)&v21, &v25); if ( record_retry != 0 ) goto LABEL_47; } if ( a3 != 0 ) { record_retry = mac_oneshot(v35, v8, a3 + (v20 << 8), v22, (int)v31, v10); if ( record_retry != 0 ) return record_retry; goto LABEL_36; } v23[0] = *(_DWORD *)a0 + (v20 << 8); v23[1] = 0; v23[2] = v22; v23[3] = (int)v31; v23[4] = v10; v23[5] = v8; record_retry = ecc_submit_op(v23); if ( record_retry == 0 ) { LABEL_36: memcpy_thunk((int)v30); record_retry = rsa_pad_and_verify((int)v31, v10, v18, v21, v17, v16, (int)v30); if ( record_retry == 0 ) { record_retry = mac_oneshot(v35, SYM - 1, v18, v21, *(_DWORD *)(a0 + 8), *(_DWORD *)(a0 + 12)); if ( record_retry == 0 ) { **(_DWORD **)(a0 + 16) = v25; *(_DWORD *)(a0 + 4) = v22; v15 = v20; while ( v15 < 4 && *((_BYTE *)v5 + 127) != 0 ) { v20 = ++v15; v5 += 64; } if ( v15 == 4 ) { record_retry = SYM - 5; } else if ( v5[6] == 1 ) { record_retry = key_unwrap((int)v5, *(_DWORD *)a0 + (v15 << 8), a3, v15); } } } goto LABEL_47; } LABEL_48: if ( v6 != 0 ) __asm { SVC 0x63 ; 'c' } return record_retry; }", "ret_err_000A_7": "int __fastcall ret_err_000A_7() { return SYM; }", "slot_id_get": "int __fastcall slot_id_get(_DWORD *a0) { int result; result = SYM; if ( *SYM != -1 ) { *a0 = *SYM; return 0; } return result; }", "sysdrv_get_module_config_unsupported": "int __fastcall sysdrv_get_module_config_unsupported() { return SYM; }", "sysdrv_get_platform_state": "int __fastcall sysdrv_get_platform_state(_DWORD *a0) { int v1; int *v2; int v3; char *v4; v1 = 0; switch ( *a0 ) { case 0: v2 = SYM[0]; goto LABEL_23; case 1: v2 = SYM[0]; goto LABEL_23; case 2: v2 = SYM[0]; goto LABEL_23; case 3: v2 = SYM[0]; goto LABEL_23; case 4: v3 = *((_DWORD *)SYM + 142); goto LABEL_4; case 6: svc_queue_state_get((int)(a0 + 1)); return v1; case 7: v2 = SYM[0]; goto LABEL_23; case 8: v2 = SYM[0]; goto LABEL_23; case 9: v2 = SYM[0]; goto LABEL_23; case 0xA: v2 = SYM; goto LABEL_23; case 0xB: queue_field12_get((int)(a0 + 1)); return v1; case 0xC: v3 = *((_DWORD *)SYM + 514); goto LABEL_4; case 0xE: v4 = SYM[0]; goto LABEL_25; case 0xF: v4 = SYM[0]; goto LABEL_25; case 0x10: v2 = SYM[0]; goto LABEL_23; case 0x11: v2 = SYM[0]; goto LABEL_23; case 0x14: mbox_flag_read(a0 + 1); return v1; case 0x15: v3 = *((_DWORD *)SYM[0] + 1); goto LABEL_4; case 0x16: v3 = *((_DWORD *)SYM[0] + 2); goto LABEL_4; case 0x17: v2 = SYM; LABEL_23: v3 = *v2; goto LABEL_4; case 0x18: v4 = SYM; LABEL_25: v3 = (unsigned __int8)*v4; LABEL_4: a0[1] = v3; break; default: v1 = SYM; break; } return v1; }", "slot_count_get": "int __fastcall slot_count_get(int a0) { int *v1; int v2; int v3; v1 = SYM; v2 = 0; *(_DWORD *)a0 = 0; v3 = *v1; while ( *(unsigned __int8 *)(SYM + 8 * v2) != v3 ) { if ( (unsigned int)++v2 >= 0x10 ) return 0; } *(_DWORD *)a0 = 1; return 0; }", "digest_size_for_alg": "int __fastcall digest_size_for_alg(_DWORD *a0) { int v1; int v2; int v3[6]; char v4; int v5; v5 = *(_DWORD *)SYM; if ( *a0 == 0 ) return SYM - 3; switch ( a0[2] ) { case 0x50000004: v2 = 32; break; case 0x50000005: v2 = 48; break; case 0x50000006: v2 = 64; break; default: return SYM; } if ( a0[1] != v2 ) return SYM + 7; v3[0] = 1; v3[1] = 1; v3[2] = 32; v3[3] = (int)&v4; v3[4] = v2; v3[5] = a0[2]; v1 = ecc_submit_op(v3); if ( v1 == 0 ) memcpy_thunk(*a0); return v1; }", "ret_err_0009_2": "int __fastcall ret_err_0009_2() { return SYM; }", "ret_err_0009_3": "int __fastcall ret_err_0009_3() { return SYM; }", "ret_err_000A_8": "int __fastcall ret_err_000A_8() { return SYM; }", "cert_blob_parse": "int __fastcall cert_blob_parse(unsigned int *a0, unsigned int a1) { int result; int v2; int v3; unsigned int v4; int v5; int v6; unsigned int *v7; result = 0; v2 = 1; v3 = 0; v4 = 0; if ( a1 < 0x204 ) return SYM; v5 = SYM; v6 = SYM; while ( 1 ) { if ( *(_BYTE *)(v5 + v2) == 1 ) { v7 = &a0[2 * v4++]; v7[1] = v2; v7[2] = *(_DWORD *)(v6 + 4 * v2); } ++v2; if ( (unsigned int)++v3 >= 0x61 ) break; if ( v4 >= 0x40 ) { result = SYM; break; } } *a0 = v4; return result; }", "cert_blob_parse2": "int __fastcall cert_blob_parse2(unsigned int *a0, unsigned int a1) { int result; int v2; int v3; unsigned int v4; int v5; int v6; unsigned int *v7; result = 0; v2 = 1; v3 = 0; v4 = 0; if ( a1 < 0x204 ) return SYM; v5 = SYM; v6 = SYM; while ( 1 ) { if ( *(_BYTE *)(v5 + v2) == 1 ) { v7 = &a0[2 * v4++]; v7[1] = v2; v7[2] = *(_DWORD *)(v6 + 4 * v2); } ++v2; if ( (unsigned int)++v3 >= 0x61 ) break; if ( v4 >= 0x40 ) { result = SYM; break; } } *a0 = v4; return result; }", "smu_version_get": "int __fastcall smu_version_get(bool *a0, _BYTE *a1) { int result; int v2; bool *v3; int v4; v4 = 0; *a0 = false; *a1 = 0; result = smu_mailbox_xfer(29, 0, 0, &v4, 0x1388u); v3 = (bool *)SYM; *a1 = v4 & 1; *v3 = (v4 & 2) != 0; if ( result == 0 && *a1 == 1 ) return otp_read_flag(a0, 1, (int)v3, v2); return result; }", "ret_err_0009_4": "int __fastcall ret_err_0009_4() { return SYM; }", "get_chip_id_pair": "int __fastcall get_chip_id_pair(_DWORD *a0, int a1) { int result; _DWORD *v2; result = 0; if ( a1 != 8 ) return SYM; v2 = SYM; *a0 = *((_DWORD *)SYM + 220); a0[1] = v2[221]; return result; }", "tee_ctx_lookup": "int __fastcall tee_ctx_lookup(_DWORD *a0, _DWORD *a1, int a2) { __int64 v3; int v4; _DWORD *v5; _DWORD *v6; unsigned __int8 v7[4]; v7[0] = -1; if ( *(_DWORD *)SYM == 0 ) return SYM; v3 = *((unsigned int *)SYM + 2) + *(_QWORD *)SYM; v4 = map_client_buffer((unsigned __int64)(v3 + 4096) >> 32, v3 + 4096, 0x1000u, v7, &v6, 0, 1, 0xFFFFu); if ( v4 == 0 ) { v5 = v6; if ( a2 != 0 ) { *a0 = *v6; *a1 = v6[16]; } else { *v6 = 0; v5[16] = 0; } } if ( v7[0] != 255 ) __asm { SVC 0x6C ; 'l' } return v4; }", "slot_id_get2": "int __fastcall slot_id_get2(_DWORD *a0) { int result; result = SYM; if ( *SYM != -1 ) { *a0 = *SYM; return 0; } return result; }", "dram_base_get": "int __fastcall dram_base_get(_DWORD *a0) { int v1; int v2; if ( SYM[2] == 0 ) return SYM; v1 = *(_DWORD *)(SYM + 4); v2 = *(_DWORD *)(SYM + 8); *a0 = *(_DWORD *)SYM; a0[1] = v1; a0[2] = v2; return 0; }", "ret_err_0009_5": "int __fastcall ret_err_0009_5() { return SYM; }", "const12_out": "int __fastcall const12_out(int a0) { *(_DWORD *)a0 = 12; return 0; }", "dram_window_describe": "int __fastcall dram_window_describe(int a0, _DWORD *a1, _DWORD *a2, int a3) { int v4; _DWORD *v5; __int64 v6; int v7; _DWORD *v8; unsigned __int8 v9[4]; _DWORD *v10; v4 = SYM; v9[0] = -1; if ( a0 != 0 ) { if ( a0 != 1 ) return SYM; v5 = (_DWORD *)((char *)SYM + 28); } else { v5 = SYM; } if ( *v5 == 0 ) return SYM; v6 = ((unsigned int)(v5[2] + 4095) >> 12 << 12) + *(_QWORD *)SYM; v7 = map_client_buffer((unsigned __int64)(v6 + 4096) >> 32, v6 + 4096, 0x1000u, v9, &v10, 0, 1, 0xFFFFu); if ( v7 == 0 ) { v8 = v10; if ( v10 != nullptr ) { if ( a3 != 0 ) { *a1 = *v10; *a2 = v10[16]; } else { *v10 = 0; v8[16] = 0; } } else { v7 = v4; } } if ( v9[0] != 255 ) __asm { SVC 0x6C ; 'l' } return v7; }", "chip_id_build": "int __fastcall chip_id_build(int a0, int a1) { __int64 v2; int v3; unsigned int v4; _DWORD v5[2]; _BYTE dst[31]; _BYTE v6[33]; int v7; v7 = *(_DWORD *)SYM; bzero_core(dst, 0x40u); v5[0] = 0; v5[1] = 0; v2 = *((_QWORD *)SYM + 110); v3 = SYM; v4 = ((_DWORD)v2 << 24) | ((unsigned int)(v2 >> 8) << 16) & 0xFFFFFF | (unsigned __int16)(HIWORD(*((_DWORD *)SYM + 220)) << 8) | BYTE3(v2); v5[0] = HIBYTE(HIDWORD(v2)) | ((unsigned int)(v2 >> 24) >> 24 << 8) | ((unsigned int)(v2 >> 16) >> 24 << 16) | ((unsigned int)(v2 >> 8) >> 24 << 24); v5[1] = v4; if ( a0 != 0 && a1 == 32 && (HIBYTE(HIDWORD(v2)) | ((unsigned int)(v2 >> 24) >> 24 << 8) | ((unsigned int)(v2 >> 16) >> 24 << 16) | ((unsigned int)(v2 >> 8) >> 24 << 24) | v4) != 0 ) { __asm { SVC 0x66 ; 'f' } v3 = mac_oneshot((unsigned __int8)v6, SYM, (unsigned int)v5, 8u, (unsigned int)v6 & 0xFFFFFFE0, 32); if ( v3 == 0 ) memcpy_thunk(a0); } return v3; }", "sysdrv_vbios_flash_begin": "int __fastcall sysdrv_vbios_flash_begin() { mp_reset_cmd14(); engine_regs_reset(); return engine_reset_all(); }", "ret_err_000A_9": "int __fastcall ret_err_000A_9() { return SYM; }", "status_invalidate": "void *__fastcall status_invalidate() { void *result; result = *SYM; *((_DWORD *)*SYM + 423) = -1; return result; }", "ret_err_000A_10": "int __fastcall ret_err_000A_10() { return SYM; }", "ret_err_000A_11": "int __fastcall ret_err_000A_11() { return SYM; }", "sysdrv_set_value": "int __fastcall sysdrv_set_value(char a0, int a1) { int result; result = 0; if ( (a0 & 8) != 0 ) return object_delete_by_id(a1); return result; }", "sysdrv_set_dram_info": "int __fastcall sysdrv_set_dram_info(_DWORD *a0, int a1) { int v2; int v3; int v4; v2 = 0; v3 = *((_DWORD *)SYM + 554); if ( v3 << 31 == 0 ) return SYM; if ( (v3 & 2) != 0 ) { v4 = golia_log_timestamped(a0[3], a0 + 1, a0 + 2, a1); if ( v4 != 0 ) return v4; } return v2; }", "sysdrv_platform_notify": "int __fastcall sysdrv_platform_notify(int a0, int a1) { int v2; __int64 v3; bzero_core(&v3, 0x44u); v2 = golia_log_write((unsigned int)&v3, 1, a1); if ( v2 == 0 ) { *(_DWORD *)a0 = *((_DWORD *)SYM + 554); *(_QWORD *)(a0 + 4) = v3; if ( *(_DWORD *)(a0 + 16) >= 0x3Cu ) memcpy_thunk(*(_DWORD *)(a0 + 12)); else return SYM; } return v2; }", "sysdrv_feature_commit": "int __fastcall sysdrv_feature_commit(_DWORD *a0) { int v1; if ( a0 == nullptr ) return SYM; *a0 = 0; v1 = (unsigned __int8)*SYM; if ( (v1 == 35 || v1 == 53) && (*((_DWORD *)*SYM + 10) & 0x1000) != 0 ) *a0 = 1; return 0; }", "key_unwrap_alt": "int __fastcall key_unwrap_alt(_DWORD *a0, int a1) { _DWORD v2[7]; int v3; char v4; int v5; v5 = *(_DWORD *)SYM; bzero((void *)((unsigned int)&v4 & 0xFFFFFFE0), 0xE0u); v2[0] = *a0; return kdf_derive_key_hkdf(a1, (char *)a0[1], (int)v2, 4, a0[2], a0[3], (int)&v3); }", "sysdrv_set_rsm_info": "int __fastcall sysdrv_set_rsm_info(unsigned int a0) { unsigned int v1; int v2; int v3; int result; int v4; int v5; int v6; int v7; int v8; int v9; int v10; int v11; int v12; int v13; v1 = 0; v12 = 0; v13 = 0; bzero_core(&v10, 0x28u); if ( fuse_read_pair(&v12, &v13, v2, v3) != 0 ) return SYM; if ( v12 != 0 ) v4 = 0; else v4 = (unsigned __int16)a0 >> 12; v5 = v4; if ( v13 != 0 ) v6 = 0; else v6 = (unsigned __int8)a0; if ( (a0 & 0x20000) == 0 ) v1 = (a0 >> 8) & 0xF; if ( (a0 & 0x40000) == 0 || (v11 = 1, (result = psb_process_config_entry(2u, (int)&v10, 0)) == 0) ) { v11 = ((8 * v6) | (v5 << 11) | (v1 << 15) | (2 * ((a0 & 0x20000) != 0)) | (4 * ((a0 & 0x10000) != 0))) + 1; result = psb_process_config_entry(1u, (int)&v10, 1); if ( result == 0 ) return fuse_read_config(0, v7, v8, v9); } return result; }", "fuse_feature_check": "int __fastcall fuse_feature_check(unsigned int a0) { int otp_block; unsigned int v1; int v2; int v3; int v4; int v5; unsigned __int64 v6; unsigned __int64 dst; int v7; int v8; int v9; int v10; otp_block = read_otp_block((int *)&dst, 0x11E0u, 64); if ( otp_block == 0 ) { if ( ((HIDWORD(dst) | (((unsigned int)dst | HIDWORD(dst)) >> 16)) & 0x10) != 0 || (bzero_core(&dst, 0x18u), v1 = bitmap_apply_for_each_bit(1u, 1u, 244, 3, 16, (int)&dst), (otp_block = apply_reg_range(143, v1, (int)&dst)) == 0) ) { if ( a0 < 0x40 ) { v4 = shl_saturating(1, 0, a0); v2 = v4 - 1; v3 = (v4 != 0) + v5 - 1; } else { v2 = -1; v3 = -1; } otp_block = read_otp_block((int *)&dst, 0x1160u, 192); if ( otp_block == 0 ) { LODWORD(dst) = dst | HIDWORD(dst) | v7; HIDWORD(dst) = v8 | v9 | v10; v6 = dst; bzero_core(&dst, 0x18u); v7 = v2; v8 = v3; LODWORD(dst) = v2; v10 = v3; HIDWORD(dst) = v2; v9 = v3; if ( v6 < __PAIR64__(v3, v2) ) return apply_reg_range(139, 6u, (int)&dst); } } } return otp_block; }", "ret_err_000A_12": "int __fastcall ret_err_000A_12() { return SYM; }", "sysdrv_tee_query_32": "int __fastcall sysdrv_tee_query_32(unsigned int a0, unsigned int a1, unsigned int a2, int a3, unsigned int *a4) { _DWORD *v5; int v6; unsigned int v7; int v8; int v9; unsigned __int8 v10[4]; int v11; int v12; int v13; int v14; unsigned int v15; unsigned int v16; unsigned int v17; int v18; v15 = a0; v16 = a1; v17 = a2; v18 = a3; v5 = SYM; v8 = 0; v9 = 0; v10[0] = -1; if ( a2 <= 0xFF ) return SYM; if ( get_default_ring() == 0xFFFF ) { v6 = map_client_buffer(v16, v15, a2, v10, &v14, 0, 1, 0xFFFFu); if ( v6 == 0 ) { __asm { SVC 0x6D ; 'm' } v6 = v10[0]; if ( v10[0] == 0 ) { __asm { SVC 0x79 ; 'y' } v6 = verify_image_signature(0x18u, (int)v5, 0x700u, 0, 0, 0, a2, &v8, &v9, &v11, (int)&v12, &v13); if ( v6 == 0 ) { bzero_core((void *)SYM, 0x80u); *a4 = (region_size_lookup(36) + 4 * (v5[140] & 0x1FFFFFF) + 10485760) & 0xFFF00000; if ( get_dpm_index() != 0 ) { flash_caps_update(); *SYM[0] = *a4; *a4 += platform_region_size(13); v7 = platform_region_size(58) + *a4; *a4 = v7; } else { v7 = *a4; } *SYM = v7; *((_BYTE *)SYM + 24) = 1; fuse_write_thunk(v11, 24, v13, 0xFFFF, 255, 2, 2, v12); } } } } else { v6 = SYM - 6; } if ( v10[0] != 255 ) __asm { SVC 0x6C ; 'l' } return v6; }", "sysdrv_tee_load_firmware": "int __fastcall sysdrv_tee_load_firmware(__int64 *a0) { int v1; __int64 v2; _DWORD *v3; _DWORD *v4; int v5; unsigned int v6; int qword; int v7; int v8; int v9; int v10; unsigned int v11; int v12; int v13; int v14; __int64 v15; int v16; int v17; int v18; int v19; int v20; int v21; _DWORD *v22; int v23; int v24; int v25; int v26; int v27; _DWORD *v28; _DWORD *v29; unsigned int v30; _DWORD *v31; int v32; __int64 v33; unsigned int v34; int v35; unsigned int v36; int v37; unsigned int v38; int a39; int v40; int v41; int v42; int v43; int v44; int v45[2]; unsigned int v46; _BYTE v47[8]; _BYTE v48[12]; _DWORD dst[5]; int v49; int v50[2]; v1 = 0; v46 = 0; v33 = 0; v34 = 0; v35 = 0; v48[0] = -1; v36 = 0; v38 = 0; v40 = 0; v41 = 0; v37 = 0; v47[0] = 1; a39 = 0; v42 = 0; v43 = 0; v44 = 0; v45[0] = 0; v2 = *a0; v4 = *((_DWORD **)a0 + 3); v3 = *((_DWORD **)a0 + 2); v5 = *((_DWORD *)a0 + 1); v6 = *(_DWORD *)(*(_DWORD *)a0 + 12); log_event(1u, v6); log_event(2u, (int)v4); if ( v6 >= 0x62 ) { qword = SYM; goto LABEL_79; } if ( v6 != 49 && v6 != 50 && v6 != 85 && *(_DWORD *)(v2 + 8) <= 0xFFu ) { qword = SYM; goto LABEL_79; } v7 = SYM - 6; if ( v4 != (_DWORD *)((unsigned int)(SYM - 6) >> 16) && fw_type_is_known(v6) == 0 ) goto LABEL_34; if ( v6 == 64 ) { v8 = fifo_init(v2, (int)v3); goto LABEL_41; } if ( v6 != 60 || ccp_field6_get() == 1 ) { v31 = v3; v32 = -9; v9 = map_client_buffer(*(_DWORD *)(v2 + 4), *(_DWORD *)v2, *(_DWORD *)(v2 + 8), v48, v50, 0, 1, (unsigned int)v4); } else { v30 = (unsigned int)v3; v29 = v4; v9 = map_client_buffer_ro(*(_DWORD *)(v2 + 4), *(_DWORD *)v2, *(_DWORD *)(v2 + 8), v48, v50); } qword = v9; if ( v9 != 0 ) goto LABEL_79; __asm { SVC 0x6D ; 'm' } qword = v48[0]; if ( v48[0] != 0 ) goto LABEL_79; if ( v6 != 18 ) { if ( v6 != 13 && v6 != 58 || *(unsigned __int8 *)(v50[0] + 160) << 31 != 0 ) goto LABEL_28; LABEL_34: qword = v7; goto LABEL_79; } v1 = platform_mode_get(*(_DWORD *)(v50[0] + 96)); if ( v1 != 0 ) { power_rail_enable(); goto LABEL_79; } v29 = nullptr; __asm { SVC 0x7B ; '{' } LABEL_28: if ( v4 == (_DWORD *)0xFFFF ) { switch ( v6 ) { case '1': v13 = 0; break; case '2': v13 = 1; break; case 'U': v8 = buffer_copy_bounded(v50[0], *(_DWORD *)(v2 + 8)); LABEL_41: qword = v8; goto LABEL_79; default: goto LABEL_32; } v14 = loadfw_engine_step(v13); qword = v14; if ( v14 != 0 ) { log_event(0xCu, v14); goto LABEL_79; } v8 = vf_table_lookup(v6, v50[0], *(_DWORD *)(v2 + 8)); goto LABEL_41; } LABEL_32: v10 = opcode_to_index(v6); v11 = v10; if ( v10 != 0 ) { v29 = &v46; v12 = region_info_get(v10, (int)v4, v47, &v33, &v36); } else { HIDWORD(v15) = &v33; LODWORD(v15) = v47; v12 = loadfw_iterate_entries(v6, (int)v4, v15, &v36, &v37, (int *)&v46, &v35, &v41); } qword = v12; if ( v12 == 0 ) { if ( v47[0] != 0 ) { if ( v6 != 60 && *(_QWORD *)SYM == 0 ) { qword = SYM; goto LABEL_79; } bzero_core(dst, 0x18u); dst[0] = HIDWORD(v33); dst[1] = v33; dst[2] = v36; dst[3] = 0; if ( v11 != 0 ) v16 = 0xFFFF; else v16 = (int)v4; v49 = v16; if ( v6 == 13 || v6 == 58 ) v49 = 0xFFFF; dst[4] = 0; __asm { SVC 0x89 } if ( &v28 != (_DWORD **)-116 ) { qword = SYM - 16; goto LABEL_79; } v46 = v34; } qword = verify_image_signature( v6, v46, v36, v41, v38, v50[0], *(_DWORD *)(v2 + 8), &a39, &v40, &v42, (int)&v43, &v44); if ( qword == 0 ) { qword = ret_zero_4(); if ( qword == 0 ) { if ( v6 == 5 ) { find_default_key_record(); } else if ( v6 == 60 ) { qword = log_region_map(v46, a39); if ( qword != 0 ) goto LABEL_79; } if ( v47[0] != 0 ) { *(_QWORD *)(v5 + 8) = v33; nop_hook_vf(); ring_owner_check(v6, v33, v46, v40, (unsigned int)v4, v47[0]); } if ( v6 == 73 ) { qword = smu_mailbox_xfer(27, 1, 0, v45, 0x3E8u); if ( dram_scratch_map(v45[0], v17, v18, v19) == 0 ) { qword = page_map_read_qword(v46, v40, v45[0], v20); if ( qword == 0 ) qword = smu_mailbox_xfer(26, 1, 0, v45, 0x3E8u); } __asm { SVC 0x8A } } if ( v11 != 0 && v11 <= 0x24 ) { if ( v4 == (_DWORD *)0xFFFF ) v21 = 15; else v21 = (int)v4; v22 = (_DWORD *)(SYM + 8 * v21); v23 = v22[1] | (1 << v11 >> 31); *v22 |= 1 << v11; v22[1] = v23; } } } } LABEL_79: if ( v35 != 0 ) __asm { SVC 0x7E ; '~' } if ( v34 != 0 ) __asm { SVC 0x8A } if ( v48[0] != 255 ) __asm { SVC 0x6C ; 'l' } if ( v1 != 0 ) { qword = smu_mailbox_xfer(27, 1, 0, v45, 0x3E8u); dram_scratch_map(v45[0], v24, v25, v26); } else if ( qword == 0 ) { nop_hook_spi(); if ( v47[0] != 0 ) fuse_write_thunk(v42, v6, v44, (unsigned __int16)v4, 255, 2, 2, v43, v31, v32); else fuse_write_thunk(v42, v6, v44, (unsigned __int16)v4, 255, 2, 1, v43, v31, v32); qword = loadfw_validate_type(v6, (int)v4, a39, v27); } nop_hook_flash(); log_event(3u, qword); return qword; }", "tee_state_check": "int __fastcall tee_state_check(int a0) { int v1; unsigned __int16 *v2; unsigned int v3; _DWORD *v4; int v5; v5 = 0; if ( *SYM[0] == 24 ) return SYM; if ( *SYM == 0 ) return SYM - 3; v1 = curve_table_find(a0, (int)&v5); if ( v1 == 0 ) { v2 = (unsigned __int16 *)(v5 + 256); if ( v5 + 256 + *(_DWORD *)(v5 + 20) <= (unsigned int)SYM ) { __asm { SVC 0x7D ; '}' } if ( SYM != nullptr ) { v3 = *(_DWORD *)(v5 + 20); v4 = (_DWORD *)((char *)SYM + 4); *(_DWORD *)SYM = 49152; copy_words_swapped(v2, v4, v3); __asm { SVC 0x7E ; '~' } } else { return SYM - 7; } } else { return SYM - 6; } } return v1; }", "sysdrv_register_range": "int __fastcall sysdrv_register_range(unsigned int *a0) { int v1; int v2; unsigned int v3; __int64 v4; __int64 v5; int v6; __int64 v7; unsigned int v8; int v9; int v10; int v11; unsigned int v12; int v13; unsigned int v14; int v15; _DWORD v16[5]; unsigned __int8 v17[4]; unsigned __int8 v18[4]; int v19; int v20; int v21; char v22; int v23; v23 = *(_DWORD *)SYM; v17[0] = -1; v18[0] = -1; v21 = 0; __asm { SVC 0x66 ; 'f' } v20 = 255; v12 = a0[5]; v1 = SYM; if ( a0[2] <= 0xFF ) { v2 = SYM; goto LABEL_20; } LODWORD(v7) = a0[1]; HIDWORD(v7) = *a0; v10 = 104; v8 = a0[2]; v9 = 0; v2 = spirom_xfer(&v7, 1); if ( v2 == 0 ) { v3 = v11; LODWORD(v4) = 6291456; HIDWORD(v4) = a0[3]; v5 = v4 + a0[4]; if ( v12 >= 0xA00000 ) { v7 = v5; v10 = 107; v8 = 0x400000; v9 = 0; v2 = spirom_xfer(&v7, 1); if ( v2 != 0 || (*SYM = v11, (v2 = map_client_buffer(*a0, a0[1], a0[2], v17, &v15, 0, 0, 0xFFFFu)) != 0) ) { LABEL_18: if ( v3 != 255 ) fw_slot_operation(v3, 0, 1); goto LABEL_20; } v6 = v15; v14 = *(_DWORD *)(v15 + 84); if ( a0[2] - 256 > v14 ) { if ( *(_DWORD *)(v15 + 96) == *((_DWORD *)SYM + 581) ) { v2 = map_client_buffer(a0[3], a0[4], v12, v18, &v13, 0, 0, 0xFFFFu); if ( v2 == 0 ) { __asm { SVC 0x79 ; 'y' } v16[0] = v15; v16[1] = a0[2]; v16[2] = &v22; v16[3] = 32; v16[4] = &v21; v2 = sysdrv_verify_signed_image((int)v16, 0, v20, 0); if ( v2 == 0 ) { v2 = crypto_aligned_op(v15 + 256, v14, v13, v12, &v19); if ( v2 == 0 && *(_DWORD *)(v6 + 80) != v19 ) v2 = SYM + 1; } } } else { v2 = SYM - 1; } goto LABEL_18; } } v2 = v1; goto LABEL_18; } LABEL_20: if ( v17[0] != 255 ) __asm { SVC 0x6C ; 'l' } if ( v18[0] != 255 ) __asm { SVC 0x6C ; 'l' } return v2; }", "ret_err_000A_13": "int __fastcall ret_err_000A_13() { return SYM; }", "ret_err_000A_14": "int __fastcall ret_err_000A_14() { return SYM; }", "shared_buffer_map": "int __fastcall shared_buffer_map(_DWORD *a0) { int result; unsigned __int8 v1[4]; int v2; v1[0] = -1; result = map_client_buffer(*((_DWORD *)SYM + 502), *((_DWORD *)SYM + 501), 0, v1, &v2, 0, 0, 0xFFFFu); if ( result == 0 ) { a0[1] = v2; *a0 = v1[0]; } return result; }", "ret_err_000A_15": "int __fastcall ret_err_000A_15() { return SYM; }", "ret_err_000A_16": "int __fastcall ret_err_000A_16() { return SYM; }", "stub_svc8F": "int __fastcall stub_svc8F(int a0, int a1, unsigned int a2) { int v3; v3 = SYM; if ( a1 == 112 ) { if ( a2 <= 2 ) { LABEL_5: __asm { SVC 0x8F } return 65534; } } else if ( a1 == 116 ) { goto LABEL_5; } return v3; }", "mp_reset_cmd14": "int __fastcall mp_reset_cmd14() { return mp_reset_sequence(14, 0, 0, 0, 50); }", "psb_entry_apply": "int __fastcall psb_entry_apply(unsigned int a0) { int result; int v1; int v2; int v3; _BYTE v4[40]; memcpy_thunk((int)v4); result = psb_process_config_entry(a0, (int)v4, 0); if ( result == 0 ) return fuse_read_config(0, v1, v2, v3); return result; }", "client_buffer_validate": "int __fastcall client_buffer_validate(int a0, int a1, unsigned int a2) { int v3; int v4; ccp_desc_t d; __asm { SVC 0x79 ; 'y' } if ( a0 == -1 ) return SYM; __asm { SVC 0x79 ; 'y' } if ( a1 == -1 ) return SYM; if ( a2 < 0x2000 ) __asm { SVC 0x68 ; 'h' } __asm { SVC 0x68 ; 'h' } if ( ccp_desc_passthru(&d, a0, a1, a2, 1) != 0 ) return SYM - 6; else return crypto_wait_completion((int)&d, 1, v3, v4); }", "client_range_validate": "int __fastcall client_range_validate(int a0, int a1, int a2, int a3) { int v4; int v5; int v6; int v7; ccp_desc_t d; int v8; v4 = 0; __asm { SVC 0x79 ; 'y' } v5 = SYM; if ( a0 != -1 ) { __asm { SVC 0x79 ; 'y' } if ( a1 != -1 ) { v5 = SYM - 6; if ( a3 != 0 ) { if ( ccp_desc_passthru(&d, a0, a1, a2, 0) == 0 ) { __asm { SVC 0x5E ; '^' } if ( crypto_queue_prepare(0, &v8, (int)&d, 1) != 0 ) v4 = v5; __asm { SVC 0x5F ; '_' } return v4; } } else if ( ccp_desc_passthru(&d, a0, a1, a2, 1) == 0 ) { return crypto_wait_completion((int)&d, 1, v6, v7); } } } return v5; }", "engine_regs_reset": "__int64 __fastcall engine_regs_reset() { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } return (unsigned int)SYM | 0x6000000000LL; }", "sysdrv_tee_cmd48_nop": "int __fastcall sysdrv_tee_cmd48_nop() { return 0; }", "ret_err_000A_17": "int __fastcall ret_err_000A_17() { return SYM; }", "ret_zero_2": "int __fastcall ret_zero_2() { return 0; }", "ta_slot_acquire": "int __fastcall ta_slot_acquire(unsigned int a0, int *a1, int a2, int a3) { char *v4; int v5; int *v6; unsigned int v7; int result; int v8; int v9; int v10; int v11; int v12; _BYTE v13[8]; v4 = SYM; v5 = 0; v6 = (int *)SYM[0]; v12 = 0; v7 = 0; if ( SYM[4] != 0 || SYM[3] == 0 && platform_rev_match() != 0 ) { *a1 = 94; result = *v6; *(_DWORD *)(*v6 + 124) |= 0xD0000u; return result; } result = (unsigned __int8)v4[2]; if ( v4[2] == 0 ) { if ( (*((_DWORD *)*SYM + 10) & 4) == 0 ) { *v4 = 1; v5 = 82; v4[1] = 1; result = *v6; *(_DWORD *)(*v6 + 124) |= 0xC0000u; goto LABEL_7; } v8 = a0 >> 8; result = a0 & 7; v9 = (unsigned __int8)a0 >> 3; if ( a0 != 0 ) { v10 = (v8 << 20) | (v9 << 15); result = map_client_buffer(0xFFFEu, v10 | (result << 12) | 0x10000000, 4u, v13, &v12, 1, 0, 0xFFFFu); if ( result != 0 ) { LABEL_11: v5 = 78; goto LABEL_22; } v11 = HIWORD(*(_DWORD *)v12); __asm { SVC 0x6C ; 'l' } if ( soc_supports_feature(v11) != 0 ) { *v4 = soc_supports_feature2(v11); v4[1] = soc_supports_feature3(v11); v4[5] = 0; result = map_client_buffer(0xFFFEu, v10 | 0x10002000, 0x100u, v13, &v12, 1, 0, 0xFFFFu); if ( result == 0 ) { while ( 1 ) { if ( v4[2] != 0 ) { v8 = v11 | 0xA0000; v9 = *(_DWORD *)(*v6 + 124) | v11 | 0xA0000; *(_DWORD *)(*v6 + 124) = v9; v5 = 79; goto LABEL_21; } if ( v7 >= 0x64 ) break; ++v7; v4[2] = boot_measure_record(v12); } v5 = 80; LABEL_21: result = v13[0]; __asm { SVC 0x6C ; 'l' } if ( v5 == 79 ) goto LABEL_7; goto LABEL_22; } goto LABEL_11; } result = *v6; v5 = 77; v9 = *(_DWORD *)(*v6 + 124) | 0x4000000; *(_DWORD *)(*v6 + 124) = v9; } LABEL_22: result = caps_to_mode(result, v9, v8, a3); if ( result != 0 ) { v5 = 79; v4[2] = 1; } goto LABEL_7; } v5 = 82; LABEL_7: *a1 = v5; return result; }", "sysdrv_get_fw_state": "int __fastcall sysdrv_get_fw_state(int *a0, int a1) { int v2; int result; result = 0; *a0 = 1; if ( a1 == 64 ) { if ( *((_DWORD *)SYM + 2) != 0 ) { if ( *SYM == 1 ) { v2 = 2; } else if ( *((_DWORD *)SYM + 1) != 0 ) { v2 = 4; } else { v2 = 3; } } else { v2 = 1; } *a0 = v2; return 0; } return result; }", "sysdrv_boot_done_notify": "int __fastcall sysdrv_boot_done_notify(_DWORD *a0) { _DWORD *v1; int result; v1 = SYM; result = svc_notify_stub(*(_DWORD *)SYM, *((_DWORD *)SYM + 1)); if ( result == 0 ) { result = svc_notify_stub(*(v1 - 6), *(v1 - 5)); if ( result == 0 ) { result = svc_notify_stub(v1[6], v1[7]); if ( result == 0 ) *a0 = *(v1 - 1) != 0 || v1[5] != 0 || v1[11] != 0; } } return result; }", "sysdrv_mbox_hash_op": "int __fastcall sysdrv_mbox_hash_op() { int v0; int v1; int v2; _DWORD v3[4]; int v4; unsigned int v5; int v6; int v7; int v8; int v9; _BYTE dst[31]; _BYTE v10[33]; _BYTE v11[31]; _BYTE v12[33]; _BYTE b[32]; _BYTE v13[32]; int v14; v14 = *(_DWORD *)SYM; v0 = 0; if ( *SYM != 0 ) { bzero_core(dst, 0x40u); bzero_core(v11, 0x40u); __asm { SVC 0x66 ; 'f' } v9 = (unsigned __int8)v12; memcpy_thunk((unsigned int)v12 & 0xFFFFFFE0); v1 = SYM; v3[0] = 4; v3[1] = 1; v3[2] = 128; v3[3] = (unsigned int)v12 & 0xFFFFFFE0; v4 = 32; v5 = (unsigned int)v10 & 0xFFFFFFE0; v6 = 0; v7 = 0; v8 = SYM; v0 = crypto_submit_op(v3); if ( v0 == 0 ) { v0 = hmac_sha256( v9, SYM, (unsigned int)v10 & 0xFFFFFFE0, 32, (int)&(*SYM)[24] + 3, 64, (int)v13, 32); if ( v0 == 0 ) { v2 = SYM; v0 = hmac_sha256(v9, SYM, (int)v13, 32, SYM, 16, (int)b, 32); if ( v0 == 0 ) { if ( ct_memcmp((const void *)(v2 + 16), b, 0x20u) != 0 ) { return SYM; } else { v3[0] = 4; v3[1] = 1; v3[2] = 128; v3[3] = v2; v6 = 0; v7 = 1; v4 = 32; v5 = (unsigned int)v10 & 0xFFFFFFE0; v8 = v1; crypto_submit_op(v3); bzero((void *)(((unsigned int)v10 & 0xFFFFFFE0) + 16), 0x10u); buf_reverse_inplace((void *)((unsigned int)v10 & 0xFFFFFFE0), 0x10u); v0 = client_handle_validate((unsigned int)v10 & 0xFFFFFFE0, 4, 32); bzero((void *)((unsigned int)v10 & 0xFFFFFFE0), 0x10u); } } } } } return v0; }", "ret_err_000A_18": "int __fastcall ret_err_000A_18() { return SYM; }", "buffer_triplet_check": "int __fastcall buffer_triplet_check(_DWORD *a0, _DWORD *a1, int a2, unsigned int a3) { _DWORD *v4; if ( a0 == nullptr || a1 == nullptr || a2 == 0 ) return SYM; v4 = SYM; *a0 = *((_DWORD *)SYM + 525); *a1 = v4[591]; if ( a3 < 0x10 ) return SYM; memcpy_thunk(a2); return 0; }", "scratch_map_sized": "int __fastcall scratch_map_sized(int a0) { if ( *(_DWORD *)(a0 + 4) >= 0x20000u ) return map_region_pages(8060928, 0x20000u, *(_DWORD *)a0); else return SYM; }", "ret_err_000A_19": "int __fastcall ret_err_000A_19() { return SYM; }", "ret_err_000A_20": "int __fastcall ret_err_000A_20() { return SYM; }", "slot_index_validate": "int __fastcall slot_index_validate(unsigned int *a0) { unsigned int v1; int v2; v1 = *a0; if ( *a0 > 0xF ) return SYM; v2 = (int)*SYM; if ( a0[2] != 0 ) a0[1] = *(_DWORD *)(v2 + 4 * v1 + 1280); else *(_DWORD *)(v2 + 4 * v1 + 1280) = a0[1]; return 0; }", "slot_value_get": "int __fastcall slot_value_get(_DWORD *a0) { int v1; v1 = (int)*SYM; if ( a0[1] != 0 ) *a0 = *(_DWORD *)(v1 + 216); else *(_DWORD *)(v1 + 216) = *a0; return 0; }", "ret_err_000A_21": "int __fastcall ret_err_000A_21() { return SYM; }", "ret_err_000A_22": "int __fastcall ret_err_000A_22() { return SYM; }", "sysdrv_key_op_unsupported": "int __fastcall sysdrv_key_op_unsupported() { return SYM; }", "ret_err_000A_23": "int __fastcall ret_err_000A_23() { return SYM; }", "object_alloc_type7": "int __fastcall object_alloc_type7(_DWORD *a0) { if ( *a0 != 7 ) return SYM; __asm { SVC 0x59 ; 'Y' } a0[1] = 39; return 0; }", "fw_slot_operation": "int __fastcall fw_slot_operation(unsigned int a0, unsigned __int8 a1, int a2) { _DWORD *v3; int v4; int v5; unsigned int v6; int v7; unsigned int v8; int v9; unsigned int v10; unsigned int v11; int v12; int v13; _DWORD v14[6]; int v15; v3 = nullptr; v4 = a1; v15 = 0; v11 = 0; v12 = 0; v13 = 0; if ( a0 >= 0x10 ) return SYM; v5 = SYM; if ( *(_DWORD *)(SYM + 8 * a0) == 255 ) return SYM; if ( a2 == 0 ) goto LABEL_28; __asm { SVC 0x5E ; '^' } v3 = (_DWORD *)flash_access_acquire(1000); if ( v3 == nullptr ) { LABEL_28: pcie_port_reg_read(a0, 8, (int)&v12); if ( v12 << 31 != 0 ) { if ( a2 == 0 ) goto LABEL_10; __asm { SVC 0x66 ; 'f' } if ( *(_DWORD *)(v5 + 8 * a0) == 0 ) { LABEL_10: _ZF = v4 == 0; v6 = SYM + 8 * a0; if ( !_ZF ) { pcie_port_reg_read(a0, 0, (int)&v11); v7 = v11 << 16; v8 = HIWORD(v11); pcie_port_reg_read(a0, 4, (int)&v11); v14[0] = v8; v9 = ((v11 + 1) << 16) - v7; v14[5] = 0xFFFF; v14[1] = v7; v14[2] = v9; v14[3] = 0; v14[4] = 1; __asm { SVC 0x89 } v3 = v14; if ( &v11 != (unsigned int *)-12 ) goto LABEL_16; v3 = (_DWORD *)ecc_point_op(v13, 0, v9); if ( v3 != nullptr ) goto LABEL_16; v10 = *(_DWORD *)(v6 + 4); if ( v10 < 0x62 ) *(_BYTE *)(SYM + v10) = 0; } pcie_port_reg_write(a0, 8, 0); pcie_port_reg_write(a0, 12, 0); pcie_port_reg_write(a0, 4, 0); pcie_port_reg_write(a0, 0, 0); *(_DWORD *)(v5 + 8 * a0) = 255; *(_DWORD *)(v6 + 4) = 0; } } } LABEL_16: if ( v13 != 0 ) __asm { SVC 0x8A } if ( a2 != 0 ) { if ( v3 != (_DWORD *)SYM && v3 != (_DWORD *)(SYM + 1) ) v15 = flash_access_release(1000); if ( v3 == nullptr ) v3 = (_DWORD *)v15; __asm { SVC 0x5F ; '_' } } return (int)v3; }", "ret_err_000A_24": "int __fastcall ret_err_000A_24() { return SYM; }", "ret_err_000A_25": "int __fastcall ret_err_000A_25() { return SYM; }", "sysdrv_c2p_hook": "int __fastcall sysdrv_c2p_hook(char a0, int a1, int a2, int a3) { int result; unsigned int v4; v4 = 4; result = otp_read_u32(&v4, a1, a2, a3); if ( result == 0 ) { if ( v4 < 4 ) return fuse_program_bits(0x97u, 1 << a0 << (4 * v4)); else return SYM; } return result; }", "sysdrv_mbox_query_58": "int __fastcall sysdrv_mbox_query_58(int *a0, int a1, int a2, int a3) { int *v4; int v5; int *v6; _DWORD *v7; int *v8; int v9; unsigned int i; int v10; int v11; int v12; int v13; unsigned int j; int v14; _BYTE v15[408]; v4 = SYM[0]; v5 = 0; v6 = SYM; if ( *((unsigned __int8 *)a0 + 4) << 31 != 0 ) { *SYM[0] = 4; *v6 = 0; } else { *v4 = reg_read_stub(); } v7 = SYM; v8 = (int *)SYM; v9 = *a0; if ( *((_BYTE *)a0 + 8) != 0 ) { if ( v9 == 16 ) { if ( *v4 != 4 ) { vf_reg_setup(11); if ( *v4 == 2 ) vf_reg_setup(47); } vf_reg_setup(18); vf_reg_setup(41); v11 = 40; goto LABEL_25; } memcpy(v15, SYM, sizeof(v15)); foreach_instance_indexed(0, (int)v15, 17); for ( i = 0; i < 0x51; ++i ) { v10 = *((unsigned __int16 *)v8 + i); if ( *((_WORD *)v8 + i) != 0 && v10 != 11 ) vf_bringup_step(v10); } if ( *v4 != 4 ) { vf_reg_setup(11); if ( *v4 == 2 ) vf_reg_setup(47); } if ( v7[556] != 0 ) vf_reg_setup(170); if ( *(unsigned __int8 *)v6 << 31 != 0 ) vf_reg_setup(12); if ( (*(_BYTE *)v6 & 2) != 0 ) { v11 = 276; LABEL_25: vf_reg_setup(v11); return v5; } return v5; } if ( (v9 & 0xE2) != 0 ) { memcpy(v15, SYM, 0xD8u); foreach_enabled_instance(0, (int)v15, 9u); reg_write_vf_slot(34); reg_write_vf_slot(35); reg_write_vf_slot(128); reg_write_vf_slot(41); reg_write_vf_slot(346); reg_write_vf_slot(40); if ( *(unsigned __int8 *)v6 << 31 != 0 ) reg_write_vf_slot(12); if ( (*(_BYTE *)v6 & 2) != 0 ) reg_write_vf_slot(276); reg_write_vf_slot(46); reg_write_vf_slot(18); reg_write_vf_slot(15); v12 = 16; LABEL_46: reg_write_vf_slot(v12); if ( *v4 == 4 ) return v5; reg_write_vf_slot(11); if ( *v4 != 2 ) return v5; v13 = 47; LABEL_73: reg_write_vf_slot(v13); return v5; } switch ( v9 ) { case 1: case 4: memcpy(v15, &(*SYM)[54], 0xD8u); foreach_enabled_instance(0, (int)v15, 9u); reg_write_vf_slot(34); reg_write_vf_slot(35); reg_write_vf_slot(128); reg_write_vf_slot(41); reg_write_vf_slot(346); reg_write_vf_slot(40); if ( *(unsigned __int8 *)v6 << 31 != 0 ) reg_write_vf_slot(12); if ( (*(_BYTE *)v6 & 2) != 0 ) reg_write_vf_slot(276); reg_write_vf_slot(46); reg_write_vf_slot(18); reg_write_vf_slot(15); reg_write_vf_slot(16); reg_write_vf_slot(108); v12 = 309; goto LABEL_46; case 8: memcpy(v15, SYM, 0xD8u); foreach_enabled_instance(0, (int)v15, 9u); reg_write_vf_slot(34); reg_write_vf_slot(35); reg_write_vf_slot(128); reg_write_vf_slot(41); reg_write_vf_slot(346); reg_write_vf_slot(40); if ( *(unsigned __int8 *)v6 << 31 != 0 ) reg_write_vf_slot(12); if ( (*(_BYTE *)v6 & 2) != 0 ) reg_write_vf_slot(276); reg_write_vf_slot(46); reg_write_vf_slot(18); reg_write_vf_slot(15); v13 = 16; goto LABEL_73; case 16: if ( *v4 != 4 ) { reg_write_vf_slot(11); if ( *v4 == 2 ) reg_write_vf_slot(47); } reg_write_vf_slot(18); reg_write_vf_slot(41); v13 = 40; goto LABEL_73; default: break; } if ( v9 != 256 ) return SYM; memcpy(v15, (char *)SYM + 216, 0xD8u); foreach_enabled_instance(0, (int)v15, 9u); for ( j = 0; j < 0x51; ++j ) { v14 = *((unsigned __int16 *)v8 + j); if ( *((_WORD *)v8 + j) != 0 && v14 != 11 ) reg_write_vf_slot(v14); } if ( *v4 != 4 ) { reg_write_vf_slot(11); if ( *v4 == 2 ) reg_write_vf_slot(47); } if ( v7[556] != 0 ) reg_write_vf_slot(170); if ( *(unsigned __int8 *)v6 << 31 != 0 ) reg_write_vf_slot(12); if ( (*(_BYTE *)v6 & 2) != 0 ) { v13 = 276; goto LABEL_73; } return v5; }", "ret_err_000A_26": "int __fastcall ret_err_000A_26() { return SYM; }", "key_blob_fetch": "int __fastcall key_blob_fetch(int a0, unsigned int a1, int *a2) { int v3; int v4; char *v5; char v6; unsigned __int8 dst; _BYTE v7[67]; _BYTE v8[68]; int v9; int v10; int v11; unsigned int v12; int *v13; v11 = a0; v12 = a1; v13 = a2; v9 = *(_DWORD *)SYM; v3 = 0; if ( a1 > 0x40 ) return SYM; v5 = SYM; if ( SYM[1] != 1 ) { v4 = reg_probe(SYM - 1, SYM); if ( v4 == 0 ) { __asm { SVC 0x7B ; '{' } v4 = SYM; if ( SYM == 0 ) { __asm { SVC 0x7B ; '{' } v4 = 1; } } goto LABEL_14; } if ( *SYM != 0 ) { LABEL_11: __asm { SVC 0x7D ; '}' } v3 = -1; v4 = fifo_cmd_setup((_DWORD *)0xFFFFFFFF, 632, 820); if ( v4 == 0 ) { v10 = *(_DWORD *)SYM; bzero_core(&dst, 0x44u); dst = 100; memcpy_thunk((int)v7); v6 = crc16_ccitt(&dst, a1 + 1); memcpy_thunk((int)v8); v8[a1] = v6; v4 = fifo_write_bytes((_DWORD *)0xFFFFFFFF, (int)v8, a1 + 1); if ( v4 == 0 ) v4 = fifo_wait_idle(-1); } goto LABEL_14; } v4 = reg_write_nop(); if ( v4 == 0 ) { *v5 = 1; goto LABEL_11; } LABEL_14: if ( v3 != 0 ) __asm { SVC 0x7E ; '~' } *v13 = v4; return v4; }", "ret_err_0009_6": "int __fastcall ret_err_0009_6() { return SYM; }", "ret_err_0009_7": "int __fastcall ret_err_0009_7() { return SYM; }", "flash_access_toggle": "int __fastcall flash_access_toggle(int a0, int a1) { if ( a0 != 0 ) return flash_access_release(a1); else return flash_access_acquire(a1); }", "flash_guard_check": "int __fastcall flash_guard_check(int *a0) { char *v1; v1 = SYM; if ( *SYM != 0 ) return SYM; memcpy((void *)SYM, a0, 0x34u); *v1 = 1; return 0; }", "sysdrv_set_platform_state": "int __fastcall sysdrv_set_platform_state(_DWORD *a0) { int v1; int v2; int *v3; int v4; int v5; int v6; v1 = 0; __asm { SVC 0x66 ; 'f' } v2 = (unsigned __int8)a0; switch ( *a0 ) { case 0: v3 = SYM[0]; v4 = a0[1]; goto LABEL_4; case 1: v3 = SYM[0]; v4 = a0[1]; goto LABEL_4; case 2: v3 = SYM[0]; v4 = a0[1]; goto LABEL_4; case 3: v3 = SYM[0]; v4 = a0[1]; goto LABEL_4; case 5: v3 = SYM[0]; v4 = a0[1]; goto LABEL_4; case 7: v3 = SYM[0]; v4 = a0[1]; goto LABEL_4; case 8: v3 = SYM[0]; v4 = a0[1]; goto LABEL_4; case 9: v3 = SYM[0]; v4 = a0[1]; goto LABEL_4; case 0xA: v3 = SYM[0]; v4 = a0[1]; goto LABEL_4; case 0xD: v3 = SYM[0]; v4 = a0[1]; goto LABEL_4; case 0x11: v3 = SYM; v4 = a0[1]; LABEL_4: *v3 = v4; break; case 0x13: v5 = a0[1]; if ( v5 != 0 ) LOBYTE(v5) = 1; *(_BYTE *)SYM = v5; v1 = dram_alloc_region(v2, 0x28u, SYM, 1u, 1); break; case 0x14: mbox_slot_clear(); break; case 0x15: *(_DWORD *)(SYM + 4) = a0[1]; break; case 0x16: *(_DWORD *)(SYM + 8) = a0[1]; break; case 0x18: v6 = a0[1]; if ( v6 != 0 ) LOBYTE(v6) = 1; *SYM = v6; break; case 0x19: *(_BYTE *)(SYM + 1) = 1; break; default: v1 = SYM; break; } return v1; }", "sysdrv_set_protected_region": "int __fastcall sysdrv_set_protected_region(unsigned int *a0) { char *v1; int result; unsigned int v2; int v3; int v4; v1 = SYM; v3 = 255; if ( SYM[1] != 0 ) return SYM; v2 = a0[2]; if ( v2 > 0x800 ) return SYM; result = map_client_buffer(a0[1], *a0, v2, &v3, &v4, 0, 0, 0xFFFFu); if ( result == 0 ) { memcpy_thunk(SYM); *((_DWORD *)v1 + 1) = a0[2]; v1[1] = 1; if ( v3 != 255 ) __asm { SVC 0x6C ; 'l' } return 0; } return result; }", "triple_store": "int __fastcall triple_store(_DWORD *a0) { int v1; int v2; int v3; v1 = SYM; v2 = a0[1]; v3 = a0[2]; *(_DWORD *)SYM = *a0; *(_DWORD *)(v1 + 4) = v2; *(_DWORD *)(v1 + 8) = v3; SYM[2] = 1; return 0; }", "spirom_xfer": "int __fastcall spirom_xfer(__int64 *a0, int a1) { int v2; __int64 v3; unsigned int v4; unsigned int v5; unsigned __int64 v6; int v7; int v8; int v9; int v10; int v11; int v12; int v13; unsigned __int64 v14; int v15; __int64 *v16; int v17; v16 = a0; v17 = a1; v2 = 0; v15 = 0; v13 = 255; v3 = *a0; v12 = *((_DWORD *)a0 + 2); v4 = *((_DWORD *)a0 + 1); v5 = *(_DWORD *)a0; v6 = a0[1]; if ( HIWORD(v4) << 16 != 0 ) return SYM; if ( (HIDWORD(v6) & ~HIWORD(SYM)) != 0 ) return SYM; v14 = __PAIR64__(v4, v5) + v6; if ( ((__PAIR64__(v4, v5) + v6) & 0xFFFF000000000000LL) != 0 || v17 == 0 && *((unsigned int *)SYM[0] + 4) < v6 ) return SYM; if ( (_WORD)v3 != 0 || (_WORD)v12 != 0 ) return SYM; __asm { SVC 0x5E ; '^' } v7 = flash_access_acquire(1000); if ( v7 != 0 || (v7 = spirom_xfer_core(v5, v4, v6, SHIDWORD(v6), v17, &v13, *((_DWORD *)a0 + 4))) != 0 ) { LABEL_41: if ( v7 == SYM || v7 == SYM + 1 ) goto LABEL_44; goto LABEL_43; } pcie_port_reg_write(v13, 0, HIWORD(v5) | (v4 << 16)); pcie_port_reg_write(v13, 4, ((unsigned int)(v14 - 1) >> 16) | ((((_DWORD)v14 != 0) + HIDWORD(v14) - 1) << 16)); v8 = *((_DWORD *)a0 + 4); if ( v8 == 51 ) { v2 = SYM; v9 = 50; goto LABEL_53; } if ( v8 > 51 ) { v2 = SYM; if ( v8 == 83 ) { v9 = 50; goto LABEL_53; } if ( v8 > 83 ) { if ( v8 != 84 ) { if ( v8 == 104 ) { v2 = SYM; v9 = 50; } else { if ( v8 + SYM != 0 ) goto LABEL_33; v2 = SYM; v9 = 50; } LABEL_53: pcie_port_reg_write(v13, 8, v9 | 5); pcie_port_reg_write(v13, 12, v2); goto LABEL_43; } } else { if ( v8 != 58 ) { if ( v8 != 60 && v8 != 61 ) goto LABEL_33; v9 = 16; LABEL_38: v2 = 56; goto LABEL_53; } __asm { SVC 0x7C ; '|' } v2 = SYM; } v9 = 48; goto LABEL_53; } if ( v8 == 33 ) { LABEL_35: v9 = 2048; if ( !debug_port_enabled() && !debug_disabled() ) goto LABEL_53; v9 = 3094; goto LABEL_38; } if ( v8 > 33 ) { if ( v8 == 34 ) { v9 = 2050; } else { if ( v8 != 49 && v8 != 50 ) goto LABEL_33; v9 = 50; v2 = SYM; } goto LABEL_53; } if ( v8 == 4 || v8 == 8 ) goto LABEL_35; if ( v8 == 13 ) { __asm { SVC 0x7C ; '|' } v7 = SYM; v2 = SYM; v9 = 48; if ( SYM != 0 ) goto LABEL_41; goto LABEL_53; } LABEL_33: v7 = SYM + 3; LABEL_43: v15 = flash_access_release(1000); LABEL_44: if ( v7 == 0 ) v7 = v15; __asm { SVC 0x5F ; '_' } v10 = v13; if ( v7 != 0 ) { if ( v13 != 255 ) { v11 = SYM; *(_DWORD *)(SYM + 8 * v13) = 255; *(_DWORD *)(v11 + 8 * v10 + 4) = 0; } } else { *((_DWORD *)a0 + 5) = v13; } return v7; }", "sysdrv_tee_cmd9_unsupported": "int __fastcall sysdrv_tee_cmd9_unsupported() { return SYM; }", "ecc_submit_op": "int __fastcall ecc_submit_op(int *a0) { int v1; _DWORD *v2; int *v3; int v4; int v5; int v6; int v7; int v8; unsigned int v9; unsigned int v10; _DWORD v11[8]; ccp_desc_t v12; _DWORD v13[8]; v1 = 1; __asm { SVC 0x5E ; '^' } v2 = SYM; switch ( a0[5] ) { case 1342177282: goto LABEL_3; case 1342177283: v1 = 2; goto LABEL_3; case 1342177284: v1 = 3; goto LABEL_3; case 1342177285: v1 = 4; goto LABEL_3; case 1342177286: v1 = 5; LABEL_3: memcpy_thunk(*(_DWORD *)SYM + 1664); v3 = SYM; v4 = SYM; if ( ccp_queue_ready(v11, 65, *SYM + 1664, v1, 1) == 0 ) { if ( a0[1] != 0 ) v5 = ccp_desc_aes(&v12, a0[2], *a0, 0, 1, a0[2], a0[2], 65, v1, 16); else v5 = ccp_desc_sha(&v12, *a0, a0[2], a0[2], 65, v1, 16); if ( v5 == 0 ) { v6 = ccp_queue_kick(v13, *v3 + 1728, 65, a0[4], 1); if ( v6 == 0 ) { v9 = crypto_wait_completion((int)v11, 3, v7, v8); v4 = v9; if ( v9 == 0 ) { while ( 1 ) { v10 = a0[4]; if ( v10 <= v9 ) break; *(_BYTE *)(a0[3] + v9) = *(_BYTE *)(v10 - v9 + *v2 + 1727); ++v9; } } } } } break; default: v4 = SYM + 10; break; } __asm { SVC 0x5F ; '_' } return v4; }", "feature_flag_set": "int __fastcall feature_flag_set(char a0) { SYM[1] = a0; return 0; }", "sysdrv_enable_feature": "int __fastcall sysdrv_enable_feature(int a0, int a1, unsigned int a2, int a3) { int v4; int v5; _DWORD *v6; _DWORD *v7; int v8; int v9; int v10; _DWORD v11[5]; _DWORD v12[3]; int v13; _BYTE v14[4]; char v15; int v16; v16 = *(_DWORD *)SYM; v8 = 0; v9 = 0; v10 = 0; engine_state_check((int)&v13); v4 = fifo_exchange(a0, a1, a2, (int)&v9, v14); if ( v4 != 0 ) { v5 = SYM; LABEL_6: set_status_out(v5); goto LABEL_9; } v11[0] = v9 + 5242880; v11[1] = 1572864; v11[3] = 32; v11[2] = &v15; v11[4] = &v8; v4 = sysdrv_verify_signed_image((int)v11, 1, a3, 0); if ( v4 != 0 ) { if ( v4 == SYM ) v5 = SYM + 11; else v5 = SYM + 1; goto LABEL_6; } set_status_out(SYM); v6 = (_DWORD *)(v10 + 300); v7 = (_DWORD *)(v10 + 428); bzero((void *)(v10 + 300), 0x78u); bzero(v7, 0x98u); v12[1] = a1; v12[2] = a2; v12[0] = a0; v4 = ecc_params_prepare((__int64 *)v12, &v9, v6, v7, v13); if ( v4 == 0 ) { set_status_out(SYM + 1); mbox_set_error(3); monitor_notify(v6[2]); __asm { SVC 0x51 ; 'Q' } return v4; } LABEL_9: if ( v9 != 0 ) __asm { SVC 0x6C ; 'l' } return v4; }", "sysdrv_tee_session_query": "int __fastcall sysdrv_tee_session_query(int a0) { int v1; int v2; unsigned __int64 hw_counter_us; v1 = 0; if ( *(unsigned __int8 *)(a0 + 32) >= 0x10u || *(unsigned __int8 *)(a0 + 61) >= 0x12u ) return SYM; if ( *(_DWORD *)(a0 + 24) != 0 || *(_DWORD *)(a0 + 28) != 0 ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } } if ( *(_BYTE *)(a0 + 62) != 0 ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } v2 = *(unsigned __int16 *)(a0 + 52); hw_counter_us = read_hw_counter_us(); v1 = SYM; while ( 1 ) { __asm { SVC 0x7B ; '{' } if ( v2 == 0 ) break; if ( read_hw_counter_us() - hw_counter_us >= 0x3E8 ) return v1; } return 0; } return v1; }", "sysdrv_tee_query_34": "int __fastcall sysdrv_tee_query_34(int a0, int a1) { int v2; int *v3; if ( *(unsigned __int8 *)(a0 + 12) << 31 != 0 && *((_DWORD *)SYM + 2) > 1u ) return SYM; if ( *SYM == 0 ) return SYM; v2 = *(_DWORD *)(a0 + 4); switch ( v2 ) { case 1: return tlv_response_build(a0); case 2: if ( a1 != 0 ) { v3 = (int *)SYM; *(_DWORD *)(a1 + 20) = (*SYM)[11]; *(_DWORD *)(a1 + 64) = v3[12]; return 0; } else { return SYM; } case 3: return spi_identify(); default: return SYM - 4; } }", "instance_enum": "int __fastcall instance_enum() { int result; unsigned int i; unsigned int v0; unsigned int v1; unsigned int v2; result = (unsigned __int8)feature_entry_get(0); v2 = result; if ( result != 0 ) { for ( i = 0; ; i = (unsigned __int8)(i + 1) ) { result = v2; if ( i >= v2 ) break; if ( feature_enabled(0, i) ) { LOBYTE(v0) = 0; do { LOBYTE(v1) = 0; do { __asm { SVC 0x7B ; '{' } v1 = (unsigned __int8)(v1 + 1); } while ( v1 < 2 ); v0 = (unsigned __int8)(v0 + 1); } while ( v0 < 2 ); } } } return result; }", "instance_enum_alt": "int __fastcall instance_enum_alt() { int result; unsigned int i; unsigned int v0; unsigned int v1; unsigned int v2; result = (unsigned __int8)feature_entry_get(0); v2 = result; if ( result != 0 ) { for ( i = 0; ; i = (unsigned __int8)(i + 1) ) { result = v2; if ( i >= v2 ) break; if ( feature_enabled(0, i) ) { LOBYTE(v0) = 0; do { LOBYTE(v1) = 0; do { __asm { SVC 0xA6 } v1 = (unsigned __int8)(v1 + 1); } while ( v1 < 2 ); v0 = (unsigned __int8)(v0 + 1); } while ( v0 < 2 ); } } } return result; }", "config_apply_type258": "int __fastcall config_apply_type258() { int type258; int v0[3]; type258 = config_find_type258(v0); if ( type258 == 0 ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } } return type258; }", "fw_info_publish": "int __fastcall fw_info_publish(int a0) { __int64 v1; int result; unsigned int i; unsigned __int8 v2[4]; unsigned int *v3; v2[0] = -1; LODWORD(v1) = fw_info_buffer_get(); if ( v1 == 0 ) return SYM; result = map_client_buffer(HIDWORD(v1), v1, 0xC04u, v2, &v3, 0, 1, 0xFFFFu); if ( result == 0 ) { __asm { SVC 0x7C ; '|' } for ( i = 0; *v3 > i; ++i ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0xA6 } if ( v2[0] != 255 ) __asm { SVC 0x6C ; 'l' } return 0; } return result; }", "fifo_cmd_with_wait": "int __fastcall fifo_cmd_with_wait(_DWORD *a0, __int16 a1, int a2) { int result; int v3; int v4; v4 = 0; memcpy_thunk(SYM); result = retry_op_3x(a0, 8, SYM - 2, 0x102u); if ( result == 0 ) { __asm { SVC 0x56 ; 'V' } v3 = SYM - 8; *(_BYTE *)(v3 + 4) = a1; *(_BYTE *)(v3 + 5) = HIBYTE(a1); result = retry_op_3x(a0, 8, v3, 6u); if ( result == 0 ) { __asm { SVC 0x56 ; 'V' } result = retry_with_timeout(a0, &v4); if ( result == 0 && v4 != 2 ) return SYM; } } return result; }", "loadfw_engine_step": "int __fastcall loadfw_engine_step(int a0) { int result; int v1; int v2; _ZF = a0 == 0; result = SYM; v1 = *SYM; if ( !_ZF ) { if ( a0 != 1 ) return result; if ( (v1 & 2) != 0 ) { v2 = SYM; goto LABEL_9; } return SYM; } if ( v1 << 31 == 0 ) return SYM; v2 = SYM; LABEL_9: result = v2; __asm { SVC 0x7B ; '{' } if ( v2 == 0 ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } return 0; } return result; }", "boot_measure_record": "int __fastcall boot_measure_record(int a0) { _UNKNOWN **v1; unsigned int v2; unsigned int v3; int v4; int v5; int *v6; _DWORD *v7; unsigned int i; unsigned int j; unsigned int k; int *v8; bool v9; _DWORD *v10; int v11; int v12; int *v13; _DWORD v14[9]; _DWORD *buf[4]; _DWORD *v15; int v16; _BYTE v17[13]; _DWORD v18[15]; v16 = *(_DWORD *)SYM; v18[13] = v16; v1 = SYM; v2 = (unsigned int)v17 & 0xFFFFFFE0; v3 = 3; v4 = 0; v5 = *((_DWORD *)*SYM + 112); if ( *SYM == 20 ) v6 = &(*SYM)[-24]; else v6 = (int *)SYM; v15 = v6; v7 = v6 + 8; if ( (SYM & ~v5) == 0 ) v3 = 0; if ( (*(_BYTE *)(a0 + 221) & 2) == 0 ) { *(_BYTE *)(a0 + 220) = v3; for ( i = 0; i < 4; ++i ) *(_DWORD *)(v2 + 4 * i) = ccp_trng_read32_unchecked(); *(_BYTE *)(a0 + 221) = 1; for ( j = 0; j < 4; ++j ) *(_DWORD *)(a0 + 4 * j + 224) = *(_DWORD *)(v2 + 4 * j); do { do *(_BYTE *)(a0 + 220) = v3 | 0x10; while ( (*(_BYTE *)(a0 + 221) & 2) != 0 ); } while ( *(unsigned __int8 *)(a0 + 221) << 31 == 0 ); *(_BYTE *)(a0 + 221) = 1; for ( k = 0; k < 4; ++k ) buf[k] = *(_DWORD **)(a0 + 4 * k + 240); buf_reverse_inplace((void *)((unsigned int)v17 & 0xFFFFFFE0), 0x10u); buf_reverse_inplace(buf, 0x10u); v8 = &(*SYM)[-32]; if ( (*SYM)[-30] != 0 ) { LABEL_22: if ( v3 < 3 ) v13 = &v7[4 * v3 + 1]; else v13 = &(*SYM)[24]; v14[0] = v13; v14[1] = 0; v14[2] = 128; v14[3] = (unsigned int)v17 & 0xFFFFFFE0; v14[4] = 32; v14[5] = v18; v14[6] = 0; v14[7] = 0; v14[8] = SYM; if ( crypto_submit_op(v14) != 0 ) { v10 = *v1; v12 = *((_DWORD *)*v1 + 31) | 0x2000000; } else { if ( ct_memcmp(buf, v18, 0x10u) == 0 ) return 1; v10 = *v1; v12 = *((_DWORD *)*v1 + 31) | 0x3000000; } goto LABEL_29; } if ( v3 == 3 ) goto LABEL_21; v9 = log_record_prepare(v15) == 0; v10 = *v1; v11 = *((_DWORD *)*v1 + 31); if ( !v9 ) { v12 = v11 | 0x1000000; LABEL_29: v10[31] = v12; return v4; } v10[31] = v11 | 0x100000; if ( *v7 == 10 ) { LABEL_21: v8[2] = 1; goto LABEL_22; } } return v4; }", "soc_supports_feature3": "BOOL __fastcall soc_supports_feature3(int a0) { int v1; int v2; v1 = (unsigned __int8)*SYM; if ( v1 == 37 || v1 == 45 || v1 == 43 || v1 == 53 ) { if ( a0 == 17399 || a0 == 17400 ) return true; v2 = 17401; } else { if ( a0 == 17390 || a0 == 17391 || a0 == 17361 || a0 == 17360 ) return true; v2 = 17337; } return a0 == v2; }", "soc_supports_feature2": "BOOL __fastcall soc_supports_feature2(int a0) { int v1; int v2; v1 = (unsigned __int8)*SYM; if ( v1 == 37 || v1 == 45 || v1 == 43 || v1 == 53 ) { if ( a0 == 17399 ) return true; v2 = 17400; } else { if ( a0 == 17390 || a0 == 17389 || a0 == 17361 || a0 == 17365 || a0 == 17360 || a0 == 17339 ) return true; v2 = 17337; } return a0 == v2; }", "soc_supports_feature": "int __fastcall soc_supports_feature(int a0) { int v1; v1 = (unsigned __int8)*SYM; if ( v1 == 37 || v1 == 45 || v1 == 43 || v1 == 53 ) { if ( a0 == 17399 || a0 == 17400 || a0 == 17401 || a0 == 17402 ) return 1; } else if ( (v1 == 35 || v1 == 20) && (a0 == 17388 || a0 == 17390 || a0 == 17389 || a0 == 17391 || a0 == 17361 || a0 == 17365 || a0 == 17360 || a0 == 17340 || a0 == 17339 || a0 == 17337) ) { return 1; } return 0; }", "fw_entry_load": "int __fastcall fw_entry_load(int a0, unsigned int a1, unsigned int a2, int a3) { int result; int v4; int locked; unsigned int v5; int v6; int v7; int v8; int v9; unsigned int v10; unsigned int v11; int v12; v9 = a0; v10 = a1; v11 = a2; v12 = a3; result = SYM; v4 = 0; v8 = SYM >> 31; locked = SYM; v5 = 0; if ( ((a1 + 4095) & (SYM >> 19)) == a1 && ((a2 + 4095) & (SYM >> 19)) == a2 && a2 != 0 ) { if ( v9 == 3 || (result = vf_range_find(a1, a2), locked = result, result == 0) ) { ret_not_supported(); while ( v5 < a2 >> 12 ) { locked = flash_locked_erase(v9, a1 + (v5 << 12)); if ( locked != 0 ) break; if ( a3 != 0 ) { v6 = 4096; locked = otp_region_copy(v9, a1, SYM, 0x1000u); if ( locked == 0 ) { v7 = SYM; while ( memcmp_be((const void *)(v7 + v4), &v8, 4u) == 0 ) { v6 -= 4; v4 += 4; if ( v6 == 0 ) goto LABEL_14; } locked = SYM + 12; } break; } LABEL_14: ++v5; } ret_not_supported(); return locked; } } return result; }", "fw_version_report_alt": "int __fastcall fw_version_report_alt(int a0, int a1, int a2) { _BYTE *v3; int result; unsigned __int8 dst; _BYTE v4[3]; int v5; _BYTE v6[32]; unsigned __int8 v7[52]; int v8; bzero_core(&dst, 0x28u); bzero_core(v7, 0x34u); v3 = SYM; dst = *((_BYTE *)SYM + 1016); v4[0] = 2; v4[1] = *((_BYTE *)SYM + 1008); v5 = a1; buf_reverse_inplace(&v5, 4u); result = hmac_sha256(a0, SYM, (int)(v3 + 1020), 32, (int)&dst, 8, (int)v6, 32); if ( result == 0 ) { result = mp_command_send(dst, (int)v4, 0x27u); if ( result == 0 ) { v7[0] = v3[2120]; result = mp_command_retry(v7); if ( result == 0 ) { if ( v7[2] == 128 ) { if ( a2 != 0 ) { result = fw_version_report(a0, &v8); if ( result == 0 && v8 != a1 + 1 ) return SYM + 1; } } else { return SYM; } } } } return result; }", "fw_list_bounded": "int __fastcall fw_list_bounded(int a0, unsigned int *a1, unsigned int *a2, int a3) { unsigned int v4; int result; unsigned int i; v4 = *a2; result = 0; if ( *a2 > 0x1F4 ) return SYM; for ( i = *a1; *a1 + v4 > i; ++i ) { result = fw_version_report_alt(a0, i, a3); if ( result != 0 ) break; --*a2; } *a1 += v4 - *a2; return result; }", "otp_region_copy": "int __fastcall otp_region_copy(int a0, unsigned int a1, int a2, unsigned int a3) { int result; int v4; unsigned int v5; unsigned int v6; unsigned int v7; unsigned int v8; int v9; int v10; result = SYM; v4 = a2; LOBYTE(v5) = 0; if ( a2 != 0 && a3 <= 0x1000 && a3 != 0 ) { v6 = *((_DWORD *)SYM + 4); if ( v6 >= a1 && a1 + a3 <= v6 ) { v7 = a1; v8 = a3; ret_not_supported(); do { if ( v8 <= 0x40 ) v9 = v8; else v9 = 64; v10 = flash_locked_read(a0, v7, v4, (unsigned __int8)v9); if ( v10 != 0 ) { v5 = (unsigned __int8)(v5 + 1); if ( v5 > 0xA ) break; __asm { SVC 0x56 ; 'V' } } else { v8 -= v9; v7 += v9; v4 += v9; } } while ( v8 != 0 ); ret_not_supported(); return v10; } } return result; }", "fw_version_report": "int __fastcall fw_version_report(int a0, _DWORD *a1) { _BYTE *v2; int v3; int v4; int v5; int v6; unsigned __int8 v7[3]; _DWORD v8[3]; int buf; _BYTE b[33]; unsigned __int8 dst; _BYTE v9[3]; _DWORD v10[3]; _BYTE v11[32]; int v12; _BYTE a[32]; int v13; int v14; _DWORD *v15; v14 = a0; v15 = a1; v13 = *(_DWORD *)SYM; bzero_core(&dst, 0x30u); bzero_core(v7, 0x34u); v2 = SYM; dst = *((_BYTE *)SYM + 1016); v9[0] = 3; v9[1] = *((_BYTE *)SYM + 1008); v5 = rand_fill_bytes(v10, 0xCu, v3, v4); if ( v5 == 0 ) { v6 = SYM; v12 = (int)(v2 + 1020); v5 = hmac_sha256(v14, SYM, (int)(v2 + 1020), 32, (int)&dst, 16, (int)v11, 32); if ( v5 == 0 ) { v5 = mp_command_send(dst, (int)v9, 0x2Fu); if ( v5 == 0 ) { v7[0] = v2[2120]; v5 = mp_command_retry(v7); if ( v5 == 0 ) { if ( v7[2] == 128 ) { v8[0] = v10[0]; v8[1] = v10[1]; v8[2] = v10[2]; v5 = hmac_sha256(v14, v6, v12, 32, (int)v8, 16, (int)a, 32); if ( v5 == 0 ) { if ( ct_memcmp(a, b, 0x20u) != 0 ) { return SYM + 2; } else { buf_reverse_inplace(&buf, 4u); *a1 = buf; } } } else { return SYM; } } } } } return v5; }", "fw_entry_select": "int __fastcall fw_entry_select(int a0, unsigned int a1, unsigned int *a2, int a3, int a4) { int result; unsigned int *v5; unsigned int v6; unsigned int v7; unsigned int v8; unsigned int v9; _DWORD *v10; int v11; unsigned int v12; int locked; result = SYM; v5 = a2; v6 = a3; LOBYTE(v7) = 0; if ( a2 != nullptr && a3 != 0 && (a0 == 3 || (result = vf_range_find(a1, a3)) == 0) ) { v8 = a1; v9 = v6; ret_not_supported(); v10 = SYM; do { v11 = (v8 - 1 + v10[7]) & ~(v10[7] - 1); if ( v9 <= 0x40 ) v12 = v9; else v12 = 64; if ( v11 - v8 < v12 && v11 != v8 ) v12 = v11 - v8; locked = flash_locked_op(a0, v8, (int)v5, (unsigned __int8)v12); if ( locked != 0 ) { v7 = (unsigned __int8)(v7 + 1); if ( v7 > 0xA ) break; __asm { SVC 0x56 ; 'V' } } else { v9 -= v12; v8 += v12; v5 = (unsigned int *)((char *)v5 + v12); } } while ( v9 != 0 ); if ( a4 != 0 && locked == 0 ) { if ( v6 > 0x1000 ) v6 = 4096; locked = otp_region_copy(a0, a1, SYM, v6); if ( locked == 0 && memcmp_be((const void *)SYM, a2, v6) != 0 ) locked = SYM + 12; } ret_not_supported(); return locked; } return result; }", "trace_reg_poke": "void __fastcall trace_reg_poke() { if ( *SYM != 0 ) __asm { SVC 0x7C ; '|' } }", "sysdrv_get_dram_range": "int __fastcall sysdrv_get_dram_range(_DWORD *a0, int a1) { __int64 v2; int result; v2 = *((_QWORD *)SYM + 1); result = 0; if ( v2 == 0 ) return SYM; *(_DWORD *)a1 = v2; *a0 = HIDWORD(v2); return result; }", "sysdrv_query_47": "int __fastcall sysdrv_query_47(int *a0, unsigned int a1) { int otp_block; int v2[12]; otp_block = SYM; bzero_core(v2, 0x30u); if ( 8 * a1 >= 0x40 ) { bzero_core(a0, a1); otp_block = read_otp_block(v2, 0x1160u, 192); *a0 = v2[0] | v2[1] | v2[2]; a0[1] = v2[3] | v2[4] | v2[5]; } return otp_block; }", "version_word_get": "int __fastcall version_word_get(int a0) { *(_DWORD *)a0 = SYM[1]; return 0; }", "boot_flag_apply": "int __fastcall boot_flag_apply() { int result; result = *((unsigned __int8 *)SYM + 2402); if ( *((_BYTE *)SYM + 2402) != 0 ) { __asm { SVC 0xA6 } return SYM; } return result; }", "nop_hook_fwcfg": "void __fastcall nop_hook_fwcfg() { ; }", "sysdrv_set_reg_allowlist_mode": "int __fastcall sysdrv_set_reg_allowlist_mode(int a0) { int *v1; int v2; v1 = SYM; if ( *(_BYTE *)(a0 + 4) != 0 ) { v2 = *(_BYTE *)(a0 + 3) == 0; } else { window_size_set(); v2 = 2; } *v1 = v2; return boot_flag_apply(); }", "rsa_crt_exponentiate": "int __fastcall rsa_crt_exponentiate(unsigned int a0, int r1_0, unsigned int **a1) { int v2; _DWORD *v3; bn_t *v4; int v5; int v6; unsigned int v7; int v8; int v9; int v10; int v11; int v12; int v13; bn_t *a; bn_t *v14; bn_t *v15; bn_scratch_t *v16; bn_t *v17; bn_t *rem; bn_t *v18; unsigned int nbytes; bn_t *a19; bn_t *b; bn_t *r; v2 = 0; a = (bn_t *)SYM; v14 = (bn_t *)(SYM + 1212); r = (bn_t *)(SYM + 2424); v3 = (_DWORD *)(SYM + 4848); b = (bn_t *)(SYM + 3636); v4 = (bn_t *)(SYM + 6060); v5 = 0; v6 = SYM + 7272; a19 = (bn_t *)(SYM + 8484); rem = (bn_t *)(SYM + 9696); v17 = (bn_t *)(SYM + 10908); v15 = (bn_t *)(SYM + 12120); v18 = (bn_t *)(SYM + 13332); v16 = (bn_scratch_t *)(SYM + 14544); __asm { SVC 0x5E ; '^' } *(_DWORD *)(SYM + 4848) = **a1 != 0; v3[1] = 0; v3[2] = 0; v3[3] = **a1; *(_DWORD *)v6 = 1; *(_DWORD *)(v6 + 4) = 0; *(_QWORD *)(v6 + 8) = 0x100000000LL; nbytes = a0 >> 3; v7 = a0 >> 4; if ( r1_0 != 0 ) { v5 = r1_0 + v7; v2 = r1_0; } while ( 1 ) { v8 = key_blob_load(v2, &v16->t0, a, v7); if ( v8 != 0 ) break; v8 = bn_sub(r, a, (bn_t *)v6); if ( v8 != 0 ) break; bn_modinv_flag0(&v16->t0, (int)v4); v8 = v9; if ( v9 != 0 ) break; if ( v4->nlimbs == 1 && v4->limb[0] == 1 ) { while ( 1 ) { v8 = key_blob_load(v5, &v16->t0, v14, v7); if ( v8 != 0 ) goto LABEL_28; v8 = bn_sub(b, v14, (bn_t *)v6); if ( v8 != 0 ) goto LABEL_28; bn_modinv_flag0(&v16->t0, (int)v4); v8 = v10; if ( v10 != 0 ) goto LABEL_28; if ( v4->nlimbs == 1 && v4->limb[0] == 1 ) { if ( bn_mul(v4, r, b, 0) == 0 ) { bn_modinv_flag1(&v16->t0, (int)a19); if ( v11 == 0 && bn_mul(v18, a, v14, 0) == 0 ) { v8 = bn_divmod(v16, nullptr, a19, r, rem); if ( v8 == 0 ) { v8 = bn_divmod(v16, nullptr, a19, b, v17); if ( v8 == 0 ) { bn_modinv_flag1(&v16->t0, (int)v15); if ( v12 == 0 ) { v8 = bn_export_words(v18, a1[1], nbytes); if ( v8 == 0 ) { v8 = bn_export_words(a19, a1[2], nbytes); if ( v8 == 0 ) { v8 = bn_export_words(a, a1[3], v7); if ( v8 == 0 ) { v13 = bn_export_words(v14, a1[4], v7); v8 = v13; if ( v13 == 0 ) { v8 = bn_export_words(rem, a1[5], v7); if ( v8 == 0 ) { v8 = bn_export_words(v17, a1[6], v7); if ( v8 == 0 ) v8 = bn_export_words(v15, a1[7], v7); } } } } } } } } } } goto LABEL_28; } } } } LABEL_28: bzero_core((void *)SYM, 0x5538u); __asm { SVC 0x5F ; '_' } return v8; }", "set_slot_flags": "char __fastcall set_slot_flags(char result) { *SYM = result; return result; }", "set_active_slot_id": "__int16 __fastcall set_active_slot_id(__int16 result) { *((_WORD *)SYM + 1) = result; return result; }", "get_active_slot_id": "int __fastcall get_active_slot_id() { return (unsigned __int8)*SYM; }", "objmap_lookup_cached": "int __fastcall objmap_lookup_cached(int a0, int a1, int a2, int a3) { _WORD *v4; int v5; int result; if ( *SYM == 0 ) return SYM + 1; v4 = SYM; v5 = *((unsigned __int16 *)SYM + 1); if ( *(unsigned __int16 *)SYM != v5 || *((unsigned __int16 *)SYM + 1) != a0 || *((_DWORD *)SYM + 1) != a1 ) { *(_WORD *)SYM = v5; v4[1] = a0; *((_DWORD *)v4 + 1) = a1; *((_DWORD *)v4 + 2) = 0; __asm { SVC 0xB8 } if ( v4 != nullptr ) return SYM; } result = a2; __asm { SVC 0xB3 } if ( a2 != 0 ) return SYM + 5; return result; }", "vf_config_apply": "int __fastcall vf_config_apply(int a0) { int v1; int v2; unsigned int v3; unsigned int v4; unsigned int i; int result; _QWORD v5[51]; int v6; int v7; if ( a0 != 0 ) { v6 = SYM + (a0 << 12); v1 = 3; } else { memcpy(v5, SYM, sizeof(v5)); v2 = 0; v3 = 0; v4 = (unsigned __int8)feature_entry_get(0); while ( v3 < v4 ) { if ( feature_enabled(0, v3) ) { for ( i = 0; i < 0x11; ++i ) { if ( LODWORD(v5[3 * i]) != 0 ) { v7 = v5[3 * i]; result = objmap_lookup_cached(3, v2, (int)&v7, 1); if ( result != 0 ) return result; } } v7 = SYM; result = objmap_lookup_cached(4, v2, (int)&v7, 1); if ( result != 0 ) return result; } v2 += select_mem_attr(0); v3 = (unsigned __int8)(v3 + 1); } v6 = SYM; v1 = 5; } return objmap_lookup_cached(v1, 0, (int)&v6, 1); }", "window_size_set": "int __fastcall window_size_set() { SYM[1] = 0x20000; __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } return SYM + 12; }", "reg_allowlist_mode_gate": "int __fastcall reg_allowlist_mode_gate() { int v0; v0 = 0; if ( *SYM == 2 ) { __asm { SVC 0x7B ; '{' } } else if ( *SYM == 1 ) { return 1; } return v0; }", "task_create_wrapper": "__int64 __fastcall task_create_wrapper() { __asm { SVC 0x51 ; 'Q' } return SYM; }", "svc_AF_service_task": "void __fastcall __noreturn svc_AF_service_task() { __asm { SVC 0x59 ; 'Y' } while ( 1 ) { __asm { SVC 0x5A ; 'Z' } __asm { SVC 0x5E ; '^' } __asm { SVC 0xAF } __asm { SVC 0x5F ; '_' } } }", "ta_reg_access_chiplet": "int __fastcall ta_reg_access_chiplet(int a0, __int64 *a1) { unsigned int v2; __int64 v3; __int64 v4; int v5; int result; int v6; unsigned int v7; int v8; int v9; unsigned int i; char *v10; unsigned int v11; char v12[4]; char v13[4]; int v14; int v15; v2 = *((unsigned __int8 *)a1 + 66); v3 = a1[1]; v4 = *a1; v5 = 0; *(_DWORD *)v12 = *((unsigned __int16 *)a1 + 32); result = reg_allowlist_lookup(v3, 0, v13, &v11); if ( result == 0 ) { v6 = attr_permits_usage(a0, v2, v12[0], (unsigned __int8)v11, v13[0]); SYM[2 * (_DWORD)v4] = v3; if ( v6 != 0 ) return SYM; if ( HIDWORD(v4) == -1 ) { v5 = *(_DWORD *)(SYM + 12 * v4 + 2240); } else { v7 = HIDWORD(v4); do { v7 >>= 1; if ( v7 << 31 != 0 ) ++v5; } while ( v7 != 0 ); } if ( a0 == 0 && v5 * v2 > HIDWORD(v3) ) return SYM; v8 = 0; v9 = SYM + 12 * v4; for ( i = 0; ; ++i ) { if ( *(_DWORD *)(v9 + 2240) <= i ) return 0; if ( ((1 << i) & HIDWORD(v4)) != 0 ) { if ( v2 == 2 || v2 == 4 ) { if ( a0 == 1 ) { __asm { SVC 0x7C ; '|' } continue; } if ( a0 == 0 ) { __asm { SVC 0x7B ; '{' } LABEL_31: ++v8; continue; } } else if ( v2 == 8 ) { if ( a0 == 1 ) { __asm { SVC 0xA5 } continue; } if ( a0 == 0 ) { __asm { SVC 0x7B ; '{' } v10 = (char *)a1 + 4 * v8; *((_DWORD *)v10 + 4) = v14; *((_DWORD *)v10 + 10) = v15; goto LABEL_31; } } } } } return result; }", "ta_reg_access_simple": "int __fastcall ta_reg_access_simple(int a0, int a1) { unsigned int v2; __int16 v3; int result; char v4[4]; int v5; int v6; unsigned int v7; v2 = *(unsigned __int8 *)(a1 + 14); v3 = *(_WORD *)(a1 + 12); result = reg_allowlist_lookup(*(_DWORD *)a1, 0, v4, &v7); if ( result == 0 ) { if ( attr_permits_usage(a0, v2, v3, (unsigned __int8)v7, v4[0]) == 0 ) { if ( v2 == 2 || v2 == 4 ) { if ( a0 != 0 ) { if ( a0 != 1 ) return SYM; __asm { SVC 0x7C ; '|' } } else { __asm { SVC 0x7B ; '{' } } } else { if ( v2 != 8 ) return SYM; if ( a0 != 0 ) { if ( a0 != 1 ) return SYM; __asm { SVC 0xA5 } } else { __asm { SVC 0x7B ; '{' } *(_DWORD *)(a1 + 4) = v5; *(_DWORD *)(a1 + 8) = v6; } } return 0; } return SYM; } return result; }", "opcode_group_index2": "unsigned int __fastcall opcode_group_index2(int a0, int a1, int a2, int a3) { unsigned int result; if ( (unsigned int)(a0 - 768) > 0x18 ) { if ( (unsigned int)(a0 - 800) > 0x18 ) { if ( (unsigned int)(a0 - 832) > 0x18 ) { if ( (unsigned int)(a0 - 864) > 0x18 ) { if ( (unsigned int)(a0 - 896) > 0x18 ) { if ( (unsigned int)(a0 - 928) > 0x18 ) result = 6; else result = 5; } else { result = 4; } } else { result = 3; } } else { result = 2; } } else { result = 1; } } else { result = 0; } if ( result < 6 ) return vf_reg_addr_calc(result, a0, a1, a2); return result; }", "flash_read_status_byte": "int __fastcall flash_read_status_byte(_DWORD *a0, int a1) { int v2; v2 = 0; return fifo_transfer(a0, 8, SYM, 1u, a1, &v2, 1u); }", "sysdrv_get_rpc_abi_version": "int __fastcall sysdrv_get_rpc_abi_version(unsigned int *a0, int a1, unsigned int *a2) { unsigned int v3; int v4; int v5; unsigned int v6; int v7; unsigned int v8; if ( *SYM == 0 ) return SYM + 2; v3 = SYM; v4 = SYM; v5 = SYM; v6 = SYM + 16320; v7 = SYM; while ( *(_DWORD *)(v3 + 12) == v7 ) { if ( memcmp_be((const void *)(v3 + 16), a0, 0x10u) == 0 ) { v8 = *(unsigned __int16 *)(v3 + 10); if ( *a2 < v8 ) return SYM - 4; if ( checksum16((unsigned __int16 *)(v3 + 32), v8) != *(_DWORD *)v3 ) return v5; memcpy_thunk(a1); v4 = 0; *a2 = *(unsigned __int16 *)(v3 + 10); return v4; } v3 += *(unsigned __int16 *)(v3 + 8); if ( v3 > v6 ) return v5; } return v4; }", "read_otp_block": "int __fastcall read_otp_block(int *a0, unsigned int a1, int a2) { int v3; v3 = 0; if ( a1 << 27 != 0 || a2 == 0 ) return SYM; __asm { SVC 0x7D ; '}' } memcpy(a0, (const void *)((a1 >> 3) + 380928), 4 * (((unsigned int)(a2 - 1) >> 5) + 1)); __asm { SVC 0x7E ; '~' } return v3; }", "error_to_status": "int __fastcall error_to_status(int result, _DWORD *a0, _DWORD *a1, _DWORD *a2) { *a0 = SYM; *a1 = 0; *a2 = 0; if ( result == 11 ) { __asm { SVC 0x7B ; '{' } *a0 = 0; *a1 = 12160; __asm { SVC 0x7C ; '|' } return 32896; } return result; }", "vf_reg_addr_calc": "int __fastcall vf_reg_addr_calc(int a0, int a1, int a2, int a3) { int v4; int v5; v4 = (a1 << 12) - (a0 << 17) + (a0 << 25); if ( a1 == 778 || a1 == 810 || a1 == 842 || a1 == 874 || a1 == 906 || a1 == 938 ) { __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } v5 = SYM; } else { __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } v5 = SYM; } __asm { SVC 0x7B ; '{' } return v5 + v4; }", "bits_set_masked": "_BYTE *__fastcall bits_set_masked(_BYTE *result, char a0, char a1) { *result = *result & ~a0 | a1; return result; }", "otp_read_flag": "int __fastcall otp_read_flag(bool *a0, int a1, int a2, int a3) { int result; bool v4; BOOL v5; v5 = false; result = read_otp_block(&v5, 0x1660u, 32); if ( result == 0 ) { v4 = (v5 & 0x20) != 0 || (v5 & 0x80) != 0 || (v5 & 0x200) != 0; v5 = v4; if ( a0 != nullptr ) *a0 = v4; } return result; }", "reg_read_triple": "int __fastcall reg_read_triple(int a0, int a1, int a2, int a3) { __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } return SYM + (a0 << 12); }", "reg_read_nop": "int __fastcall reg_read_nop(int a0) { __asm { SVC 0x7B ; '{' } return 0; }", "zero_byte_out": "int __fastcall zero_byte_out(int a0) { *(_BYTE *)a0 = 0; return 0; }", "svc_notify_stub": "int __fastcall svc_notify_stub(int a0, int a1) { __asm { SVC 0x94 } return a1; }", "pcie_port_reg_read": "unsigned int __fastcall pcie_port_reg_read(int a0, int a1, int a2) { unsigned int v3; v3 = a1 + 24 * a0; if ( v3 >= 0x180 ) return SYM; __asm { SVC 0x7B ; '{' } return v3 + SYM; }", "golia_log_write": "int __fastcall golia_log_write(unsigned int a0, int a1, unsigned int a2) { int v3; int v4; unsigned int v5; int v6; int data; _BYTE v7[8]; __int64 v8[6]; unsigned int v9; int v10; unsigned int v11; int v12; v12 = SYM; v9 = 1; v10 = 3; LODWORD(v8[0]) = &v12; HIDWORD(v8[0]) = 4; v3 = gp_object_lookup_or_create((int)v7, (int)v8, a2); v5 = v11; v6 = v3; if ( v3 == 0 ) { if ( v11 == 0 ) return SYM; v9 = v11; v8[0] = a0 | 0x4400000000LL; if ( a1 != 0 ) data = gp_object_read_data((int)v7, v8, a2, v4); else data = gp_object_write_data((int)v7, v8, a2, v4); v6 = data; } else if ( v11 == 0 ) { return v6; } gp_object_close(v5, a2); return v6; }", "object_buffer_grow": "int __fastcall object_buffer_grow(int a0, int a1, int a2) { _BYTE *v3; v3 = object_buffer_realloc(*(_DWORD *)(a0 + 4), *(_DWORD *)(*(_DWORD *)(a0 + 4) + 4) + 112 + a1, a2); if ( v3 == nullptr ) return SYM; *(_DWORD *)(a0 + 4) = v3; *((_DWORD *)v3 + 26) = a1; return 0; }", "fw_entry_iterate": "int __fastcall fw_entry_iterate(int a0, _WORD *a1, unsigned int a2, int a3) { int v4; int v5; unsigned int v6; int v7; int v8; _BYTE v9[4]; int v10; _DWORD v11[6]; _WORD *v12; v11[3] = a0; v11[4] = a1; v11[5] = a2; v12 = (_WORD *)a3; v10 = *(_DWORD *)SYM; v11[1] = v10; v4 = 0; v11[0] = 0; v9[0] = 0; if ( a1 == nullptr || a2 == 0 || v12 == nullptr ) return SYM + 6; timestamp_record(); v5 = SYM; v6 = SYM; while ( !is_boot_stage(3) ) { if ( timestamp_elapsed() > v6 ) { LABEL_9: v7 = 0x4000000; goto LABEL_20; } __asm { SVC 0x56 ; 'V' } } *((_DWORD *)*SYM + 41) = *((_DWORD *)*SYM + 41) & 0x7FFFFF00 | 0x80000000; timestamp_record(); while ( mbox_read_be32((int)v11, (int)v9) == 0 ) { if ( timestamp_elapsed() > v6 ) goto LABEL_9; __asm { SVC 0x56 ; 'V' } } v8 = 2; *v12 = BYTE1(v11[0]) + (LOBYTE(v11[0]) << 8); *a1 = HIWORD(v11[0]); timestamp_record(); while ( mbox_read_be32((int)a1 + v8, (int)v9) == 0 ) { if ( timestamp_elapsed() > v6 ) goto LABEL_9; LABEL_24: __asm { SVC 0x56 ; 'V' } } v8 = (unsigned __int16)(v8 + 4); if ( v9[0] != 0 ) return v4; if ( (unsigned __int16)v8 < a2 ) { timestamp_record(); goto LABEL_24; } v7 = 0x2000000; LABEL_20: v4 = v5; *(_DWORD *)(a0 + 12) = v7; return v4; }", "clear_status_field": "void *__fastcall clear_status_field() { void *result; result = *SYM; *((_DWORD *)*SYM + 344) = 0; return result; }", "object_slot_wipe": "unsigned int __fastcall object_slot_wipe(unsigned int result, int a0) { unsigned int v1; int v2; if ( result <= 0xFF ) { v1 = SYM + 8 * result; result = *(unsigned __int8 *)(v1 + 1); if ( result == a0 ) { v2 = *(_DWORD *)(v1 + 4); if ( v2 != 0 ) { bzero_core((void *)(v2 + 112), *(_DWORD *)(v2 + 4)); heap_free(*(_DWORD *)(v1 + 4)); } *(_DWORD *)(v1 + 4) = 0; *(_BYTE *)(v1 + 1) = 0; *(_BYTE *)v1 = 0; return 0; } } return result; }", "unlock_and_store_result": "int __fastcall unlock_and_store_result() { int result; result = reg_unlock_sequence(); __asm { SVC 0x5F ; '_' } *((_DWORD *)SYM + 1) = result; return result; }", "objmap_remove": "int __fastcall objmap_remove(int result) { unsigned int v0; int v1; char *v2; int v3; unsigned int v4; v0 = 0; v1 = SYM; v2 = SYM; while ( 1 ) { v4 = *((unsigned __int16 *)v2 + 1); if ( v0 > v4 ) break; v3 = v1 + 16 * v0; if ( *(_DWORD *)(v3 + 4) == result ) { *(_DWORD *)(v3 + 4) = 0; if ( v0 == v4 && v0 != 0 ) *((_WORD *)v2 + 1) = v4 - 1; } v0 = (unsigned __int16)(v0 + 1); } return result; }", "fabric_config_apply": "__int64 __fastcall fabric_config_apply() { __int64 result; __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } result = *((unsigned int *)SYM + 584); if ( (_DWORD)result != 1 ) { __asm { SVC 0x7C ; '|' } LODWORD(result) = SYM + 4; HIDWORD(result) = 1; __asm { SVC 0xA6 } } return result; }", "vf_bringup": "int __fastcall vf_bringup(int a0) { int v1; v1 = fw_table_populate(a0); vf_reg_init(a0); vf_reg_setup(a0); if ( *((_DWORD *)SYM + 584) == 0 ) vf_reg_enable(a0); return v1; }", "vf_bringup_step": "int __fastcall vf_bringup_step(int a0) { int result; result = vf_reg_setup(a0); if ( *((_DWORD *)SYM + 584) != 1 ) return vf_reg_enable(a0); return result; }", "flash_access_acquire": "int __fastcall flash_access_acquire(int a0) { int v1; char *v2; v1 = 0; __asm { SVC 0x5E ; '^' } v2 = SYM; if ( *SYM == 0 ) { __asm { SVC 0x7B ; '{' } v1 = flash_clock_enable(a0); } if ( (unsigned __int8)*v2 != 255 ) ++*v2; __asm { SVC 0x5F ; '_' } return v1; }", "flash_access_release": "int __fastcall flash_access_release(int a0) { int v1; int v2; v1 = 0; __asm { SVC 0x5E ; '^' } if ( *SYM != 0 ) { v2 = (unsigned __int8)(*SYM - 1); *SYM = v2; if ( v2 == 0 ) { __asm { SVC 0x7B ; '{' } v1 = flash_clock_disable(); } } __asm { SVC 0x5F ; '_' } return v1; }", "crypto_ctx_reset": "int __fastcall crypto_ctx_reset(int *a0) { _DWORD *v1; int result; v1 = (_DWORD *)a0[19]; *v1 = 0; v1[1] = 0; v1[34] = 0; result = crypto_op_begin(a0, (int)v1); if ( result != 0 ) return require_capability(SYM); return result; }", "loadfw_validate_type": "int __fastcall loadfw_validate_type(int r0_0, int r1_0, int a0, int a1) { int v2; _BYTE *v3; int v4; int v5; int v6; int v7; int v8; int v9; int result; unsigned int v10; int v11; int a12; _DWORD v13[3]; int a14; v13[1] = r0_0; v13[2] = r1_0; a14 = a0; v2 = 0; v3 = SYM; v11 = 0; a12 = 0; v4 = *SYM; switch ( r0_0 ) { case 1: case 2: case 3: case 5: case 6: case 7: case 8: case 9: case 10: case 16: case 20: case 21: case 22: case 25: case 26: case 27: case 28: case 29: case 33: case 34: case 48: case 49: case 50: case 52: case 53: case 54: case 55: case 56: case 57: case 60: case 61: case 64: case 65: case 66: case 68: case 69: case 71: case 72: case 73: case 76: case 77: case 78: case 79: case 81: case 82: case 83: case 84: case 85: case 86: case 87: case 88: case 89: case 90: case 91: case 92: case 93: case 94: case 95: case 96: case 97: goto LABEL_30; case 4: goto LABEL_34; case 11: __asm { SVC 0x7C ; '|' } LABEL_34: __asm { SVC 0x7C ; '|' } goto LABEL_31; case 12: __asm { SVC 0x7C ; '|' } __asm { SVC 0xA6 } goto LABEL_31; case 13: if ( r1_0 == 0xFFFF && v4 << 31 != 0 ) __asm { SVC 0x7C ; '|' } result = read_boot_params(SYM); if ( result == 0 ) { result = dram_window_get(0, *SYM); if ( result == 0 ) goto LABEL_27; } return result; case 18: power_rail_enable(); __asm { SVC 0xA6 } do __asm { SVC 0x7B ; '{' } while ( v11 << 31 == 0 ); nop_hook_power(); ret_err_000A_29(); smu_mailbox_xfer(3, SYM, 0, &a12, 0x3E8u); smu_mailbox_xfer(27, 0, 0, &a12, 0x3E8u); default_key_or_fallback(a12); smu_mailbox_xfer(26, 0, 0, &a12, 0x3E8u); v2 = smu_mailbox_xfer(27, 1, 0, &a12, 0x3E8u); if ( dram_scratch_map(a12, v5, v6, v7) == 0 ) v2 = smu_mailbox_xfer(26, 1, 0, &a12, 0x3E8u); v8 = (unsigned __int8)*SYM; if ( (v8 == 24 || v8 == 28 || v8 == 49) && *((_BYTE *)SYM + 2396) != 0 ) task_create_wrapper(); goto LABEL_30; case 19: __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } v11 = 2; __asm { SVC 0x7C ; '|' } delay_us(2); __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } goto LABEL_28; case 51: power_state_set(0, a14); goto LABEL_31; case 58: if ( r1_0 == 0xFFFF && (v4 & 2) != 0 ) __asm { SVC 0x7C ; '|' } result = read_boot_params(SYM); if ( result != 0 ) return result; result = dram_window_get(1u, *SYM); if ( result != 0 ) return result; result = 1; LABEL_27: v2 = dram_window_describe(result, &v10, v13, 0); if ( v3[19] != 0 ) { LABEL_28: v9 = region_enable_mask(r0_0, r1_0); LABEL_29: v2 = v9; } LABEL_30: if ( v2 != -65536 ) LABEL_31: v3[r0_0] = 1; return v2; case 62: v9 = ret_zero_3(); goto LABEL_29; case 67: v9 = reg_allowlist_build(); goto LABEL_29; default: return SYM; } }", "digest_ctx_reset": "_DWORD *__fastcall digest_ctx_reset(int *a0) { int v1; _DWORD *result; _DWORD *v2; v1 = *a0; result = (_DWORD *)a0[19]; if ( v1 == SYM ) { result[16] = 0; result[17] = 0; result[18] = 0; result[19] = 0; result[20] = 0; } else { v2 = result; bzero_core(result, 0xC0u); return bzero_core(v2 + 84, 0x168u); } return result; }", "gp_operation_release_ctx": "int __fastcall gp_operation_release_ctx(int *a0) { int v1; int v2; v1 = a0[5]; v2 = a0[1]; if ( v1 != 0 ) { if ( v2 != 5 ) { if ( v2 == 3 ) digest_ctx_reset(a0); goto LABEL_9; } } else if ( v2 != 5 ) { return require_capability(SYM); } crypto_ctx_reset(a0); LABEL_9: a0[7] &= ~0x20000u; a0[20] = 0; return 0; }", "engine_regs_clear": "__int64 __fastcall engine_regs_clear() { unsigned int i; __int64 result; __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } for ( i = 0; i < 5; ++i ) { result = *(_QWORD *)&SYM[i][0]; __asm { SVC 0x7C ; '|' } if ( (_DWORD)result != 0 ) break; } return result; }", "subsystem_reinit": "int __fastcall subsystem_reinit(int a0) { int v1; void *v2; int v3; int *v4; trace_event(0, 0xF004u, 0, 0); *SYM[0] = 0; *SYM[0] = 0; nop_hook_irq1(); mbox_reset_state(); nop_hook_plat(); instance_table_init(); v1 = SYM[12]; *((_DWORD *)SYM + 142) = *(_DWORD *)(v1 + 568); v2 = memcpy((void *)SYM, (const void *)(v1 + 904), 0x50u); v3 = secure_channel_setup((int)v2); v4 = SYM - 32; if ( v3 == 0 ) { if ( a0 != -65531 ) goto LABEL_8; v3 = (int)flash_window_setup(1); if ( v3 == 0 ) { v3 = engine_regs_clear(); if ( v3 == 0 ) { if ( *((_BYTE *)v4 + 4) != 0 ) { v3 = -65526; goto LABEL_9; } v3 = window_map_retry(); if ( v3 != 0 ) goto LABEL_9; LABEL_8: v3 = ret_zero_8(); } } } LABEL_9: __asm { SVC 0x5F ; '_' } return v3; }", "subsystem_unlock": "int __fastcall subsystem_unlock() { *SYM[0] = 0; nop_hook_plat(); __asm { SVC 0x5F ; '_' } return 0; }", "platform_reinit": "int __fastcall platform_reinit() { int v0; int stub; int *v1; int *v2; int v3; int v4; int *v5; int v6; int v7; int v8; v0 = 0; if ( debug_allowed() != 0 ) { if ( get_client_ctx_field3() == 256 ) { stub = reg_read_stub(); v1 = SYM[0]; v2 = SYM; *SYM[0] = stub; *v2 = 0; v0 = check_caller_permission(4u); if ( v0 != 0 ) return v0; if ( *v1 == 2 ) { trace_reg_pair_poke(47); v3 = check_caller_permission(0xBu); if ( v3 != 0 ) v0 = v3; } if ( *((_DWORD *)SYM + 556) != 0 ) { trace_reg_pair_poke(170); v4 = check_caller_permission(0xFu); if ( v4 != 0 ) v0 = v4; } v5 = SYM; if ( *(unsigned __int8 *)SYM << 31 != 0 ) { trace_reg_pair_poke(12); v6 = check_caller_permission(0x10u); if ( v6 != 0 ) v0 = v6; } if ( (*(_BYTE *)v5 & 2) != 0 ) { trace_reg_pair_poke(276); v7 = check_caller_permission(0x11u); if ( v7 != 0 ) v0 = v7; } } else { v0 = apply_reg_list_by_id(640); if ( v0 != 0 ) return v0; v8 = apply_reg_list_by_id(641); v0 = v8; if ( v8 != 0 ) return v0; v0 = apply_reg_list_by_id(642); if ( v0 != 0 ) return v0; } if ( heap_ready() ) __asm { SVC 0x7C ; '|' } } return v0; }", "apply_reg_list_by_id": "int __fastcall apply_reg_list_by_id(int a0) { unsigned int v1; int result; int v2; unsigned int v3; int v4; v1 = 0; v3 = 0; v4 = 0; result = client_config_find(a0, &v4, &v3); if ( result == 0 ) { if ( a0 == 640 ) goto LABEL_19; v2 = a0 - 641; if ( v2 == 0 ) { while ( v1 < v3 ) { **(_DWORD **)(v4 + 8 * v1) = *(_DWORD *)(v4 + 8 * v1 + 4); ++v1; } return result; } if ( v2 == 1 || v2 == 3 ) { LABEL_19: while ( v1 < v3 ) { result = *(_DWORD *)(v4 + 8 * v1); __asm { SVC 0x7C ; '|' } if ( result != 0 ) break; ++v1; } } else { while ( v1 < v3 ) { result = *(_DWORD *)(v4 + 8 * v1); __asm { SVC 0x7C ; '|' } if ( result != 0 ) break; ++v1; } } } return result; }", "irq_status_scan2": "void *__fastcall irq_status_scan2() { _UNKNOWN **v0; void *result; int v1; void **v2; unsigned __int8 v3; v0 = SYM; result = *SYM; v1 = *((_DWORD *)*SYM + 701); if ( v1 >= 0 ) { v2 = (void **)SYM; __asm { SVC 0x5E ; '^' } if ( BYTE1(v1) == 1 ) v3 = platform_ids_collect(); else v3 = -1; *((_DWORD *)*v0 + 701) = v3 | 0x80000000; result = *v2; __asm { SVC 0x5F ; '_' } } return result; }", "irq_task_group3": "void __fastcall __noreturn irq_task_group3() { irq_enable_group3(); while ( 1 ) { __asm { SVC 0x5A ; 'Z' } irq_status_scan2(); } }", "subsystem_register": "int __fastcall subsystem_register(_DWORD *a0, char a1) { char *v2; int result; _DWORD *v3; int v4; int v5; int v6; v2 = SYM; if ( SYM[1] != 0 ) return SYM; v3 = SYM; if ( *(_DWORD *)SYM != SYM ) return SYM + 15; result = map_window_stub(); if ( result == 0 ) { result = mp_state_advance(0, v4, v5, v6); if ( result == 0 ) { result = reg_unlock_sequence(); if ( result == 0 ) { result = queue_table_scan(); if ( result == 0 ) { *a0 = v3[4]; *v2 = a1; *((_DWORD *)v2 + 2) = 0; v2[1] = 1; } } } } return result; }", "window_map_retry": "int __fastcall window_map_retry() { int result; int v0; int v1; int v2; result = 0; if ( SYM[1] != 0 ) { result = map_window_stub(); if ( result == 0 ) { result = mp_state_advance(0, v0, v1, v2); if ( result == 0 ) return reg_unlock_sequence(); } } return result; }", "rom_parse_directory": "int __fastcall rom_parse_directory(int a0, _DWORD *a1) { int v2; int v3; int v4; unsigned int v5; int v6; int v7; int v8; if ( *a1 == SYM ) { v2 = 0; *(_DWORD *)(a0 + 4) = 0; *(_DWORD *)(a0 + 8) = 84; *(_BYTE *)(a0 + 12) = 1; } else { v2 = SYM; } if ( v2 != 0 ) goto LABEL_24; v2 = fw_tail_scan((_BYTE *)a0, (int)a1, (int)a1); if ( v2 != 0 ) goto LABEL_24; v3 = 0; v4 = 0; while ( *(_BYTE *)(a0 + 12 * v3 + 24) != 1 ) { if ( (unsigned int)++v3 >= 2 ) goto LABEL_9; } v4 = param_list_scan( (_DWORD *)((char *)a1 + *(_DWORD *)(a0 + 12 * v3 + 16) + 16), a0, *(_DWORD *)((char *)a1 + *(_DWORD *)(a0 + 12 * v3 + 16) + 8)); LABEL_9: if ( v3 == 2 ) v4 = SYM; v2 = v4; if ( v4 != 0 ) goto LABEL_24; v2 = ring_entry_validate(a0, (int)a1, 0); if ( v2 != 0 ) goto LABEL_24; v5 = ring_entry_validate(a0, (int)a1, 1); v2 = v5; if ( v5 != 0 ) goto LABEL_24; v2 = 0; while ( 1 ) { v6 = a1[v5 + 19]; if ( (unsigned int)(v6 + 4096) > 0x200000uLL ) break; v7 = 3 * v5++; v8 = a0 + 4 * v7; *(_DWORD *)(v8 + 88) = v6; *(_DWORD *)(v8 + 92) = 4096; *(_BYTE *)(v8 + 96) = 1; if ( v5 >= 2 ) goto LABEL_22; } v2 = SYM; LABEL_22: if ( v2 != 0 || (v2 = fw_tail_record_check(a0, (int)a1)) != 0 ) LABEL_24: log_event(4u, v2); return v2; }", "fw_image_authenticate": "int __fastcall fw_image_authenticate(int a0, int a1, int a2, int a3, unsigned int a4, int a5, unsigned int a6, int a7) { int v8; int v9; int v10; unsigned int v11; int v12; int v13; char v14; _BYTE v15[2]; __int16 v16; void *b; int v17; int v18; int v19; int v20; int v21; _BYTE dst[20]; _BYTE v22[20]; _BYTE v23[20]; _DWORD v24[6]; int v25; int v26; int v27; int v28; v25 = a0; v26 = a1; v27 = a2; v28 = a3; v17 = *(_DWORD *)SYM; v24[5] = v17; v8 = 0; v18 = SYM[0]; v19 = SYM[1]; v20 = SYM[2]; v21 = SYM[3]; memcpy(dst, SYM, sizeof(dst)); memcpy(v22, SYM, sizeof(v22)); memcpy(v23, SYM, sizeof(v23)); memcpy(v24, SYM, 0x14u); v9 = SYM; if ( a2 == 20 ) { v10 = 15; } else { if ( a2 != 28 && a2 != 32 && a2 != 48 && a2 != 64 ) return v9; v10 = 19; } if ( a4 == 128 || a4 == 256 || a4 == 384 || a4 == 512 ) { if ( a2 + v10 + 11 <= a4 ) { b = &v14; bzero(v15, 0x200u); bzero(b, 0x200u); v11 = a4 - a2 - v10; memcpy_thunk((int)&v15[v11]); memcpy_thunk((int)&v15[a4 - a2]); v15[0] = 0; v15[1] = 1; bzero_thunk((int)&v16, v11 - 3, 255); v15[v11 - 1] = 0; if ( v25 != 0 ) { v12 = rsa_modexp(v28, a4, a5, a6, a7, a4, (int)b, 0); v13 = SYM; if ( v12 != 0 || ct_memcmp(v15, b, a4) != 0 ) return v13; } else if ( rsa_modexp(v28, a4, a5, a6, (int)v15, a4, a7, 0) != 0 ) { return SYM - 10; } return v8; } else { return SYM - 6; } } return v9; }", "fw_segment_verify": "int __fastcall fw_segment_verify( int a0, unsigned int a1, int a2, unsigned int a3, int a4, unsigned int a5, unsigned int a6, int a7) { unsigned int v8; int result; unsigned int v9; unsigned int v10; unsigned int v11; int v12; int v13; int v14; int v15; _BYTE *v16; unsigned int v17; unsigned int v18; _BYTE v19[512]; _BYTE dst[512]; _BYTE v20[512]; _BYTE v21[8]; int v22; int v23; _BYTE *v24; unsigned int v25; int v26; unsigned int v27; int v28; unsigned int v29; v26 = a0; v27 = a1; v28 = a2; v29 = a3; v8 = a6; if ( a3 != 128 && a3 != 256 && a3 != 384 && a3 != 512 ) return SYM; if ( a6 == 0 ) v8 = a1; v9 = v8; v25 = a1 + v8 + 8; v10 = v8 + a1 + 2; result = SYM - 4; if ( v10 <= a3 ) { v18 = a3 - a1; v11 = a3 - a1 - 1; if ( v11 <= 0x200 ) { __asm { SVC 0x66 ; 'f' } v23 = (unsigned __int8)result; bzero(dst, 0x200u); bzero(v20, 0x200u); bzero(v21, 0xA0u); memcpy_thunk((int)&v22); v24 = &v21[a1 + 8]; v14 = rand_fill_bytes(v24, v9, v12, v13); if ( v14 != 0 ) return v14; switch ( a1 ) { case 0x14u: v15 = SYM; break; case 0x1Cu: v15 = SYM + 1; break; case 0x20u: v15 = SYM + 2; break; case 0x30u: v15 = SYM + 3; break; case 0x40u: v15 = SYM + 4; break; default: return SYM - 10; } v14 = mac_oneshot(v23, v15, (unsigned int)v21, v25, (int)v19, a1); if ( v14 != 0 ) return v14; v16 = &dst[v18 - v9]; *(v16 - 2) = 1; memcpy_thunk((int)(v16 - 1)); v17 = hash_by_digest_size(v23, a1, (int)v19, a1, (int)v20, a3 - a1 - 1); v14 = v17; if ( v17 != 0 ) return v14; while ( v11 > v17 ) { dst[v17] ^= v20[v17]; ++v17; } memcpy_thunk((int)&dst[v18 - 1]); dst[a3 - 1] = -68; dst[0] &= ~0x80u; if ( rsa_modexp(v28, a3, a4, a5, (int)dst, a3, a7, 0) == 0 ) return v14; return SYM - 10; } } return result; }", "rsa_pad_and_verify": "int __fastcall rsa_pad_and_verify(int a0, unsigned int a1, int a2, unsigned int a3, int a4, unsigned int a5, int a6) { unsigned int v7; unsigned int v8; int v9; int v10; unsigned int i; unsigned int j; int v11; int v12; int v13; char v14; _BYTE dst[512]; _BYTE v15[512]; _BYTE v16[8]; int v17; int v18; void *a; int v19; unsigned int v20; int v21; unsigned int v22; v19 = a0; v20 = a1; v21 = a2; v22 = a3; if ( a3 != 128 && a3 != 256 && a3 != 384 && a3 != 512 ) return SYM; v7 = a3 - a1; v8 = a3 - a1 - 1; if ( v8 > 0x200 ) return SYM - 4; __asm { SVC 0x66 ; 'f' } v18 = (unsigned __int8)a0; a = &v14; bzero(dst, 0x200u); bzero(v15, 0x200u); bzero(v16, 0xA0u); v9 = rsa_modexp(v21, a3, a4, a5, a6, a3, (int)v15, 0); v10 = SYM; if ( v9 != 0 ) return v10; memcpy_thunk((int)dst); if ( (dst[0] & 0x80) != 0 || (unsigned __int8)dst[a3 - 1] != 188 || hash_by_digest_size(v18, a1, (int)&dst[v7 - 1], a1, (int)v15, a3 - a1 - 1) != 0 ) { return v10; } for ( i = 0; v8 > i; ++i ) dst[i] ^= v15[i]; dst[0] &= ~0x80u; for ( j = 0; v7 - 2 > j && dst[j] == 0; ++j ) ; v11 = v7 - j - 2; if ( a1 + v11 + 8 <= 0xA0 ) { if ( dst[j] == 1 ) { memcpy_thunk((int)&v17); memcpy_thunk((int)&v16[a1 + 8]); switch ( a1 ) { case 0x14u: v13 = SYM; break; case 0x1Cu: v13 = SYM + 1; break; case 0x20u: v13 = SYM + 2; break; case 0x30u: v13 = SYM + 3; break; case 0x40u: v13 = SYM + 4; break; default: return v10; } v12 = mac_oneshot(v18, v13, (unsigned int)v16, a1 + v11 + 8, (int)a, a1); if ( v12 == 0 && ct_memcmp(a, &dst[v7 - 1], a1) == 0 ) return v12; } return v10; } return SYM - 4; }", "fw_segment_decrypt": "int __fastcall fw_segment_decrypt( int r0_0, unsigned int a0, int a1, _DWORD *a2, int a3, unsigned int a4, int a5, unsigned int a6, int a7) { unsigned int v8; int *v9; unsigned int v10; int *v11; unsigned int v12; int v13; int v14; unsigned int v15; unsigned int v16; unsigned int v17; int v18; int v19; _BYTE v20[512]; _BYTE dst[512]; _BYTE v21[672]; int v22; int v23; unsigned int v24; int a25; _DWORD *v26; v23 = r0_0; v24 = a0; a25 = a1; v26 = a2; v8 = -1; if ( a7 == SYM ) { v9 = (int *)SYM; v10 = 32; } else if ( a7 == SYM ) { v10 = 48; v9 = &(*SYM)[8]; } else { if ( a7 != SYM ) return SYM + 4; v10 = 64; v9 = &(*SYM)[20]; } v11 = v9; if ( a4 != a0 ) return SYM; v12 = 2 * v10 + 2; if ( v12 > a4 ) return SYM; __asm { SVC 0x66 ; 'f' } v22 = (unsigned __int8)v12; bzero(dst, 0x200u); bzero(v21, 0x200u); v13 = rsa_modexp(a3, a4, a5, a6, v23, a0, (int)v21, 0); v14 = SYM - 6; if ( v13 != 0 ) return v14; v15 = a4 - v10 - 1; v19 = v21[0]; memcpy_thunk((int)v20); memcpy_thunk((int)dst); v16 = hash_by_digest_size(v22, v10, (int)dst, v15, (int)v21, v10); if ( v16 != 0 ) return v14; while ( v16 < v10 ) { v20[v16] ^= v21[v16]; ++v16; } v17 = hash_by_digest_size(v22, v10, (int)v20, v10, (int)v21, v15); v18 = v17; if ( v17 != 0 ) return v14; while ( v17 < v15 ) { dst[v17] ^= v21[v17]; ++v17; } if ( ct_memcmp(v11, dst, v10) != 0 || v19 != 0 ) v18 = v14; while ( v10 < v15 ) { if ( dst[v10] == 1 && v8 == -1 ) v8 = v10 + 1; ++v10; } if ( v8 >= v15 ) return v14; if ( v18 == 0 ) { memcpy_thunk(a25); *v26 = v15 - v8; } return v18; }", "fw_load_and_verify": "int __fastcall fw_load_and_verify( int a0, unsigned int a1, int a2, unsigned int *a3, int a4, unsigned int a5, int a6, unsigned int a7, int a8) { unsigned int v9; unsigned int v10; unsigned int v11; _BYTE *v12; int v13; int v14; int v15; unsigned int v16; unsigned int v17; int v18; _BYTE v19[512]; _BYTE dst[512]; char v20; _BYTE v21[679]; unsigned int v22; int v23; unsigned int *v24; *(_DWORD *)&v21[675] = a0; v22 = a1; v23 = a2; v24 = a3; if ( a8 == SYM ) { v9 = 32; } else if ( a8 == SYM ) { v9 = 48; } else { if ( a8 != SYM ) return SYM + 4; v9 = 64; } if ( a5 - 2 * v9 - 2 < v22 ) return SYM; v10 = 2 * v9 + 2; if ( v10 > a5 ) return SYM; v11 = a5 - v9 - 1; if ( v11 > 0x200 ) return SYM; __asm { SVC 0x66 ; 'f' } v18 = (unsigned __int8)v10; bzero(dst, 0x200u); bzero(&v20, 0x200u); memcpy_thunk((int)dst); v12 = &dst[v9 + a5 - v22 - 2 * v9]; *(v12 - 2) = 1; memcpy_thunk((int)(v12 - 1)); v15 = rand_fill_bytes(v19, v9, v13, v14); if ( v15 == 0 ) { v16 = hash_by_digest_size(v18, v9, (int)v19, v9, (int)&v20, a5 - v9 - 1); if ( v16 != 0 ) return SYM - 6; while ( v11 > v16 ) { dst[v16] ^= v21[v16 - 1]; ++v16; } v17 = hash_by_digest_size(v18, v9, (int)dst, a5 - v9 - 1, (int)&v20, v9); v15 = v17; if ( v17 != 0 ) return SYM - 6; while ( v17 < v9 ) { v19[v17] ^= v21[v17 - 1]; ++v17; } v20 = 0; memcpy_thunk((int)v21); memcpy_thunk((int)&v21[v9]); if ( rsa_modexp(a4, a5, a6, a7, (int)&v20, a5, v23, 0) != 0 ) return SYM - 6; else *v24 = a5; } return v15; }", "fw_segment_stage": "int __fastcall fw_segment_stage( int a0, unsigned int a1, int a2, unsigned int *a3, int a4, unsigned int a5, int a6, unsigned int a7) { int v8; unsigned int v9; int v10; unsigned int v11; char v12; unsigned __int8 v13; v8 = 0; if ( a5 != a1 ) return SYM; if ( rsa_modexp(a4, a5, a6, a7, a0, a1, (int)&v12, 0) != 0 ) return SYM - 6; if ( v12 != 0 ) return SYM - 6; v9 = v13; if ( v13 != 2 ) return SYM - 6; do { if ( v9 >= a5 ) break; v10 = (unsigned __int8)*(&v12 + v9++); } while ( v10 != 0 ); if ( v9 < 0xB || v9 >= a5 ) return SYM - 6; v11 = a5 - v9; memcpy_thunk(a2); *a3 = v11; return v8; }", "fw_segment_copy": "int __fastcall fw_segment_copy( int a0, unsigned int a1, int a2, _DWORD *a3, int a4, unsigned int a5, int a6, unsigned int a7) { int result; unsigned int v8; int v9; int v10; int v11; unsigned int i; _BYTE *v12; _BYTE v13[2]; _BYTE v14[1186]; int v15; unsigned int v16; int v17; _DWORD *v18; v15 = a0; v16 = a1; v17 = a2; v18 = a3; result = SYM; if ( a5 >= 0xB && a1 <= a5 - 11 ) { v8 = a5 - a1 - 3; v13[0] = 0; v13[1] = 2; v11 = rand_fill_bytes(v14, v8, a2, (int)a3); if ( v11 == 0 ) { for ( i = 0; i < v8; ++i ) { v12 = &v13[i]; while ( v12[2] == 0 ) { result = rand_fill_bytes(v12 + 2, 1u, v9, v10); v11 = result; if ( result != 0 ) return result; } } v13[v8 + 2] = 0; memcpy_thunk((int)&v13[a5 - a1]); if ( rsa_modexp(a4, a5, a6, a7, (int)v13, a5, v17, 0) != 0 ) return SYM - 6; else *v18 = a5; } return v11; } return result; }", "nop_hook_vf": "void __fastcall nop_hook_vf() { ; }", "reg_write_vf_slot": "__int64 __fastcall reg_write_vf_slot(int a0) { __asm { SVC 0x7C ; '|' } return (unsigned int)(SYM + (a0 << 12)); }", "foreach_enabled_instance": "int __fastcall foreach_enabled_instance(unsigned int a0, int a1, unsigned int a2) { int v3; int result; unsigned int v4; unsigned int i; unsigned int j; v3 = 0; result = (unsigned __int8)feature_entry_get(a0); v4 = (unsigned __int8)result; if ( (_BYTE)result != 0 ) { for ( i = 0; i < v4; i = (unsigned __int8)(i + 1) ) { if ( feature_enabled(a0, i) ) { for ( j = 0; j < a2; ++j ) __asm { SVC 0x7C ; '|' } } result = select_mem_attr(a0); v3 += result; } } return result; }", "foreach_instance_indexed": "int __fastcall foreach_instance_indexed(int a0, int a1, int a2) { int v3; int result; unsigned int v4; unsigned int i; unsigned int j; v3 = 0; result = (unsigned __int8)feature_entry_get(a0); v4 = (unsigned __int8)result; if ( (_BYTE)result != 0 ) { result = 0; for ( i = 0; i < v4; i = result ) { if ( feature_enabled(a0, result) ) { for ( j = 0; j < a2; ++j ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0xA6 } if ( *((_DWORD *)SYM + 584) == 0 ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0xA6 } } } } v3 += select_mem_attr(a0); result = (unsigned __int8)(i + 1); } } return result; }", "instance_table_init": "void __fastcall instance_table_init() { int *v0; unsigned int v1; int v2; _BYTE v3[408]; int v4; v0 = (int *)SYM; v1 = 0; v4 = 0; do { if ( instance_is_present(*((unsigned __int16 *)v0 + v1)) == 0 ) vf_reg_setup(v2); ++v1; } while ( v1 < 0x51 ); memcpy(v3, SYM, sizeof(v3)); foreach_instance_indexed(0, (int)v3, 17); __asm { SVC 0x7B ; '{' } if ( v4 << 31 == 0 ) nop_hook_ecc(); }", "mp_service_task": "void __fastcall __noreturn mp_service_task() { int v0; int v1; int v2; int v3; int v4; _UNKNOWN **v5; _DWORD *v6; int v7; unsigned __int64 hw_counter_us; unsigned int v8; int v9; int v10; int v11; int v12; unsigned int v13; int v14; _DWORD *v15; unsigned int v16; unsigned int v17; int v18; int v19; unsigned int v20; int v21; unsigned int v22; int v23; v21 = 0; bzero_core((void *)SYM, 0x2000u); v2 = SYM; v3 = 2; *(_DWORD *)SYM = 2; *(_DWORD *)(v2 + 4) = 0; v4 = (unsigned __int8)*SYM; if ( v4 == 35 ) { v4 = SYM; v3 = 1; *(_DWORD *)SYM = 1; } dma_transfer(v4, v3, v0, v1); v5 = SYM; *((_DWORD *)*SYM + 426) |= 0x15000000u; *((_DWORD *)*v5 + 424) |= 0x300000u; v6 = *v5; v6[636] = 0; v6[637] = 0; v6[638] = 0; mbox_reset_state(); instance_table_init(); __asm { SVC 0x59 ; 'Y' } *SYM[0] = 29; while ( 1 ) { __asm { SVC 0x5A ; 'Z' } __asm { SVC 0x5E ; '^' } v7 = 0; hw_counter_us = read_hw_counter_us(); v21 = 0; v22 = 0; v23 = 0; while ( 1 ) { v8 = *((_DWORD *)*SYM + 640); v9 = *((_DWORD *)*SYM + 641); if ( v8 == 0 ) goto LABEL_55; v10 = (v8 >> 7) & 0x3FF; if ( v8 == 260096 ) { v10 = *((_DWORD *)*SYM + 641); v9 = 0; if ( *((_BYTE *)SYM + 2396) != 0 && *SYM != 49 ) __asm { SVC 0xAF } v11 = 3; } else if ( (v9 & 0x8000) != 0 ) { v11 = 0; } else if ( (v9 & 8) != 0 ) { v11 = 4; } else { v11 = 255; reg_read_nop(v10); } if ( v11 == 4 ) { error_to_status(v10, &v23, &v22, &v21); } else if ( (unsigned int)(v10 - 768) > 0x18 && (unsigned int)(v10 - 800) > 0x18 && (unsigned int)(v10 - 832) > 0x18 && (unsigned int)(v10 - 864) > 0x18 && (unsigned int)(v10 - 896) > 0x18 && (unsigned int)(v10 - 928) > 0x18 ) { reg_read_triple(v10, (int)&v23, (int)&v22, (int)&v21); } else { opcode_group_index2(v10, (int)&v23, (int)&v22, (int)&v21); } opcode_group_index(v10); if ( v11 != 0 ) { if ( v23 != 0 ) goto LABEL_37; } else if ( v23 != 0 ) { goto LABEL_31; } trace_event(0, 0xF01Au, v10, 0); v11 = 2; LABEL_31: if ( v21 >= 0 ) { LABEL_37: if ( v11 == 255 ) goto LABEL_52; goto LABEL_38; } if ( *((_BYTE *)SYM + 2396) != 0 && *SYM != 49 ) __asm { SVC 0xAF } v11 = 2; v23 = v21 & 0xFFFFF; v22 = v21 & 0xC0000000 | SYM & ((unsigned int)v21 >> 10); LABEL_38: v12 = SYM; if ( *(_DWORD *)SYM == 2 ) { v13 = *(_DWORD *)(SYM + 4); if ( v13 > 0xFF ) { *(_DWORD *)(SYM + 4) = v13 + 1; } else { v14 = SYM + 32 * v13; *(_DWORD *)(v14 + 8) = v10 | (v13 << 24); *(_DWORD *)(v14 + 12) = v9; *(_QWORD *)v14 = hw_counter_us; *(_DWORD *)(v14 + 16) = v22; *(_DWORD *)(v14 + 20) = v23; *(_DWORD *)(v14 + 24) = v11; *(_DWORD *)(SYM + 4) = v13 + 1; } } else if ( v11 == 0 ) { _ZF = *(_DWORD *)SYM == 1; v15 = *v5; *((_DWORD *)*v5 + 636) = v10 | (*(unsigned __int8 *)(SYM + 4) << 24); if ( _ZF ) { v15[637] = v23; v16 = v22; } else { v15[637] = v22; v16 = v23; } v15[638] = v16; v17 = *(_DWORD *)(v12 + 4); if ( v17 <= 0xFF ) { v18 = v10 | (v17 << 24); v19 = SYM + 32 * v17; v20 = v17 + 1; *(_DWORD *)(v19 + 8) = v18; *(_DWORD *)(v19 + 12) = v9; *(_QWORD *)v19 = hw_counter_us; *(_DWORD *)(v19 + 16) = v22; *(_DWORD *)(v19 + 20) = v23; *(_DWORD *)(v12 + 4) = v20; if ( v20 == 256 ) *(_DWORD *)(v12 + 4) = 255; } *((_DWORD *)*v5 + 346) = *(_DWORD *)(v12 + 4); } LABEL_52: if ( (unsigned int)++v7 > 0x10 ) break; if ( *((_DWORD *)*SYM + 642) == 0 ) goto LABEL_55; } *((_DWORD *)*v5 + 638) = SYM; LABEL_55: __asm { SVC 0x5F ; '_' } } }", "instance_id_in_use": "int __fastcall instance_id_in_use(unsigned int a0) { int *v1; unsigned int i; unsigned __int16 *v2; int *v3; v1 = (int *)SYM; for ( i = 0; feature_entry_get(0) > i; ++i ) { if ( !feature_enabled(0, i) ) { v2 = (unsigned __int16 *)v1 + i; if ( v2[29] == a0 ) return 1; if ( v2[41] == a0 ) return 1; if ( v2[47] == a0 ) return 1; v3 = &v1[2 * i]; if ( *((unsigned __int16 *)v3 + 53) <= a0 && *((unsigned __int16 *)v3 + 56) >= a0 ) return 1; } } return 0; }", "mbox_service_task": "void __fastcall __noreturn mbox_service_task() { int *v0; _UNKNOWN **v1; int v2; _DWORD *v3; int v4; int v5; int v6; _DWORD *v7; int v8; _DWORD *v9; int v10; int v11; int v12; int *v13; _DWORD *v14; int v15; __int64 v16; __asm { SVC 0x59 ; 'Y' } v0 = SYM; v1 = SYM; v2 = SYM; SYM[2] = 58; while ( 1 ) { __asm { SVC 0x5A ; 'Z' } __asm { SVC 0x5E ; '^' } v3 = *v1; v4 = *((_DWORD *)*v1 + 346); v5 = (unsigned __int16)v4; v6 = BYTE2(v4); if ( *v0 == 1 ) { if ( (unsigned __int16)v4 > 0xFFu ) v5 = 255; if ( BYTE2(v4) == 0 ) { v9 = (_DWORD *)(v2 + 32 * v5); v3[636] = v9[2]; v3[637] = v9[5]; v10 = v9[4]; LABEL_22: v3[638] = v10; goto LABEL_8; } if ( BYTE2(v4) != 1 ) goto LABEL_15; v13 = (int *)(v2 + 32 * v5); v11 = *v13++; v12 = *v13; v3[636] = v13[1]; v3[637] = v11; v3[638] = v12; } else { if ( *v0 != 2 ) { if ( (unsigned __int16)v4 > 0xFFu ) v5 = 255; v7 = (_DWORD *)(v2 + 32 * v5); v3[636] = v7[2]; v3[637] = v7[4]; v3[638] = v7[5]; v8 = v0[1]; goto LABEL_7; } if ( (unsigned __int16)v4 > 0xFFu ) v6 = 15; if ( v6 == 0 ) { v14 = (_DWORD *)(v2 + 32 * (unsigned __int16)v4); v3[636] = v14[2]; v3[637] = v14[4]; v10 = v14[5]; goto LABEL_22; } if ( v6 != 1 ) { if ( v6 != 4 ) { LABEL_15: v8 = v4 | 0xFF00; LABEL_7: v3[346] = v8; goto LABEL_8; } v3[636] = SYM; v3[637] = 2; v10 = v0[1]; goto LABEL_22; } v15 = v2 + 32 * (unsigned __int16)v4; v16 = *(_QWORD *)v15; v3[636] = *((unsigned __int8 *)SYM + 12) | (*(unsigned __int8 *)(v15 + 24) << 24) | 0xFF00; *(_QWORD *)(v3 + 637) = v16; } LABEL_8: __asm { SVC 0x5F ; '_' } } }", "mbox_reset_state": "_DWORD *__fastcall mbox_reset_state() { _DWORD *result; result = *SYM; result[643] = 0; result[644] = 0; result[645] = 4; result[645] = 2; return result; }", "instance_first_enabled": "unsigned int __fastcall instance_first_enabled(int a0, int a1) { int *v2; unsigned int i; unsigned int result; v2 = (int *)SYM; for ( i = 0; i < 0x51; ++i ) { result = *((unsigned __int16 *)v2 + i); if ( *((_WORD *)v2 + i) != 0 ) { result = instance_id_in_use(result); if ( result == 0 ) { __asm { SVC 0x7C ; '|' } result = SYM + 4 + (*((unsigned __int16 *)v2 + i) << 12); __asm { SVC 0x7C ; '|' } } } } return result; }", "instance_iter_masked": "unsigned int __fastcall instance_iter_masked(unsigned int a0, int a1, unsigned int a2, int a3) { int v4; unsigned __int8 v5; unsigned int v6; unsigned int i; unsigned int j; v4 = 0; v5 = feature_entry_get(a0); v6 = v5; if ( v5 != 0 ) { for ( i = 0; i < v6; i = (unsigned __int8)(i + 1) ) { if ( feature_enabled(a0, i) ) { for ( j = 0; j < a2; ++j ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } } } v4 += select_mem_attr(a0); } } return a0; }", "is_boot_stage": "BOOL __fastcall is_boot_stage(int a0) { return (unsigned __int8)*((_DWORD *)*SYM + 41) == a0; }", "mbox_clear_low": "void *__fastcall mbox_clear_low() { void *result; result = *SYM; *((_DWORD *)*SYM + 41) &= 0xFFFFFF00; return result; }", "mbox_clear_status": "_DWORD *__fastcall mbox_clear_status() { _DWORD *result; result = *SYM; result[41] = 0; result[42] = 0; return result; }", "mbox_set_status_bits": "int __fastcall mbox_set_status_bits(int a0) { int v1; v1 = (int)*SYM; *(_DWORD *)(v1 + 164) = *((_DWORD *)*SYM + 41) | a0; *(_DWORD *)(v1 + 168) = 0; return 0; }", "fw_entry_match_uuid": "BOOL __fastcall fw_entry_match_uuid(int a0, int a1, int a2) { unsigned __int8 v3; _BYTE dst[48]; int v4; v4 = *(_DWORD *)SYM; v3 = (unsigned __int8)bzero_core(dst, 0x30u); __asm { SVC 0x66 ; 'f' } return hmac_sha256(v3, SYM, SYM, 48, a0, a1, (int)dst, 48) == 0 && ct_memcmp((const void *)a2, dst, 0x30u) == 0; }", "hmac_verify_wrapper": "BOOL __fastcall hmac_verify_wrapper(int a0, int a1, int a2) { __asm { SVC 0x66 ; 'f' } return hmac_sha256((unsigned __int8)a0, SYM, SYM, 48, a0, a1, a2, 48) == 0; }", "be32_field_load": "int __fastcall be32_field_load(int result, int a0) { *(_DWORD *)(result + 20) = *(unsigned __int8 *)(a0 + 7) + (*(unsigned __int8 *)(a0 + 6) << 8) + (*(unsigned __int8 *)(a0 + 5) << 16) + (*(unsigned __int8 *)(a0 + 4) << 24); *(_DWORD *)(result + 24) = *(unsigned __int8 *)(a0 + 11) + (*(unsigned __int8 *)(a0 + 10) << 8) + (*(unsigned __int8 *)(a0 + 9) << 16) + (*(unsigned __int8 *)(a0 + 8) << 24); *(_DWORD *)(result + 28) = *(unsigned __int8 *)(a0 + 12); *(_BYTE *)(result + 32) = *(_BYTE *)(a0 + 15); *(_DWORD *)result = *(_DWORD *)(a0 + 16); *(_DWORD *)(result + 4) = 0; return result; }", "mbox_read_be32": "int __fastcall mbox_read_be32(int a0, int a1) { _UNKNOWN **v2; int v3; int v4; v2 = SYM; v3 = *((_DWORD *)*SYM + 41); if ( (v3 & 0x800000) == 0 ) return 0; v4 = *((_DWORD *)*SYM + 42); *(_BYTE *)(a0 + 3) = v4; *(_BYTE *)(a0 + 2) = BYTE1(v4); *(_BYTE *)(a0 + 1) = BYTE2(v4); *(_BYTE *)a0 = HIBYTE(v4); *(_BYTE *)a1 = (~v3 << 9 >> 31) + 1; *((_DWORD *)*v2 + 41) = v3 & 0x7F7FFFFF | 0x80000000; return 1; }", "mbox_post_be24": "int __fastcall mbox_post_be24(unsigned __int8 *a0, int a1) { int v2; int v3; int v4; unsigned int v5; v2 = (unsigned __int16)__rev16(*((unsigned __int16 *)a0 + 1)) | (a0[1] << 16) | (*a0 << 24); v3 = (int)*SYM; v4 = *((_DWORD *)*SYM + 41); if ( (v4 & 0x800000) == 0 ) return 0; *(_DWORD *)(v3 + 164) = v4 & 0xFF7FFFFF; *(_DWORD *)(v3 + 168) = v2; v5 = *(_DWORD *)(v3 + 164) | 0x80000000; if ( a1 != 0 ) v5 = *(_DWORD *)(v3 + 164) | 0xC0000000; *(_DWORD *)(v3 + 164) = v5; return 1; }", "config_find_type324": "int __fastcall config_find_type324() { unsigned int v0; unsigned int v1; int v2; int v3; int v4; int v5; int v6; int *v7; v0 = 0; v1 = 0; v2 = 0; while ( *(_DWORD *)(SYM + 16 * v2 + 1676) != 324 ) { if ( (unsigned int)++v2 >= 0x10 ) goto LABEL_5; } v3 = SYM + 16 * v2; v0 = *(_DWORD *)(v3 + 1680); v1 = *(_DWORD *)(v3 + 1684); LABEL_5: if ( v2 == 16 ) return SYM + 2; if ( v1 == 0 ) return SYM + 5; v4 = (int)*SYM; if ( *SYM == nullptr ) return SYM + 1; udiv_select_shift(v0, *(_DWORD *)(v4 + 12) << 10); if ( v5 != 0 ) return SYM; if ( v0 == 0 ) return SYM; v6 = *(_DWORD *)(v4 + 20); if ( v1 >= v6 << 10 || v1 < 0x38 ) return SYM; if ( (v6 << 10) - v1 < v0 ) return SYM; v7 = SYM; *SYM = v0; v7[1] = v1; return 0; }", "fw_teardown_all": "int __fastcall fw_teardown_all(unsigned int a0) { int result; if ( fw_slot_any_busy(a0) ) return 1; if ( fw_slot_scan_b(a0) != 0 ) return 1; if ( fw_slot_scan_a(a0) != 0 ) return 1; result = fw_slot_scan_c(a0); if ( result != 0 ) return 1; return result; }", "object_persist_store": "int __fastcall object_persist_store(int a0) { int v1; int v2; unsigned int v3; int free; int v4; v1 = SYM; v2 = 1; v3 = *(_DWORD *)(a0 + 4) + *(_DWORD *)(a0 + 104) + 112; if ( v3 > 0x1F9C ) return SYM; __asm { SVC 0x5E ; '^' } free = persist_find_by_uuid((unsigned int *)(a0 + 8), *(unsigned __int8 *)(a0 + 1), (unsigned int *)(a0 + 72)); if ( free == -1 && (v2 = 0, (free = persist_slot_find_free()) == -1) ) { v4 = v1; } else { v4 = svc_queue_wait(free, a0, v3); if ( v4 == 0 && v2 == 0 ) { v4 = persist_slot_init(a0 + 8, *(_BYTE *)(a0 + 1), a0 + 72, free); if ( v4 != 0 ) svc_queue_wait_simple(); } } __asm { SVC 0x5F ; '_' } return v4; }", "debug_unlock_apply": "int __fastcall debug_unlock_apply() { int v0; if ( debug_disabled() || debug_port_enabled() ) return 0; set_slot_flags(1); set_active_slot_id(0); v0 = vf_config_apply(0); if ( v0 == 0 ) { v0 = check_caller_permission(4u); if ( v0 == 0 ) { if ( *((_DWORD *)SYM + 556) == 0 || (set_active_slot_id(170), (v0 = vf_config_apply(170)) == 0) && (v0 = check_caller_permission(0xFu)) == 0 ) { set_active_slot_id(12); v0 = vf_config_apply(12); if ( v0 == 0 ) { v0 = check_caller_permission(0x10u); if ( v0 == 0 ) { set_active_slot_id(276); v0 = vf_config_apply(276); if ( v0 == 0 ) { v0 = check_caller_permission(0x11u); if ( v0 == 0 ) { set_active_slot_id(11); v0 = vf_config_apply(47); if ( v0 == 0 ) v0 = check_caller_permission(0xBu); } } } } } } } set_slot_flags(0); return v0; }", "flash_mode_read": "int __fastcall flash_mode_read(unsigned int *a0) { int result; unsigned int v1; result = 0; v1 = a0[18]; if ( v1 == 1 || v1 == 3 ) { result = flash_read_dispatch(1, 0, 1, 0); if ( result == 0 && a0[18] == 1 ) return spi_write_verified(1u, 0, 0, 0x48u, a0, 0); } return result; }", "ring_owner_check": "int __fastcall ring_owner_check(int a0, __int64 a1, int a2, int a3, unsigned int a4, int a5) { int result; unsigned int v6; result = 0; if ( a4 != 0xFFFF ) { if ( a4 < 0xF ) { v6 = SYM + 240 * a0 + 16 * a4; *(_QWORD *)v6 = a1 - *(_QWORD *)SYM; *(_DWORD *)(v6 + 8) = a3; *(_BYTE *)(v6 + 12) = 3; if ( a5 != 0 ) *(_BYTE *)(v6 + 12) = 15; } else { return SYM; } } return result; }", "reg_allowlist_lookup": "int __fastcall reg_allowlist_lookup(int a0, unsigned __int8 a1, _BYTE *a2, _BYTE *a3) { int result; int v4; _DWORD v5[2]; _BYTE *v6; v6 = a3; v5[0] = a0; v5[1] = a1; result = hashtable_insert((int *)SYM, (int)v5, &v6); if ( result == SYM ) { v4 = SYM; *a2 = *(_BYTE *)(SYM + 12 * (_DWORD)v6 + 8); *a3 = *(_BYTE *)(v4 + 12 * (_DWORD)v6 + 9); return 0; } return result; }", "spirom_xfer_core": "unsigned int __fastcall spirom_xfer_core(unsigned __int8 a0, int a1, int a2, int a3, int a4, int *a5, int a6) { int v7; __int64 v8; int v9; unsigned int v10; unsigned int result; __int64 v11; unsigned __int64 v12; int v13; unsigned int v14; int v15; int v16; int v17; __int64 v18; v16 = a0; v17 = a1; v18 = *(_QWORD *)&a2; HIDWORD(v8) = a0; v7 = 0; LODWORD(v8) = a1; v9 = 255; v10 = 0; v14 = 0; __asm { SVC 0x66 ; 'f' } v15 = a0; while ( 1 ) { result = pcie_port_reg_read(v7, 8, (int)&v14); if ( result != 0 ) return SYM + 8; if ( v14 << 31 == 0 ) { if ( v9 == 255 ) v9 = v7; goto LABEL_21; } if ( pcie_port_reg_read(v7, 0, (int)&v14) != 0 ) return SYM + 8; LODWORD(v11) = (unsigned __int64)v14 >> 16; HIDWORD(v11) = v14 << 16; result = pcie_port_reg_read(v7, 4, (int)&v14); if ( result != 0 ) return SYM + 8; v12 = (unsigned __int64)(v14 + 1) << 16; if ( a4 == 0 ) break; if ( *(_DWORD *)(SYM + 8 * v7) == v15 ) { ++v10; } else if ( (a6 != 101 && a6 != 102 || *(_DWORD *)(SYM + 8 * v7 + 4) != 103) && __PAIR64__(v11, HIDWORD(v11)) < __PAIR64__(v8, HIDWORD(v8)) + v18 && __PAIR64__(v8, HIDWORD(v8)) < v12 ) { return SYM + 8; } LABEL_21: if ( (unsigned int)++v7 >= 0x10 ) goto LABEL_22; } if ( v11 != v8 || v12 - __PAIR64__(v11, HIDWORD(v11)) != v18 ) goto LABEL_21; v9 = v7; LABEL_22: if ( v10 >= 4 && v15 != 0 ) return SYM; if ( v9 == 255 ) return SYM + 8; v13 = SYM; *(_DWORD *)(SYM + 8 * v9) = v15; *(_DWORD *)(v13 + 8 * v9 + 4) = a6; *a5 = v9; return result; }", "client_config_find": "int __fastcall client_config_find(int a0, _DWORD *a1, _DWORD *a2) { int v3; unsigned int v4; int current_client_id; unsigned int v5; __int64 *v6; _QWORD *v7; __int64 v8; v3 = SYM; v4 = 0; current_client_id = get_current_client_id(); if ( current_client_id == 0 ) return SYM + 3; v5 = *(_DWORD *)(current_client_id + 256); v6 = (__int64 *)(current_client_id + 320); while ( v5 > v4 ) { v7 = v6 + 1; v8 = *v6; if ( *(_DWORD *)v6 == a0 ) { *a1 = v7; v3 = 0; *a2 = HIDWORD(v8); return v3; } ++v4; v6 = &v7[HIDWORD(v8)]; } return v3; }", "config_entry_match": "int __fastcall config_entry_match(_DWORD *a0, int *a1, unsigned int a2, int a3, int a4) { int result; unsigned int v5; int v6; result = 0; if ( a4 == 0 ) return SYM; v5 = HIWORD(a2); if ( a3 == 1 && v5 == 0xFFFF ) return SYM; if ( a3 != 0 ) { if ( a3 == 1 ) { *a0 = a4 + (v5 << 10) + 1544; v6 = 64; } else { if ( a3 != 2 ) return SYM + 4; *a0 = a4 + 16904; v6 = 48; } } else { *a0 = a4 + 8; v6 = 96; } *a1 = v6; return result; }", "reg_poll_until_set": "int __fastcall reg_poll_until_set(int a0, int a1) { int v2; int v3; v2 = 0; v3 = 1000; __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } if ( a0 == SYM - 4 ) { do { __asm { SVC 0x7B ; '{' } --v3; } while ( v3 != 0 && SYM != 0 ); if ( SYM != 0 ) return SYM; } return v2; }", "region_enable_mask": "int __fastcall region_enable_mask(int a0, int a1) { int *v2; unsigned int *v3; char *v4; int v5; int result; int *v6; __int64 v7; platform_region_size(13); v2 = SYM; v3 = (unsigned int *)SYM; v4 = (char *)SYM; v5 = 1 << (a1 + 1); if ( a0 == 13 ) { if ( a1 == 0xFFFF ) v5 = 1; *((_DWORD *)SYM + 1) |= v5; return map_and_copy_44(((unsigned __int64)v3[3] + *(_QWORD *)v2) >> 32, v3[3] + *v2); } if ( a0 != 19 ) { if ( a0 != 24 ) { if ( a0 != 58 ) return SYM; if ( a1 == 0xFFFF ) v5 = 1; *((_DWORD *)SYM + 2) |= v5; } return map_and_copy_44(((unsigned __int64)v3[3] + *(_QWORD *)v2) >> 32, v3[3] + *v2); } if ( a1 != 0xFFFF ) return SYM + 4; bzero_core(SYM, 0x2Cu); v6 = SYM; *(_DWORD *)v4 = 1; v7 = *(_QWORD *)v6; *(_QWORD *)(v4 + 12) = v3[1] + *(_QWORD *)v6; *(_QWORD *)(v4 + 28) = v3[2] + v7; *(_QWORD *)(v4 + 20) = v3[8] + v7; *(_QWORD *)(v4 + 36) = v3[9] + v7; result = map_and_copy_44(((unsigned __int64)v3[3] + *(_QWORD *)v2) >> 32, v3[3] + *v2); if ( result == 0 ) return mp_reset_wait(((unsigned __int64)v3[3] + *(_QWORD *)v6) >> 32, v3[3] + *v6); return result; }", "boot_mode_query": "void *__fastcall boot_mode_query(int a0) { int v1; v1 = 0; if ( reg_read_stub() == 2 ) v1 = 2; if ( *((_DWORD *)SYM + 556) != 0 ) v1 |= 1u; if ( clock_gate_set(0) != 0 ) v1 |= 4u; if ( clock_gate_set(1) != 0 ) v1 |= 8u; mbox_clear_status(); *((_DWORD *)*SYM + 42) = v1; return mbox_set_busy(); }", "mp_reset_wait": "int __fastcall mp_reset_wait(int a0, int a1) { int v2; int result; int v3; v2 = SYM; result = reg_poll_until_set(SYM, a0); if ( result == 0 ) { v3 = SYM - 216; result = reg_poll_until_set(SYM - 216, 1); if ( result == 0 ) { result = reg_poll_until_set(v2, a1); if ( result == 0 ) return reg_poll_until_set(v3, 2); } } return result; }", "ring_state_check": "int __fastcall ring_state_check(_DWORD *a0) { if ( read_hw_status() == 0 ) return SYM + 9; if ( get_default_ring() != 0xFFFF ) return SYM; *a0 = *SYM; return 0; }", "mbox_set_ready32": "_DWORD *__fastcall mbox_set_ready32() { _DWORD *result; result = *SYM; result[42] = 32; result[41] = result[41] & 0x7FFFFF00 | 0x80000000; return result; }", "mp_reset_sequence": "int __fastcall mp_reset_sequence(__int16 a0, int a1, int a2, int a3, int a4) { int v5; int v6; trace_event(11, 0xF022u, (unsigned __int16)(a0 << 8), 0); v5 = reg_poll_timeout(1000 * a4); v6 = v5; if ( v5 == 0 ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } v5 = reg_poll_timeout(1000 * a4); v6 = v5; } trace_event(11, 0xF023u, v5, 0); return v6; }", "smu_mailbox_xfer": "int __fastcall smu_mailbox_xfer(int a0, int a1, int a2, _DWORD *a3, unsigned int a4) { int v5; int *v6; int v7; unsigned int v8; _DWORD *v9; unsigned int i; int v10; int *v11; v5 = 0; __asm { SVC 0x5E ; '^' } __asm { SVC 0x7D ; '}' } v6 = (int *)SYM; if ( SYM != nullptr ) { v7 = 0; v8 = (unsigned int)SYM >> 20 << 20; v11 = (int *)(SYM + v8); v9 = (_DWORD *)(v8 + SYM - 24); while ( *v9 == 0 ) { __asm { SVC 0x56 ; 'V' } if ( a4 != -1 && ++v7 > a4 ) { LABEL_13: v5 = SYM; goto LABEL_19; } } *v9 = 0; *v6 = a1; *v11 = a0; for ( i = 0; i <= 0x64; ++i ) { if ( *v9 != 0 ) break; delay_us(10); } v10 = 0; while ( *v9 == 0 ) { __asm { SVC 0x56 ; 'V' } if ( a4 != -1 && ++v10 > a4 - 1 ) goto LABEL_13; } if ( *v9 != 1 ) v5 = SYM + 1; if ( a3 != nullptr ) *a3 = *v6; } else { v5 = SYM; } LABEL_19: __asm { SVC 0x5F ; '_' } if ( v6 != nullptr ) __asm { SVC 0x7E ; '~' } return v5; }", "mbox_fault_report": "void *__fastcall mbox_fault_report() { int v0; int v1; int v2; int v3; int v4; if ( *((_DWORD *)SYM + 220) != 0 || *((_DWORD *)SYM + 221) != 0 ) { mbox_clear_status(); *((_DWORD *)*SYM + 42) = *(_DWORD *)(v0 + 880); mbox_set_busy(); while ( (*(_DWORD *)(*(_DWORD *)v1 + 164) & 0x800000) == 0 ) ; mbox_clear_status(); *(_DWORD *)(*(_DWORD *)v2 + 168) = *(_DWORD *)(v3 + 884); mbox_set_busy(); while ( (*(_DWORD *)(*(_DWORD *)v4 + 164) & 0x800000) == 0 ) ; mbox_clear_status(); return mbox_set_busy(); } else { mbox_clear_status(); return (void *)mbox_set_status_bits(150994944); } }", "mp_send_request": "int __fastcall mp_send_request(int a0, int a1, unsigned int a2, int a3, unsigned int a4) { int v5; _BYTE v6[8]; _BYTE v7[72]; bzero_core(v6, 0x50u); if ( a2 >= 0x48 || a4 >= 0x48 || a2 + a4 >= 0x48 ) return SYM; if ( a0 == 0 || a0 == 255 ) return SYM + 15; v6[3] = a4; v6[2] = a2; v6[4] = a0; v6[0] = *((_BYTE *)SYM + 5); v6[1] = *((_BYTE *)SYM + 6); if ( a1 != 0 && a2 != 0 ) memcpy_thunk((int)v7); v5 = flash_window_release((int)v6); if ( v5 == 0 && a3 != 0 && a4 != 0 ) memcpy_thunk(a3); return v5; }", "mp_send_and_wait": "int __fastcall mp_send_and_wait(int a0, int a1, int a2, int a3) { int result; result = mp_wait_response(a0, a1, a2, a3); if ( result == 0 ) return mp_send_request(a0, 0, 0, 0, 0); return result; }", "task_spawn_worker": "int __fastcall task_spawn_worker(int a0, int a1, int a2, int a3, _DWORD *a4, int a5, int *src, int *a6) { int v7; int result; _DWORD *v8; int v9; v7 = 3; v9 = 0; result = worker_ctx_alloc(&v9); if ( result == 0 ) { *(_DWORD *)(v9 + 16) = a1; __asm { SVC 0x54 ; 'T' } v8 = (_DWORD *)v9; *(_DWORD *)(v9 + 28) = a5; v8[5] = a2; v8[9] = 3; v8[2] = a0; v8[3] = 0; v8[6] = *a4; memcpy(v8 + 11, src, 0x20u); result = param_types_scan(v9); if ( result == 0 ) { *(_DWORD *)(v9 + 4) = 2; __asm { SVC 0x57 ; 'W' } __asm { SVC 0x56 ; 'V' } if ( *(_DWORD *)(v9 + 4) == 4 ) { param_types_apply((int)src, v9); v7 = *(_DWORD *)(v9 + 36); result = *(_DWORD *)(v9 + 32); *a4 = *(_DWORD *)(v9 + 24); } else { result = SYM; } } } if ( v9 != 0 ) *(_DWORD *)(v9 + 4) = 0; *a6 = v7; return result; }", "dram_window_get": "int __fastcall dram_window_get(unsigned int a0, int a1) { int v2; _DWORD *v3; __int64 v4; int v5; unsigned __int8 v6[4]; int v7; v6[0] = -1; if ( a0 >= 2 ) return SYM - 1; v2 = SYM; v3 = (_DWORD *)(SYM + 28 * a0); if ( *v3 == 0 ) return SYM; v4 = ((v3[2] + 4095) & (unsigned int)(SYM >> 4)) + *(_QWORD *)SYM; v5 = map_client_buffer((unsigned __int64)(v4 + 4096) >> 32, v4 + 4096, 0x1000u, v6, &v7, 0, 1, 0xFFFFu); if ( v5 == 0 ) { if ( v7 != 0 ) { v5 = smu_mailbox_xfer( 31, ((a1 & 2) != 0) | (2 * (a1 & 1)) | (4 * ((a1 & 4) != 0)) | (8 * ((a1 & 8) != 0)) | (a0 << 31), 0, nullptr, 0x3E8u); *(_DWORD *)(v7 + 128) = a1; } else { v5 = v2; } } if ( v6[0] != 255 ) __asm { SVC 0x6C ; 'l' } return v5; }", "field4_set": "int __fastcall field4_set(int result) { (*SYM)[4] = result; return result; }", "attr_copy_4_alt": "int __fastcall attr_copy_4_alt(int a0, int *a1, unsigned int a2, int a3) { int v4; unsigned int *v5; unsigned int v6; _DWORD dst[12]; unsigned int *v7; v4 = SYM; v5 = (unsigned int *)(*(_DWORD *)(a0 + 4) + 112); if ( a2 <= 4 ) { memcpy(dst, a1, 12 * a2); if ( a2 == 4 ) { v7 = v5 + 257; v4 = bn_to_bytes_be((int)(v5 + 64), 0x100u, SYM, v5 + 257, dst, 4u, a3); if ( v4 == 0 ) { v6 = 8 * v5[257]; if ( v6 > 0xFF && *(_DWORD *)(*(_DWORD *)(a0 + 4) + 96) >= v6 ) { v4 = bn_to_bytes_be((int)(v5 + 192), 0x100u, SYM, v7, dst, 4u, a3); if ( v4 == 0 ) { v4 = bn_to_bytes_be((int)(v5 + 128), 0x100u, SYM, v5 + 258, dst, 4u, a3); if ( v4 == 0 ) { v4 = bn_to_bytes_be((int)v5, 0x100u, SYM, v5 + 256, dst, 4u, a3); if ( v4 == 0 ) { *(_DWORD *)(*(_DWORD *)(a0 + 4) + 4) = 1036; *(_DWORD *)(*(_DWORD *)(a0 + 4) + 92) = v6; } } } } } } } return v4; }", "mbox_set_error": "int __fastcall mbox_set_error(int result) { int v0; v0 = (int)*SYM; *((_DWORD *)*SYM + 452) |= 0x80u; *(_DWORD *)(v0 + 1804) = result; return result; }", "attr_copy_5": "int __fastcall attr_copy_5(int a0, int *a1, unsigned int a2, int a3) { int v4; int v5; int v6; int v7; _DWORD dst[15]; v4 = *(_DWORD *)(a0 + 4); v5 = SYM; v6 = *(_DWORD *)(v4 + 88); v7 = v4 + 112; if ( a2 <= 5 ) { memcpy(dst, a1, 12 * a2); if ( (v6 != SYM || a2 == 4) && (v6 != SYM || a2 == 5) ) { v5 = bn_to_bytes_be(v7, 0x80u, SYM, nullptr, dst, a2, a3); if ( v5 == 0 ) { v5 = bn_to_bytes_be(v7 + 128, 0x14u, SYM, nullptr, dst, a2, a3); if ( v5 == 0 ) { v5 = bn_to_bytes_be(v7 + 148, 0x80u, SYM, nullptr, dst, a2, a3); if ( v5 == 0 ) { v5 = bn_to_bytes_be(v7 + 276, 0x80u, SYM, nullptr, dst, a2, a3); if ( v5 == 0 && (v6 != SYM - 1 || (v5 = bn_to_bytes_be(v7 + 404, 0x80u, SYM, nullptr, dst, a2, a3)) == 0) ) { *(_DWORD *)(*(_DWORD *)(a0 + 4) + 4) = 532; *(_DWORD *)(*(_DWORD *)(a0 + 4) + 92) = 1024; } } } } } } return v5; }", "attr_copy_4": "int __fastcall attr_copy_4(int a0, int *a1, unsigned int a2, int a3) { int v4; _DWORD *v5; _DWORD *entry_by_id; int v6; int v7; _DWORD dst[13]; v4 = SYM; v5 = (_DWORD *)(*(_DWORD *)(a0 + 4) + 112); if ( a2 > 4 ) return v4; memcpy(dst, a1, 12 * a2); entry_by_id = find_entry_by_id(dst, a2, SYM); if ( entry_by_id == nullptr || entry_by_id[1] != 4 ) return v4; v5[1] = 384; v6 = *(_DWORD *)(*(_DWORD *)(a0 + 4) + 88); if ( v6 == SYM || v6 == SYM + 1 ) { if ( a2 != 4 ) return v4; v4 = bn_to_bytes_be((int)(v5 + 2), 0x42u, SYM, nullptr, dst, 4u, a3); if ( v4 != 0 ) return v4; } else if ( v6 != SYM && v6 != SYM + 1 || a2 != 3 ) { return v4; } v4 = bn_to_bytes_be((int)v5 + 74, 0x42u, SYM, nullptr, dst, a2, a3); if ( v4 == 0 ) { v7 = bn_to_bytes_be((int)(v5 + 35), 0x42u, SYM, nullptr, dst, a2, a3); v4 = v7; if ( v7 == 0 ) { *v5 = 4; *(_DWORD *)(*(_DWORD *)(a0 + 4) + 4) = 208; *(_DWORD *)(*(_DWORD *)(a0 + 4) + 92) = v5[1]; } } return v4; }", "read_reg_pair": "int __fastcall read_reg_pair(int a0, int a1, _DWORD *a2) { __int64 v3; __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } v3 = 0; *a2 = a0; a2[1] = a1; return v3; }", "bitmap_set_strided": "unsigned int __fastcall bitmap_set_strided(char a0, int a1, int a2, int a3) { unsigned int v4; unsigned int v5; char v6; v4 = 0; v5 = a0 & 0x1F; while ( a1-- != 0 ) { v4 = v5 >> 5; v6 = v5 & 0x1F; v5 += a2; *(_DWORD *)(a3 + 4 * v4) |= 1 << v6; } return v4 + 1; }", "bitmap_apply_for_each_bit": "unsigned int __fastcall bitmap_apply_for_each_bit(unsigned int a0, unsigned int a1, char a2, int a3, int a4, int a5) { unsigned int result; unsigned int i; result = 0; for ( i = 0; i < a1; ++i ) { if ( a0 << 31 != 0 ) result = bitmap_set_strided(a2 + i, a3, a4, a5); a0 >>= 1; } return result; }", "alg_params_for_curve": "int __fastcall alg_params_for_curve(int a0, _DWORD *a1, int a2, unsigned int a3, unsigned int a4) { unsigned int v5; int v6; unsigned int v7; int v8; int v9; _BYTE v10[64]; int v11; v5 = a4; v11 = *(_DWORD *)SYM; v6 = 0; switch ( a2 ) { case 805306370: v7 = 64; v8 = SYM; v9 = 20; goto LABEL_7; case 805306371: v7 = 64; v8 = SYM + 1; v9 = 28; goto LABEL_7; case 805306372: v7 = 64; v8 = SYM + 2; v9 = 32; goto LABEL_7; case 805306373: v7 = 128; v8 = SYM + 3; v9 = 48; goto LABEL_7; case 805306374: v7 = 128; v8 = SYM + 4; v9 = 64; LABEL_7: if ( a4 <= v7 ) goto LABEL_11; v6 = mac_oneshot(a0, v8, a3, a4, (int)v10, v9); if ( v6 == 0 ) { v5 = v9; LABEL_11: memcpy_thunk((int)(a1 + 49)); a1[48] = v7; a1[81] = v5; a1[82] = v8; } return v6; default: return SYM; } }", "ccp_queue_submit": "int __fastcall ccp_queue_submit(int a0, int a1, int a2) { int v3; _DWORD *v4; v3 = 0; if ( ccp_is_enabled() == 0 ) return 49; v4 = *(_DWORD **)(SYM + 4 * a0); v4[1] = *(_DWORD *)(SYM - 84 + 28 * a0 + 4) + 32 * ((a1 + 1) & (*(_DWORD *)(SYM - 84 + 28 * a0 + 16) - 1)); if ( a2 != 0 ) *v4 |= 1u; return v3; }", "sysdrv_mbox_query_37_unsupported": "int __fastcall sysdrv_mbox_query_37_unsupported() { return SYM; }", "slot_table_set": "int __fastcall slot_table_set(int r0_0, unsigned int a0) { _DWORD *v1; int v2; _DWORD *v3; __int64 v4; __int64 v5; _QWORD v6[2]; int v7; unsigned __int8 v8; int a9; v1 = SYM; v8 = -1; a9 = 0; if ( a0 == 0xFFFF ) a0 = 15; if ( a0 > 0xF ) return SYM; v3 = (_DWORD *)(SYM + 8 * a0); *v3 |= 5u; v1[446] = *v3; v1[447] = v3[1]; HIDWORD(v4) = (unsigned __int64)(*(_QWORD *)SYM + 9437184LL) >> 32; LODWORD(v4) = (4 * v1[4]) & 0x7FFFFFF; v5 = v4 + (unsigned int)(*SYM + 9437184); region_size_lookup(2); v6[1] = v5; v6[0] = 0x10000000000001LL; v7 = 0x100000; __asm { SVC 0x8B } v2 = (int)v6; if ( v6 == nullptr ) { __asm { SVC 0x6D ; 'm' } v2 = v8; if ( v8 == 0 ) memcpy_thunk(a9); } if ( v8 != 255 ) __asm { SVC 0x6C ; 'l' } return v2; }", "ccp_pack_mem_attrs": "int __fastcall ccp_pack_mem_attrs(int a0, int a1, int a2, unsigned __int16 a3) { return a3 | (a0 << 16); }", "sysdrv_set_index_and_read": "int __fastcall sysdrv_set_index_and_read(unsigned int a0, _DWORD *a1) { if ( a0 > 0xF ) return SYM; *SYM[0] = a0; flash_caps_update(); log_field4_get(); *a1 = *SYM; return 0; }", "persist_slot_init": "int __fastcall persist_slot_init(int a0, char a1, int a2, int a3) { int v4; if ( (unsigned int)(a3 - 256) > 0xFF ) return SYM; v4 = SYM + 88 * (a3 - 256); *(_DWORD *)(v4 + 84) = a3; *(_BYTE *)(v4 + 80) = a1; memcpy_thunk(v4); memcpy_thunk(v4 + 64); return 0; }", "mbox_set_busy": "void *__fastcall mbox_set_busy() { void *result; result = *SYM; *((_DWORD *)*SYM + 41) |= 0x80000000; return result; }", "sysdrv_set_misc_param": "int __fastcall sysdrv_set_misc_param(int a0) { *((_DWORD *)SYM + 3) = a0; return 0; }", "attr_list_copy": "int __fastcall attr_list_copy(int a0, int *a1, unsigned int a2, int a3) { int v4; int v5; int v6; int *v7; _DWORD *param_by_id; _DWORD *v8; unsigned int v9; int v10; unsigned int i; int v11; unsigned int v12; _DWORD *entry_by_id; bool v13; int v14; _DWORD dst[24]; _BYTE v15[4]; int v16; int v17; int v18; int v19; int v20; int v21; int v22; unsigned int v23; int v24; v4 = SYM; v24 = 0; v5 = *(_DWORD *)(a0 + 4); v6 = *(_DWORD *)(v5 + 88); v7 = (int *)(v5 + 112); if ( a2 <= 8 ) { memcpy(dst, a1, 12 * a2); if ( (v6 != SYM || a2 == 2) && (v6 != SYM || a2 == 3 || a2 == 8) ) { param_by_id = find_param_by_id(dst, a2, SYM, a3); v8 = param_by_id; if ( param_by_id != nullptr ) { v9 = param_by_id[2]; if ( v9 <= *(_DWORD *)(*(_DWORD *)(a0 + 4) + 96) >> 3 ) { v7[1] = 8 * v9; if ( rsa_key_get_components((int)v7, (int)v15) == 0 ) { v10 = v8[1]; for ( i = 0; i < v9; ++i ) *(_BYTE *)(v16 + i) = *(_BYTE *)(v9 - i + v10 - 1); v11 = SYM; v12 = v9 + 16; v7[2] = 0; v4 = bn_to_bytes_be((int)(v7 + 2), 4u, v11, nullptr, dst, a2, a3); if ( v4 == 0 ) { entry_by_id = find_entry_by_id(dst, a2, SYM); if ( entry_by_id != nullptr ) { v13 = v6 == SYM; v7[3] = entry_by_id[2]; if ( !v13 ) goto LABEL_26; v4 = bn_to_bytes_be(v17, v9, SYM, nullptr, dst, a2, a3); if ( v4 == 0 ) { v12 += v9; if ( a2 != 8 ) goto LABEL_26; v23 = v9 >> 1; v24 = 1; v12 += 5 * (v9 >> 1); v4 = bn_to_bytes_be(v18, v9 >> 1, SYM, nullptr, dst, 8u, a3); if ( v4 == 0 ) { v14 = bn_to_bytes_be(v19, v23, SYM, nullptr, dst, 8u, a3); v4 = v14; if ( v14 == 0 ) { v4 = bn_to_bytes_be(v20, v23, SYM, nullptr, dst, 8u, a3); if ( v4 == 0 ) { v4 = bn_to_bytes_be(v21, v23, SYM, nullptr, dst, 8u, a3); if ( v4 == 0 ) { v4 = bn_to_bytes_be(v22, v23, SYM, nullptr, dst, 8u, a3); if ( v4 == 0 ) { LABEL_26: *(_DWORD *)(*(_DWORD *)(a0 + 4) + 4) = v12; *(_DWORD *)(*(_DWORD *)(a0 + 4) + 92) = v7[1]; *v7 = v24; } } } } } } } } } } } } } return v4; }", "attr_marshal": "int __fastcall attr_marshal(int a0, __int64 *a1, int a2, int a3) { __int64 v4; unsigned int v5; int v6; int v7; int v8; int v9; int v10; v4 = *a1; v5 = *((_DWORD *)a1 + 2); v6 = SYM; if ( validate_client_range(*((_DWORD *)a1 + 1), v5, a3, 0) != 0 && a2 == 1 && (_DWORD)v4 == -1073741824 ) { v7 = *(_DWORD *)(a0 + 4); if ( v5 <= *(_DWORD *)(v7 + 96) >> 3 ) { memcpy_thunk(v7 + 112); v8 = SYM; *(_DWORD *)(*(_DWORD *)(a0 + 4) + 4) = v5; *(_DWORD *)(*(_DWORD *)(a0 + 4) + 92) = 8 * v5; v9 = *(_DWORD *)(a0 + 4); v10 = *(_DWORD *)(v9 + 88); if ( v10 == v8 || v10 == v8 + 2 ) *(_DWORD *)(v9 + 92) = 8 * v5 - (v5 & 0x1FFFFFFF); return 0; } } return v6; }", "persist_slot_addr": "unsigned int __fastcall persist_slot_addr(int a0, int a1, int a2) { unsigned int result; result = a0 - 16; if ( result < 0x80 ) { result = SYM + 8 * result; if ( *(unsigned __int8 *)(result + 1) == a2 ) *(_DWORD *)(result + 4) = a1; } return result; }", "flash_caps_update": "int __fastcall flash_caps_update() { char *v0; int result; v0 = SYM; *((_DWORD *)SYM + 3) |= 1u; result = *((_DWORD *)v0 + 3) | (2 * get_dpm_index()); *((_DWORD *)v0 + 3) = result; return result; }", "phys_range_compose": "int __fastcall phys_range_compose(__int64 *a0) { int *v1; __int64 v2; int result; __int64 v3; int v4; int v5; int v6; int v7; __int64 v8; __int64 v9; v8 = 0; v9 = 0; if ( *a0 != 0 ) goto LABEL_3; __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } v8 = (16 * v8 + v9) << 20; v1 = SYM; v2 = v8 + (unsigned int)SYM; --HIDWORD(v2); *a0 = v2; result = read_reg_pair(v2, SHIDWORD(v2), v1); if ( result == 0 ) { LABEL_3: v3 = *(_QWORD *)SYM + 0x400000LL; v6 = 60; v4 = 0x100000; v5 = 0; result = spirom_xfer(&v3, 0); *((_DWORD *)SYM + 5) = v7; } return result; }", "field6_set": "int __fastcall field6_set(int result) { *((_DWORD *)SYM + 6) = result; return result; }", "spi_wait_ready": "int __fastcall spi_wait_ready(int a0, int a1, int a2, int a3) { char *v4; unsigned int v5; int v6; int v7; v7 = a3; v4 = SYM; v5 = 0; LOBYTE(v7) = 0; v6 = SYM(*((_DWORD *)SYM + 1) + 52, 0, 0, 0, 0, 0, v7); if ( v6 != 0 ) goto LABEL_7; do { v6 = ((int (__fastcall *)(int, _DWORD, _DWORD, _DWORD, int *, int))SYM)( *((_DWORD *)v4 + 1) + 44, 0, 0, 0, &v7, 1); if ( v6 != 0 ) break; ++v5; if ( ((1 << *(_BYTE *)(*((_DWORD *)v4 + 1) + 30)) & (unsigned __int8)v7) == *(unsigned __int8 *)(*((_DWORD *)v4 + 1) + 33) ) break; } while ( v5 < 0xA ); if ( v5 == 10 ) { v6 = SYM; goto LABEL_7; } if ( v6 != 0 ) { LABEL_7: log_event(8u, 14); log_event(6u, v6); } return v6; }", "mp_query_capability": "int __fastcall mp_query_capability(int a0, int a1, int a2, int a3) { unsigned __int8 *v4; int v5; int result; int v6; int v7; int v8; v8 = a3; v4 = (unsigned __int8 *)SYM; v5 = 0; while ( 1 ) { result = mp_send_and_wait(v4[52], a1, a2, a3); if ( result != 0 ) break; result = mp_send_request(v4[36], 0, 0, (int)&v8, 1u); if ( result != 0 ) break; v6 = v4[9]; v7 = v4[10] == 1 ? (unsigned __int8)(v6 & v8) : v6 & ~(unsigned __int8)v8; if ( v7 == 0 ) break; if ( (unsigned int)++v5 > 0xA ) return SYM; delay_us(1); } return result; }", "config_find_type258b": "int __fastcall config_find_type258b(int a0) { int i; for ( i = 0; i < 10; ++i ) { if ( *(_DWORD *)(SYM + 32 * i + 1304) == 258 ) { *(_DWORD *)(SYM + 32 * i + 1328) = a0; return 0; } } return SYM; }", "spirom_region_read": "int __fastcall spirom_region_read(int a0, unsigned int a1, int a2) { __int64 v3; int result; __int64 v4; int v5; int v6; int v7; int v8; if ( *SYM == 0 ) return SYM; v3 = *((_QWORD *)SYM + 3); v5 = a2; v4 = v3 + a1; v6 = 0; v7 = a0; result = spirom_xfer(&v4, 0); if ( result == 0 ) *(_BYTE *)(SYM + v8) = 1; return result; }", "desc_init_type4": "_DWORD *__fastcall desc_init_type4(_DWORD *result, int a0) { result[1] = SYM; *result = 4; result[3] = *(_DWORD *)(a0 + 8); result[2] = 0x1000000; return result; }", "desc_init_type5": "_DWORD *__fastcall desc_init_type5(int a0) { *(_DWORD *)(a0 + 4) = SYM; *(_DWORD *)a0 = 5; *(_DWORD *)(a0 + 8) = 0; *(_DWORD *)(a0 + 12) = 4096; *(_DWORD *)(a0 + 16) = 255; return (_DWORD *)a0; }", "result_set_alt": "int __fastcall result_set_alt(int a0, int a1) { if ( a0 == 0 ) return 44; *(_DWORD *)(a0 + 4) = a1; return 0; }", "platform_mode_get": "int __fastcall platform_mode_get(int a0) { int v1; int v2; v1 = 0; __asm { SVC 0x7B ; '{' } v2 = *((_DWORD *)SYM + 406); if ( v2 == 1 || v2 == 2 ) { __asm { SVC 0x7C ; '|' } *((_DWORD *)SYM + 406) = 0; return reg_read_nop2(a0); } return v1; }", "sysdrv_load_verify_fw_segment": "int __fastcall sysdrv_load_verify_fw_segment(int a0, int a1, int a2, int a3, int a4, int a5) { int v6; char *v7; int v8; _BYTE a[32]; int v9; v9 = *(_DWORD *)SYM; if ( a4 != 32 ) return SYM; v7 = SYM; if ( *SYM == 0 ) { derive_apob_hmac_key_thunk(); if ( v8 != 0 ) return v8; *v7 = 1; } if ( a5 == 0 ) return hmac_sha256(a0, SYM, SYM, 32, a1, a2, a3, 32); v6 = hmac_sha256(a0, SYM, SYM, 32, a1, a2, (int)a, 32); if ( v6 == 0 && ct_memcmp(a, (const void *)a3, 0x20u) != 0 ) return SYM; return v6; }", "queue_slot_release": "int __fastcall queue_slot_release(unsigned int a0, int a1) { int *v2; int v3; unsigned int v4; if ( a0 >= 3 ) return 48; v2 = *(int **)(SYM + 4 * a0); v3 = *v2; if ( (*v2 & 2) == 0 ) return 52; v4 = SYM - 84 + 28 * a0; if ( !ring_has_space(a0, a1) ) return 48; v2[2] = *(_DWORD *)(v4 + 4) + 32 * ((a1 + 1) & (*(_DWORD *)(v4 + 16) - 1)); v2[4] = 2; *v2 = v3 | 1; return 0; }", "instance_is_present": "int __fastcall instance_is_present(int a0) { int result; result = 0; if ( a0 == 11 ) { if ( *((_DWORD *)SYM + 321) == 0 ) return result; } else if ( a0 != 47 ) { return result; } return 1; }", "trace_event": "void __fastcall trace_event(int a0, unsigned int a1, int a2, int a3) { if ( a1 <= 0xF000 ) { if ( a1 < 0xF000 && a0 == 0 ) return; } else if ( a0 != 0 ) { return; } if ( a1 == 1 || a1 == 2 || (trace_reg_poke(), a2 != 0) && a1 > 0xF000 ) { trace_reg_poke(); if ( a2 != 0 && (a1 == 2 || a1 > 0xF000) ) trace_reg_poke(); } if ( a3 != 0 && a1 > 0xF000 ) __asm { SVC 0x9A } }", "trace_unless_ee": "void __fastcall trace_unless_ee(unsigned int a0) { if ( HIBYTE(a0) != 238 && HIBYTE(a0) != 239 ) trace_reg_poke(); }", "spirom_write_checked": "int __fastcall spirom_write_checked(int a0, unsigned int a1, int a2, int a3) { unsigned int v4; char v5; int v6; int v7; int *v8; char *v9; int v10; unsigned int i; int v11; unsigned int *v12; unsigned int v13[64]; unsigned int v14; unsigned int a[10]; v4 = a1; v5 = a3; a[8] = *(_DWORD *)SYM; v6 = 0; v14 = 1; if ( *(_DWORD *)SYM == 1 ) { if ( a3 == 1 ) return SYM - 1; __asm { SVC 0x5E ; '^' } __asm { SVC 0xA7 } if ( a1 == -1 ) { v7 = flash_entry_match(a, v13, &v14); if ( v7 != 0 ) { LABEL_22: __asm { SVC 0x5F ; '_' } return v7; } v4 = v13[0]; v6 = 1; } if ( v4 < 0x40 ) { v8 = (int *)SYM; v7 = SYM + 3; v9 = (char *)*SYM + 8 * v4; if ( v9[16] == 1 && v9[17] == v5 ) { v10 = *((unsigned __int16 *)v9 + 9); if ( ct_memcmp(a, (char *)SYM[2] + 16 * v10 + 16, 0x10u) != 0 ) { ++v7; } else { for ( i = 0; i < v14; ++i ) { v11 = *v8 + 8 * v4; *(_DWORD *)(v11 + 20) = 0; *(_BYTE *)(v11 + 16) = 0; bzero((void *)(v8[2] + 16 * v10 + 16), 0x10u); if ( i + 1 == v14 ) break; v12 = &v13[i]; v4 = v12[1]; v10 = *(unsigned __int16 *)(*v8 + 8 * v4 + 18); } v7 = flash_slot_match(a, v6); if ( v7 == 0 ) { v7 = svc_queue_wait(18, *v8, 8 * *(_DWORD *)*v8 + 16); if ( v7 == 0 ) v7 = svc_queue_wait(17, v8[2], 16 * *(_DWORD *)v8[2] + 16); } } } } else { v7 = SYM + 2; } goto LABEL_22; } return SYM; }", "flash_slot_match": "int __fastcall flash_slot_match(unsigned int *a0, int a1) { int v2; int v3; int v4; _DWORD *v5; int v6; int v7; v2 = SYM; v3 = 0; v4 = SYM; while ( 1 ) { v5 = (_DWORD *)(v4 + 24 * v3); if ( v5[1] == 1 && memcmp_be(v5 + 3, a0, 0x10u) == 0 ) break; if ( (unsigned int)++v3 >= 0x40 ) return v2; } v6 = v4 + 24 * v3; if ( a1 != 0 ) { *(_DWORD *)(v6 + 4) = 0; v5[2] = 0; v5[3] = 0; v5[4] = 0; v5[5] = 0; v5[6] = 0; } else { v7 = *(_DWORD *)(v6 + 8) - 1; v5[2] = v7; if ( v7 == 0 ) { v5[3] = 0; v5[4] = 0; v5[5] = 0; v5[6] = 0; v5[1] = 0; } } return 0; }", "flash_entry_match": "int __fastcall flash_entry_match(unsigned int *a0, unsigned int *a1, _DWORD *a2) { int v3; _UNKNOWN **v4; unsigned int v5; unsigned int i; int v6; unsigned int *v7; v3 = 0; v4 = SYM; v5 = 0; *a2 = 0; while ( 1 ) { v7 = (unsigned int *)v4[2]; if ( *v7 <= v5 ) break; if ( memcmp_be(&v7[4 * v5 + 4], a0, 0x10u) == 0 ) { for ( i = 0; *(_DWORD *)*v4 > i; ++i ) { v6 = (int)*v4 + 8 * i; if ( *(_WORD *)(v6 + 18) == (unsigned __int8)v5 && *(_BYTE *)(v6 + 16) == 1 ) { *a1++ = i; ++*a2; break; } } } ++v5; } if ( *a2 == 0 ) return SYM; return v3; }", "spirom_erase_checked": "int __fastcall spirom_erase_checked(int a0, unsigned int a1, _BYTE *a2, int a3, int a4) { int v5; char *v6; int v7; _DWORD **v8; _BYTE *v9; unsigned int v10; char *v11; _DWORD *v12; unsigned int v13; unsigned int v14; _DWORD v15[2]; _BYTE a[32]; int v16; int v17; unsigned int v18; _BYTE *v19; int v20; v17 = a0; v18 = a1; v19 = a2; v20 = a3; v16 = *(_DWORD *)SYM; if ( *(_DWORD *)SYM == 1 ) { __asm { SVC 0x5E ; '^' } if ( a1 < 0x40 ) { v5 = SYM + 3; v6 = (char *)*SYM + 8 * a1; if ( v6[16] != 1 ) goto LABEL_18; if ( (unsigned __int8)v6[17] != (unsigned __int8)a4 ) goto LABEL_18; v5 = SYM + 4; if ( *((_DWORD *)v6 + 5) != a3 ) goto LABEL_18; v7 = *((unsigned __int16 *)v6 + 9); v8 = (_DWORD **)SYM; if ( a4 == 1 ) { v15[0] = a1; v15[1] = a3; if ( hmac_sha256(v17, SYM, (int)SYM[1] + 32 * v7 + 16, 32, (int)v15, 8, (int)a, 32) != 0 ) { v5 = SYM + 5; goto LABEL_18; } v9 = v19; v10 = 32; v11 = a; } else { if ( a4 != 2 ) goto LABEL_9; __asm { SVC 0xA7 } v10 = 16; v11 = (char *)SYM[2] + 16 * v7 + 16; v9 = a; } if ( ct_memcmp(v9, v11, v10) == 0 ) { v12 = *v8; v13 = (unsigned int)&(*v8)[2 * a1]; v14 = *(_DWORD *)(v13 + 20); if ( v14 + 1 >= v14 ) { *(_DWORD *)(v13 + 20) = v14 + 1; v5 = svc_queue_wait(18, (int)v12, 8 * *v12 + 16); } else { v5 = SYM + 7; } } goto LABEL_18; } LABEL_9: v5 = SYM + 2; LABEL_18: __asm { SVC 0x5F ; '_' } return v5; } return SYM; }", "spirom_state_reset": "int __fastcall spirom_state_reset() { _DWORD *v0; int v1; int v2; int v3; int *v4; int v5; int result; int v6; _BYTE *v7; _BYTE *v8; int v9; v9 = 0; bzero_core(SYM, 0x604u); bzero_core((void *)SYM, 0x210u); bzero_core((void *)SYM, 0x810u); bzero_core((void *)SYM, 0x410u); svc_queue_state_get((int)&v9); v0 = SYM; if ( v9 == 1 && *((unsigned __int8 *)SYM + 1004) << 31 != 0 ) { v1 = svc_queue_submit(16, SYM, 0x810u); v2 = SYM; v3 = v1; v4 = (int *)SYM; if ( v1 == 0 || v1 == SYM ) { v5 = svc_queue_submit(17, SYM, 0x410u); v3 = v5; if ( v5 == 0 || v5 == v2 ) { v3 = svc_queue_submit(18, SYM, 0x210u); if ( v3 == 0 ) v3 = spirom_multi_write((unsigned int *)v4[2]); } } if ( v3 == v2 ) { v6 = *v4; v3 = 0; *(_BYTE *)(v6 + 4) = 0; *(_DWORD *)v6 = 0; v7 = (_BYTE *)v4[1]; v7[4] = 0; *(_DWORD *)v7 = 0; v8 = (_BYTE *)v4[2]; v8[4] = 0; *(_DWORD *)v8 = 0; } else if ( v3 != 0 ) { LABEL_15: trace_event(0, 0xF005u, v3, 0); return v3; } *v0 = 1; goto LABEL_15; } result = 0; *(_DWORD *)SYM = 0; return result; }", "spirom_multi_write": "int __fastcall spirom_multi_write(unsigned int *a0) { int v1; int v2; unsigned int v3; int v4; unsigned int *v5; int v6; _DWORD *v7; unsigned int v8; int v9; v1 = SYM; if ( *a0 > 0x40 ) return SYM + 1; v2 = SYM; v3 = 0; LABEL_20: if ( *a0 > v3 ) { v1 = SYM; v4 = 255; v5 = &a0[4 * v3 + 4]; if ( buffer_all_zero((int)v5, 0x10u) != 0 ) goto LABEL_5; v6 = 0; while ( 1 ) { v7 = (_DWORD *)(v2 + 24 * v6); if ( v7[1] == 1 ) { if ( memcmp_be(v7 + 3, v5, 0x10u) == 0 ) { v8 = *(_DWORD *)(v2 + 24 * v6 + 8); if ( v8 <= 0x20 ) { v7[2] = v8 + 1; v1 = 0; } else { v1 = SYM + 1; } LABEL_16: if ( v4 != 255 && v1 == SYM ) { v9 = v2 + 24 * v4; memcpy_thunk(v9 + 12); *(_DWORD *)(v9 + 8) = 1; *(_DWORD *)(v9 + 4) = 1; LABEL_5: v1 = 0; } ++v3; goto LABEL_20; } } else if ( v4 == 255 ) { v4 = v6; } if ( (unsigned int)++v6 >= 0x40 ) goto LABEL_16; } } return v1; }", "spirom_write_dispatch": "int __fastcall spirom_write_dispatch(int a0, unsigned int a1, _BYTE *a2, _DWORD *a3, int a4) { int v5; char *v6; int v7; _DWORD *v8; int v9; _BYTE *v10; unsigned int v11; char *v12; unsigned int v13; _BYTE a[32]; int v14; int v15; unsigned int v16; _BYTE *v17; _DWORD *v18; v15 = a0; v16 = a1; v17 = a2; v18 = a3; v14 = *(_DWORD *)SYM; v5 = 0; if ( *(_DWORD *)SYM == 1 ) { __asm { SVC 0x5E ; '^' } if ( a1 < 0x40 ) { v6 = (char *)*SYM + 8 * a1; if ( v6[16] != 1 || (unsigned __int8)v6[17] != (unsigned __int8)a4 ) { v5 = SYM + 3; LABEL_17: __asm { SVC 0x5F ; '_' } return v5; } v7 = *((unsigned __int16 *)v6 + 9); v8 = SYM; v9 = SYM + 4; if ( a4 == 1 ) { v13 = a1; v5 = hmac_sha256(v15, SYM, (int)SYM[1] + 32 * v7 + 16, 32, (int)&v13, 4, (int)a, 32); if ( v5 != 0 ) { v5 = SYM + 5; goto LABEL_17; } v10 = v17; v11 = 32; v12 = a; } else { if ( a4 != 2 ) goto LABEL_9; __asm { SVC 0xA7 } v11 = 16; v12 = (char *)SYM[2] + 16 * v7 + 16; v10 = a; } if ( ct_memcmp(v10, v12, v11) != 0 ) v5 = v9; else *v18 = *(_DWORD *)(*v8 + 8 * a1 + 20); goto LABEL_17; } LABEL_9: v5 = SYM + 2; goto LABEL_17; } return SYM; }", "spirom_read_checked": "int __fastcall spirom_read_checked(unsigned int a0, unsigned int *a1, int a2, int a3) { int v4; unsigned int v5; unsigned int v6; int v7; char v8; int v9; unsigned int v10; int v11; _UNKNOWN **v12; _DWORD *v13; int v14; unsigned int v15; _DWORD *v16; int v17; unsigned int v18[6]; unsigned int *v19; int v20; int v21; v18[5] = a0; v19 = a1; v20 = a2; v21 = a3; v18[4] = *(_DWORD *)SYM; v4 = 0; v5 = 0; v6 = 0; if ( *(_DWORD *)SYM == 1 ) { __asm { SVC 0x5E ; '^' } v8 = a3; v7 = SYM + 2; v9 = (int)*SYM; v10 = *(_DWORD *)*SYM; if ( v10 >= 0x40 ) { while ( v10 > v6 ) { v11 = v9 + 8 * v6; if ( *(_BYTE *)(v11 + 16) == 0 && *(unsigned __int8 *)(v11 + 17) == (unsigned __int8)a3 ) { v10 = v6; v4 = 1; v5 = *(unsigned __int16 *)(v9 + 8 * v6 + 18); goto LABEL_11; } ++v6; } if ( SYM != 0 ) goto LABEL_34; } LABEL_11: v12 = SYM; if ( *(_BYTE *)(v9 + 8 * v10 + 16) != 0 ) { v7 = SYM; LABEL_34: __asm { SVC 0x5F ; '_' } return v7; } if ( a3 == 1 ) { if ( v4 == 0 ) v5 = *(_DWORD *)SYM[1]; if ( v5 >= 0x40 ) goto LABEL_34; memcpy_thunk((int)SYM[1] + 32 * v5 + 16); if ( v4 == 0 ) ++*(_DWORD *)v12[1]; v13 = v12[1]; v14 = 16; v15 = 32 * *v13 + 16; } else { if ( a3 != 2 ) { v7 = SYM + 3; goto LABEL_34; } if ( v4 == 0 ) v5 = *(_DWORD *)SYM[2]; if ( v5 >= 0x40 ) goto LABEL_34; __asm { SVC 0xA7 } v7 = spirom_slot_find(v18); if ( v7 != 0 ) goto LABEL_34; memcpy_thunk((int)v12[2] + 16 * v5 + 16); if ( v4 == 0 ) ++*(_DWORD *)v12[2]; v13 = v12[2]; v14 = 17; v15 = 16 * *v13 + 16; } v7 = svc_queue_wait(v14, (int)v13, v15); if ( v7 == 0 ) { v16 = *v12; v17 = (int)*v12 + 8 * v10; *(_DWORD *)(v17 + 20) = 0; *(_BYTE *)(v17 + 16) = 1; *(_BYTE *)(v17 + 17) = v8; *(_WORD *)(v17 + 18) = v5; if ( v4 == 0 ) ++*v16; v7 = svc_queue_wait(18, (int)v16, 8 * *v16 + 16); if ( v7 == 0 ) *v19 = v10; } goto LABEL_34; } return SYM + 1; }", "spirom_slot_find": "int __fastcall spirom_slot_find(unsigned int *a0) { int v1; int v2; int v3; int v4; int v5; _DWORD *v6; unsigned int v7; int v8; v1 = SYM; v2 = 255; v3 = SYM; v4 = 0; v5 = SYM; while ( 1 ) { v6 = (_DWORD *)(v3 + 24 * v4); if ( v6[1] != 1 ) { if ( v2 == 255 ) v2 = v4; goto LABEL_10; } if ( memcmp_be(v6 + 3, a0, 0x10u) == 0 ) break; LABEL_10: if ( (unsigned int)++v4 >= 0x40 ) goto LABEL_11; } v7 = *(_DWORD *)(v3 + 24 * v4 + 8); if ( v7 < 0x20 ) { v6[2] = v7 + 1; v5 = 0; } else { v5 = SYM + 7; } LABEL_11: if ( v2 != 255 && v5 == v1 ) { v8 = v3 + 24 * v2; memcpy_thunk(v8 + 12); ++*(_DWORD *)(v8 + 8); *(_DWORD *)(v8 + 4) = 1; return 0; } return v5; }", "spirom_range_check": "int __fastcall spirom_range_check(__int64 a0, int a1, int *a2, int *a3) { int v4; int v5; char *v6; int v7; _BYTE *v8; int v9; int v10; int v11; unsigned int v12; int v13; int v14; unsigned int v15; int v16; v4 = SYM; v16 = 0; if ( a0 == 0 || *(_QWORD *)a2 == 0 || (unsigned int)(a1 - 104) >= 0x1F99 ) return v4; v13 = HIDWORD(a0) & (SYM >> 19); v5 = HIDWORD(a0) - v13; v11 = 1; v12 = (a1 + HIDWORD(a0) - v13 + 4095) & 0xFFFFF000; v14 = a0; v15 = v12; __asm { SVC 0x6B ; 'k' } if ( &v11 == nullptr ) { v6 = SYM; __asm { SVC 0x6D ; 'm' } v7 = v16; *((_DWORD *)SYM + 4) = a1; *((_DWORD *)v6 + 5) = a1 - 8; *((_DWORD *)v6 + 6) = v7 + v5; memcpy(SYM, a2, 0x18u); memcpy((char *)SYM + 24, a3 + 6, 0x18u); memcpy((char *)SYM + 48, a3, 0x18u); memcpy((char *)SYM + 72, a3 + 12, 0x18u); v8 = SYM; v9 = *((_DWORD *)SYM + 2); if ( v9 != 0 ) { if ( v9 != 1 ) return v4; *((_QWORD *)v6 + 5) = *(_QWORD *)SYM; v10 = 1 << v8[12]; } else { *((_QWORD *)v6 + 5) = *(_QWORD *)SYM + 0xFDFC000000LL; v10 = 1 << v8[12]; } *((_DWORD *)v6 + 7) = v10; if ( 1 << *((_BYTE *)SYM + 60) == 4 && 1 << *((_BYTE *)SYM + 36) == 4 && 1 << *((_BYTE *)SYM + 84) == 4 && 1 << v8[12] == 4 ) { *((_DWORD *)v6 + 1) = 1; __asm { SVC 0x5C ; '\\' } return 0; } return v4; } return SYM + 1; }", "flash_read_indirect": "int __fastcall flash_read_indirect(int a0, int a1, int a2, int a3) { int v4; unsigned int v5; char *v6; int v7; int v8; unsigned __int64 hw_counter_us; _DWORD *v9; _DWORD *v10; int v11; unsigned __int64 v12; v4 = 0; v5 = 0; if ( *((_DWORD *)SYM + 6) == 0 ) return SYM; v6 = SYM; if ( *((_DWORD *)SYM + 1) == 0 || *(_QWORD *)SYM == 0 ) return SYM; ret_not_supported(); __asm { SVC 0x5E ; '^' } while ( 2 ) { if ( v5 < a2 ) { hw_counter_us = read_hw_counter_us(); while ( 1 ) { v9 = *((_DWORD **)v6 + 6); v9[2] = 32; v9[3] = 0; v9[4] = a0; v9[5] = 0; v9[6] = a1 + v5; v9[7] = 0; v9[8] = 1; v9[9] = 0; v10 = v9 + 2; v4 = evtlog_push(134, a3, v7, v8); if ( v4 != 0 ) goto LABEL_16; v11 = v10[1]; if ( v11 != 11 && v11 != 10 ) break; __asm { SVC 0x56 ; 'V' } v4 = v10[1]; v12 = read_hw_counter_us(); v7 = SYM; if ( v12 - hw_counter_us >= (unsigned int)SYM ) { if ( v4 != 0 ) goto LABEL_16; goto LABEL_14; } } if ( v11 != 0 ) { v4 = SYM + 3; break; } LABEL_14: v5 = (unsigned __int8)(v5 + 1); __asm { SVC 0x56 ; 'V' } continue; } break; } LABEL_16: __asm { SVC 0x5F ; '_' } ret_not_supported(); return v4; }", "flash_desc_resolve": "int __fastcall flash_desc_resolve(int a0, int a1, _DWORD *a2, _DWORD *a3, int a4) { _DWORD *v5; _DWORD *v6; int v7; if ( a2 == nullptr || a3 == nullptr ) return SYM; if ( *((_DWORD *)SYM + 6) == 0 || *((_DWORD *)SYM + 1) == 0 || *(_QWORD *)SYM == 0 ) return SYM + 2; __asm { SVC 0x5E ; '^' } v5 = *((_DWORD **)SYM + 6); v5[2] = 40; v5[3] = 0; v5[4] = a0; v5[5] = 0; v5[6] = a1; v5[7] = 0; v6 = v5 + 2; v7 = evtlog_push(131, a4, (int)a2, (int)a3); if ( v7 == 0 ) { if ( v6[1] != 0 ) { v7 = SYM + 5; } else { *a2 = v6[6]; *a3 = v6[8]; } } __asm { SVC 0x5F ; '_' } return v7; }", "flash_read_core": "int __fastcall flash_read_core(unsigned int r0_0, int a0, int a1, unsigned int a2, int a3, int a4) { unsigned int v5; char *v6; unsigned int v7; unsigned int v8; unsigned __int64 hw_counter_us; int v9; void *v10; int v11; int v12; int v13; int v14; int v15; v5 = a2; if ( a2 == 0 || a3 == 0 ) return SYM; v6 = SYM; if ( *((_DWORD *)SYM + 6) == 0 || *((_DWORD *)SYM + 1) == 0 || *(_QWORD *)SYM == 0 ) return SYM + 2; ret_not_supported(); __asm { SVC 0x5E ; '^' } v7 = *((_DWORD *)v6 + 5) - 56; LABEL_7: if ( v5 <= v7 ) v8 = v5; else v8 = v7; hw_counter_us = read_hw_counter_us(); do { v9 = *((_DWORD *)SYM + 6); *(_DWORD *)(v9 + 12) = 0; *(_DWORD *)(v9 + 8) = v8 + 40; *(_QWORD *)(v9 + 16) = r0_0; v9 += 24; *(_DWORD *)v9 = a0; *(_DWORD *)(v9 + 4) = 0; *(_DWORD *)(v9 + 8) = a1; *(_DWORD *)(v9 + 12) = 0; *(_DWORD *)(v9 + 16) = v8; v10 = (void *)(v9 + 24); *(_DWORD *)(v9 + 20) = 0; v11 = v9 - 16; bzero_core(v10, v8); v14 = evtlog_push(132, a4, v12, v13); if ( v14 != 0 ) break; v15 = *(_DWORD *)(v11 + 4); if ( v15 != 11 ) { if ( v15 != 0 ) { v14 = SYM + 5; break; } memcpy_thunk(a3); v5 -= v8; a1 += v8; a3 += v8; if ( v5 != 0 ) goto LABEL_7; break; } __asm { SVC 0x56 ; 'V' } v14 = 11; } while ( read_hw_counter_us() - hw_counter_us < (unsigned int)SYM ); __asm { SVC 0x5F ; '_' } ret_not_supported(); return v14; }", "spirom_write_page": "int __fastcall spirom_write_page(int a0, unsigned int *a1, _DWORD *a2) { int v3; int v4; _DWORD *v5; int v6; _DWORD *v7; unsigned int i; int v8; int v9; _BYTE dst[4]; unsigned int v10[9]; _DWORD src[9]; int v11; unsigned int *v12; _DWORD *v13; int v14; v11 = a0; v12 = a1; v13 = a2; src[8] = *(_DWORD *)SYM; v3 = 0; v4 = *((_DWORD *)SYM + 6); v5 = (_DWORD *)(v4 + 8); if ( *a2 > 0x1F4u ) return SYM; v6 = *a2; if ( v4 == 0 || *((_DWORD *)SYM + 1) == 0 || *(_QWORD *)SYM == 0 ) return SYM + 2; __asm { SVC 0x5E ; '^' } bzero_core(dst, 0x28u); v7 = SYM; dst[0] = *((_BYTE *)SYM + 1016); dst[2] = *((_BYTE *)SYM + 1008); dst[1] = 2; for ( i = *a1; *a1 + v6 > i; ++i ) { v10[0] = i; buf_reverse_inplace(v10, 4u); v3 = hmac_sha256(v11, SYM, SYM, 32, (int)dst, 8, (int)src, 32); if ( v3 != 0 ) break; v5[1] = 0; *v5 = 48; v5[2] = v7[252]; v5[3] = v10[0]; memcpy(v5 + 4, src, 0x20u); v3 = evtlog_push(136, v14, v8, v9); if ( v3 != 0 ) break; if ( v5[1] != 0 ) { v3 = v5[1]; break; } --*a2; } *a1 += v6 - *a2; __asm { SVC 0x5F ; '_' } return v3; }", "flash_write_core": "int __fastcall flash_write_core(unsigned int a0, int a1, int a2, unsigned int a3, int a4, int a5, unsigned int a6) { unsigned int v7; char *v8; unsigned int v9; unsigned int v10; unsigned __int64 hw_counter_us; int v11; int v12; int v13; int v14; int v15; int v16; int v17; v7 = a3; if ( a3 == 0 || a4 == 0 ) return SYM; v8 = SYM; if ( *((_DWORD *)SYM + 6) == 0 || *((_DWORD *)SYM + 1) == 0 || *(_QWORD *)SYM == 0 ) return SYM + 2; ret_not_supported(); __asm { SVC 0x5E ; '^' } if ( a6 != 0 ) v9 = a6; else v9 = *((_DWORD *)v8 + 5) - 56; LABEL_8: if ( v7 <= v9 ) v10 = v7; else v10 = v9; hw_counter_us = read_hw_counter_us(); do { v11 = *((_DWORD *)SYM + 6); *(_DWORD *)(v11 + 12) = 0; *(_DWORD *)(v11 + 8) = v10 + 40; *(_QWORD *)(v11 + 16) = a0; v11 += 24; *(_DWORD *)v11 = a1; *(_DWORD *)(v11 + 4) = 0; *(_DWORD *)(v11 + 8) = a2; *(_DWORD *)(v11 + 12) = 0; *(_DWORD *)(v11 + 16) = v10; v12 = v11 + 24; *(_DWORD *)(v11 + 20) = 0; v13 = v11 - 16; memcpy_thunk(v12); v16 = evtlog_push(133, a5, v14, v15); if ( v16 != 0 ) break; v17 = *(_DWORD *)(v13 + 4); if ( v17 != 11 ) { if ( v17 != 0 ) { v16 = SYM + 5; break; } v7 -= v10; a2 += v10; a4 += v10; if ( *SYM != 0 ) __asm { SVC 0x56 ; 'V' } if ( v7 != 0 ) goto LABEL_8; break; } __asm { SVC 0x56 ; 'V' } v16 = 11; } while ( read_hw_counter_us() - hw_counter_us < (unsigned int)SYM ); __asm { SVC 0x5F ; '_' } ret_not_supported(); return v16; }", "spi_mode_select": "int __fastcall spi_mode_select(int a0) { int v1; if ( a0 != 0 ) v1 = 11; else v1 = 10; if ( v1 == 11 && reg_read_stub() != 2 ) return 0; __asm { SVC 0x7B ; '{' } return 0; }", "reg_read_stub": "int __fastcall reg_read_stub() { __asm { SVC 0x7B ; '{' } return 0; }", "flash_window_release": "int __fastcall flash_window_release(int a0) { __asm { SVC 0x7D ; '}' } return SYM - 5; }", "flash_read_dispatch": "int __fastcall flash_read_dispatch(int a0, unsigned int a1, int a2, int a3) { int v4; int indirect; unsigned int v5; v5 = a3; if ( *SYM[0] == 0 ) { indirect = flash_read_indirect(a0, a1, a2, a3); LABEL_4: v4 = indirect; if ( indirect == 0 ) return v4; goto LABEL_5; } v4 = flash_region_translate(a0, a1, 0, &v5); if ( v4 == 0 ) { indirect = fw_entry_load(2, v5, a2 << 12, a3); goto LABEL_4; } LABEL_5: if ( *SYM != 0 ) trace_event(0, 0xF016u, v4, 1); return v4; }", "spi_write_region": "int __fastcall spi_write_region(unsigned int a0, int a1) { int v2; int v3; int v4; int sector_desc; int v5; int v6; int v7; int v8; int v9; int v10; int v11; int v12; int v13; v8 = 0; v9 = 0; v10 = 0; v11 = 0; v12 = 0; v13 = 0; spi_sector_align(a0, a1, &v8); sector_desc = spi_find_sector_desc(&v8, v2, v3, v4); if ( sector_desc != 0 ) goto LABEL_11; sector_desc = spi_check_alignment(a0, a1, &v10, &v12); if ( sector_desc != 0 ) goto LABEL_11; if ( v11 != 0 ) { sector_desc = spi_page_program( (unsigned __int8 *)(*((_DWORD *)SYM + 1) + 64), &v10, *(_DWORD *)(*((_DWORD *)SYM + 1) + 12) << 10); if ( sector_desc != 0 ) { log_event(8u, 21); log_event(6u, sector_desc); } } else { if ( v13 == 0 ) goto LABEL_10; sector_desc = spi_write_enable(&v12); } if ( sector_desc != 0 ) { LABEL_11: log_event(8u, 9); log_event(6u, sector_desc); return sector_desc; } LABEL_10: v8 = 0; v9 = 0; sector_desc = spi_find_sector_desc(&v8, v5, v6, v7); if ( sector_desc != 0 ) goto LABEL_11; return sector_desc; }", "spi_erase_sector": "int __fastcall spi_erase_sector(int a0, int a1) { int v2; v2 = spi_erase_and_write(0, a0, a1); if ( v2 != 0 ) { log_event(8u, 8); log_event(6u, v2); } return v2; }", "flash_op_wrapper2": "int __fastcall flash_op_wrapper2(int a0, int a1, _DWORD *a2, _DWORD *a3, int a4) { int v5; v5 = SYM; ret_not_supported(); if ( *SYM == 0 ) { v5 = flash_desc_resolve(a0, a1, a2, a3, a4); ret_not_supported(); } return v5; }", "spi_erase_range": "int __fastcall spi_erase_range(unsigned int a0, int a1) { unsigned int v2; int v3; unsigned int v4; int v5; unsigned int v6; int v7; int v8; unsigned int v9; unsigned int v10; unsigned int v11; unsigned int v12; int v13; v2 = a0; v3 = a1; v4 = a1; v5 = 0; if ( *SYM == 0 ) { v5 = SYM + 4; goto LABEL_22; } if ( a1 == 0 || (v6 = a0 + a1, a0 + a1 > 0x200000) ) { v5 = SYM; LABEL_22: log_event(8u, 7); log_event(7u, a0); log_event(7u, v3); log_event(6u, v5); return v5; } v7 = *(_DWORD *)(*((_DWORD *)SYM + 1) + 16) << 10; v8 = v7 - 1; v9 = (a0 + v7 - 1) & ~(v7 - 1); if ( v9 != a0 ) { v2 = (a0 + v7 - 1) & ~(v7 - 1); if ( v6 <= v9 ) { v10 = a0; LABEL_18: v13 = spi_erase_sector(v10, a1); goto LABEL_21; } if ( v9 > a0 ) { v5 = spi_erase_sector(a0, v9 - a0); if ( v5 != 0 ) goto LABEL_22; v4 -= v2 - a0; } } if ( v2 + v4 != ((v2 + v4 + v7 - 1) & ~v8) ) { v11 = v4 & ~v8; if ( v11 == 0 ) { a1 = v4; v10 = v2; goto LABEL_18; } if ( v11 < v4 ) { v12 = v4 - v11; v5 = spi_erase_sector(v11 + v2, v4 - v11); if ( v5 != 0 ) goto LABEL_22; v4 -= v12; } } if ( v4 == 0 ) return v5; v13 = spi_write_region(v2, v4); LABEL_21: v5 = v13; if ( v13 != 0 ) goto LABEL_22; return v5; }", "flash_info_get": "int __fastcall flash_info_get(_DWORD *a0) { if ( *SYM == 0 ) return SYM; if ( a0 == nullptr ) return SYM - 4; *a0 = *((_DWORD *)SYM + 1); return 0; }", "spi_init": "int __fastcall spi_init(int a0, int a1, int a2, int a3) { char *v4; int result; int v5; v4 = SYM; result = 0; if ( *SYM == 0 ) { v5 = spi_probe_controller(0, (unsigned __int8)*SYM, a2, a3); if ( v5 != 0 ) { log_event(8u, 1); log_event(6u, v5); } else { *v4 = 1; } return v5; } return result; }", "spi_load_device_desc": "int __fastcall spi_load_device_desc(_BYTE *a0, int a1, unsigned int a2, int a3) { int v4; int v5; _DWORD v6[64]; _DWORD v7[5]; int v8; char v9; int v10; v10 = *(_DWORD *)SYM; v8 = 0; __asm { SVC 0x66 ; 'f' } bzero_core(v6, 0x100u); if ( a3 == 0 ) { v5 = spi_window_map((int)a0, a1, a2); goto LABEL_12; } v4 = spi_window_map((int)v6, a1, 256); if ( v4 == 0 ) { if ( v6[4] != SYM ) return SYM; if ( v6[27] > a2 ) return SYM + 5; v4 = spi_window_map((int)a0, a1, a2); if ( v4 != 0 ) { LABEL_10: bzero(a0, a2); return v4; } __asm { SVC 0x79 ; 'y' } v7[0] = a0; v7[1] = a2; v7[2] = &v9; v7[3] = 64; v7[4] = &v8; v5 = sysdrv_verify_signed_image((int)v7, 0, 0, 0); LABEL_12: v4 = v5; if ( v5 == 0 ) return v4; goto LABEL_10; } return v4; }", "spi_write_status": "int __fastcall spi_write_status(unsigned int *a0, int a1, unsigned int a2) { int v3; v3 = 0; if ( *SYM == 0 ) { v3 = SYM + 4; goto LABEL_11; } if ( a0 == nullptr || a2 == 0 || a1 + a2 > 0x200000 ) { v3 = SYM; LABEL_11: log_event(8u, 22); log_event(7u, a1); log_event(7u, a2); log_event(6u, v3); return v3; } __asm { SVC 0x7D ; '}' } if ( a1 == -219152384 ) { v3 = SYM; goto LABEL_11; } if ( memcmp_be((const void *)(a1 + 219152384), a0, a2) != 0 ) v3 = spi_erase_and_write((int)a0, a1, a2); __asm { SVC 0x7E ; '~' } if ( v3 != 0 ) goto LABEL_11; return v3; }", "flash_op_wrapper": "int __fastcall flash_op_wrapper(int a0, unsigned int *a1, unsigned int *a2, int a3) { int v4; int v5; ret_not_supported(); if ( *SYM[0] != 0 ) v4 = fw_list_bounded(a0, a1, a2, a3); else v4 = spirom_write_page(a0, a1, a2); v5 = v4; if ( v4 != 0 && *SYM != 0 ) trace_event(0, 0xF017u, v4, 1); ret_not_supported(); return v5; }", "flash_locked_op": "int __fastcall flash_locked_op(int a0, unsigned int a1, int a2, unsigned int a3) { char v4; int capability; int v5; int v6; int v7; int v8; _BYTE *v9; unsigned int v10; unsigned int v11; int v12; int v13; int v14; unsigned int src; _BYTE dst[72]; int v15; v4 = a3; v15 = *(_DWORD *)SYM; if ( a3 > 0x40 ) return SYM; v5 = acquire_service_lock(a0, 2); if ( v5 != 0 ) return v5; capability = mp_query_capability(0, v6, v7, v8); if ( capability == 0 ) { v9 = SYM; v10 = bswap32(a1); src = v10; v11 = *((unsigned __int8 *)SYM + 15); if ( v11 == 3 ) src = v10 >> 8; memcpy(dst, &src, v11); memcpy_thunk((int)&dst[(unsigned __int8)v9[15]]); capability = mp_send_request((unsigned __int8)v9[64], (int)dst, (unsigned __int8)(v9[15] + v4), 0, 0); if ( capability == 0 ) capability = mp_wait_response(0, v12, v13, v14); } v5 = unlock_and_store_result(); if ( capability == 0 ) return v5; return capability; }", "flash_locked_read": "int __fastcall flash_locked_read(int a0, unsigned int a1, int a2, unsigned int a3) { int result; int v4; int v5; int v6; int v7; unsigned int v8; unsigned int v9; int v10; int v11; int v12; int v13; unsigned int v14; v14 = a3; result = acquire_service_lock(a0, 1); if ( result == 0 ) { v7 = mp_wait_response(0, v4, v5, v6); if ( v7 == 0 ) { v8 = bswap32(a1); v14 = v8; v9 = *((unsigned __int8 *)SYM + 15); if ( v9 == 3 ) v14 = v8 >> 8; v7 = mp_send_request(*((unsigned __int8 *)SYM + 60), (int)&v14, v9, a2, a3); if ( v7 == 0 ) v7 = mp_wait_response(0, v10, v11, v12); } v13 = unlock_and_store_result(); if ( v7 == 0 ) return v13; return v7; } return result; }", "spi_erase_block": "int __fastcall spi_erase_block(int a0, int a1, unsigned int a2) { int ready; unsigned int v3; unsigned int v4; char *v5; unsigned int v6; unsigned int v7; unsigned int v8; int v9; int v10; int v11; int v12; int v13; int v14; int v15; int v16; int v17; int v18; int v19; int savedregs; ready = 0; v3 = *(_DWORD *)(*((_DWORD *)SYM + 1) + 24); if ( v3 > a2 || ((v3 + a1 - 1) & ~(v3 - 1)) != a1 || ((a2 - 1 + v3) & ~(v3 - 1)) != a2 ) { ready = SYM; LABEL_13: log_event(8u, 20); log_event(7u, a1); log_event(7u, a2); log_event(6u, ready); return ready; } v4 = a2 - v3; v5 = SYM; v6 = v4 + a0; v7 = 0; v8 = v4 + a1; while ( v7 < a2 ) { ready = spi_status_read2(); if ( ready != 0 ) break; ready = spi_wait_ready(0, v9, v10, v11); if ( ready != 0 ) break; v12 = SYM(*((_DWORD *)v5 + 1) + 76, v8, v6, *(_DWORD *)(*((_DWORD *)v5 + 1) + 24), 0, 0, savedregs); ready = spi_wait_ready_long(v12, v13, v14, v15); if ( ready != 0 ) break; ready = spi_probe_device(0, v16, v17, v18); if ( ready != 0 ) break; v19 = *(_DWORD *)(*((_DWORD *)v5 + 1) + 24); v6 -= v19; v8 -= v19; v7 += v19; } if ( ready != 0 ) goto LABEL_13; return ready; }", "spi_window_map": "int __fastcall spi_window_map(int a0, int a1, int a2) { int v3; __asm { SVC 0x5E ; '^' } v3 = SYM; if ( (unsigned int)(a1 + a2) <= 0x200000 ) { __asm { SVC 0x7D ; '}' } if ( a1 != -219152384 ) { memcpy_thunk(a0); v3 = 0; __asm { SVC 0x68 ; 'h' } __asm { SVC 0x7E ; '~' } } __asm { SVC 0x5F ; '_' } return v3; } else { __asm { SVC 0x5F ; '_' } return SYM; } }", "flash_op_bounded": "int __fastcall flash_op_bounded(unsigned int a0, unsigned int a1, int a2, unsigned int a3, int a4, int a5) { int v6; int core; unsigned int v7; v7 = a3; if ( *SYM[0] == 0 ) { core = flash_read_core(a0, a1, a2, a3, a4, a5); LABEL_4: v6 = core; if ( core == 0 ) return v6; goto LABEL_5; } v6 = flash_region_translate(a0, a1, a2, &v7); if ( v6 == 0 ) { core = otp_region_copy(2, v7, a4, a3); goto LABEL_4; } LABEL_5: if ( *SYM != 0 ) trace_event(0, 0xF015u, v6, 1); return v6; }", "spi_page_program": "int __fastcall spi_page_program(unsigned __int8 *a0, int *a1, int a2) { int ready; unsigned int v3; int i; int v4; int v5; int v6; int v7; int v8; int v9; int v10; int v11; int v12; int v13; int savedregs; ready = 0; v3 = 0; for ( i = *a1 * a2; a1[1] > v3; i += a2 ) { ready = spi_status_read2(); if ( ready != 0 ) break; ready = spi_wait_ready(0, v4, v5, v6); if ( ready != 0 ) break; v7 = SYM(a0, i, 0, 0, 0, 0, savedregs); ready = spi_wait_ready_long(v7, v8, v9, v10); if ( ready != 0 ) break; ready = spi_probe_device(0, v11, v12, v13); if ( ready != 0 ) break; ++v3; } if ( ready != 0 ) { log_event(8u, 19); log_event(7u, *a1); log_event(7u, a1[1]); log_event(6u, ready); } return ready; }", "mp_command_send": "int __fastcall mp_command_send(int a0, int a1, unsigned int a2) { int result; int v3; int v4; int v5; int v6; int v7; int v8; int v9; int v10; result = acquire_service_lock(2, 4); if ( result == 0 ) { v6 = mp_wait_response(0, v3, v4, v5); if ( v6 == 0 ) { v6 = mp_send_request(a0, a1, a2, 0, 0); if ( v6 == 0 ) v6 = mp_wait_response(0, v7, v8, v9); } v10 = unlock_and_store_result(); if ( v6 == 0 ) return v10; return v6; } return result; }", "mp_command_retry": "int __fastcall mp_command_retry(unsigned __int8 *a0) { int v1; int v2; int result; int v3; int v4; int v5; int v6; int v7; int v8; int v9; int v10; v1 = 0; while ( 1 ) { v2 = *a0; result = acquire_service_lock(2, 5); if ( result == 0 ) { v6 = mp_wait_response(0, v3, v4, v5); if ( v6 == 0 ) { v6 = mp_send_request(v2, 0, 0, (int)(a0 + 1), 0x32u); if ( v6 == 0 ) v6 = mp_wait_response(0, v7, v8, v9); } v10 = unlock_and_store_result(); if ( v6 == 0 ) v6 = v10; result = v6; } if ( result != 0 || a0[2] == 128 ) break; if ( (unsigned int)++v1 > 0x64 ) return SYM; __asm { SVC 0x56 ; 'V' } } return result; }", "flash_locked_erase": "int __fastcall flash_locked_erase(int a0, unsigned int a1) { int result; int v2; int v3; int v4; int capability; unsigned int v5; unsigned int v6; int v7; int v8; int v9; int v10; unsigned int v11; result = acquire_service_lock(a0, 3); if ( result == 0 ) { capability = mp_query_capability(0, v2, v3, v4); if ( capability == 0 ) { v5 = bswap32(a1); v11 = v5; v6 = *((unsigned __int8 *)SYM + 15); if ( v6 == 3 ) v11 = v5 >> 8; capability = mp_send_request(*((unsigned __int8 *)SYM + 56), (int)&v11, v6, 0, 0); if ( capability == 0 ) capability = mp_wait_response(0, v7, v8, v9); } v10 = unlock_and_store_result(); if ( capability == 0 ) return v10; return capability; } return result; }", "spi_write_enable": "int __fastcall spi_write_enable(int *a0) { int v1; v1 = spi_page_program( (unsigned __int8 *)(*((_DWORD *)SYM + 1) + 68), a0, *(_DWORD *)(*((_DWORD *)SYM + 1) + 16) << 10); if ( v1 != 0 ) { log_event(8u, 18); log_event(6u, v1); } return v1; }", "tsu_parse_rom_image": "int __fastcall tsu_parse_rom_image(int *a0) { char *v1; int v2; int v3; int v4; _BYTE dst[252]; _BYTE v5[252]; _DWORD *v6; unsigned __int8 v7[4]; v6 = nullptr; bzero_core(dst, 0xFCu); bzero_core(v5, 0xFCu); v1 = SYM; v7[0] = -1; *a0 = 0; if ( ((unsigned __int8)*v1 & (unsigned __int8)v1[1]) == 0 ) { v2 = SYM; *a0 = 5; goto LABEL_15; } if ( map_client_buffer(*((_DWORD *)v1 + 2), *((_DWORD *)v1 + 1), 0x200000u, v7, &v6, 0, 1, 0xFFFFu) != 0 ) { v2 = SYM + 4; *a0 = 6; goto LABEL_13; } dst[0] = 1; v2 = rom_parse_directory((int)dst, v6); if ( v2 != 0 ) { *a0 = 7; goto LABEL_13; } __asm { SVC 0x7D ; '}' } v2 = rom_parse_directory((int)v5, (_DWORD *)0xD100000); if ( v2 != 0 ) { v3 = 8; LABEL_11: *a0 = v3; goto LABEL_12; } v2 = tsu_write_active_slot(a0, (int)v6, (int)dst, (int)v5); if ( v2 != 0 ) { v3 = 10; goto LABEL_11; } LABEL_12: __asm { SVC 0x7E ; '~' } LABEL_13: if ( v7[0] != 255 ) { __asm { SVC 0x6C ; 'l' } v6 = nullptr; } LABEL_15: *v1 = 0; v1[1] = 0; v4 = vbios_flash_verify(); if ( v4 != 0 ) { if ( v2 == 0 ) { v2 = v4; *a0 = 19; } } else if ( v2 == 0 ) { return v2; } log_event(0xBu, 9); log_event(9u, v2); log_event(9u, *a0); return v2; }", "flash_ctx_set": "int __fastcall flash_ctx_set(int result, int a0) { char *v1; v1 = SYM; if ( result != 0 ) { *((_DWORD *)SYM + 1) = a0; *v1 = 1; } else { *((_DWORD *)SYM + 2) = a0; v1[1] = 1; } return result; }", "spi_write_verified": "int __fastcall spi_write_verified(unsigned int a0, unsigned int a1, int a2, unsigned int a3, unsigned int *a4, int a5) { return spi_write_dispatch(a0, a1, a2, a3, a4, a5, 0); }", "spi_erase_and_write": "int __fastcall spi_erase_and_write(int a0, unsigned int a1, unsigned int a2) { BOOL v3; int v4; int v5; int v6; int sector_desc; int v7; int v8; int v9; int v10; int v11; int v12; v3 = a0 == 0; v11 = 0; v12 = 0; __asm { SVC 0x5E ; '^' } if ( a2 != 0 ) { spi_sector_align(a1, a2, &v11); sector_desc = spi_find_sector_desc(&v11, v4, v5, v6); if ( sector_desc == 0 ) { v7 = spi_block_write(a0, v3, a1, a2); sector_desc = v7; if ( v7 == 0 ) { v11 = 0; v12 = 0; sector_desc = spi_find_sector_desc(&v11, v8, v9, v10); } } } else { sector_desc = SYM; } __asm { SVC 0x5F ; '_' } if ( sector_desc != 0 ) { log_event(8u, 10); log_event(6u, sector_desc); } return sector_desc; }", "spi_write_dispatch": "int __fastcall spi_write_dispatch( unsigned int a0, unsigned int a1, int a2, unsigned int a3, unsigned int *a4, int a5, unsigned int a6) { int v7; int v8; unsigned int v9; v9 = a3; if ( *SYM[0] == 0 ) { v8 = flash_write_core(a0, a1, a2, a3, (int)a4, a5, a6); LABEL_4: v7 = v8; if ( v8 == 0 ) return v7; goto LABEL_5; } v7 = flash_region_translate(a0, a1, a2, &v9); if ( v7 == 0 ) { v8 = fw_entry_select(2, v9, a4, a3, a5); goto LABEL_4; } LABEL_5: if ( *SYM != 0 ) trace_event(0, 0xF014u, v7, 1); return v7; }", "spi_block_write": "int __fastcall spi_block_write(int a0, int a1, int a2, unsigned int a3) { int device_desc; unsigned int v4; int v5; unsigned int v6; int v7; int v8; unsigned int v9; const void *v10; unsigned int v11; int v12; int v13; int v14; int v15; int v16; int v17; int v18; int v19; int v20; v17 = a0; v18 = a1; v19 = a2; v20 = a3; device_desc = 0; v16 = a0; v4 = a3; v5 = *(_DWORD *)(*((_DWORD *)SYM + 1) + 16); v14 = 0; v15 = 0; v6 = v5 << 10; v7 = a2 & ~((v5 << 10) - 1); v8 = a2 - v7; v9 = (v5 << 10) - (a2 - v7); if ( a3 < v9 ) v9 = a3; while ( v4 != 0 ) { v10 = nullptr; v11 = *(_DWORD *)(*((_DWORD *)SYM + 1) + 16) << 10; if ( v11 > 0x2000 ) { device_desc = SYM; LABEL_7: log_event(8u, 17); log_event(7u, v7); log_event(6u, device_desc); goto LABEL_8; } device_desc = spi_load_device_desc((_BYTE *)SYM, v7, v11, 0); if ( device_desc != 0 ) goto LABEL_7; v10 = (const void *)SYM; LABEL_8: if ( device_desc != 0 ) goto LABEL_28; if ( v10 == nullptr ) { LABEL_14: device_desc = SYM; LABEL_28: log_event(8u, 16); log_event(7u, v19); log_event(7u, v20); log_event(7u, v18); log_event(6u, device_desc); return device_desc; } v12 = (int)v10 + v8; if ( v18 != 0 ) { bzero_thunk(v12, v9, 255); } else { memcpy_thunk(v12); v16 += v9; } v4 -= v9; v9 = v6; v8 = 0; if ( v4 < v6 ) v9 = v4; range_to_block_span(v7, v6, &v14); if ( v15 == 0 ) { device_desc = SYM - 4; goto LABEL_28; } device_desc = spi_write_enable(&v14); if ( device_desc != 0 ) goto LABEL_28; v13 = spi_erase_block((int)v10, v7, v6); device_desc = v13; if ( v13 != 0 ) goto LABEL_28; __asm { SVC 0x7D ; '}' } if ( v7 == -219152384 ) goto LABEL_14; if ( memcmp_be((const void *)(v7 + 219152384), v10, v6) != 0 ) device_desc = SYM - 2; __asm { SVC 0x7E ; '~' } if ( device_desc != 0 ) goto LABEL_28; v7 += v6; } return device_desc; }", "vbios_flash_verify": "int __fastcall vbios_flash_verify() { int flash_header; int v0; unsigned int dst[16]; _DWORD v1[2]; _BYTE b[72]; _BYTE v2[4]; _DWORD src[13]; src[12] = *(_DWORD *)SYM; bzero_core(dst, 0x48u); bzero_core(b, 0x48u); bzero_core(src, 0x30u); v2[0] = 0; flash_header = vbios_find_flash_header(v2); if ( flash_header != 0 ) goto LABEL_10; if ( v2[0] == 0 ) { flash_header = spi_write_status((unsigned int *)SYM, 28672, 0xCu); if ( flash_header != 0 ) goto LABEL_10; } __asm { SVC 0x7D ; '}' } v1[1] = checksum16((unsigned __int16 *)0xD100000, 0x1E0000u); v1[0] = SYM; __asm { SVC 0x66 ; 'f' } flash_header = hmac_sha256((unsigned __int8)SYM, SYM, SYM, 32, (int)v1, 8, (int)src, 48); if ( flash_header == 0 ) { memcpy(dst, src, 0x30u); v0 = SYM; flash_header = spi_write_status(dst, SYM, 0x48u); if ( flash_header == 0 ) { flash_header = spi_load_device_desc(b, v0, 0x48u, 0); if ( flash_header == 0 && ct_memcmp(dst, b, 0x48u) != 0 ) flash_header = SYM; } } __asm { SVC 0x7E ; '~' } if ( flash_header != 0 ) { LABEL_10: log_event(0xBu, 10); log_event(9u, flash_header); } return flash_header; }", "ret_zero_3": "int __fastcall ret_zero_3() { return 0; }", "ret_zero_4": "int __fastcall ret_zero_4() { return 0; }", "ret_zero_5": "int __fastcall ret_zero_5() { return 0; }", "flash_flag_update": "unsigned int __fastcall flash_flag_update(int a0) { _DWORD *v1; if ( *((_BYTE *)SYM + 19) != 0 ) { v1 = SYM; *((_DWORD *)SYM + 1) &= ~(2 * a0); v1[2] &= ~(2 * a0); } return bit_scan_count(a0); }", "sysdrv_tee_query_18": "int __fastcall sysdrv_tee_query_18(unsigned int a0) { int v1; int v2; int v3; unsigned int v4; __int64 v5; int v6; _DWORD v7[6]; int v8; v8 = 0; if ( a0 == 0xFFFF ) return SYM + 1; if ( a0 >= 0xF ) return SYM; v1 = 0; flash_flag_update(1 << a0); v2 = SYM; v3 = 0; while ( 1 ) { v4 = v2 + 240 * v3 + 16 * a0; if ( *(unsigned __int8 *)(v4 + 12) << 31 == 0 ) goto LABEL_13; v5 = *(_QWORD *)v4 + *(_QWORD *)SYM[0]; bzero_core(v7, 0x18u); v7[0] = HIDWORD(v5); v7[1] = v5; v7[2] = 0x100000; v6 = *SYM; v7[5] = a0; v7[3] = v6; v7[4] = 1; __asm { SVC 0x89 } if ( v7 != nullptr ) return SYM - 6; v1 = ecc_point_op(v8, 0, *(_DWORD *)(v4 + 8)); if ( v8 != 0 ) __asm { SVC 0x8A } config_blob_read_entry(1u, a0, 2, 2); if ( v1 != 0 ) return v1; LABEL_13: if ( (unsigned int)++v3 >= 0x62 ) return v1; } }", "sysdrv_ring_notify": "int __fastcall sysdrv_ring_notify(unsigned int a0, int a1, unsigned int a2, int a3) { int result; int v4; _DWORD v5[3]; _DWORD savedregs[4]; if ( a0 == 0xFFFF ) { v5[1] = savedregs[0]; v5[2] = savedregs[1]; savedregs[0] = savedregs[2]; result = 0; v4 = 0; v5[0] = 0; switch ( a1 ) { case 3: result = 18592; goto LABEL_17; case 4: result = 18592; LABEL_17: __asm { SVC 0x7C ; '|' } goto LABEL_18; case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 19: case 20: case 21: case 22: v4 = 1; goto LABEL_19; case 15: case 16: case 17: case 18: return flash_region_lookup(a1, a2, a3); case 23: case 24: LABEL_18: if ( result != 0 ) return result; LABEL_19: result = vf_id_to_reg(a1, (int)v5); if ( result == 0 ) { if ( v4 != 0 ) { __asm { SVC 0x7B ; '{' } LABEL_22: result = 292; } else { __asm { SVC 0x7C ; '|' } result = v5[0]; } } break; default: goto LABEL_22; } } else { result = 292; if ( a0 >= 0xF ) return result; if ( a1 != 0 ) { if ( a1 == 1 ) { result = 17584; } else { if ( a1 != 2 ) return result; result = 17632; } } else { result = 17536; } if ( ((a2 >> 28) & 7) == 3 ) return 293; else __asm { SVC 0xA0 } } return result; }", "nop_hook_flash": "void __fastcall nop_hook_flash() { ; }", "flash_state_reset": "_DWORD *__fastcall flash_state_reset() { _DWORD *result; bzero_core((void *)SYM, 0x78u); bzero_core((void *)SYM, 0x5BE0u); result = (_DWORD *)(unsigned __int8)*SYM; if ( result == (_DWORD *)22 || result == (_DWORD *)25 || result == (_DWORD *)28 || result == (_DWORD *)49 ) { record_init_32((_DWORD *)SYM); bzero_core((void *)SYM, 0x1904u); return bzero_core((void *)SYM, 0xB40u); } return result; }", "vf_slot_read_cfg": "int __fastcall vf_slot_read_cfg(char a0) { unsigned int v1; v1 = a0 & 0x3F; if ( v1 >= 0x10 ) return 292; __asm { SVC 0xA6 } return (*SYM)[6 * v1 + 4]; }", "vf_slot_write_cfg": "int __fastcall vf_slot_write_cfg(char *a0) { char v1; int *v2; int v3; v1 = *a0; if ( (v1 & 0x3Fu) >= 0x10 ) return 292; v2 = &(*SYM)[6 * (v1 & 0x3F)]; __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } v3 = (SYM + 8) | SYM; if ( (vf_slot_read_cfg(*(_DWORD *)a0) | v3) != 0 ) return SYM; __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } if ( (v2[5] | v2[2] | v2[3] | *v2 | v2[1]) != 0 ) return SYM; __asm { SVC 0x7C ; '|' } return v2[4]; }", "flash_region_lookup": "int __fastcall flash_region_lookup(int a0, int a1, int a2) { _DWORD *v3; int v4; int v5; int cfg; char *v6; v3 = SYM; v4 = 0; v5 = *((_DWORD *)SYM + 7); if ( v5 != 0 ) { if ( v5 == 1 ) { if ( a0 == 16 ) { *((_DWORD *)SYM + 7) = 2; v3[1] = a1; v3[2] = a2; return v4; } } else if ( v5 == 2 ) { if ( a0 == 17 ) { *((_DWORD *)SYM + 7) = 3; v3[3] = a1; v3[4] = a2; return v4; } } else if ( v5 == 3 && a0 == 18 ) { v6 = (char *)SYM; *((_DWORD *)SYM + 5) = a1; v3[6] = a2; cfg = vf_slot_write_cfg(v6); goto LABEL_17; } LABEL_10: v4 = SYM; LABEL_18: record_init_32(SYM); return v4; } if ( a0 != 15 ) goto LABEL_10; if ( (a1 & 0x40) != 0 ) { *(_DWORD *)SYM = a1; v3[7] = 1; return v4; } cfg = vf_slot_read_cfg(a1); LABEL_17: v4 = cfg; record_init_32(SYM); if ( v4 != 0 ) goto LABEL_18; return v4; }", "record_init_32": "_DWORD *__fastcall record_init_32(_DWORD *a0) { _DWORD *result; result = bzero_core(a0, 0x20u); a0[7] = 0; return result; }", "sysdrv_ring_complete": "int __fastcall sysdrv_ring_complete(int a0, unsigned int a1, int a2, int a3) { int v4; int v5; _DWORD *v6; unsigned int v7; unsigned int v8; unsigned int v9; int v10; int v11[2]; v11[0] = a2; v11[1] = a3; if ( a1 >= 0xF ) return SYM; gp_get_system_time(v11); v4 = SYM + 360; v5 = SYM + 180; v6 = (_DWORD *)(SYM + 12 * a1); if ( *v6 != v11[0] ) { *(_DWORD *)(SYM + 12 * a1) = v11[0]; v6[1] = 0; v6[2] = 0; *(_DWORD *)(v4 + 4 * a1) = 0; *(_DWORD *)(v5 + 12 * a1) = v11[0]; v7 = v5 + 12 * a1; *(_DWORD *)(v7 + 4) = 0; *(_DWORD *)(v7 + 8) = 0; } if ( a2 != 0 ) { if ( a2 == 1 ) { ++*(_DWORD *)(v5 + 12 * a1 + 4); } else if ( a2 == 2 ) { ++*(_DWORD *)(v4 + 4 * a1); } } else { ++v6[1]; } if ( a0 == 256 || a0 == 288 || a0 == 282 ) { if ( a2 != 0 ) { if ( a2 == 1 ) ++*(_DWORD *)(v5 + 12 * a1 + 8); } else { ++v6[2]; } } v8 = SYM + 4 * a1 + 4096; if ( v6[1] <= 0x32u && *(_DWORD *)((v9 = v5 + 12 * a1) + 4) <= 0x32u && *(_DWORD *)(v4 + 4 * a1) <= 0x32u ) { if ( v6[2] <= 0x14u && *(_DWORD *)(v9 + 8) <= 0x14u ) return 0; sysdrv_tee_query_12(3, a1, 0); v10 = 6; } else { sysdrv_tee_query_12(3, a1, 0); v10 = 5; } *(_DWORD *)(v8 + 2188) = v10; return 0; }", "vf_id_to_reg": "int __fastcall vf_id_to_reg(int a0, int a1) { int result; int v2; result = 0; switch ( a0 ) { case 3: case 4: *(_DWORD *)a1 = 18596; return result; case 5: v2 = 41848; goto LABEL_5; case 6: v2 = 41844; goto LABEL_5; case 7: v2 = SYM; goto LABEL_5; case 8: v2 = SYM - 4; goto LABEL_5; case 9: v2 = 41828; goto LABEL_5; case 10: v2 = 41824; goto LABEL_5; case 11: v2 = SYM - 20; goto LABEL_5; case 12: v2 = SYM - 24; goto LABEL_5; case 13: v2 = 15752; goto LABEL_5; case 14: v2 = 15744; LABEL_5: *(_DWORD *)a1 = v2; break; default: result = 292; break; } return result; }", "nop_hook_spi": "void __fastcall nop_hook_spi() { ; }", "sysdrv_validate_ring_buffer": "int __fastcall sysdrv_validate_ring_buffer(unsigned int a0, unsigned int a1, unsigned int a2, unsigned int a3) { int result; unsigned __int64 v4; unsigned __int64 v5; unsigned __int64 v6; unsigned __int64 v7; if ( a0 >= 0xF ) return SYM; v4 = __PAIR64__(a1, 0) + a2; v5 = v4 + a3; v6 = *(_QWORD *)(SYM + 8 * a0); v7 = *(_QWORD *)(SYM + 120 + 8 * a0); if ( v6 == v7 || v7 == 0 ) return SYM + 1; result = SYM; if ( v4 >= v6 && v7 >= v4 && v5 >= v6 && v7 >= v5 ) return 0; return result; }", "sysdrv_tee_query_12": "int __fastcall sysdrv_tee_query_12(int a0, unsigned int a1, int a2) { int v3; int v4; int v5; unsigned int v6; int v7; unsigned int v8; int v9; unsigned int v10; int v11; v3 = SYM; v4 = 0; if ( a1 >= 0xF ) return SYM; v5 = 1 << a1; v6 = SYM + 4 * a1; v7 = (int)*SYM; v8 = v6 + 4096; if ( a0 != 0 ) { if ( a0 == 1 ) { *(_DWORD *)(v7 + 364) = v5; *(_DWORD *)(v8 + 2188) = 0; v11 = *(_DWORD *)(v7 + 360) & ~v5; } else { if ( a0 == 2 ) { *(_DWORD *)(v8 + 2188) = 0; } else if ( a0 != 3 ) { v4 = SYM; goto LABEL_8; } v11 = *(_DWORD *)(v7 + 360) | v5; } *(_DWORD *)(v7 + 360) = v11; } LABEL_8: if ( a2 != 0 ) { v9 = *(_DWORD *)(v8 + 2188); *(_DWORD *)(a2 + 56) = v9; *(_DWORD *)(a2 + 64) = *(_DWORD *)(v8 + 2248); if ( (*(_DWORD *)(v7 + 360) & v5) != 0 ) v10 = v9 & 0x7FFFFFFF; else v10 = v9 | 0x80000000; *(_DWORD *)(a2 + 56) = v10; } else if ( a0 == 0 ) { return v3; } return v4; }", "sysdrv_mgmt_query_9": "int __fastcall sysdrv_mgmt_query_9(unsigned int **a0) { unsigned int *v1; int v2; unsigned __int8 v3[4]; _DWORD v4[12]; v4[10] = *(_DWORD *)SYM; v1 = *a0; v3[0] = -1; v4[0] = 0; v4[1] = 0; __asm { SVC 0x5E ; '^' } v2 = map_client_buffer(v1[5], v1[4], v1[6], v3, v4, 0, 0, 0xFFFFu); if ( v2 == 0 ) { if ( *(_DWORD *)(v4[0] + 4) == 127 && *(_DWORD *)v4[0] == 36864 ) { __asm { SVC 0x90 } v2 = 4096; } else { v2 = SYM; } } if ( v3[0] != 255 ) __asm { SVC 0x6C ; 'l' } __asm { SVC 0x5F ; '_' } return v2; }", "monitor_notify": "int __fastcall monitor_notify(int a0) { int v1; set_status_out(SYM); __asm { SVC 0x83 } return SYM + v1; }", "timestamp_record": "__int64 __fastcall timestamp_record() { __int64 result; unsigned int v0; unsigned int v1; v0 = 0; v1 = 0; gp_get_system_time((int *)&v0); result = time_to_ms(v0, v1); *((_QWORD *)SYM + 2) = result; return result; }", "provision_begin": "int __fastcall provision_begin() { int v0; int v1; int v2; mbox_set_busy(); trace_event(9, 1u, 1, 0); v0 = SYM; *(_DWORD *)(SYM + 12) = 0; v1 = provision_record_read(v0); if ( v1 != 0 || (ret_err_0009(), (v1 = irq_route_setup(v0)) != 0) || (*((_DWORD *)SYM + 142) = 3, *(_DWORD *)(v0 + 12) != 0) ) { v2 = *(_DWORD *)(v0 + 12); } else { v2 = 0x10000000; } mbox_set_status_bits(v2); trace_event(9, 2u, v1, 0); return v1; }", "spi_status_poll": "int __fastcall spi_status_poll(unsigned __int8 *a0, unsigned int a1) { int v2; unsigned int v3; char *v4; int v5; int savedregs; v2 = 0; v3 = 0; v4 = SYM; v5 = *((_DWORD *)SYM + 1) + 44; while ( v3 < a1 ) { if ( v3 == 1 ) v5 = *((_DWORD *)v4 + 1) + 48; v2 = SYM(v5, 0, 0, 0, &a0[v3], 1, savedregs); if ( v2 != 0 ) { log_event(8u, 13); log_event(7u, *a0); log_event(7u, a0[1]); log_event(7u, a1); log_event(6u, v2); return v2; } if ( ++v3 >= 2 ) return v2; } return v2; }", "spi_probe_device": "int __fastcall spi_probe_device(int a0, int a1, int a2, int a3) { int v4; int v5; v4 = a2; v5 = a3; v5 = *(_DWORD *)SYM; v4 = 0; return spi_program_verified((unsigned __int8 *)SYM, (int)&v4, 2u, a3); }", "spi_status_read2": "int __fastcall spi_status_read2() { return spi_status_poll((unsigned __int8 *)SYM, 2u); }", "spi_program_verified": "int __fastcall spi_program_verified(unsigned __int8 *a0, int a1, unsigned int a2, int a3) { int ready; unsigned int v4; int v5; int v6; int v7; int v8; int v9; unsigned __int8 v10[4]; int v11; *(_DWORD *)v10 = a2; v11 = a3; v11 = *(_DWORD *)SYM; *(_DWORD *)v10 = 0; ready = spi_wait_ready(SYM, a1, a2, a3); if ( ready != 0 ) goto LABEL_11; v4 = spi_status_poll(v10, 2u); ready = v4; if ( v4 != 0 ) goto LABEL_11; do { if ( v4 >= a2 ) break; v10[v4] = v10[v4] & ~*(_BYTE *)(a1 + v4) | a0[v4]; ++v4; } while ( v4 < 2 ); v5 = *((_DWORD *)SYM + 1); v6 = *(unsigned __int8 *)(v5 + 28) <= 1u ? 1 : 2; ready = ((int (__fastcall *)(int, _DWORD, unsigned __int8 *, int, _DWORD, _DWORD))SYM)( v5 + 56, 0, v10, v6, 0, 0); if ( ready != 0 || (ready = spi_wait_ready_long(0, v7, v8, v9)) != 0 ) { LABEL_11: log_event(8u, 12); log_event(7u, *a0); log_event(7u, a0[1]); log_event(7u, a2); log_event(6u, ready); } return ready; }", "sysdrv_mgmt_release_context": "int __fastcall sysdrv_mgmt_release_context(int a0) { int *v1; _DWORD *v2; v1 = SYM; __asm { SVC 0x5E ; '^' } if ( (unsigned int)(a0 - 16) < 0x10 ) { v2 = (_DWORD *)(SYM + 8 * (a0 - 16)); __asm { SVC 0x6C ; 'l' } *v2 = 0; v2[1] = 0; } __asm { SVC 0x5F ; '_' } return *v1; }", "flash_slot_iterate": "int __fastcall flash_slot_iterate(int a0) { int *v1; int v2; unsigned int i; _DWORD *v3; v1 = SYM; __asm { SVC 0x5E ; '^' } v2 = SYM; for ( i = 0; i < 0x10; ++i ) { if ( *(unsigned __int8 *)(v2 + 8 * i) == a0 ) { v3 = (_DWORD *)(v2 + 8 * i); __asm { SVC 0x6C ; 'l' } *v3 = 0; v3[1] = 0; } } __asm { SVC 0x5F ; '_' } return *v1; }", "flash_slot_state": "int __fastcall flash_slot_state(int a0) { _DWORD *v1; int result; int v2; unsigned int v3; unsigned int v4; v1 = SYM; result = 0; v2 = *((_DWORD *)SYM + 14); if ( *(_BYTE *)(v2 + 5) == 0 ) { v3 = *((_DWORD *)SYM + 11); v4 = v3 + 1; if ( v3 + 1 < v3 ) return SYM; if ( *((unsigned __int8 *)SYM + 1004) << 31 != 0 ) { *((_DWORD *)SYM + 11) = v4; *(_DWORD *)(v2 + 8) = v4 + v1[7]; if ( v1[9] != 0 ) { *(_BYTE *)(v2 + 7) = *((_BYTE *)v1 + 32); goto LABEL_9; } } else { *(_DWORD *)(v2 + 8) = 0; } *(_BYTE *)(v2 + 7) = -1; LABEL_9: *(_BYTE *)(v2 + 5) = 1; *(_WORD *)(v2 + 20) += 32; result = hmac_sha256(a0, SYM, SYM, 32, v1[15], v1[13] - v1[15], v1[13], 32); if ( result == 0 ) v1[13] += 32; } return result; }", "object_body_alloc": "int __fastcall object_body_alloc(int a0, int a1, unsigned int a2, int a3, unsigned int a4) { __int16 v5; unsigned int v6; int result; __int16 v7; unsigned int v8; unsigned int v9; unsigned int v10; unsigned int *v11; unsigned int *v12; _DWORD *v13; unsigned int *v14; int v15; int v16; int v17; int v18; unsigned int v19; v5 = a2; v6 = a4; if ( a2 > 0x1F9C ) return SYM; if ( *(_DWORD *)SYM >= 0x200u ) return SYM + 1; v7 = a2 + 15; v8 = (a2 + 15) & 0xFFFFFFF0; v9 = v8 + 80; v10 = v8 + 48; v11 = (unsigned int *)SYM; if ( *((_DWORD *)SYM + 15) + 65488 >= *((_DWORD *)SYM + 13) + v9 || (result = heap_walk_free_list()) == 0 ) { v12 = v11; v13 = (_DWORD *)v11[13]; if ( v12[15] + 65488 >= (unsigned int)v13 + v9 ) { v14 = v12; bzero_core(v13, v10); memcpy_thunk((int)(v13 + 12)); *v13 = SYM; *((_BYTE *)v13 + 4) = 2; v13[4] = a0; *((_WORD *)v13 + 11) = v5; *((_WORD *)v13 + 10) = v10; *((_WORD *)v13 + 12) = v7 & 0xFFF0; v13[3] = a3; *((_BYTE *)v13 + 5) = 0; __asm { SVC 0x66 ; 'f' } v17 = rand_fill_bytes((_BYTE *)v13 + 32, 0x10u, v15, v16); v18 = SYM + 6; if ( v17 != 0 || (result = aes_cmac_compute( (unsigned __int8)a3, SYM, 32, (unsigned int)(v13 + 8), 0x10u, SYM, (int)(v13 + 12), *((unsigned __int16 *)v13 + 12), (int)(v13 + 12), 0)) != 0 ) { result = v18; } else { *((_BYTE *)v13 + 6) = 1; } if ( result == 0 ) { if ( *v14 <= a4 ) v6 = (*v14)++; v14[v6 + 16] = (unsigned int)v13; v19 = v14[13]; v14[14] = v19; v14[13] = v19 + v10; } } else { return SYM + 4; } } return result; }", "fw_dir_scan": "int __fastcall fw_dir_scan() { unsigned int *v0; int result; int v1; int v2; unsigned int v3; unsigned int i; unsigned int j; unsigned int v4; int v5; v0 = (unsigned int *)SYM; result = 0; v1 = SYM; v2 = *((_DWORD *)SYM + 15); v3 = v2 + 65488; for ( i = v2 + 64; i < v3; i += *(unsigned __int16 *)(i + 20) ) { if ( *(_DWORD *)i != SYM ) { if ( *(_DWORD *)i != -1 ) { v5 = 3; goto LABEL_21; } break; } if ( *(unsigned __int16 *)(i + 24) > 0x1F9Cu || (unsigned int)*(unsigned __int16 *)(i + 20) - 48 >= 0x1F9D ) { v0[6] = 2; return v1; } for ( j = 0; *v0 > j; ++j ) { if ( *(_DWORD *)(i + 16) == *(_DWORD *)(v0[j + 16] + 16) ) { v0[j + 16] = i; break; } } if ( *v0 == j ) { v0[j + 16] = i; v4 = *v0 + 1; *v0 = v4; if ( v4 > 0x200 ) return SYM + 1; } v0[14] = i; } if ( i <= v3 ) { v0[13] = i; v0[3] = i - v0[15]; return result; } v5 = 4; LABEL_21: v0[6] = v5; return v1; }", "svc_queue_entry_run": "int __fastcall svc_queue_entry_run(int a0, int a1) { int v2; int v3; int v4; v2 = 0; __asm { SVC 0x66 ; 'f' } v3 = *(unsigned __int8 *)(a1 + 6); v4 = a1 + 48; if ( v3 == 1 ) { v2 = aes_cmac_compute( (unsigned __int8)a0, SYM, 32, a1 + 32, 0x10u, SYM, v4, *(unsigned __int16 *)(a1 + 24), SYM, 0); if ( v2 != 0 ) v2 = SYM; } memcpy_thunk(a0); return v2; }", "svc_queue_wait_simple": "int __fastcall svc_queue_wait_simple() { int v0; return svc_queue_wait(v0, 0, 0); }", "heap_walk_free_list": "int __fastcall heap_walk_free_list() { int v0; int v1; unsigned int v2; int v3; int v4; int v5; unsigned int v6; int v7; int v8; int v9; unsigned int v10; int v11; int v12; v0 = SYM; v1 = 0; v2 = 0; v3 = 0; v4 = SYM - 2112; v5 = *(_DWORD *)(SYM - 2052); v6 = *(_DWORD *)(v5 + 4); if ( v5 == SYM ) { *(_DWORD *)(SYM - 2052) = SYM + 0x10000; *(_DWORD *)(v4 + 8) = 16; } else { *(_DWORD *)(SYM - 2104) = 0; *(_DWORD *)(v4 + 60) = v0; } bzero_thunk(*(_DWORD *)(v4 + 60), 0x10000, 255); if ( v6 + 1 < v6 ) return SYM; **(_DWORD **)(v4 + 60) = SYM; *(_DWORD *)(*(_DWORD *)(v4 + 60) + 4) = v6 + 1; *(_DWORD *)(v4 + 12) = 0; *(_DWORD *)(v4 + 52) = *(_DWORD *)(v4 + 60) + 64; while ( *(_DWORD *)v4 > v2 ) { v7 = v4 + 4 * v2; v8 = *(_DWORD *)(v7 + 64); if ( *(_WORD *)(v8 + 22) != 0 ) { if ( *(_BYTE *)(v8 + 5) == 1 ) *(_WORD *)(v8 + 20) -= 32; v9 = *(_DWORD *)(v7 + 64); v10 = *(unsigned __int16 *)(v9 + 20); *(_BYTE *)(v9 + 5) = 0; memcpy(*(void **)(v4 + 52), *(const void **)(v7 + 64), v10); v11 = v4 + 4 * v3++; *(_DWORD *)(v11 + 64) = *(_DWORD *)(v4 + 52); v12 = *(_DWORD *)(v4 + 52); *(_DWORD *)(v4 + 56) = v12; *(_DWORD *)(v4 + 52) = v12 + v10; } ++v2; } *(_DWORD *)v4 = v3; *(_DWORD *)(v4 + 4) = 1; return v1; }", "svc_queue_submit": "int __fastcall svc_queue_submit(int a0, int a1, unsigned int a2) { unsigned int v3; int v4; int v5; int v6; v3 = 0; v4 = SYM; v5 = 0; if ( *((_DWORD *)SYM + 5) != 1 ) return SYM - 6; if ( a1 == 0 ) return SYM - 7; __asm { SVC 0x5E ; '^' } while ( *(_DWORD *)SYM > v3 ) { v6 = *((_DWORD *)SYM + v3 + 16); if ( v6 == 0 ) goto LABEL_16; if ( *(_DWORD *)(v6 + 16) == a0 ) { v5 = *((_DWORD *)SYM + v3 + 16); goto LABEL_12; } ++v3; } if ( SYM == 0 ) { LABEL_12: if ( *(_WORD *)(v5 + 22) != 0 ) { if ( *(unsigned __int16 *)(v5 + 22) <= a2 ) v4 = svc_queue_entry_run(a1, v5); else v4 = SYM - 7; } } LABEL_16: __asm { SVC 0x5F ; '_' } return v4; }", "svc_queue_entry_get": "int __fastcall svc_queue_entry_get(int a0, _DWORD *a1) { unsigned int *v2; int v3; unsigned int v4; unsigned int v5; v2 = (unsigned int *)SYM; v3 = SYM; v4 = 0; if ( *((_DWORD *)SYM + 5) != 1 ) return SYM - 6; if ( a1 == nullptr ) return SYM - 7; __asm { SVC 0x5E ; '^' } *a1 = 0; while ( *v2 > v4 ) { v5 = v2[v4 + 16]; if ( v5 == 0 ) { v3 = SYM - 8; break; } if ( *(_DWORD *)(v5 + 16) == a0 ) { if ( *(_WORD *)(v2[v4 + 16] + 22) != 0 ) { v3 = 0; *a1 = *(unsigned __int16 *)(v2[v4 + 16] + 22); } break; } ++v4; } __asm { SVC 0x5F ; '_' } return v3; }", "fw_dir_map": "int __fastcall fw_dir_map() { _DWORD *v0; _DWORD *v1; int v2; bool v3; int v4; bzero_core(SYM, 0x840u); v0 = SYM; v1 = SYM; if ( *((_DWORD *)SYM + 413) == 1 ) { v2 = map_region_pages(SYM, 0x20000u, SYM); if ( v2 != 0 ) goto LABEL_11; v1[7] = v0[253]; v1[10] = v0[251] & 1; v3 = (v0[247] & 0x100) == 0; v1[9] = v0[247] & 0x100; v4 = v3 ? 255 : v0[519]; v1[8] = v4; v2 = heap_stats_collect(); if ( v2 != 0 || v1[4] == 0 && ((v2 = fw_dir_scan()) != 0 || (v2 = svc_queue_dispatch()) != 0) ) { LABEL_11: if ( v2 == SYM ) { trace_event(0, 0xF007u, v1[6], 0); v2 = 0; v1[5] = 0; } } else { v1[5] = 1; } trace_event(0, 0xF006u, v2, 0); return v2; } else { *((_DWORD *)SYM + 5) = 0; return 0; } }", "svc_queue_state_get": "_DWORD *__fastcall svc_queue_state_get(int a0) { *(_DWORD *)a0 = *((_DWORD *)SYM + 5); return (_DWORD *)a0; }", "queue_field12_get": "_DWORD *__fastcall queue_field12_get(int a0) { *(_DWORD *)a0 = *((_DWORD *)SYM + 12); return (_DWORD *)a0; }", "heap_stats_collect": "int __fastcall heap_stats_collect() { int *v0; int result; int v1; unsigned int v2; unsigned int v3; int v4; _DWORD *v5; int v6; v0 = (int *)SYM; result = 0; v1 = SYM; v2 = 0; v3 = 0; v4 = *(_DWORD *)SYM; v5 = (_DWORD *)((char *)SYM - 2112); v6 = *((_DWORD *)SYM + 0x4000); if ( *(_DWORD *)SYM == -1 ) { if ( v6 == -1 ) { *((_DWORD *)SYM - 526) = 0; v5[4] = 1; v5[15] = v0; *v0 = v1; *(_DWORD *)(v5[15] + 4) = 1; v5[3] = 0; v5[13] = v5[15] + 64; return result; } } else if ( v4 != SYM && *(_DWORD *)SYM != -1 ) { goto LABEL_8; } if ( v6 != SYM && v6 != -1 ) { LABEL_8: result = SYM; *((_DWORD *)SYM - 522) = 1; return result; } if ( v4 == SYM ) v2 = *((_DWORD *)SYM + 1); if ( v6 == SYM ) v3 = *((_DWORD *)SYM + 16385); if ( v2 <= v3 ) { *((_DWORD *)SYM - 513) = (char *)SYM + 0x10000; v5[2] = 16; } else { *((_DWORD *)SYM - 526) = 0; v5[15] = v0; } return result; }", "svc_queue_wait": "int __fastcall svc_queue_wait(int a0, int a1, unsigned int a2) { _DWORD *v3; unsigned int v4; unsigned int v5; int v6; int v7; int v8; v3 = SYM; v4 = 0; v5 = 0; v6 = 0; v7 = 5000; if ( *((_DWORD *)SYM + 5) != 1 ) return SYM; if ( a1 == 0 && a2 != 0 ) return SYM - 1; __asm { SVC 0x5E ; '^' } while ( *(_DWORD *)SYM > v4 ) { if ( *(_DWORD *)(*((_DWORD *)SYM + v4 + 16) + 16) == a0 ) { v6 = *((_DWORD *)SYM + v4 + 16); v5 = *(_DWORD *)(v6 + 12); break; } ++v4; } if ( (v6 | a2) != 0 ) { if ( v5 + 1 >= v5 ) { v8 = object_body_alloc(a0, a1, a2, v5 + 1, v4); if ( v8 == 0 ) { v3[12] = 1; __asm { SVC 0x5C ; '\\' } } } else { v8 = SYM - 2; } } else { v8 = 0; } __asm { SVC 0x5F ; '_' } if ( v8 == 0 && *SYM[0] != 0 && *SYM != 0 ) { while ( v7 != 0 ) { if ( v3[12] != 1 ) return v8; __asm { SVC 0x56 ; 'V' } --v7; } return SYM + 10; } return v8; }", "svc_queue_dispatch": "int __fastcall svc_queue_dispatch() { _DWORD *v0; int v1; int v2; int v3; int v4; const void *v5; int v6; unsigned int v7; unsigned int v8; unsigned int v9; _BYTE a[32]; int v10; v10 = *(_DWORD *)SYM; __asm { SVC 0x66 ; 'f' } v0 = SYM; v1 = SYM; v2 = *((_DWORD *)SYM + 14); if ( *(_BYTE *)(v2 + 5) != 1 ) { v3 = 7; LABEL_10: v0[6] = v3; return v1; } v4 = *((_DWORD *)SYM + 13); v5 = (const void *)(v4 - 32); v6 = hmac_sha256( (unsigned __int8)v10, SYM, SYM, 32, *((_DWORD *)SYM + 15), v4 - *((_DWORD *)SYM + 15) - 32, (int)a, 32); if ( v6 != 0 ) return SYM + 4; if ( ct_memcmp(a, v5, 0x20u) != 0 ) { v3 = 6; goto LABEL_10; } if ( v0[10] == 1 ) { if ( *(unsigned __int8 *)(v2 + 4) >= 2u && *(unsigned __int8 *)(v2 + 7) != v0[8] ) { v3 = 9; goto LABEL_10; } v7 = *(_DWORD *)(v2 + 8); v8 = v0[7]; if ( v7 != v8 || v7 == 0 ) { if ( v7 > v8 ) { v9 = v7 - v8; v0[11] = v9; if ( v9 <= 0x1F4 || (*((_BYTE *)SYM + 1004) & 4) == 0 ) { v0[12] = 1; __asm { SVC 0x5C ; '\\' } return v6; } } v0[6] = 5; return v1; } } else if ( *(_DWORD *)(v2 + 8) != 0 ) { v3 = 8; goto LABEL_10; } return v6; }", "flash_recovery_probe": "int __fastcall flash_recovery_probe(int a0) { int dispatch; _DWORD *v1; int v2; int v3; unsigned int *v4; int v5; unsigned int v6; int v7; dispatch = 0; __asm { SVC 0x5E ; '^' } v1 = SYM; if ( *((_DWORD *)SYM + 1) == 1 ) { dispatch = flash_read_dispatch(5, *((_DWORD *)SYM + 2) + 1, 15, 0); if ( dispatch != 0 ) goto LABEL_14; dispatch = flash_read_dispatch(5, v1[2], 1, 0); if ( dispatch != 0 ) goto LABEL_14; v1[1] = 0; } v2 = v1[3]; v3 = v1[15]; v4 = (unsigned int *)(v3 + v2); if ( v1[13] - v3 != v2 ) { dispatch = flash_slot_state(a0); if ( dispatch != 0 ) goto LABEL_14; v5 = v1[3]; v6 = v1[13] - v1[15] - v5; dispatch = spi_write_verified(5u, v1[2], v5, v6, v4, 0); if ( dispatch != 0 ) goto LABEL_14; v7 = v1[3]; if ( __CFADD__(v7, v6) ) { dispatch = SYM; goto LABEL_14; } v1[3] = v7 + v6; } if ( v1[11] == 0 || (dispatch = flash_op_wrapper(a0, (unsigned int *)SYM + 7, (unsigned int *)SYM + 11, 0)) == 0 ) { v1[12] = 0; } LABEL_14: __asm { SVC 0x5F ; '_' } if ( dispatch == SYM || dispatch == 11 || dispatch == 10 || dispatch == SYM - 5 ) { __asm { SVC 0x5C ; '\\' } return 0; } return dispatch; }", "svc_queue_worker": "void __fastcall __noreturn svc_queue_worker(unsigned __int8 a0) { int v1; int v2; int v3; __asm { SVC 0x66 ; 'f' } v1 = a0; v2 = *((_DWORD *)SYM + 413); if ( v2 != 1 ) { __asm { SVC 0x54 ; 'T' } __asm { SVC 0x53 ; 'S' } if ( (_BYTE)v2 != 0 ) { __asm { SVC 0x56 ; 'V' } while ( 1 ) ; } } if ( *SYM[0] == 0 ) __asm { SVC 0x5A ; 'Z' } while ( 1 ) { __asm { SVC 0x5A ; 'Z' } __asm { SVC 0x5E ; '^' } v3 = flash_recovery_probe(v1); if ( v3 != 0 ) trace_event(0, 0xF00Eu, v3, 1); __asm { SVC 0x5F ; '_' } } }", "crypto_wait_completion": "int __fastcall crypto_wait_completion(int a0, int a1, int a2, int a3) { int v4; unsigned int v5; int v6; int v7; v5 = a1; v6 = a2; v7 = a3; __asm { SVC 0x5E ; '^' } v4 = SYM; if ( crypto_queue_prepare(0, &v6, a0, a1) == 0 ) v4 = 0; __asm { SVC 0x5F ; '_' } if ( v4 == 0 ) { do { __asm { SVC 0x5A ; 'Z' } queue_flag_set(0); if ( queue_flag_test() ) { __asm { SVC 0x5E ; '^' } queue_slot_info(0, &v5, &v7); if ( v7 != 0 && (v5 == v6 || v6 - a1 < v5 && v5 < v6) ) { queue_slot_release(0, v6); __asm { SVC 0x5F ; '_' } return v7 + 0x80000000; } __asm { SVC 0x5F ; '_' } __asm { SVC 0x56 ; 'V' } } } while ( !ring_is_full(0, v6) ); } return v4; }", "ret_zero_6": "int __fastcall ret_zero_6() { return 0; }", "map_window_stub": "int __fastcall map_window_stub() { __asm { SVC 0x7D ; '}' } return SYM; }", "tsu_mailbox_task": "void __fastcall __noreturn tsu_mailbox_task() { _DWORD *v0; int *v1; v0 = (_DWORD *)((char *)*SYM + 2764); *((_DWORD *)*SYM + 430) |= 0x3C0u; __asm { SVC 0x59 ; 'Y' } v1 = SYM; *SYM = 89; *v0 |= 0x80000000; while ( 1 ) { __asm { SVC 0x5A ; 'Z' } SYM(*v1, -1); } }", "gp_object_allocate": "int __fastcall gp_object_allocate(int *a0, int a1) { int v2; int result; int v3; unsigned int v4; int v5; _BYTE *v6; int v7; unsigned int v8; v2 = 0; v8 = 0; result = alg_to_engine_params(a0, &v8); if ( result == 0 ) { v3 = SYM; v4 = object_slot_alloc(a1); if ( v4 != -1 && (v2 = object_slot_bind(v4, 0, a1)) != 0 && (v5 = SYM + 8 * v4, (v6 = heap_alloc(v8, 0, a1)) != nullptr) ) { *(_DWORD *)(v5 + 4) = v6; *v6 = 1; v3 = 0; *((_DWORD *)v6 + 1) = 0; *((_DWORD *)v6 + 22) = *a0; v7 = a0[1]; *((_DWORD *)v6 + 27) = 0; *((_DWORD *)v6 + 24) = v7; *((_DWORD *)v6 + 25) = -1; a0[2] = v2; } else { object_slot_wipe(v4, a1); object_slot_release(v2); } return v3; } return result; }", "gp_object_close_and_delete": "int __fastcall gp_object_close_and_delete(int a0, int a1, int a2, int a3) { int v4; int v5; unsigned int v6; int v7; v7 = a3; v4 = SYM; v5 = *(_DWORD *)(object_from_handle(a0, &v7, a1) + 4); if ( (*(_DWORD *)(v5 + 108) & 0x10000) == 0 || (*(_BYTE *)(v7 + 4) & 4) == 0 || (v6 = *(_DWORD *)(v7 + 12)) == -1 || (v4 = key_slot_load((unsigned int *)(v5 + 8), *(unsigned __int8 *)(v5 + 1), (unsigned int *)(v5 + 72)), object_slot_wipe(v6, a1), object_slot_release(a0), v4 != 0) ) { fatal_error(v4); } return 0; }", "gp_object_close": "unsigned int __fastcall gp_object_close(unsigned int result, int a0) { unsigned int v1; v1 = result; if ( result != 0 ) { if ( (*(_DWORD *)(*(_DWORD *)(object_from_handle(result, nullptr, a0) + 4) + 108) & 0x10000) != 0 ) { if ( objslot_release(v1) != 0 ) fatal_error(SYM); return object_slot_release(v1); } else { return gp_object_free(v1, a0); } } return result; }", "gp_object_delete_persistent": "int __fastcall gp_object_delete_persistent(int *a0, int a1) { int v2; int v3; int v4[8]; int v5; int v6; int v7; LOBYTE(v5) = -1; v6 = 0; if ( *SYM == 0 ) return SYM; v2 = persist_handle_lookup(*a0, &v7, &v5, a1); if ( v2 == 0 ) { v3 = task_spawn_worker((unsigned __int8)v5, 2, 0, -1, &v7, 0, v4, &v6); v2 = v3; if ( v3 == 0 ) persist_handle_release(*a0, a1); } return v2; }", "gp_operation_copy_state": "int __fastcall gp_operation_copy_state(int *a0, int a1) { int v2; gp_session_t *v3; gp_session_t *v4; void *ctx; int v5; int result; int v6; int v7; int v8; int dst[9]; v2 = SYM; v3 = session_from_handle(a0[1], a1); v4 = session_from_handle(*a0, a1); if ( v3->in_use == 0 || v4->in_use == 0 || v3->alg != v4->alg || v3->f08 != v4->f08 || v3->key_bits > v4->max_len ) return require_capability(v2); ctx = (void *)v4->ctx; if ( ctx != nullptr ) bzero(ctx, v4->buf_len); if ( v3->key_bits != 0 || v3->op_class == 5 ) { v5 = v4->ctx; if ( v5 != 0 ) memcpy_thunk(v5); } v4->key_bits = v3->key_bits; v4->flags = v3->flags; v4->state = v3->state; result = v3->nbufs; if ( v3->nbufs != 0 ) { bzero_core(dst, 0x20u); v6 = ccp_desc_aes_full(dst, 1, v4->buf_id[0], 0, 1, 0, v3->buf_id[0], 0, 1, 0, 32 * v3->nbufs, 1); if ( v6 != 0 ) return require_capability(v2); result = crypto_wait_completion((int)dst, 1, v7, v8); v2 = result; if ( result != 0 ) return require_capability(v2); } return result; }", "gp_operation_allocate": "int __fastcall gp_operation_allocate(int a0, int a1, int a2, int a3) { int v4; int v5; int v6; int v7; int v8; int v9; int v10; _BYTE *v11; v4 = 0; v5 = SYM; v6 = 0; v7 = SYM; __asm { SVC 0x5E ; '^' } v8 = SYM; v9 = 0; while ( *(_BYTE *)(SYM + 84 * v9 + 32) != 0 ) { if ( (unsigned int)++v9 >= 0x20 ) goto LABEL_4; } v4 = v9 + 16; v6 = SYM + 84 * v9; *(_BYTE *)(v6 + 32) = 1; *(_BYTE *)(v6 + 34) = a1; *(_DWORD *)(v6 + 72) = 0; LABEL_4: if ( v4 != 0 ) v7 = hash_alg_setup(*(_DWORD *)(a0 + 60), v6, v8, a3); __asm { SVC 0x5F ; '_' } if ( v4 != 0 ) { if ( v7 != 0 || (v10 = crypto_validate_algorithm((_DWORD *)(a0 + 56), v6), (v7 = v10, v10 != 0) || (v7 = v5, v11 = heap_alloc(*(_DWORD *)(v6 + 72), 0, a1), *(_DWORD *)(v6 + 76) = v11, v11 == nullptr)) ) { session_release_buffers(v6); *(_BYTE *)(v6 + 34) = 0; *(_BYTE *)(v6 + 32) = 0; } else { if ( *(_DWORD *)(v6 + 4) == 5 ) crypto_ctx_reset((int *)v6); v7 = 0; *(_DWORD *)(a0 + 56) = v4; } } return v7; }", "gp_digest_do_final": "int __fastcall gp_digest_do_final(int a0, _DWORD *a1, int a2) { unsigned int *v3; unsigned int v4; int v5; gp_session_t *v6; int v7; unsigned int v8; int components; int v9; int v10; unsigned int v11; int alg; int v12; int v13; int v14; int v15; int v16; int v17; int v18; v3 = a1 + 5; v18 = a1[2]; v4 = a1[3]; v5 = a1[4]; v6 = session_from_handle(*(_DWORD *)(a0 + 60), a2); v7 = SYM; v8 = v6->key_bits >> 3; if ( v4 > v8 ) return v7; components = rsa_key_get_components(v6->ctx, (int)&v15); if ( components == 0 ) { v9 = *(_DWORD *)(a0 + 56); if ( v9 != 0 ) { v10 = v15; v11 = 4; } else { v10 = v17; v11 = v8; } alg = v6->alg; v12 = v6->alg - SYM; if ( v6->alg == SYM ) goto LABEL_12; if ( alg > SYM ) { if ( v12 != 0x100000 && v12 != 0x200000 && v12 != 3145728 ) goto LABEL_16; if ( v9 != 0 ) v14 = fw_load_and_verify(v18, v4, v5, v3, v16, v8, v10, v11, alg); else v14 = fw_segment_decrypt(v18, v4, v5, v3, v16, v8, v10, v11, alg); LABEL_20: components = v14; if ( v14 == 0 ) return components; goto LABEL_27; } v13 = alg - 1610612784; if ( v13 != 0 ) { if ( v13 != 256 ) { if ( v13 + SYM == 0 ) { LABEL_12: components = SYM + 3; LABEL_29: require_capability(components); return components; } LABEL_16: components = SYM - 6; goto LABEL_29; } if ( v9 != 0 ) v14 = fw_segment_copy(v18, v4, v5, v3, v16, v8, v10, v11); else v14 = fw_segment_stage(v18, v4, v5, v3, v16, v8, v10, v11); goto LABEL_20; } if ( v4 != v8 ) return v7; components = rsa_modexp(v16, v8, v10, v11, v18, v4, v5, 0); if ( components == 0 ) { *v3 = v8; return components; } } LABEL_27: if ( components != -65520 && components != v7 ) goto LABEL_29; return components; }", "gp_asym_sign_verify": "int __fastcall gp_asym_sign_verify(int a0, int a1, int a2) { int components; _DWORD *v3; __int64 v4; unsigned int v5; gp_session_t *v6; int ctx; gp_session_t *v7; unsigned int v8; unsigned int alg; signed int v9; int v10; int v11; int v12; int v13; int v14; int v15; unsigned int op_class; int v16; unsigned int v17; signed int v18; int v19; int v20; int v21; int v22; int v23; int v24; int v25; _DWORD *entry_by_id; _DWORD *v26; unsigned int *v27; unsigned int v28; _DWORD *v29; int v30; int v31; int v32; int v33; int v34; int v35; int v36; v34 = a0; v35 = a1; v36 = a2; components = SYM; v28 = 0; v29 = *(_DWORD **)a1; udiv_select_shift(*(_DWORD *)(a1 + 4), 0xCu); v26 = v3; v33 = *(_DWORD *)(a1 + 8); v4 = *(_QWORD *)(a1 + 12); v27 = *(unsigned int **)(a1 + 16); v5 = *(_DWORD *)(a1 + 20); v6 = session_from_handle(*(_DWORD *)(v34 + 60), a2); ctx = v6->ctx; v7 = v6; v8 = v6->key_bits >> 3; alg = v6->alg; if ( alg == SYM ) { if ( v5 == 40 ) goto LABEL_37; return SYM + 16; } if ( alg == SYM ) { if ( v5 == 2 * v8 ) { if ( (_DWORD)v4 != 20 && (_DWORD)v4 != 28 && (_DWORD)v4 != 32 && (_DWORD)v4 != 48 && (_DWORD)v4 != 64 ) goto LABEL_89; goto LABEL_40; } return SYM + 16; } if ( v5 < v8 ) return SYM + 16; components = rsa_key_get_components(ctx, (int)&v30); if ( components == 0 ) { v9 = v7->alg; v10 = v7->alg - SYM; if ( v7->alg != SYM ) { if ( (signed int)v7->alg <= SYM ) { v11 = v9 - SYM; if ( v9 != SYM ) { if ( v9 <= SYM ) { v12 = v9 + SYM; if ( v12 == 0 ) { v14 = 16; goto LABEL_34; } if ( v12 == 4096 ) goto LABEL_37; goto LABEL_33; } if ( v11 != 4096 ) { if ( v11 != 0x2000 ) goto LABEL_33; goto LABEL_39; } LABEL_38: v14 = 32; goto LABEL_34; } LABEL_29: v14 = 28; goto LABEL_34; } v13 = v10 - SYM; if ( v10 == SYM ) goto LABEL_38; if ( v10 <= SYM ) { if ( v10 + SYM == 0 ) { LABEL_37: v14 = 20; goto LABEL_34; } if ( v10 + SYM + SYM != 0 ) { LABEL_33: v14 = -1; goto LABEL_34; } goto LABEL_29; } if ( v13 + SYM == 0 ) { LABEL_39: v14 = 48; LABEL_34: if ( (_DWORD)v4 != v14 ) { components = SYM; LABEL_89: require_capability(components); return components; } LABEL_40: components = SYM + 15; v15 = *(_DWORD *)(v34 + 56); op_class = v7->op_class; if ( v15 != 0 ) { if ( op_class != 7 || v7->f08 != 3 ) goto LABEL_89; v16 = v30; v17 = 4; } else { if ( op_class != 7 || v7->f08 != 2 ) goto LABEL_89; v16 = v32; v17 = v8; } v18 = v7->alg; v19 = v7->alg - SYM; if ( v7->alg == SYM ) goto LABEL_71; if ( (signed int)v7->alg <= SYM ) { if ( v18 == SYM ) goto LABEL_71; if ( v18 > SYM ) { if ( v18 - SYM == 2066 ) { if ( v15 != 0 ) v25 = pk_verify_signature(v33, v4, (int)v27, v5, (_DWORD *)v7->ctx); else v25 = pk_bignum_core(v33, v4, (_DWORD *)v7->ctx, v27, v5); goto LABEL_82; } if ( v18 - SYM == 4096 ) goto LABEL_71; } else { components = SYM; v20 = v18 + SYM; if ( v20 == 0 ) goto LABEL_69; v21 = v20 - 2305; if ( v21 == 0 ) { if ( v15 != 0 ) { v25 = pk_op_dispatch((unsigned int *)v7->ctx, v33, v4, (int)v27); LABEL_82: components = v25; } LABEL_69: if ( (*(_DWORD *)(v34 + 56) | components) == 0 ) { if ( v7->alg == SYM ) *(_DWORD *)(a1 + 20) = 2 * v8; else *(_DWORD *)(a1 + 20) = v8; } if ( components == 0 ) return components; goto LABEL_87; } if ( v21 == 1791 ) { LABEL_71: v25 = fw_image_authenticate(v15, v33, v4, v31, v8, v16, v17, (int)v27); goto LABEL_82; } } LABEL_68: components = SYM; goto LABEL_69; } v22 = v19 - SYM; if ( v19 != SYM ) { if ( v19 > SYM ) { v24 = SYM; v23 = v22 + SYM; if ( v22 + SYM == 0 ) goto LABEL_66; } else { if ( v19 == 4096 ) goto LABEL_71; v23 = v19 + SYM; if ( v19 + SYM == 0 ) goto LABEL_66; v24 = SYM; } if ( v23 + v24 != 0 ) goto LABEL_68; } LABEL_66: if ( v15 != 0 ) { v25 = rsa_pad_and_verify(v33, v4, v31, v8, v16, v17, (int)v27); } else { if ( (unsigned int)v26 > 1 ) goto LABEL_69; entry_by_id = find_entry_by_id(v29, (unsigned int)v26, SYM); if ( entry_by_id != nullptr ) v28 = entry_by_id[1]; v25 = fw_segment_verify(v33, v4, v31, v8, v16, v17, v28, (int)v27); } goto LABEL_82; } if ( v13 + SYM + SYM != 0 ) goto LABEL_33; } v14 = 64; goto LABEL_34; } LABEL_87: if ( components != -65520 && components != -53134 ) goto LABEL_89; return components; }", "gp_operation_set_key": "int __fastcall gp_operation_set_key(int a0, __int64 *a1, int a2) { __int64 v3; int v4; gp_session_t *v5; int v6; int v7; int v8; int v9; v3 = *a1; v4 = SYM; v5 = session_from_handle(*(_DWORD *)(a0 + 56), a2); if ( v5->key_bits == 0 ) return require_capability(v4); if ( (v5->flags & 0x20000) != 0 ) gp_operation_release_ctx((int *)v5); v5->state = 1; v4 = alg_key_size_check(v5->alg, SHIDWORD(v3)); if ( v4 != 0 ) return require_capability(v4); v6 = v5->alg - SYM; v7 = SYM >> 20; if ( v5->alg == SYM ) goto LABEL_15; if ( (signed int)v5->alg > SYM ) { if ( v6 == v7 ) goto LABEL_15; if ( v6 == 512 ) goto LABEL_15; v8 = v6 + SYM; if ( v6 + SYM == 0 ) goto LABEL_15; goto LABEL_14; } v8 = v5->alg - 268435472; if ( v5->alg != 268435472 && v5->alg != 268435473 && v5->alg != 268435475 ) { LABEL_14: if ( v8 != v7 ) { v4 = SYM + 10; return require_capability(v4); } LABEL_15: v4 = key_material_reverse(v5->buf_id[0], v3); if ( v4 == 0 ) goto LABEL_19; return require_capability(v4); } LABEL_19: v4 = aes_keysize_to_mode( &v5->buf_id[5], 0, v5->key_bits, v5->f08, v5->alg, *SYM + 640, *SYM + 640, v5->buf_id[0]); if ( v4 != 0 ) return require_capability(v4); v5->flags |= 0x20000u; return v9; }", "gp_cipher_update": "int __fastcall gp_cipher_update(int a0, int a1, int a2, int a3) { int v4; __int64 v5; gp_session_t *v6; unsigned int ctx; unsigned int v7; int v8; int v9; unsigned int v10; int v11; v4 = SYM; v11 = *(_DWORD *)a1; v5 = *(_QWORD *)(a1 + 4); v10 = *(_DWORD *)(a1 + 12); v6 = session_from_handle(*(_DWORD *)(a0 + 56), a2); if ( v6->key_bits == 0 || (v6->flags & 0x20000) == 0 || v6->state != 1 ) goto LABEL_26; ctx = v6->ctx; v7 = *(_DWORD *)(ctx + 64) + v5; if ( a3 == 0 ) v7 &= 0xFFFFFFF0; if ( v7 > v10 ) return SYM + 16; v8 = v6->alg - SYM; v9 = SYM >> 20; if ( v6->alg != SYM ) { if ( (signed int)v6->alg > SYM ) { if ( v8 == v9 || v8 + SYM == 0 || v8 + SYM == v9 ) goto LABEL_17; } else if ( v6->alg == 268435472 || v6->alg - 268435472 == v9 || v6->alg == 268435984 ) { goto LABEL_17; } v4 = SYM + 10; LABEL_26: require_capability(v4); return v4; } LABEL_17: v4 = cipher_feed_blocks((int)v6, v11, v5, SHIDWORD(v5)); if ( v4 == 0 ) { if ( a3 != 1 ) goto LABEL_28; if ( v7 << 28 != 0 ) v4 = cipher_ctx_load((int)v6, (v7 & 0xFFFFFFF0) + HIDWORD(v5), v7 & 0xF); *(_DWORD *)(ctx + 64) = 0; v6->flags &= ~0x20000u; v6->state = 0; if ( v4 == 0 ) { LABEL_28: *(_DWORD *)(a1 + 12) = v7; return v4; } } if ( v4 != -65520 ) goto LABEL_26; return v4; }", "gp_mac_update": "int __fastcall gp_mac_update(int a0, __int64 *a1, int a2) { __int64 v3; __int64 v4; gp_session_t *v5; int *v6; int v7; int v8; int v9; v3 = *a1; v4 = a1[1]; v5 = session_from_handle(*(_DWORD *)(a0 + 56), a2); v6 = (int *)v5; v7 = SYM; if ( v5->f0c > HIDWORD(v4) ) return SYM; v9 = mac_feed_blocks((int)v5, (_DWORD *)v5->ctx, v3, SHIDWORD(v3), v4); v8 = v9; if ( v9 != 0 ) { if ( v9 != v7 ) require_capability(v9); } else { *((_DWORD *)a1 + 3) = v6[3]; gp_operation_release_ctx(v6); } return v8; }", "gp_mac_compute_final": "int __fastcall gp_mac_compute_final(int a0, __int64 *a1, int a2) { __int64 v3; gp_session_t *v4; int ctx; int v5; int v6; v3 = *a1; v4 = session_from_handle(*(_DWORD *)(a0 + 56), a2); ctx = v4->ctx; v4->state = 1; v5 = hash_feed_blocks((int)v4, ctx, v3, SHIDWORD(v3)); v6 = v5; if ( v5 != 0 ) require_capability(v5); return v6; }", "gp_operation_free": "int __fastcall gp_operation_free(int *a0, int a1) { gp_session_t *v2; __int64 v3; int result; v2 = session_from_handle(*a0, a1); session_release_buffers((int)v2); v3 = *(_QWORD *)&v2->buf_len; v2 = (gp_session_t *)((char *)v2 + 32); bzero((void *)HIDWORD(v3), v3); result = heap_free(*(_DWORD *)&v2->buf_id[9]); BYTE2(v2->alg) = 0; LOBYTE(v2->alg) = 0; return result; }", "gp_cipher_do_final": "int __fastcall gp_cipher_do_final(int a0, int *a1, int a2) { unsigned int v3; int v4; gp_session_t *v5; int v6; int v7; _DWORD *ctx; unsigned int v8; unsigned int i; unsigned int f0c; int v9; int v10; void *a; _BYTE b[64]; int v11; int v12; int *v13; int owner; v12 = a0; v13 = a1; owner = a2; v11 = *(_DWORD *)SYM; v10 = *a1; v9 = a1[1]; a = (void *)a1[2]; v3 = a1[3]; v4 = SYM; v5 = session_from_handle(*(_DWORD *)(a0 + 60), a2); v6 = SYM; if ( (v5->flags & 0x20000) == 0 || v5->state != 1 ) goto LABEL_22; if ( v5->alg == SYM ) { v4 = hash_feed_blocks_alt((int)v5, v10, v9); if ( v4 != 0 ) goto LABEL_22; v7 = mac_engine_run((int)v5); } else { ctx = (_DWORD *)v5->ctx; v8 = ctx[48]; if ( v8 > 0x80 || ctx[81] > v8 ) { v4 = SYM + 6; goto LABEL_22; } v4 = mac_feed_blocks((int)v5, ctx + 84, v10, v9, (int)ctx + v8); if ( v4 != 0 ) goto LABEL_22; bzero_thunk((int)ctx + ctx[81], ctx[48] - ctx[81], 92); for ( i = 0; ctx[81] > i; ++i ) *((_BYTE *)ctx + i) = *((_BYTE *)ctx + i + 196) ^ 0x5C; v7 = mac_oneshot(owner, ctx[82], (unsigned int)ctx, ctx[48] + v5->f0c, (int)b, 64); } v4 = v7; if ( v7 == 0 ) { f0c = v5->f0c; if ( f0c > v3 ) { v4 = v6; goto LABEL_22; } if ( *(_DWORD *)(a0 + 56) != 0 ) { if ( ct_memcmp(a, b, f0c) != 0 ) { v4 = SYM; goto LABEL_22; } } else { memcpy_thunk((int)a); a1[3] = v5->f0c; } v5->flags &= ~0x20000u; v5->state = 0; } LABEL_22: if ( *(_DWORD *)(a0 + 56) != 0 ) { if ( v4 != 0 && v4 != -53135 ) LABEL_25: require_capability(v4); } else if ( v4 != 0 && v4 != v6 ) { goto LABEL_25; } return v4; }", "gp_mac_or_digest_init": "int __fastcall gp_mac_or_digest_init(int a0, int a1, int a2) { int v3; gp_session_t *v4; int v5; int ctx; unsigned int v6; unsigned int i; int result; v3 = SYM; v4 = session_from_handle(*(_DWORD *)(a0 + 56), a2); if ( (v4->flags & 0x20000) != 0 ) gp_operation_release_ctx((int *)v4); v4->state = 1; if ( v4->op_class != 3 || v4->key_bits == 0 ) return require_capability(v3); if ( v4->alg == SYM ) { v5 = mac_finalize((int)v4, v4->ctx); goto LABEL_15; } ctx = v4->ctx; v6 = *(_DWORD *)(ctx + 192); if ( v6 > 0x80 || *(_DWORD *)(ctx + 324) > v6 ) { v3 = SYM + 6; return require_capability(v3); } v3 = crypto_op_begin((int *)v4, ctx + 336); if ( v3 != 0 ) return require_capability(v3); bzero_thunk(*(_DWORD *)(ctx + 324) + ctx, *(_DWORD *)(ctx + 192) - *(_DWORD *)(ctx + 324), 54); for ( i = 0; *(_DWORD *)(ctx + 324) > i; ++i ) *(_BYTE *)(ctx + i) = *(_BYTE *)(ctx + i + 196) ^ 0x36; v5 = hash_feed_blocks((int)v4, ctx + 336, ctx, *(_DWORD *)(ctx + 192)); LABEL_15: v3 = v5; if ( v5 != 0 ) return require_capability(v3); result = v4->flags | 0x20000; v4->flags = result; return result; }", "gp_mac_init_with_iv": "int __fastcall gp_mac_init_with_iv(int a0, __int64 *a1, int a2) { __int64 v3; int v4; gp_session_t *v5; int result; v3 = *a1; v4 = SYM; v5 = session_from_handle(*(_DWORD *)(a0 + 56), a2); if ( (v5->flags & 0x20000) == 0 || v5->state != 1 ) return require_capability(v4); if ( v5->op_class != 3 ) return require_capability(v4 + 6); result = v5->alg == SYM ? hash_feed_blocks_alt((int)v5, v3, SHIDWORD(v3)) : hash_feed_blocks((int)v5, v5->ctx + 336, v3, SHIDWORD(v3)); v4 = result; if ( result != 0 ) return require_capability(v4); return result; }", "gp_operation_reset": "int __fastcall gp_operation_reset(int *a0, int a1) { gp_session_t *v2; v2 = session_from_handle(*a0, a1); return gp_operation_release_ctx((int *)v2); }", "gp_set_operation_key": "int __fastcall gp_set_operation_key(int *a0, int a1) { int v2; gp_session_t *v3; int v4; int v5; unsigned int *v6; int v7; unsigned int v8; int alg; int v9; int v10; int v11; int v12; unsigned int v13; int v14; int v15; int v16; int v17; int v18; int v19; int v20; unsigned int f08; unsigned int v21; void *v22; int v23; _DWORD *v24; int v25; _DWORD *v26; int v27; unsigned int ctx; v2 = SYM; v3 = session_from_handle(*a0, a1); v4 = a0[1]; if ( v4 == 0 ) { bzero((void *)v3->ctx, v3->buf_len); return 0; } v5 = object_from_handle(v4, nullptr, a1); v6 = *(unsigned int **)(v5 + 4); v7 = v5; if ( (v6[27] & 0x20000) == 0 ) goto LABEL_62; if ( v3->state != 0 ) goto LABEL_62; v8 = v6[1]; if ( v8 > v3->buf_len ) goto LABEL_62; alg = v3->alg; v9 = v3->alg - SYM; if ( v3->alg == SYM ) goto LABEL_56; if ( (signed int)v3->alg > SYM ) { v17 = v9 - SYM; if ( v9 == SYM ) { ctx = v3->ctx; if ( v8 <= 0xD0 ) { memcpy((void *)v3->ctx, v6 + 28, v8); v23 = *(_DWORD *)(ctx + 4); goto LABEL_85; } goto LABEL_62; } if ( v9 <= SYM ) { v18 = v9 - SYM; if ( v9 != SYM ) { if ( v9 > SYM ) { if ( v18 + SYM != 0 ) { if ( v18 + SYM == 2305 ) { if ( (v6[22] != SYM + 1 || v3->f08 == 3) && v6[23] <= v3->max_len ) { memcpy_thunk(v3->ctx); v23 = *(_DWORD *)(*(_DWORD *)(v7 + 4) + 92); goto LABEL_85; } goto LABEL_62; } if ( v18 + SYM != 4096 && v18 + SYM != 0x2000 ) goto LABEL_61; } } else { v19 = v9 + SYM; if ( v9 + SYM != 0 && v19 != 0x100000 && v19 != 0x200000 && v19 != 3145728 ) goto LABEL_61; } } LABEL_56: if ( (v6[22] != SYM || (f08 = v3->f08) == 3 || f08 == 0) && v6[23] <= v3->max_len ) { memcpy((void *)v3->ctx, v6 + 28, v8); v23 = *(_DWORD *)(*(_DWORD *)(v7 + 4) + 116); goto LABEL_85; } goto LABEL_62; } v20 = v17 - SYM; if ( v17 == SYM ) goto LABEL_56; if ( v17 > SYM ) { v16 = SYM; if ( v20 + SYM == 0 ) goto LABEL_56; v15 = v20 + SYM + SYM; if ( v15 == 0 ) goto LABEL_56; } else { v15 = v17 - 2030; if ( v15 == 0 || v15 == 4096 || v15 == 0x2000 ) goto LABEL_56; v16 = SYM; } LABEL_55: if ( v15 + v16 != 0 ) goto LABEL_61; goto LABEL_56; } v10 = alg - SYM; if ( alg == SYM ) goto LABEL_28; if ( alg > SYM ) { v14 = v10 - 1550; if ( v10 == 1550 ) { v22 = (void *)v3->ctx; if ( v8 <= 0x20 ) goto LABEL_82; goto LABEL_62; } if ( v10 <= 1550 ) { if ( v10 != 1 && v10 != 2 && v10 != 3 && v10 != 4 ) goto LABEL_61; LABEL_28: v26 = (_DWORD *)v3->ctx; v27 = alg_params_for_curve(a1, v26, alg, (unsigned int)(v6 + 28), v6[1]); v2 = v27; if ( v27 == 0 ) { v3->key_bits = 8 * v26[81]; return v2; } goto LABEL_62; } v15 = v14 + SYM; if ( v14 + SYM == 0 || v15 == 256 ) goto LABEL_64; v16 = SYM; goto LABEL_55; } v11 = alg - SYM; if ( alg == SYM ) goto LABEL_64; if ( alg > SYM ) { if ( v11 == 1 || v11 == 3 || v11 == 256 || v11 == 512 ) goto LABEL_64; LABEL_61: v2 = SYM + 10; goto LABEL_62; } v12 = alg + SYM; if ( v12 == 0 ) { v24 = (_DWORD *)v3->ctx; memcpy(v24, v6 + 28, v8); v25 = v24[257]; LABEL_70: v23 = 8 * v25; LABEL_85: v3->key_bits = v23; return 0; } v13 = v12 + 1879048226; if ( v13 >= 2 && v13 != 3 ) goto LABEL_61; LABEL_64: v21 = v6[22]; if ( (v21 == SYM - 32 || v21 == SYM - 31 || v21 == SYM - 29) && v6[23] <= v3->max_len ) { v22 = (void *)v3->ctx; LABEL_82: memcpy(v22, v6 + 28, v8); v25 = *(_DWORD *)(*(_DWORD *)(v7 + 4) + 4); goto LABEL_70; } LABEL_62: require_capability(v2); return v2; }", "gp_object_enumerate": "int __fastcall gp_object_enumerate(_DWORD *a0, int a1, unsigned int a2) { int v3; unsigned int v4; unsigned int v5; unsigned int v6; int v7; int v8; int v9; int v10; int v11; unsigned int v12; unsigned int v13; unsigned int v14; int v15; _BYTE *v16; _BYTE *v17; int v18; int v19; _DWORD *v20; int v21; int v22; int v23; int v24; unsigned int object_by_uuid; unsigned int *v25; int v26; int v27; _DWORD v28[8]; unsigned __int8 v29[4]; v28[6] = a0; v28[7] = a1; *(_DWORD *)v29 = a2; v27 = *(_DWORD *)SYM; v28[4] = v27; v3 = 0; v24 = 0; object_by_uuid = -1; v4 = 0; v26 = 0; if ( *(_DWORD *)(a1 + 8) != 0 && *(_DWORD *)(a1 + 12) != 0 ) { v4 = *(_DWORD *)(a1 + 12); v26 = *(_DWORD *)(a1 + 8); } v25 = *(unsigned int **)a1; v5 = *(_DWORD *)(a1 + 4); v6 = a0[15]; if ( v4 <= 0x2000 ) { if ( v25 == nullptr || v5 == 0 || v5 > 0x40 || a0[14] != 1 ) fatal_error(SYM); v8 = session_key_fetch((int)v28, 0x10u, *(unsigned int *)v29); if ( v8 != 0 ) fatal_error(v8); object_by_uuid = find_object_by_uuid(v25, v5, *(int *)v29); v7 = object_find_by_type(object_by_uuid, v6, &v24, *(int *)v29); if ( v7 == 0 ) { v9 = 112; if ( a0[16] != 0 ) { v3 = object_from_handle(a0[16], nullptr, *(int *)v29); v10 = object_usage_check(v3); if ( v10 != 0 ) fatal_error(v10); v11 = 0; v9 = *(_DWORD *)(*(_DWORD *)(v3 + 4) + 4) + 112; } else { v11 = 1; } v12 = v9 + v4; v7 = object_slot_reserve((int)v25, v5, (int *)&object_by_uuid, v6, v29[0]); if ( v7 == 0 ) { v13 = handle_to_index(v24); v14 = object_by_uuid; *(_DWORD *)(SYM + 16 * v13 + 12) = object_by_uuid; v15 = SYM + 8 * v14; v16 = heap_alloc(v12, 0, *(int *)v29); v17 = v16; if ( v16 != nullptr ) { *(_DWORD *)(v15 + 4) = v16; v18 = (int)(v16 + 112); if ( v11 != 0 ) { *((_DWORD *)v16 + 1) = 0; *((_DWORD *)v16 + 22) = SYM; } else { *((_DWORD *)v16 + 1) = *(_DWORD *)(*(_DWORD *)(v3 + 4) + 4); memcpy(v16 + 88, (const void *)(*(_DWORD *)(v3 + 4) + 88), 0x18u); memcpy(v17 + 112, (const void *)(*(_DWORD *)(v3 + 4) + 112), *(_DWORD *)(*(_DWORD *)(v3 + 4) + 4)); v18 += *((_DWORD *)v17 + 1); } *v17 = 1; v17[1] = v5; *((_DWORD *)v17 + 26) = v4; *((_DWORD *)v17 + 27) |= 0x10000u; memcpy_thunk((int)(v17 + 8)); v20 = v17 + 72; v21 = v28[1]; v22 = v28[2]; v23 = v28[3]; *v20 = v28[0]; v20[1] = v21; v20[2] = v22; v20[3] = v23; if ( v4 != 0 ) memcpy_thunk(v18); v7 = object_persist_store(*(_DWORD *)(v15 + 4)); if ( v7 == 0 ) goto LABEL_29; } else { v19 = SYM; *(_BYTE *)v15 = 0; v7 = v19 + 6; } } } object_slot_wipe(object_by_uuid, *(int *)v29); object_slot_release(v24); v24 = 0; LABEL_29: a0[17] = v24; return v7; } return SYM; }", "gp_asym_op_with_attrs": "void __fastcall gp_asym_op_with_attrs(int a0, __int64 *a1, int a2) { int v3; gp_session_t *v4; int v5; unsigned int ctx; void *v6; __int64 v7; unsigned int v8; unsigned int v9; int v10; unsigned int v11; _DWORD *v12; unsigned int v13[3]; unsigned int n; _BYTE dst[256]; int v14; v14 = *(_DWORD *)SYM; v3 = SYM; bzero_core(dst, 0x100u); v4 = session_from_handle(*(_DWORD *)(a0 + 56), a2); v5 = object_from_handle(*(_DWORD *)(a0 + 60), nullptr, a2); ctx = v4->ctx; v6 = (void *)(*(_DWORD *)(v5 + 4) + 112); v7 = *a1; udiv_select_shift(*((_DWORD *)a1 + 1), 0xCu); v9 = v8; if ( v8 <= 1 ) { memcpy(v13, (const void *)v7, 12 * v8); if ( v4->op_class == 8 && v4->key_bits != 0 && v4->f08 == 6 ) { v10 = *(_DWORD *)(v5 + 4); if ( *(_DWORD *)(ctx + 1028) <= *(_DWORD *)(v10 + 96) >> 3 && (*(_DWORD *)(v10 + 108) & 0x30000) == 0 ) { v3 = bn_to_bytes_be((int)dst, 0x100u, SYM, &n, v13, v9, 2); if ( v3 == 0 ) { if ( v4->alg + SYM != 0 ) { v3 = SYM + 10; } else { buf_reverse_inplace(dst, n); v3 = rsa_modexp( ctx + 256, *(_DWORD *)(ctx + 1028), ctx + 512, *(_DWORD *)(ctx + 1032), (int)dst, n, (int)v6, 0); if ( v3 == 0 ) { v11 = *(_DWORD *)(ctx + 1028); v12 = (_DWORD *)(ctx + 1028); buf_reverse_inplace(v6, v11); *(_DWORD *)(*(_DWORD *)(v5 + 4) + 92) = 8 * *v12; *(_DWORD *)(*(_DWORD *)(v5 + 4) + 4) = *v12; *(_DWORD *)(*(_DWORD *)(v5 + 4) + 108) |= 0x20000u; return; } } } } } } require_capability(v3); }", "gp_crypto_dispatch": "int __fastcall gp_crypto_dispatch(rpc_frame_t *frame, unsigned int client, int a0, int a1) { int v2; int v3; unsigned __int64 *param; unsigned int i; int v4; int *v5; int binary; int v6; unsigned int v7; v7 = client; v2 = SYM; v3 = 0; param = frame->param; for ( i = 0; i < 4; ++i ) { if ( LODWORD(param[i]) != 0 ) { v4 = param_slot_lookup(frame->opcode, i); if ( v4 == 0 ) return v2; v7 = v4; if ( validate_client_range(param[i], HIDWORD(param[i]), 2, client) == 0 ) return v2; } } v5 = (int *)&frame->f18[4]; switch ( frame->opcode ) { case 1u: binary = gp_operation_allocate((int)frame, client, a0, a1); goto LABEL_12; case 2u: gp_operation_free(v5, client); return v3; case 3u: binary = gp_set_operation_key(v5, client); goto LABEL_12; case 4u: gp_operation_reset(v5, client); return v3; case 5u: gp_operation_set_key((int)frame, (__int64 *)param, client); return v3; case 6u: v6 = 0; goto LABEL_17; case 7u: v6 = 1; LABEL_17: binary = gp_cipher_update((int)frame, (int)param, client, v6); goto LABEL_12; case 8u: case 9u: binary = gp_digest_do_final((int)frame, param, client); goto LABEL_12; case 0xAu: case 0xBu: binary = gp_asym_sign_verify((int)frame, (int)param, client); goto LABEL_12; case 0xCu: binary = gp_mac_compute_final((int)frame, (__int64 *)param, client); goto LABEL_12; case 0xDu: binary = gp_mac_update((int)frame, (__int64 *)param, client); goto LABEL_12; case 0xEu: gp_mac_or_digest_init((int)frame, (int)param, client); return v3; case 0xFu: gp_mac_init_with_iv((int)frame, (__int64 *)param, client); return v3; case 0x10u: case 0x11u: gp_cipher_do_final((int)frame, (int *)param, client); return v3; case 0x30u: binary = gp_object_allocate(v5, client); goto LABEL_12; case 0x31u: gp_object_free(frame->f18[4], client); return v3; case 0x32u: gp_object_reset_attributes(v5, client); return v3; case 0x33u: gp_object_populate_attrs((int)frame, (__int64 *)param, client, 2); return v3; case 0x34u: binary = gp_object_set_attributes((int)frame, (__int64 *)param, client, 0); goto LABEL_12; case 0x35u: gp_generate_random((int)frame, (int)param); return v3; case 0x36u: gp_object_info_short((int)frame, (__int64 *)param, client); return v3; case 0x37u: gp_operation_copy_state(v5, client); return v3; case 0x38u: gp_marshal_params((int *)frame, (__int64 *)param, client); return v3; case 0x39u: gp_asym_op_with_attrs((int)frame, (__int64 *)param, client); return v3; case 0x3Au: gp_get_object_info((int)frame, (__int64 *)param, client, a1); return v3; case 0x3Bu: gp_object_restrict_usage(v5, client); return v3; case 0x40u: require_capability(frame->f18[4]); return v3; case 0x41u: binary = task_yield(); goto LABEL_12; case 0x42u: gp_get_system_time(v5); return v3; case 0x43u: binary = gp_prop_format_value( client, frame->f18[4], 0, *(_DWORD *)param, *((_DWORD *)param + 1), *((char **)param + 2), (unsigned int *)param + 3); goto LABEL_12; case 0x44u: binary = gp_prop_get_binary((int)frame, (int *)param, client); goto LABEL_12; case 0x45u: binary = gp_prop_get_bool((int)frame, (int *)param, client); goto LABEL_12; case 0x46u: binary = gp_prop_get_u32(client, frame->f18[4], 0, *(_DWORD *)param, *((_DWORD *)param + 1), &frame->f18[5]); goto LABEL_12; case 0x47u: binary = gp_prop_get_uuid((int)frame, (int *)param, client); goto LABEL_12; case 0x48u: binary = gp_prop_get_identity((int)frame, (int *)param, client); goto LABEL_12; case 0x50u: binary = ret_zero_7(); goto LABEL_12; case 0x51u: nop_hook_gp1(); return v3; case 0x52u: nop_hook_gp2(); return v3; case 0x53u: log_register_source(*param, frame->f18[4], client, v7); return v3; case 0x54u: binary = gp_object_create_persistent((int)v5, client); goto LABEL_12; case 0x55u: binary = gp_object_delete_persistent(v5, client); goto LABEL_12; case 0x56u: binary = gp_object_open_persistent(v5, client); goto LABEL_12; case 0x57u: binary = gp_object_enumerate(frame, (int)param, client); goto LABEL_12; case 0x58u: gp_object_close(frame->f18[4], client); return v3; case 0x59u: gp_object_close_and_delete(frame->f18[4], client, a0, a1); return v3; case 0x5Au: binary = gp_object_lookup_or_create((int)frame, (int)param, client); goto LABEL_12; case 0x5Bu: binary = gp_object_read_data((int)frame, (__int64 *)param, client, a1); goto LABEL_12; case 0x5Cu: binary = gp_object_write_data((int)frame, (__int64 *)param, client, a1); goto LABEL_12; case 0x5Du: binary = gp_object_truncate((int)frame, (int)param, client, a1); goto LABEL_12; case 0x5Eu: binary = gp_object_seek((int)frame, (int)param, client, a1); LABEL_12: v3 = binary; break; default: v3 = SYM - 6; break; } return v3; }", "log_register_source": "__int64 __fastcall log_register_source(__int64 a0, int a1, int a2, int a3) { unsigned int v4; unsigned int v5; unsigned int i; unsigned __int8 *v6; int v7; unsigned int v8; unsigned int v9; unsigned int v10; unsigned int v11; v4 = HIDWORD(a0); __asm { SVC 0x5E ; '^' } log_set_source_name(a1, (int *)a0, a2); if ( v4 <= 0x100 && v4 != 0 && *(_BYTE *)(a0 + v4 - 1) == 0 ) { v5 = (unsigned int)strlen((char *)a0); if ( v5 > 0xFF ) v5 = 255; for ( i = 0; i < 0x10; ++i ) { v6 = (unsigned __int8 *)(SYM + 8 * i); v7 = *((_DWORD *)v6 + 1); if ( v7 == 0 ) break; if ( *v6 == a2 ) { v9 = *(_DWORD *)(v7 + 12); v8 = *(_DWORD *)(v7 + 8); v10 = v8; if ( v9 >= 0x7F ) { if ( v8 >= 0x7F ) v8 = 0; v9 = v8; } v11 = v9 + 1; if ( v9 + 1 >= 0x7F ) v11 = 0; if ( v10 != v11 ) goto LABEL_17; __asm { SVC 0x56 ; 'V' } if ( *(_DWORD *)(*((_DWORD *)v6 + 1) + 8) != v11 ) { LABEL_17: memcpy_thunk((v9 << 8) + 256 + *((_DWORD *)v6 + 1)); *(_BYTE *)(*((_DWORD *)v6 + 1) + (v9 << 8) + v5 + 256) = 0; *(_DWORD *)(*((_DWORD *)v6 + 1) + 12) = v11; } } } } __asm { SVC 0x5F ; '_' } return a0; }", "nop_hook_gp1": "void __fastcall nop_hook_gp1() { ; }", "ret_zero_7": "int __fastcall ret_zero_7() { return 0; }", "nop_hook_gp2": "void __fastcall nop_hook_gp2() { ; }", "gp_object_free": "unsigned int __fastcall gp_object_free(unsigned int result, int a0) { unsigned int v1; unsigned int v2; int v3; v1 = result; if ( result != 0 ) { v2 = handle_to_index(result); if ( v2 == -1 ) fatal_error(SYM); v3 = SYM + 16 * v2; if ( *(_BYTE *)v3 == 0 || *(unsigned __int8 *)(v3 + 1) != a0 ) fatal_error(SYM); object_slot_wipe(*(_DWORD *)(v3 + 12), a0); return object_slot_release(v1); } return result; }", "gp_object_set_attributes": "int __fastcall gp_object_set_attributes(int a0, __int64 *a1, int a2, int a3) { int v4; int v5; __int64 v6; unsigned int v7; unsigned int v8; _DWORD *v9; unsigned int v10; int v11; int v12; int v13; int v14; v4 = SYM; v5 = object_from_handle(*(_DWORD *)(a0 + 56), nullptr, a2); v6 = *a1; udiv_select_shift(*((_DWORD *)a1 + 1), 0xCu); v8 = v7; v9 = *(_DWORD **)(v5 + 4); v10 = *(_DWORD *)(a0 + 60); if ( (v9[27] & 0x30000) != 0 || v9[24] < v10 ) goto LABEL_31; v11 = v9[22]; v12 = SYM; v4 = SYM + 10; if ( v11 == SYM ) goto LABEL_18; if ( v11 <= SYM ) { switch ( v11 - SYM ) { case -5: goto LABEL_17; case -4: case -3: case -2: case -1: goto LABEL_18; default: goto LABEL_31; } } if ( v11 == SYM ) { if ( v10 != 256 && v10 != 512 && v10 != 768 && v10 != 1024 && v10 != 1536 && v10 != 2048 && v10 != 3072 && v10 != 4096 ) { goto LABEL_31; } v14 = object_attr_store(v5, v10, a2, a3); } else { if ( v11 <= SYM ) { v12 = v11 - SYM + 16777258; if ( v11 - SYM != -16777258 ) { if ( v11 - SYM == -16777248 && (v10 == 128 || v10 == 192 || v10 == 256) ) goto LABEL_17; goto LABEL_31; } LABEL_18: if ( v10 <= 0x400 ) { LABEL_17: v14 = random_fill_object(v5, v10, v12, v8); goto LABEL_29; } LABEL_31: require_capability(v4); return v4; } v13 = v11 + SYM; if ( v13 != 0 ) { if ( v13 == 15 ) { v14 = attr_unpack_4(v5, v10, (int *)v6, v8); goto LABEL_29; } goto LABEL_31; } v14 = attr_pack_4(v5, v10, (int *)v6, v8); } LABEL_29: v4 = v14; if ( v14 == 0 ) { *(_DWORD *)(*(_DWORD *)(v5 + 4) + 108) |= 0x20000u; return v4; } if ( v14 != -65530 ) goto LABEL_31; return v4; }", "gp_generate_random": "int __fastcall gp_generate_random(int a0, int a1) { int v2; int v3; return rand_fill_bytes(*(_BYTE **)a1, *(_DWORD *)(a1 + 4), v2, v3); }", "gp_marshal_params": "int __fastcall gp_marshal_params(int *a0, __int64 *a1, int a2) { int v3; int v4; __int64 v5; int v6; int v7; int v8; int v9; int v10; int v11; int v12; int v13; _DWORD *v14; int v15; int v16; int v17; unsigned int v18; _DWORD *v19; int v20; int v21; int v22; bool v23; int v24; int v25; unsigned int v26; _DWORD v27[9]; v3 = SYM; v4 = object_from_handle(a0[14], nullptr, a2); v5 = *a1; v26 = *((_DWORD *)a1 + 1); v6 = *(_DWORD *)(v4 + 4); if ( (*(_DWORD *)(v6 + 108) & 0x20000) == 0 ) goto LABEL_83; if ( a0[16] == 2 ) { if ( (a0[15] & 0x20000000) == 0 ) goto LABEL_83; } else if ( (a0[15] & 0x20000000) != 0 ) { goto LABEL_83; } v7 = a0[15]; if ( (v7 & 0x10000000) == 0 && *(unsigned __int8 *)(v6 + 100) << 31 == 0 ) goto LABEL_83; v8 = *(_DWORD *)(v6 + 88); v9 = SYM; v10 = SYM + 8; if ( v8 == SYM ) goto LABEL_22; if ( v8 > SYM ) { v11 = v8 - (SYM + 33); if ( v11 == 0 ) goto LABEL_69; if ( v8 <= SYM + 33 ) { if ( v11 == -32 || v11 == -30 ) goto LABEL_22; if ( v11 == -1 ) goto LABEL_25; LABEL_83: require_capability(v3); return v3; } v12 = v8 + SYM; switch ( v12 ) { case 0: LABEL_25: v14 = (_DWORD *)(v6 + 112); if ( rsa_key_get_components(v6 + 112, (int)v27) != 0 ) return v9; v3 = v10; v15 = a0[15]; v16 = v15 - SYM; if ( v15 == SYM ) { if ( *v14 == 0 ) return v3; v19 = (_DWORD *)v27[6]; v18 = v14[1] >> 4; } else if ( v15 > SYM ) { if ( v15 + SYM != 0 ) { v17 = v15 + SYM + SYM; if ( v17 != 0 ) { if ( v17 != 256 ) return v3; v18 = v14[3]; v19 = (_DWORD *)v27[0]; } else { v19 = (_DWORD *)v27[1]; v18 = v14[1] >> 3; } } else { if ( *v14 == 0 ) return v3; v19 = (_DWORD *)v27[7]; v18 = v14[1] >> 4; } } else { switch ( v16 ) { case -1024: v19 = (_DWORD *)v27[2]; v18 = v14[1] >> 3; break; case -768: if ( *v14 == 0 ) return v3; v19 = (_DWORD *)v27[3]; v18 = v14[1] >> 4; break; case -512: if ( *v14 == 0 ) return v3; v19 = (_DWORD *)v27[4]; v18 = v14[1] >> 4; break; default: if ( v16 != -256 || *v14 == 0 ) return v3; v19 = (_DWORD *)v27[5]; v18 = v14[1] >> 4; break; } } break; case 1: LABEL_69: v19 = (_DWORD *)(v6 + 112); v3 = SYM + 8; v25 = v7 - SYM; if ( v7 != SYM ) { if ( v7 <= SYM ) { if ( v25 + SYM != 0 ) { if ( v25 + SYM + SYM != 0 ) return v3; v13 = copy_maybe_reverse(v5, &v26, (int)(v19 + 69), 0x80u, 1); } else { v13 = copy_maybe_reverse(v5, &v26, (int)(v19 + 101), 0x80u, 1); } goto LABEL_80; } if ( v7 + SYM != 0 ) { if ( v7 + SYM != 256 ) return v3; v13 = copy_maybe_reverse(v5, &v26, (int)(v19 + 37), 0x80u, 1); goto LABEL_80; } v18 = 20; v20 = v5; v19 += 32; LABEL_79: v13 = copy_maybe_reverse(v20, &v26, (int)v19, v18, 1); goto LABEL_80; } v18 = 128; break; case 2: v19 = (_DWORD *)(v6 + 112); v21 = v7 - SYM; if ( v7 == SYM ) { v3 = SYM + 10; goto LABEL_83; } if ( v7 <= SYM ) { if ( v21 + SYM == 0 ) { v13 = copy_maybe_reverse(v5, &v26, (int)(v19 + 128), v19[258], 1); goto LABEL_80; } v22 = v21 + SYM + SYM; if ( v22 == 0 ) { v13 = copy_maybe_reverse(v5, &v26, (int)(v19 + 192), v19[257], 1); goto LABEL_80; } v23 = v22 == 3840; goto LABEL_58; } v24 = v7 + SYM; if ( v7 + SYM != 0 ) { v23 = v24 + SYM == 0; if ( v24 + SYM == 0 ) { a0[17] = 8 * v19[258]; v3 = 0; LABEL_86: *((_DWORD *)a1 + 1) = v26; return v3; } LABEL_58: if ( !v23 ) return SYM + 8; v13 = copy_maybe_reverse(v5, &v26, (int)(v19 + 64), v19[257], 1); goto LABEL_80; } v18 = v19[256]; break; default: goto LABEL_83; } v20 = v5; goto LABEL_79; } if ( (unsigned int)(v8 - SYM + 16) > 6 ) goto LABEL_83; LABEL_22: if ( v7 != -1073741824 ) return SYM + 8; v13 = copy_maybe_reverse(v5, &v26, v6 + 112, *(_DWORD *)(v6 + 4), 0); LABEL_80: v3 = v13; if ( v13 == 0 ) goto LABEL_86; if ( v13 != v10 && v13 != v9 ) goto LABEL_83; return v3; }", "gp_get_object_info": "int __fastcall gp_get_object_info(int a0, __int64 *a1, int a2, int a3) { __int64 v4; int v5; int v6; int v7; v7 = a3; v4 = *a1; v5 = SYM; v6 = object_from_handle(*(_DWORD *)(a0 + 56), &v7, a2); if ( HIDWORD(v4) >= 0x1C ) { *(_DWORD *)v4 = *(_DWORD *)(*(_DWORD *)(v6 + 4) + 88); *(_DWORD *)(v4 + 4) = *(_DWORD *)(*(_DWORD *)(v6 + 4) + 92); *(_DWORD *)(v4 + 8) = *(_DWORD *)(*(_DWORD *)(v6 + 4) + 96); *(_DWORD *)(v4 + 12) = *(_DWORD *)(*(_DWORD *)(v6 + 4) + 100); *(_DWORD *)(v4 + 16) = *(_DWORD *)(*(_DWORD *)(v6 + 4) + 104); *(_DWORD *)(v4 + 24) = *(_DWORD *)(*(_DWORD *)(v6 + 4) + 108); *(_DWORD *)(v4 + 20) = *(_DWORD *)(v7 + 8); } require_capability(v5); return v5; }", "gp_object_info_short": "gp_session_t *__fastcall gp_object_info_short(int a0, __int64 *a1, int a2) { __int64 v3; gp_session_t *result; v3 = *a1; result = session_from_handle(*(_DWORD *)(a0 + 56), a2); if ( HIDWORD(v3) == 32 ) return (gp_session_t *)j_memcpy((int *)v3, (int *)result, 0x20u); return result; }", "gp_prop_get_binary": "int __fastcall gp_prop_get_binary(int a0, int *a1, int a2) { int v3; unsigned int v4; int v5; int v6; __int64 v7; char v8; v3 = SYM; v4 = a1[3]; LODWORD(v7) = a1[1]; HIDWORD(v7) = &v8; v5 = gp_prop_lookup(a2, 0, *(_DWORD *)(a0 + 56), *a1, v7); v6 = v5; if ( v5 == 0 ) { v6 = SYM - 3; if ( v8 == 3 ) { if ( v4 < 0xA ) return SYM; a1[3] = 10; } } else if ( v5 == v3 || v5 == SYM ) { return v6; } require_capability(v6); return v6; }", "gp_prop_get_bool": "int __fastcall gp_prop_get_bool(int a0, int *a1, int a2) { int v3; int v4; int v5; char v6; __int64 v7; char v8; char v9; v3 = SYM; LODWORD(v7) = a1[1]; HIDWORD(v7) = &v8; v4 = gp_prop_lookup(a2, 0, *(_DWORD *)(a0 + 56), *a1, v7); v5 = v4; if ( v4 != 0 ) { if ( v4 != v3 && v4 != -65520 ) goto LABEL_4; } else { if ( v8 != 2 ) { v5 = SYM - 3; LABEL_4: require_capability(v5); return v5; } v6 = v9; if ( v9 != 0 ) v6 = 1; *(_BYTE *)(a0 + 60) = v6; } return v5; }", "gp_prop_get_identity": "int __fastcall gp_prop_get_identity(int a0, int *a1, int a2) { int v3; int v4; unsigned int v5; int v6; int v7; _BYTE v8[4]; v3 = SYM; v4 = a1[2]; v5 = a1[3]; v6 = gp_prop_lookup(a2, 0, *(_DWORD *)(a0 + 56), *a1, __SPAIR64__(v8, a1[1])); v7 = v6; if ( v6 != 0 ) { if ( v6 != v3 && v6 != SYM ) goto LABEL_4; } else { if ( v8[0] != 5 ) { v7 = SYM - 3; LABEL_4: require_capability(v7); return v7; } if ( v5 >= 0x14 ) memcpy_thunk(v4); else return SYM; } return v7; }", "gp_prop_format_value": "int __fastcall gp_prop_format_value(int a0, int a1, int a2, int a3, unsigned int a4, char *a5, unsigned int *a6) { int v7; unsigned int v8; _BYTE v9[4]; int v10; int v11; unsigned __int16 v12; unsigned __int16 v13; unsigned __int8 v14; unsigned __int8 v15; unsigned __int8 v16; unsigned __int8 v17; unsigned __int8 v18; unsigned __int8 v19; unsigned __int8 v20; unsigned __int8 v21; v7 = gp_prop_lookup(a0, a2, a1, a3, __SPAIR64__(v9, a4)); if ( v7 != 0 ) { if ( v7 != -65528 && v7 != SYM ) LABEL_4: require_capability(v7); } else { switch ( v9[0] ) { case 0: case 3: v8 = v9[1]; break; case 1: v8 = 11; break; case 2: v8 = 6; break; case 4: v8 = 37; break; case 5: v8 = 48; break; default: LABEL_14: v7 = SYM - 10; goto LABEL_4; } if ( *a6 >= v8 ) { switch ( v9[0] ) { case 0: case 3: memcpy_thunk((int)a5); break; case 1: vsnprintf(a5, (int)\"0x%08x\", v10); break; case 2: if ( (_BYTE)v10 != 0 ) strcpy(a5, \"true\"); else strcpy(a5, \"false\"); break; case 4: vsnprintf( a5, (int)\"%08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x\", v10, (unsigned __int16)v11, HIWORD(v11), (unsigned __int8)v12, HIBYTE(v12), (unsigned __int8)v13, HIBYTE(v13), v14, v15, v16, v17); break; case 5: vsnprintf( a5, (int)\"0x%08x:%08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x\", v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21); break; default: goto LABEL_14; } *a6 = v8; } else { return SYM; } } return v7; }", "gp_prop_get_u32": "int __fastcall gp_prop_get_u32(int a0, int a1, int a2, int a3, unsigned int a4, _DWORD *a5) { int v6; int v7; int v8; _BYTE v9[4]; int v10; v6 = SYM; v7 = gp_prop_lookup(a0, a2, a1, a3, __SPAIR64__(v9, a4)); v8 = v7; if ( v7 == 0 ) { if ( v9[0] == 1 ) { *a5 = v10; return v8; } v8 = SYM - 3; } else if ( v7 == v6 || v7 == -65520 ) { return v8; } require_capability(v8); return v8; }", "gp_prop_get_uuid": "int __fastcall gp_prop_get_uuid(int a0, int *a1, int a2) { int v3; int v4; unsigned int v5; int v6; int v7; _BYTE v8[4]; v3 = SYM; v4 = a1[2]; v5 = a1[3]; v6 = gp_prop_lookup(a2, 0, *(_DWORD *)(a0 + 56), *a1, __SPAIR64__(v8, a1[1])); v7 = v6; if ( v6 != 0 ) { if ( v6 != v3 && v6 != SYM ) goto LABEL_4; } else { if ( v8[0] != 4 ) { v7 = SYM - 3; LABEL_4: require_capability(v7); return v7; } if ( v5 >= 0x10 ) memcpy_thunk(v4); else return SYM; } return v7; }", "gp_get_system_time": "int __fastcall gp_get_system_time(int *a0) { unsigned __int64 hw_counter_us; unsigned __int64 v1; int v2; int v3; int result; int savedregs; int savedregsa; hw_counter_us = read_hw_counter_us(); LODWORD(v1) = udivmod64(hw_counter_us, 0x3E8u, 0, savedregs); v2 = v1; v3 = udivmod64(v1, 0x3E8u, 0, savedregsa); *a0 = v3; result = v2 - 1000 * v3; a0[1] = result; return result; }", "gp_object_open_persistent": "int __fastcall gp_object_open_persistent(int *a0, int a1) { int result; int v2; int v3; LOBYTE(v2) = -1; if ( *SYM == 0 ) return SYM; result = persist_handle_lookup(*a0, &v3, &v2, a1); if ( result == 0 ) return task_spawn_worker((unsigned __int8)v2, 3, a0[2], a0[1], &v3, a0[3], a0 + 4, a0 + 12); return result; }", "gp_object_lookup_or_create": "int __fastcall gp_object_lookup_or_create(int a0, int a1, unsigned int a2) { unsigned int v3; unsigned int v4; int v5; int v6; int v7; int v8; unsigned int v9; _BYTE *v10; int v11; unsigned int object_by_uuid; int v12; unsigned int *v13; unsigned int v14; unsigned int v15[6]; v15[4] = *(_DWORD *)SYM; object_by_uuid = -1; v12 = 0; v13 = *(unsigned int **)a1; v3 = *(_DWORD *)(a1 + 4); v4 = *(_DWORD *)(a0 + 60); object_by_uuid = find_object_by_uuid(v13, v3, a2); if ( object_by_uuid != -1 ) goto LABEL_13; v5 = session_key_fetch((int)v15, 0x10u, a2); if ( v5 != 0 ) fatal_error(v5); v6 = persist_find_by_uuid(v13, v3, v15); if ( v6 == -1 ) { v7 = SYM; goto LABEL_14; } v7 = svc_queue_entry_get(v6, &v14); if ( v7 != 0 ) goto LABEL_14; v8 = object_slot_reserve((int)v13, v3, (int *)&object_by_uuid, v4, a2); v7 = v8; if ( v8 == 0 ) { v9 = SYM + 8 * object_by_uuid; v10 = heap_alloc(v14, 0, a2); if ( v10 == nullptr ) { v7 = SYM + 4; goto LABEL_14; } *(_DWORD *)(v9 + 4) = v10; v7 = svc_queue_submit(v6, (int)v10, v14); if ( v7 == 0 ) { LABEL_13: v7 = object_find_by_type(object_by_uuid, v4, &v12, a2); if ( v7 == 0 ) { v11 = v12; goto LABEL_15; } } } LABEL_14: object_slot_wipe(object_by_uuid, a2); object_slot_release(v12); v11 = 0; v12 = 0; LABEL_15: *(_DWORD *)(a0 + 64) = v11; return v7; }", "gp_object_create_persistent": "int __fastcall gp_object_create_persistent(int a0, int a1) { int v2; int v3; int v4; char v5; v4 = -1; v3 = 0; v5 = -1; if ( *SYM != 0 ) { __asm { SVC 0x9B } if ( a0 != 0 ) { v2 = SYM; } else { v2 = worker_ctx_init(&v4, v5, a1); if ( v2 == 0 ) { v2 = task_spawn_worker((unsigned __int8)v5, 1, 0, MEMORY[0x10], &v3, MEMORY[0x14], (int *)0x18, (int *)0x3C); if ( v2 == 0 ) { persist_slot_addr(v4, v3, a1); MEMORY[0x38] = v4; return v2; } } } } else { v2 = SYM + 1; } persist_handle_release(v4, a1); return v2; }", "gp_object_populate_attrs": "int __fastcall gp_object_populate_attrs(int a0, __int64 *a1, int a2, int a3) { int v4; int v5; __int64 v6; unsigned int v7; unsigned int v8; int v9; int v10; int v11; int v12; int v13; v4 = SYM; v5 = object_from_handle(*(_DWORD *)(a0 + 56), nullptr, a2); v6 = *a1; udiv_select_shift(*((_DWORD *)a1 + 1), 0xCu); v8 = v7; v9 = *(_DWORD *)(v5 + 4); if ( (*(_DWORD *)(v9 + 108) & 0x30000) != 0 ) goto LABEL_19; v10 = *(_DWORD *)(v9 + 88); if ( v10 == SYM ) { LABEL_15: v13 = attr_marshal(v5, (__int64 *)v6, v8, a3); goto LABEL_17; } if ( v10 <= SYM ) { switch ( v10 - SYM ) { case -19: case -18: case -17: case -16: case -15: case -14: case -13: case -3: case -2: goto LABEL_15; default: goto LABEL_14; } } v11 = v10 - SYM; if ( v10 == SYM ) goto LABEL_16; if ( v10 <= SYM ) { if ( v11 != -16777216 ) { v12 = v11 + 0xFFFFFF; if ( v11 == -16777215 ) goto LABEL_22; goto LABEL_12; } LABEL_16: v13 = attr_list_copy(v5, (int *)v6, v8, a3); goto LABEL_17; } v12 = v10 + ~SYM; if ( v12 == 0 ) { LABEL_22: v13 = attr_copy_5(v5, (int *)v6, v8, a3); goto LABEL_17; } if ( v12 == 1 ) { v13 = attr_copy_4_alt(v5, (int *)v6, v8, a3); goto LABEL_17; } LABEL_12: if ( v12 != 16 && v12 != 17 ) { LABEL_14: v4 = SYM + 10; LABEL_19: require_capability(v4); return v4; } v13 = attr_copy_4(v5, (int *)v6, v8, a3); LABEL_17: v4 = v13; if ( v13 == 0 ) { *(_DWORD *)(*(_DWORD *)(v5 + 4) + 108) |= 0x20000u; return v4; } if ( v13 != -65530 ) goto LABEL_19; return v4; }", "gp_object_read_data": "int __fastcall gp_object_read_data(int a0, __int64 *a1, int a2, int a3) { __int64 v4; int v5; unsigned int v6; unsigned int v7; unsigned int v8; int v9; v9 = a3; v4 = *a1; v5 = *(_DWORD *)(object_from_handle(*(_DWORD *)(a0 + 56), &v9, a2) + 4); if ( (*(_DWORD *)(v5 + 108) & 0x10000) == 0 || (*(_BYTE *)(v9 + 4) & 0x11) == 0 ) fatal_error(SYM); v6 = *(_DWORD *)(v9 + 8); v7 = *(_DWORD *)(v5 + 104); if ( v6 < v7 ) { v8 = v7 - v6; if ( HIDWORD(v4) < v7 - v6 ) v8 = HIDWORD(v4); memcpy_thunk(v4); *(_DWORD *)(v9 + 8) += v8; *(_DWORD *)(a0 + 60) = v8; } else { *(_DWORD *)(a0 + 60) = 0; } return 0; }", "gp_object_reset_attributes": "int __fastcall gp_object_reset_attributes(int *a0, int a1) { int result; int v2; unsigned int *v3; result = *a0; if ( result != 0 ) { v2 = object_from_handle(result, nullptr, a1); v3 = *(unsigned int **)(v2 + 4); if ( (v3[27] & 0x20000) != 0 ) { bzero_core(v3 + 28, v3[1]); *(_DWORD *)(*(_DWORD *)(v2 + 4) + 4) = 0; } *(_DWORD *)(*(_DWORD *)(v2 + 4) + 108) = 0; *(_DWORD *)(*(_DWORD *)(v2 + 4) + 100) = -1; return -1; } return result; }", "gp_object_restrict_usage": "int __fastcall gp_object_restrict_usage(int *a0, int a1) { int v2; int v3; v2 = SYM; v3 = object_from_handle(*a0, nullptr, a1); *(_DWORD *)(*(_DWORD *)(v3 + 4) + 100) &= a0[1]; require_capability(v2); return v2; }", "gp_object_seek": "int __fastcall gp_object_seek(int a0, int a1, int a2, int a3) { int v4; int v5; __int64 v6; unsigned int v7; unsigned int v8; int v9; v9 = a3; v4 = *(_DWORD *)(a0 + 56); v5 = SYM; v6 = *(_QWORD *)(a0 + 68); if ( (int)v6 < 0 ) LODWORD(v6) = -(int)v6; v7 = *(_DWORD *)(*(_DWORD *)(object_from_handle(v4, &v9, a2) + 4) + 104); v8 = *(_DWORD *)(v9 + 8); if ( *(int *)(a0 + 68) < 0 ) { if ( HIDWORD(v6) != 0 ) { if ( HIDWORD(v6) == 1 ) { if ( v8 > (unsigned int)v6 ) { LODWORD(v6) = v8 - v6; LABEL_21: *(_DWORD *)(v9 + 8) = v6; return 0; } } else { if ( HIDWORD(v6) != 2 ) return v5; if ( v7 > (unsigned int)v6 ) { LODWORD(v6) = v7 - v6; goto LABEL_21; } } } LODWORD(v6) = 0; goto LABEL_21; } if ( HIDWORD(v6) != 0 ) { if ( HIDWORD(v6) == 1 ) { LODWORD(v6) = v6 + v8; } else { if ( HIDWORD(v6) != 2 ) return v5; LODWORD(v6) = v6 + v7; } } if ( (unsigned int)v6 <= 0x2000 ) goto LABEL_21; return SYM; }", "gp_object_truncate": "int __fastcall gp_object_truncate(int a0, int a1, int a2, int a3) { unsigned int v4; int v5; int v6; int v7; int v8; v8 = a3; v4 = *(_DWORD *)(a0 + 64); if ( v4 > 0x2000 ) return SYM; v5 = object_from_handle(*(_DWORD *)(a0 + 56), &v8, a2); v6 = SYM; v7 = SYM; if ( (*(_DWORD *)(*(_DWORD *)(v5 + 4) + 108) & 0x10000) == 0 || (*(_BYTE *)(v8 + 4) & 0x22) == 0 || ((v7 = object_buffer_grow(v5, v4, a2)) != 0 || (v7 = object_persist_store(*(_DWORD *)(v5 + 4))) != 0) && v7 == v6 ) { fatal_error(v7); } return v7; }", "task_yield": "int __fastcall task_yield() { __asm { SVC 0x56 ; 'V' } return 0; }", "delay_us": "unsigned int __fastcall delay_us(int a0) { unsigned int v1; int hw_counter_us; unsigned int result; v1 = a0 + 1; hw_counter_us = read_hw_counter_us(); do result = read_hw_counter_us() - hw_counter_us; while ( result < v1 ); return result; }", "gp_object_write_data": "int __fastcall gp_object_write_data(int a0, __int64 *a1, int a2, int a3) { __int64 v4; int v5; int v6; int v7; int v8; int v9; bool v10; unsigned int v11; int v12; v12 = a3; v4 = *a1; v5 = object_from_handle(*(_DWORD *)(a0 + 56), &v12, a2); v6 = *(_DWORD *)(v5 + 4); v7 = SYM; v8 = SYM; if ( (*(_DWORD *)(v6 + 108) & 0x10000) == 0 || (*(_BYTE *)(v12 + 4) & 0x22) == 0 ) goto LABEL_12; v9 = *(_DWORD *)(v12 + 8); v10 = __CFADD__(v9, HIDWORD(v4)); v11 = v9 + HIDWORD(v4); if ( v10 ) return SYM; if ( v11 > 0x2000 ) return SYM + 50; if ( *(_DWORD *)(v6 + 104) < v11 && (v8 = object_buffer_grow(v5, v11, a2)) != 0 || (memcpy_thunk(*(_DWORD *)(*(_DWORD *)(v5 + 4) + 4) + *(_DWORD *)(v5 + 4) + 112 + *(_DWORD *)(v12 + 8)), *(_DWORD *)(v12 + 8) += HIDWORD(v4), (v8 = object_persist_store(*(_DWORD *)(v5 + 4))) != 0) ) { if ( v8 == v7 ) LABEL_12: fatal_error(v8); } return v8; }", "upload_feature_table": "int __fastcall upload_feature_table() { int *v0; unsigned int v1; int *v2; int v3; unsigned int v4; _BYTE v5[260]; bzero_core(&v3, 0x108u); v0 = (int *)SYM; v1 = 0; v2 = &(*SYM)[24]; v3 = 4; do { if ( feature_enabled(0, v1 >> 2) && v4 < 0x20 ) { *(_DWORD *)&v5[8 * v4] = v0[v1]; *(_DWORD *)&v5[8 * v4++ + 4] = v2[v1]; } ++v1; } while ( v1 < 0x18 ); __asm { SVC 0xB4 } return 4; }", "log_shutdown": "int __fastcall log_shutdown() { int v0; int v1; int v2; v2 = SYM; *(_BYTE *)SYM = 0; mbox_finalize(0, v2, v0, v1); __asm { SVC 0x7E ; '~' } if ( _ZF ) return 0; else return SYM; }", "log_flush_if_due": "int __fastcall log_flush_if_due() { int v0; int result; unsigned __int64 hw_counter_us; char *v1; unsigned __int64 v2; unsigned __int64 v3; int *v4; int v5; v0 = 14; v5 = 1; result = *((_DWORD *)SYM + 142); if ( result == 3 ) { hw_counter_us = read_hw_counter_us(); v1 = SYM; v2 = hw_counter_us; v3 = hw_counter_us - *((_QWORD *)SYM + 1); result = ((unsigned int)SYM - v3) >> 32; if ( (unsigned int)SYM < v3 ) { v4 = SYM; __asm { SVC 0x5E ; '^' } mbox_state_query(&v5); if ( v5 == 2 ) v0 = mbox_poll_if_ready(); result = *v4; __asm { SVC 0x5F ; '_' } if ( v0 == 0 ) *((_QWORD *)v1 + 1) = v2; } } return result; }", "sysdrv_set_counter": "int __fastcall sysdrv_set_counter(unsigned int *a0) { if ( *SYM[0] == 0 ) return SYM; __asm { SVC 0x5E ; '^' } mbox_dispatch_if_ready(); __asm { SVC 0x5F ; '_' } return SYM + 10; }", "sysdrv_get_counter": "int __fastcall sysdrv_get_counter(int a0) { *(_DWORD *)a0 = 0; mbox_dispatch_if_ready(); return 0; }", "log_ring_update": "int __fastcall log_ring_update(int a0, int a1, int a2, int a3) { int result; int *v4; int v5; int v6; v6 = 0; result = (unsigned __int8)*SYM[0]; if ( *SYM[0] != 0 ) { v4 = SYM; __asm { SVC 0x5E ; '^' } if ( mbox_read_checked(a0, &v6) == 0 ) { v5 = (int)*SYM; *(_DWORD *)(v5 + 168) = v6; *(_DWORD *)(v5 + 164) = *(_DWORD *)(v5 + 164) & 0x3FFFFF00 | 0xC0000000; } __asm { SVC 0x5F ; '_' } return *v4; } return result; }", "log_emit_record": "int __fastcall log_emit_record(int a0, int a1, int a2, int a3) { char *v4; int v5; _DWORD *v6; int v7; unsigned int v8; int v9; int v10; int v11; v10 = a2; v11 = a3; v11 = *(_DWORD *)SYM; v4 = SYM; v5 = SYM; if ( *SYM == 0 ) { rand_fill_bytes(&v10, 2u, a2, a3); v6 = SYM; *((_WORD *)SYM + 5) = v10; __asm { SVC 0x7D ; '}' } *v6 = 1816; v6[1] = SYM; v7 = SYM; *((_WORD *)v6 + 4) = 0x2000; v6[3] = v7; *((_WORD *)v6 + 8) = 0x2000; v8 = *((_DWORD *)SYM + 414); if ( v8 - 1 > 4 ) { *((_DWORD *)v4 + 1) = 3; } else { if ( v8 < 3 ) v8 = 3; *((_DWORD *)v4 + 1) = v8; } v9 = mbox_state_publish((__int64 *)SYM); *v4 = 1; if ( v9 == 0 ) return 0; } return v5; }", "log_set_source_name": "void __fastcall log_set_source_name(int a0, int *a1, int a2) { unsigned int v3; int *v4; unsigned int v5; char *v6; unsigned int n; char dst[32]; _DWORD v7[4]; _DWORD v8[2]; _DWORD v9[6]; v9[5] = *(_DWORD *)SYM; v8[0] = 0; v8[1] = 0; n = 4; bzero_core(dst, 0x20u); memcpy(v9, aAmdTaLogsrcnam, 0x14u); memset(v7, 0, sizeof(v7)); v3 = 3; if ( *SYM != 0 ) { if ( a0 != 4 ) { if ( a0 > 4 ) { if ( a0 == 8 ) { v3 = 4; } else { if ( a0 != 16 ) return; v3 = 5; } } else if ( a0 == 1 ) { v3 = 1; } else { if ( a0 != 2 ) return; v3 = 2; } } if ( v3 >= *((_DWORD *)SYM + 1) ) { if ( a2 != 0 ) { __asm { SVC 0xB9 } __asm { SVC 0xA7 } if ( _ZF ) { v5 = n; v6 = (char *)v7; } else { if ( gp_prop_format_value(a2, -1, (int)v7, (int)v9, 0x12u, dst, &n) != 0 || (v5 = n, n == 0) || n >= 5 ) { v4 = (int *)aUnkn; goto LABEL_21; } v6 = dst; } memcpy(v8, v6, v5); LABEL_24: __asm { SVC 0x5E ; '^' } mbox_send_pair((int)v8, n, v3, a1); __asm { SVC 0x5F ; '_' } if ( _ZF ) log_flush_if_due(); return; } v4 = &SYM; LABEL_21: strcmp_words(v8, v4, 4); goto LABEL_24; } } }", "log_event": "void __fastcall log_event(unsigned int a0, int a1) { char **v2; int v3[11]; v3[10] = *(_DWORD *)SYM; bzero_core(v3, 0x28u); if ( *SYM != 0 && a0 <= 0x10 ) { v2 = SYM; snprintf_varargs(v3, 40, (int)SYM[2 * a0], a1); __asm { SVC 0x5E ; '^' } mbox_send_pair((int)(SYM - 1), 4u, (char)v2[2 * a0 + 1], v3); __asm { SVC 0x5F ; '_' } if ( _ZF ) log_flush_if_due(); } }", "log_entry_write": "int __fastcall log_entry_write(int a0, int a1, int a2, int a3) { int result; _DWORD *v4; int v5; int v6; v6 = a3; result = SYM; if ( *SYM[0] != 0 ) { __asm { SVC 0x5E ; '^' SVC 0x73 ; 's' } if ( *SYM != 0 ) { v4 = (_DWORD *)map_page_and_flush(*SYM + 7569408, 12288, (unsigned int *)&v6); if ( v4 != nullptr ) { v5 = mbox_write_guarded(v4); __asm { SVC 0x63 ; 'c' } } else { v5 = SYM + 12; } } else { v5 = SYM + 6; } __asm { SVC 0x5F ; '_' } return v5; } return result; }", "log_record_emit": "int __fastcall log_record_emit(int a0, unsigned __int8 *a1, int a2, int a3) { int v4; int v5; int v6; unsigned int i; unsigned __int8 v7[4]; int v8; *(_DWORD *)v7 = a2; v8 = a3; v8 = *(_DWORD *)SYM; v4 = 0; *(_DWORD *)v7 = 0; if ( a1 == nullptr || a2 == 0 ) return SYM + 6; v7[0] = BYTE1(a2); v7[1] = a2; v7[2] = *a1; v7[3] = a1[1]; timestamp_record(); v5 = SYM; while ( mbox_post_be24(v7, 0) == 0 ) { if ( (unsigned int)timestamp_elapsed() > 0x4E20 ) { LABEL_20: v4 = v5; *(_DWORD *)(a0 + 12) = 0x4000000; return v4; } __asm { SVC 0x56 ; 'V' } } v6 = 2; timestamp_record(); while ( mbox_post_be24(&a1[v6], 0) == 0 ) { if ( (unsigned int)timestamp_elapsed() > 0x4E20 ) goto LABEL_20; LABEL_13: __asm { SVC 0x56 ; 'V' } } v6 = (unsigned __int16)(v6 + 4); if ( (unsigned int)(a2 - v6) > 4 ) { timestamp_record(); goto LABEL_13; } *(_DWORD *)v7 = 0; for ( i = 0; a2 - v6 > i; ++i ) v7[i] = a1[v6 + i]; timestamp_record(); while ( mbox_post_be24(v7, 1) == 0 ) { if ( (unsigned int)timestamp_elapsed() > 0x4E20 ) goto LABEL_20; __asm { SVC 0x56 ; 'V' } } return v4; }", "ret_err_000A_27": "int __fastcall ret_err_000A_27() { return SYM; }", "boot_done_poll": "int __fastcall boot_done_poll(int a0, int a1, int a2, int a3) { int v4; int v5; int done; char *v6; int v7; const char *v8; unsigned int v9; int v10; int v11; int v12; v11 = a2; v12 = a3; v4 = SYM; v5 = 0; while ( 1 ) { wait_service_ready(); done = sysdrv_boot_done_notify(&v12); if ( (v12 | done) == 0 ) break; done = v4; clear_status_field(); __asm { SVC 0x56 ; 'V' } if ( (unsigned int)++v5 >= 0x64 ) return done; } v6 = SYM; svc_notify_stub(*((_DWORD *)SYM + 10), *((_DWORD *)SYM + 11)); v11 = *((_DWORD *)SYM + 5) | *((_DWORD *)SYM + 4) & v11; reg_write_sized(*((_DWORD *)v6 + 10), *((_DWORD *)v6 + 11), (int)&v11, *((_DWORD *)v6 + 7)); clear_status_field(); if ( done == 0 ) { v7 = 0; done = SYM - 2; while ( 1 ) { __asm { SVC 0x56 ; 'V' } v8 = *((const char **)v6 + 6); if ( *(_DWORD *)v8 == 0 && *((int *)v8 + 1) < 0 ) break; if ( (unsigned int)++v7 >= 0x1388 ) return done; } done = 0; if ( a0 != 0 && *((_DWORD *)v8 + 3) == 0 ) { v9 = *((_DWORD *)v8 + 2); if ( v9 <= *((_DWORD *)v6 + 5) ) { v10 = (unsigned __int8)*((_DWORD *)v8 + 1); if ( checksum8(v9, v8 + 8) != v10 ) done = SYM - 1; *(_DWORD *)(*((_DWORD *)v6 + 6) + 4) &= 0xFFFFFE00; } else { return SYM - 3; } } } return done; }", "evtlog_push": "int __fastcall evtlog_push(int a0, int a1, int a2, int a3) { int v4; unsigned int v5; int v6; const char *v7; unsigned int v8; int v9; char *v10; int v11; int v12; int v13; int *v14; char *v15; _DWORD *v16; int v17; int done; _DWORD *v18; int v19; v19 = a3; v4 = SYM; v5 = 0; if ( *((_DWORD *)SYM + 8) != 0 ) return SYM; v7 = *((const char **)SYM + 6); if ( *((int *)v7 + 1) >= 0 || *(_DWORD *)v7 != 0 ) return SYM - 4; v8 = *((_DWORD *)v7 + 2); if ( v8 > *((_DWORD *)SYM + 5) ) return SYM - 3; v9 = a0 - 129; if ( (unsigned int)(a0 - 129) >= 9 ) return SYM - 7; v10 = SYM; v11 = *((_DWORD *)v7 + 1) & 0x7FFFFFFF; if ( a1 != 0 ) { v12 = *((_DWORD *)v7 + 1) & 0x7FFFFF00; v13 = checksum8(v8, v7 + 8) | v12 | 0x100; } else { v13 = *((_DWORD *)v7 + 1) & 0x7FFFFE00; } v14 = *((int **)v10 + 6); v15 = v10; *v14 = a0; v14[1] = v13; v16 = SYM; v17 = SYM - 1; do { done = boot_done_poll(a1, (int)v14, v11, v9); v6 = done; if ( done == 0 ) break; if ( done == v17 || done == v4 ) { v18 = *((_DWORD **)v15 + 6); *v18 = 0; v18[1] = 0x80000000; return v6; } wait_service_ready(); svc_notify_stub(*((_DWORD *)v15 + 10), *((_DWORD *)v15 + 11)); v19 &= v16[4]; reg_write_sized(*((_DWORD *)v15 + 10), *((_DWORD *)v15 + 11), (int)&v19, *((_DWORD *)v15 + 7)); clear_status_field(); ++v5; } while ( v5 < 0xA ); return v6; }", "region_unmap_pair": "int __fastcall region_unmap_pair(int a0, int a1, int a2) { __asm { SVC 0x6A ; 'j' } __asm { SVC 0x63 ; 'c' } return a1; }", "region_unmap_if": "int __fastcall region_unmap_if(int result) { if ( result != 0 ) __asm { SVC 0x7E ; '~' } return result; }", "region_protect_pair": "int __fastcall region_protect_pair(_DWORD *a0, _DWORD *a1) { int result; if ( a1[2] != 0 ) __asm { SVC 0x8A } if ( a1[6] != 0 ) __asm { SVC 0x6A ; 'j' } if ( a1[10] != 0 ) __asm { SVC 0x6A ; 'j' } if ( a0[6] != 0 ) __asm { SVC 0x6A ; 'j' } if ( a0[16] != 0 ) __asm { SVC 0x6A ; 'j' } if ( a0[10] != 0 ) __asm { SVC 0x6A ; 'j' } result = a0[12]; if ( result != 0 ) __asm { SVC 0x6A ; 'j' } return result; }", "log_uart_init": "int __fastcall log_uart_init() { int result; int v0; result = 0; if ( *SYM != 0 ) { v0 = *((_DWORD *)SYM + 142); if ( v0 == 3 || v0 == 5 ) { result = SYM; __asm { SVC 0x7C ; '|' } if ( SYM == 0 ) { __asm { SVC 0x7C ; '|' } return 4; } } } return result; }", "trace_reg_pair_poke": "int __fastcall trace_reg_pair_poke(int a0) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7C ; '|' } return 0; }", "provision_record_read": "int __fastcall provision_record_read(int a0) { int v1; int v2; int v3; unsigned __int8 dst[16]; _DWORD v4[14]; _WORD v5[34]; _DWORD v6[20]; v6[19] = *(_DWORD *)SYM; LOWORD(v3) = 0; bzero_core(dst, 0x48u); bzero_core(v5, 0x44u); bzero_core(v6, 0x4Cu); mbox_clear_low(); v2 = provision_hdr_build(a0, (int)dst); if ( v2 == 0 ) { v2 = log_record_emit(a0, dst, 72, v1); if ( v2 == 0 ) { v2 = fw_entry_iterate(a0, v5, 0x44u, (int)&v3); if ( v2 == 0 ) { v2 = param_quad_check(v4, (int)v5, (unsigned __int16)v3, v6, 0x4Cu); if ( v2 == 0 ) { v2 = log_record_match(a0, (int)v6, 76); if ( v2 == 0 ) be32_field_load(a0, (int)v5); } } } } return v2; }", "session_record_read": "int __fastcall session_record_read(int *a0, unsigned int a1) { int v2; int v3; int v4; int *v5; unsigned int v6; int v7; _BYTE a[32]; int v8; v8 = *(_DWORD *)SYM; v2 = session_hmac_verify(a1); if ( v2 != 0 ) return v2; v3 = SYM + 96 * a1; v4 = *a0; if ( *(_DWORD *)(*a0 + 52) <= (unsigned int)a0[2] ) { v5 = (int *)*a0; v6 = v4 + 32; v7 = v4 + 80; v2 = hmac_sha256(a1, SYM, v3 + 16, 32, v4 + 32, *(_DWORD *)(v4 + 48) - 32, (int)a, 32); if ( v2 == 0 ) { if ( ct_memcmp(a, v5, 0x20u) != 0 ) return SYM; else return aes_cmac_compute(a1, v3, 16, v6, 0x10u, SYM, v7, v5[13], a0[1], 1); } return v2; } return SYM; }", "session_record_verify": "int __fastcall session_record_verify(unsigned int *a0, unsigned int a1) { int v2; _DWORD *v3; unsigned int v4; _BYTE a[32]; int v5; v5 = *(_DWORD *)SYM; v2 = session_hmac_verify(a1); if ( v2 != 0 ) return v2; v3 = (_DWORD *)*a0; v4 = SYM + 96 * a1; if ( *(_DWORD *)(*a0 + 52) <= a0[2] ) { v2 = hmac_sha256(a1, SYM, v4 + 64, 32, (int)(v3 + 12), v3[12] - 48, (int)a, 32); if ( v2 == 0 ) { if ( ct_memcmp(a, v3 + 4, 0x20u) != 0 ) return SYM; else return aes_cmac_compute( a1, v4 + 48, 16, (unsigned int)v3, 0x10u, SYM, (int)(v3 + 20), v3[13], a0[1], 1); } return v2; } return SYM; }", "log_record_prepare": "int __fastcall log_record_prepare(_DWORD *a0) { unsigned __int16 *v1; int *v2; int *v3; int *v4; int v5; int v6; unsigned int v7; _DWORD v8[10]; v1 = (unsigned __int16 *)(a0 + 8); if ( a0 != nullptr ) { v2 = SYM; if ( *SYM == 0 ) { if ( *SYM == 20 ) { v3 = SYM + 16; v4 = SYM + 24; } else { v3 = SYM + 32; v4 = SYM + 40; } v5 = aes_ecb_double((int)v3, (int)v4, (_DWORD *)SYM); if ( v5 != 0 ) return v5; *v2 = 1; } v6 = *a0; v8[0] = SYM; v7 = v6 - 32; v8[1] = 0; v8[2] = 128; v8[3] = v1; v8[4] = v7; v8[5] = v1; v8[6] = a0 + 4; v8[7] = 1; v8[8] = SYM; v5 = crypto_submit_op(v8); if ( v5 == 0 && a0[2] != checksum16(v1, v7) ) return SYM - 11; return v5; } return SYM; }", "log_buffer_config": "int __fastcall log_buffer_config(int a0, int a1) { _DWORD v2[9]; if ( (a1 | a0) << 27 != 0 ) return SYM; v2[0] = 4; v2[2] = 128; v2[3] = a0; v2[1] = 1; v2[4] = 32; v2[5] = a1; v2[6] = 0; v2[7] = 1; v2[8] = SYM; return crypto_submit_op(v2); }", "ret_zero_8": "int __fastcall ret_zero_8() { return 0; }", "tsu_write_record_header": "int __fastcall tsu_write_record_header(int *a0, int a1, int a2, int a3) { int v4; int v5; int v6; unsigned int v7; unsigned __int16 v8[16]; bzero_core(&v7, 0x20u); v4 = a1 + 12 * a2; v5 = spi_load_device_desc(&v7, *(_DWORD *)(v4 + 40), 0x20u, 0); if ( v5 != 0 ) { v6 = 11; LABEL_5: *a0 = v6; log_event(0xBu, 3); log_event(9u, v5); log_event(9u, *a0); return v5; } *(_DWORD *)v8 = a3; v7 = checksum16(v8, 0x1Cu); v5 = spi_write_status(&v7, *(_DWORD *)(v4 + 40), 0x20u); if ( v5 != 0 ) { v6 = 12; goto LABEL_5; } return v5; }", "map_and_copy_44": "int __fastcall map_and_copy_44(unsigned int r0_0, unsigned int a0) { int v1; unsigned __int8 v2[4]; int a3; v2[0] = -1; v1 = map_client_buffer(r0_0, a0, 0x2Cu, v2, &a3, 0, 1, 0xFFFFu); if ( v1 == 0 ) memcpy_thunk(a3); if ( v2[0] != 255 ) __asm { SVC 0x6C ; 'l' } return v1; }", "feature_table_walk": "void __fastcall feature_table_walk() { unsigned int i; unsigned int v0; unsigned int v1; unsigned int v2; unsigned int v3; char v4; unsigned int v5; v5 = (unsigned __int8)feature_entry_get(0); if ( v5 != 0 ) { for ( i = 0; ; i = (unsigned __int8)(v4 + 1) ) { v4 = i; if ( i >= v5 ) break; if ( feature_enabled(0, i) ) { LOBYTE(v0) = 0; do { LOBYTE(v1) = 0; do { LOBYTE(v2) = 0; do { LOBYTE(v3) = 0; do { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } v3 = (unsigned __int8)(v3 + 1); } while ( v3 < 0xA ); v2 = (unsigned __int8)(v2 + 1); } while ( v2 < 4 ); v1 = (unsigned __int8)(v1 + 1); } while ( v1 < 4 ); v0 = (unsigned __int8)(v0 + 1); } while ( v0 < 2 ); } select_mem_attr(0); } } }", "log_field4_get": "int __fastcall log_field4_get() { return *((_DWORD *)SYM + 4); }", "log_buffer_emit": "int __fastcall log_buffer_emit(int a0, int a1, unsigned int a2) { unsigned int v3; int v4; int v5; int type258; int v6; int v7; int v8; int v9; int v10; int v11; unsigned int v12; unsigned int v13; unsigned int v14; int v15; unsigned __int8 v16[4]; int v17; v16[0] = -1; if ( a1 == 0 || a2 < 3 ) return SYM; udiv_select_shift(a2, 3u); v3 = 4 * a2; v5 = v4; if ( get_active_slot_id() != 0 ) { type258 = 0; } else { type258 = config_find_type258(&v11); if ( type258 == 0 ) { if ( v14 >= v3 ) { if ( v13 != 0 || v12 != 0 ) { type258 = map_client_buffer(v13, v12, v14, v16, &v17, 0, 1, 0xFFFFu); if ( type258 != 0 || v16[0] == 255 ) { type258 = SYM + 98; } else { v6 = v17; if ( *SYM == a0 ) { if ( v15 != 0 ) { v7 = 4 * v15; v8 = 8 * v15; if ( 12 * v15 + v3 > v14 ) { type258 = SYM + 50; LABEL_25: __asm { SVC 0x6C ; 'l' } return type258; } v9 = v17 + v8; v10 = v17 + v8 + 8 * v5; memcpy_thunk(v10); memcpy_thunk(v9); v6 = v10 + v7; } } else { v15 = 0; *SYM = a0; } memcpy_thunk(v6); config_find_type258b(v15 + v5); config_apply_type258(); } } else { type258 = SYM + 12; } } else { type258 = SYM; } } } if ( v16[0] != 255 ) goto LABEL_25; return type258; }", "sysdrv_ta_lifecycle_notify": "int __fastcall sysdrv_ta_lifecycle_notify() { return 0; }", "log_config_set": "int __fastcall log_config_set(int a0, unsigned int a1) { char *v2; int v3; int firmware; int v4; unsigned __int64 v5; int v6; int v7; _DWORD v8[3]; int v9; v2 = SYM; v3 = 0; if ( a0 == 1024 ) { *((_DWORD *)SYM + 4) = a1; v2[1] = 1; } else if ( a0 == 128 ) { *((_DWORD *)SYM + 3) = a1; *v2 = 1; } if ( ((unsigned __int8)*v2 & (unsigned __int8)v2[1]) != 0 ) { LODWORD(v5) = *((_DWORD *)v2 + 3); HIDWORD(v5) = *((_DWORD *)v2 + 4); } else { if ( a0 != 1152 ) return v3; v5 = (unsigned __int64)a1 << 20; } v7 = 60; v6 = 0x40000; v8[0] = &v5; v8[1] = &v4; v8[2] = 0; v9 = 0xFFFF; firmware = sysdrv_tee_load_firmware((__int64 *)v8); *v2 = 0; v3 = firmware; v2[1] = 0; return v3; }", "log_region_map": "int __fastcall log_region_map(unsigned int a0, int a1) { _DWORD *v2; int id; int v3; int v4; char *v5; unsigned int v6; int v7; int v8; int v9; int v10; v8 = 0; v9 = 0; v10 = 0; __asm { SVC 0x7D ; '}' } v2 = (_DWORD *)SYM; if ( SYM == 0 ) return SYM; __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } if ( (v10 & v9) << 31 == 0 || (id = smu_mailbox_xfer(6, 0, 0, &v8, 0x3E8u)) == 0 ) { id = fifo_cmd_setup(v2, 632, 820); if ( id == 0 ) { id = fifo_read_id(v2); if ( id == 0 ) { id = page_probe_signature(a0); if ( id == 0 ) { id = flash_status_decode(v2, v3, v4); if ( id == 0 ) { id = flash_cmd_sequence(v2, a0, a1); if ( id == 0 ) { id = fifo_cmd_retry(v2); if ( id == 0 ) { id = fifo_read_id(v2); if ( id == 0 ) id = mbox_slot_select(); } } } } } } } __asm { SVC 0x7E ; '~' } if ( (v10 & v9) << 31 != 0 ) smu_mailbox_xfer(7, 0, 0, &v8, 0x3E8u); v5 = SYM; v6 = *((_DWORD *)SYM + 5); if ( v6 != 0 ) { v7 = fw_slot_operation(v6, 1u, 1); if ( id == 0 ) id = v7; } *((_DWORD *)v5 + 6) = 0; return id; }", "log_region_unmap": "int __fastcall log_region_unmap(int *a0) { _DWORD *v1; int id; int v2; int v3; int v4; v2 = 0; v3 = 0; v4 = 0; __asm { SVC 0x7D ; '}' } v1 = (_DWORD *)SYM; if ( SYM == 0 ) return SYM; __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } if ( (v4 & v3) << 31 == 0 || (id = smu_mailbox_xfer(6, 0, 0, &v2, 0x3E8u)) == 0 ) { id = fifo_cmd_setup(v1, 632, 820); if ( id == 0 ) { id = fifo_read_id(v1); if ( id == 0 ) *a0 = *((_DWORD *)SYM + 8) | (*((_DWORD *)SYM + 7) << 8); } } if ( (v4 & v3) << 31 != 0 ) smu_mailbox_xfer(7, 0, 0, &v2, 0x3E8u); __asm { SVC 0x7E ; '~' } return id; }", "log_record_match": "int __fastcall log_record_match(int a0, int a1, int a2) { int v3; int v4; if ( *(_WORD *)(a1 + 8) == 68 && *(_BYTE *)(a1 + 11) == 3 ) { v3 = 0; if ( a1 != 0 && a2 != 0 ) { if ( !fw_entry_match_uuid(a1, a2 - 48, a1 + a2 - 48) ) { v4 = SYM; *(_DWORD *)(a0 + 12) = 50331648; return v4 - 6; } return v3; } else { return SYM; } } else { *(_DWORD *)(a0 + 12) = 50331648; return SYM; } }", "param_bounds_check": "int __fastcall param_bounds_check(int a0, int a1, _DWORD *a2, int *a3, _DWORD *a4, int *a5, _DWORD *a6) { int v7; int v8; int v9; int v10; int v11; int v12; int result; int v13; int v14; unsigned int v15; int v16[6]; unsigned int n; int v17; unsigned int v18; int v19; _BYTE buf[512]; _BYTE v20[64]; int v21; int v22; int v23; _DWORD *v24; int *v25; v22 = a0; v23 = a1; v24 = a2; v25 = a3; v21 = *(_DWORD *)SYM; v7 = *(_DWORD *)(a1 + 60); v8 = a1 + 64; if ( (unsigned int)(v7 - 2048) >= 8 ) { v9 = a1 + 576; v10 = 1088; v11 = v8; v12 = 512; } else { v9 = a1 + 320; v10 = 576; v11 = v8; v12 = 256; } result = find_record_by_uuid(a1 + 20, &v19, &v18, &v17, &n); if ( result == 0 ) { result = uuid_table_lookup((unsigned int *)(a1 + 20), a6); if ( result == 0 ) { if ( n == 256 ) { v13 = SYM; v14 = 32; } else { v13 = SYM + 1; v14 = 48; } v15 = v14; v16[0] = v22; v16[1] = 0; v16[2] = v10; v16[3] = (int)v20; v16[4] = v14; v16[5] = v13; result = ecc_submit_op(v16); if ( result == 0 ) { memcpy_thunk((int)buf); buf_reverse_inplace(buf, n); result = rsa_pad_and_verify((int)v20, v15, v17, n, v19, v18, (int)buf); if ( result != 0 ) { return SYM; } else { *v24 = v11; *v25 = v12; *a4 = v9; *a5 = v12; } } } } return result; }", "objslot_release": "int __fastcall objslot_release(int a0) { unsigned int v1; int v2; int v3; v1 = handle_to_index(a0); if ( v1 != -1 && *(_BYTE *)(v3 = SYM + 16 * v1) != 0 && *(unsigned __int8 *)(v3 + 1) == v2 ) return 0; else return SYM; }", "context_state_reset": "int __fastcall context_state_reset(int *a0) { int v1; int v2; int *v3; int result; int stub; char *v4; int v5; v1 = 0; if ( a0 == nullptr ) return SYM; v2 = *a0; v3 = SYM; if ( *a0 == 1 ) { bzero_core(a0 + 7, 0x18u); bzero_core((void *)SYM, 0x800u); v4 = SYM; *((_WORD *)SYM + 1) = 0; *((_WORD *)v4 + 2) = 0; *v3 = reg_read_stub(); return v1; } if ( v2 == 10 || v2 == 11 ) return v1; result = flash_access_acquire(100); if ( result == 0 ) { stub = reg_read_stub(); *v3 = stub; if ( stub == 2 && spi_mode_select(1) != 0 ) *v3 = 0; if ( *a0 == 5 ) { v5 = debug_policy_value(); } else if ( get_client_ctx_field3() == 256 ) { v5 = psb_policy_dispatch(a0); } else { v5 = platform_query(a0); } v1 = v5; spi_mode_select(0); flash_access_release(100); return v1; } return result; }", "platform_query": "int __fastcall platform_query(_DWORD *a0) { int v1; int v2; int v3; v1 = 0; if ( *a0 == 4 ) { v2 = *SYM; switch ( a0[1] ) { case 0x205: v3 = v2 << 30; break; case 0x206: v3 = v2 << 29; break; case 0x210: v3 = v2 << 28; break; default: return SYM + 4; } if ( v3 >= 0 ) return v1; } else { if ( debug_disabled() ) { if ( *a0 != 2 ) return SYM; if ( a0[1] == 528 ) return apply_reg_list_varargs(528, a0[3], a0[4], a0[5], a0[6]); return v1; } if ( a0[1] == 534 ) { __asm { SVC 0x7B ; '{' } return v1; } } v1 = apply_reg_list_varargs(a0[1], a0[3], a0[4], a0[5], a0[6]); if ( v1 == -65528 && debug_disabled() ) return 0; return v1; }", "apply_reg_list_varargs": "int apply_reg_list_varargs(int a0, ...) { int result; unsigned int i; int v1; int v2; unsigned int v3; int v4; __int64 v5; int varg_r1; __int64 varg_r2; va_list va1; va_list va; va_start(va1, a0); va_start(va, a0); varg_r1 = va_arg(va1, _DWORD); varg_r2 = va_arg(va1, _QWORD); v5 = varg_r2; v3 = 0; v4 = 0; result = client_config_find(a0, &v4, &v3); if ( result == 0 ) { for ( i = 0; i < v3; ++i ) { v1 = v4; v2 = *(_DWORD *)(v4 + 8 * i + 4); HIDWORD(v5) = v2; ++*((_WORD *)SYM + 2); if ( a0 == 515 || a0 == 641 ) { LODWORD(v5) = **(_DWORD **)(v1 + 8 * i); } else { LODWORD(v5) = ~v2; __asm { SVC 0x7B ; '{' } if ( ~v2 != HIDWORD(v5) && id_in_list(*(_DWORD *)(v4 + 8 * i), (int *)va) != 0 ) { __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } } if ( (_DWORD)v5 != HIDWORD(v5) ) config_lookup_u32(*(_DWORD *)(v4 + 8 * i), (int)va, (int)&v5 + 4); } if ( (_DWORD)v5 == HIDWORD(v5) ) { objmap_remove(*(_DWORD *)(v4 + 8 * i)); } else { result = objmap_insert(a0, *(_DWORD *)(v4 + 8 * i), v5, v3); if ( result != 0 ) return result; } } return 0; } return result; }", "parse_directory_entries": "int parse_directory_entries(unsigned int a0, ...) { char v1; int result; int client_ctx_alt; unsigned __int8 *v2; unsigned __int8 *v3; unsigned int v4; unsigned int v5; int v6; int v7; unsigned int j; int v8; int v9; unsigned int k; __int64 v10; bool v11; int v12; unsigned int m; int v13; unsigned int v14; __int64 v15; int v16; unsigned int i; int v17; unsigned int v18; unsigned int *v19; int v20; va_list varg_r1; va_start(varg_r1, a0); v1 = a0; v16 = SYM; if ( a0 > 0x18 ) return SYM - 2; if ( (*SYM & 2) != 0 ) client_ctx_alt = get_client_ctx_alt(); else client_ctx_alt = get_current_client_id(); v19 = (unsigned int *)(client_ctx_alt + 256); v2 = (unsigned __int8 *)(client_ctx_alt + 320); v20 = 1 << v1; for ( i = 0; *v19 > i; ++i ) { v3 = v2; v17 = (int)&v2[8 * *((unsigned __int16 *)v2 + 2) + 12]; v4 = *(_DWORD *)v2; _ZF = (v20 & (v4 >> 8)) == 0; while ( !_ZF ) { v16 = 0; v5 = *((unsigned __int16 *)v3 + 3); v4 &= 0xC0u; v6 = v17; v7 = v4; switch ( v4 ) { case 0u: for ( j = 0; j < v5; ++j ) { if ( instance_id_in_use((*(_DWORD *)(v6 + 8 * j) >> 12) & 0x3FF) == 0 ) { if ( id_in_list(*(_DWORD *)(v6 + 8 * j), (int *)varg_r1) != 0 ) { v8 = *(_DWORD *)(v6 + 8 * j); v9 = 0; HIDWORD(v15) = *(_DWORD *)(v6 + 8 * j + 4); LODWORD(v15) = ~HIDWORD(v15); ++*((_WORD *)SYM + 2); __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } if ( ++j >= v5 ) v9 = SYM; if ( (_DWORD)v15 != HIDWORD(v15) ) { v9 = SYM + 21; LABEL_22: objmap_insert(*(_DWORD *)v3, v8, v15, v15); return v9; } if ( v9 != 0 ) goto LABEL_22; } HIDWORD(v15) = *(_DWORD *)(v6 + 8 * j + 4); LODWORD(v15) = ~HIDWORD(v15); ++*((_WORD *)SYM + 2); __asm { SVC 0x7B ; '{' } if ( ~*v3 << 27 == 0 || same_reg_group(v15, SHIDWORD(v15)) || (config_lookup_u32(*(_DWORD *)(v6 + 8 * j), (int)varg_r1, (int)&v15 + 4) != 0 || policy_table_scan(*(_DWORD *)(v6 + 8 * j), 0, 0, (_DWORD *)&v15 + 1) != 0) && same_reg_group(v15, SHIDWORD(v15)) ) { LODWORD(v15) = HIDWORD(v15); } if ( (_DWORD)v15 == HIDWORD(v15) ) { objmap_remove(*(_DWORD *)(v6 + 8 * j)); } else { result = objmap_insert(*(_DWORD *)v3, *(_DWORD *)(v6 + 8 * j), v15, v15); v16 = result; if ( result != 0 ) return result; } } } goto LABEL_67; case 0x40u: for ( k = 0; k < v5; ++k ) { ++*((_WORD *)SYM + 2); HIDWORD(v15) = *(_DWORD *)(v6 + 8 * k + 4); LODWORD(v10) = **(_DWORD **)(v6 + 8 * k); HIDWORD(v10) = HIDWORD(v15); LODWORD(v15) = v10; if ( (_DWORD)v10 != HIDWORD(v15) ) { result = objmap_insert(*(_DWORD *)v3, *(_DWORD *)(v6 + 8 * k), v10, v15); v11 = result == 0; v16 = result; LABEL_43: if ( v11 ) continue; return result; } objmap_remove(*(_DWORD *)(v6 + 8 * k)); } goto LABEL_67; case 0x80u: if ( *((_DWORD *)SYM + 561) != 0 ) { v12 = 0; v18 = feature_entry_get(0); for ( m = 0; ; m = v14 + 1 ) { v14 = m; if ( m >= v18 ) break; if ( feature_enabled(0, m) ) { for ( k = 0; k < v5; ++k ) { v13 = *(_DWORD *)(v6 + 8 * k) + v12; HIDWORD(v15) = *(_DWORD *)(v6 + 8 * k + 4); LODWORD(v15) = ~HIDWORD(v15); ++*((_WORD *)SYM + 2); __asm { SVC 0x7B ; '{' } if ( ~*v3 << 27 == 0 || same_reg_group(v15, SHIDWORD(v15)) || (config_lookup_u32(*(_DWORD *)(v6 + 8 * k), (int)varg_r1, (int)&v15 + 4) != 0 || policy_table_scan(*(_DWORD *)(v6 + 8 * k), 0, v7, (_DWORD *)&v15 + 1) != 0) && same_reg_group(v15, SHIDWORD(v15)) ) { LODWORD(v15) = HIDWORD(v15); } if ( (_DWORD)v15 == HIDWORD(v15) ) { objmap_remove(v13); } else { result = objmap_insert(*(_DWORD *)v3, v13, v15, v15); v11 = result == 0; v16 = result; if ( result != 0 ) goto LABEL_43; } } } v12 += select_mem_attr(0); } } goto LABEL_67; default: break; } _ZF = v4 == 192; if ( v4 != 192 ) return SYM - 3; } LABEL_67: v2 = (unsigned __int8 *)(v17 + 8 * *((unsigned __int16 *)v3 + 3)); } return v16; }", "psb_policy_dispatch": "int __fastcall psb_policy_dispatch(_DWORD *a0) { char *v1; int v2; int v3; char *v4; int v5; int v6; int v7; int v8; _DWORD *v9; int *v10; int v11; int v12; int v13; int v14; int v15; int v16; int v17; int v18; int v19; v1 = SYM[0]; v2 = 0; *SYM[0] = 0; if ( *a0 == 4 ) { if ( is_recovery_state() != 0 ) { v6 = 11; } else { if ( debug_allowed() == 0 ) return v2; v6 = 5; } a0[1] = v6; } else { v3 = a0[1]; v4 = SYM; v5 = SYM; switch ( v3 ) { case 2: case 3: if ( debug_disabled() ) a0[1] = a0[1] != 2; _ZF = !client_ctx_present(); v7 = (unsigned __int8)*v4; if ( _ZF ) { if ( v7 == 1 || read_hw_status() != 0 ) return v5; } else if ( v7 == 1 ) { *v1 = 1; } break; case 6: if ( *SYM == 0 || debug_disabled() ) return v5; if ( client_ctx_present() ) *v1 = 2; break; case 7: if ( *SYM != 0 ) { __asm { SVC 0x7B ; '{' } return v2; } return v5; default: break; } } v2 = parse_directory_entries(a0[1], a0[3], a0[4], a0[5], a0[6]); if ( v2 == -65528 && debug_disabled() ) { v2 = 0; } else if ( v2 != 0 ) { return v2; } v8 = a0[1]; v9 = SYM; v10 = SYM; switch ( v8 ) { case 2: if ( reg_read_stub() == 2 ) { v11 = parse_directory_entries(5u, a0[3], a0[4], a0[5]); if ( v11 != 0 ) v2 = v11; } if ( v9[556] != 0 ) { v12 = parse_directory_entries(0xCu, a0[3], a0[4], a0[5]); if ( v12 != 0 ) v2 = v12; } if ( *(unsigned __int8 *)v10 << 31 != 0 ) { v13 = parse_directory_entries(0xDu, a0[3], a0[4], a0[5]); if ( v13 != 0 ) v2 = v13; } if ( (*(_BYTE *)v10 & 2) != 0 ) { v14 = parse_directory_entries(0xEu, a0[3], a0[4], a0[5], a0[6]); goto LABEL_62; } break; case 4: if ( reg_read_stub() == 2 ) { v15 = parse_directory_entries(0xBu, a0[3], a0[4], a0[5]); if ( v15 != 0 ) v2 = v15; } if ( v9[556] != 0 ) { v16 = parse_directory_entries(0xFu, a0[3], a0[4], a0[5]); if ( v16 != 0 ) v2 = v16; } if ( *(unsigned __int8 *)v10 << 31 != 0 ) { v17 = parse_directory_entries(0x10u, a0[3], a0[4], a0[5]); if ( v17 != 0 ) v2 = v17; } if ( (*(_BYTE *)v10 & 2) != 0 ) { v14 = parse_directory_entries(0x11u, a0[3], a0[4], a0[5], a0[6]); goto LABEL_62; } break; case 6: if ( *(unsigned __int8 *)SYM << 31 != 0 ) { v18 = parse_directory_entries(8u, a0[3], a0[4], a0[5]); if ( v18 != 0 ) v2 = v18; } if ( (*(_BYTE *)v10 & 2) != 0 ) { v19 = parse_directory_entries(9u, a0[3], a0[4], a0[5]); if ( v19 != 0 ) v2 = v19; } if ( reg_read_stub() != 2 ) return v2; v14 = parse_directory_entries(0xAu, a0[3], a0[4], a0[5]); if ( v14 != 0 ) return v14; v14 = parse_directory_entries(5u, a0[3], a0[4], a0[5], a0[6]); LABEL_62: if ( v14 == 0 ) return v2; return v14; default: return v2; } return v2; }", "vf_range_find": "int __fastcall vf_range_find(unsigned int a0, int a1) { int result; unsigned int v2; unsigned int i; __int64 v3; result = SYM; v2 = a0 + a1; if ( a0 + a1 < a0 ) return SYM - 1; for ( i = 0; *((_DWORD *)SYM + 18) > i; ++i ) { v3 = *((_QWORD *)SYM + 2 * i + 10); if ( *SYM == 1 || a0 >= (unsigned int)v3 && v2 <= (int)v3 + HIDWORD(v3) ) return 0; } return result; }", "vf_reg_program_quad": "int __fastcall vf_reg_program_quad(int a0, unsigned int a1, unsigned int a2) { int result; result = vf_reg_program_pair( 44720, a1, SYM + (a0 << 12), SYM + 8 + (a0 << 12), SYM + (a0 << 12)); if ( result == 0 ) return vf_reg_program_pair( 44721, a2, SYM + 4 + (a0 << 12), SYM + 12 + (a0 << 12), SYM + 4 + (a0 << 12)); return result; }", "debug_policy_value": "int __fastcall debug_policy_value() { char *v0; int v1; __int64 v2; unsigned int v3; int v4; char *v5; int v6; int v7; int v8; int v9; int v10; int *v11; int v12; int v13; _BYTE dst[412]; v0 = SYM; v1 = *((unsigned __int16 *)SYM + 2); if ( is_recovery_state() != 0 ) { v2 = *(_QWORD *)((char *)SYM + 20); } else if ( debug_allowed() != 0 ) { v2 = 0; } else { v2 = -1; } memcpy(dst, SYM, 0x198u); v3 = 0; v4 = instance_config_apply(0, (int)dst, 0x11u, v2, HIDWORD(v2)); v5 = SYM + 6; do { if ( *(_WORD *)&v5[2 * v3] != 0 && instance_id_in_use(*(unsigned __int16 *)&v5[2 * v3]) == 0 ) { v6 = vf_reg_program_quad(*(unsigned __int16 *)&v5[2 * v3], v2, HIDWORD(v2)); if ( v4 == 0 && v6 != 0 ) v4 = v6; } ++v3; } while ( v3 < 0x51 ); if ( reg_read_stub() == 2 ) { v7 = vf_reg_program_pair(44720, v2, SYM, SYM + 8, SYM); if ( v4 == 0 && v7 != 0 ) v4 = v7; v8 = vf_reg_program_pair(44721, HIDWORD(v2), SYM + 4, SYM + 12, SYM + 4); if ( v4 == 0 && v8 != 0 ) v4 = v8; v9 = vf_reg_program_quad(47, v2, HIDWORD(v2)); if ( v4 == 0 && v9 != 0 ) v4 = v9; } if ( *((_DWORD *)SYM + 556) != 0 ) { v10 = vf_reg_program_quad(170, v2, HIDWORD(v2)); if ( v4 == 0 && v10 != 0 ) v4 = v10; } v11 = SYM; if ( *(unsigned __int8 *)SYM << 31 != 0 ) { v12 = vf_reg_program_quad(12, v2, HIDWORD(v2)); if ( v4 == 0 && v12 != 0 ) v4 = v12; } if ( (*(_BYTE *)v11 & 2) != 0 ) { v13 = vf_reg_program_quad(276, v2, HIDWORD(v2)); if ( v4 != 0 ) return v4; if ( v13 != 0 ) return v13; } else if ( v4 != 0 ) { return v4; } if ( v1 == *((unsigned __int16 *)v0 + 2) ) return SYM; return v4; }", "instance_config_apply": "int __fastcall instance_config_apply(unsigned int a0, int a1, unsigned int a2, unsigned int a3, unsigned int a4) { int v5; int v6; unsigned __int8 v7; unsigned int v8; unsigned int i; unsigned int j; int v9; int v10; int v11; int v12; int v13; int result; v5 = SYM; v6 = 0; v7 = feature_entry_get(a0); v8 = v7; if ( v7 != 0 ) { for ( i = 0; i < v8; i = (unsigned __int8)(i + 1) ) { if ( feature_enabled(a0, i) ) { for ( j = 0; j < a2; ++j ) { v9 = *(_DWORD *)(a1 + 24 * j); if ( v9 != 0 ) { v10 = a1 + 24 * j; v11 = v9 + v6; v12 = *(_DWORD *)(v10 + 8) + v6; v13 = *(_DWORD *)(v10 + 4) + v6; result = vf_reg_program_pair(SYM, a3, v13, v9 + v6, v12); if ( result != 0 ) return result; result = vf_reg_program_pair(SYM + 1, a4, v13 + 4, v11 + 4, v12 + 4); v5 = result; if ( result != 0 ) return result; } } } v6 += select_mem_attr(a0); } } return v5; }", "vf_reg_program_pair": "int __fastcall vf_reg_program_pair(int a0, unsigned int a1, int a2, int a3, int a4) { int v5; int v6; int v7; int v8; unsigned int i; unsigned int v9; int v10; v5 = 0; ++*((_WORD *)SYM + 2); __asm { SVC 0x7B ; '{' } v6 = a2; if ( a2 != 0 ) { v7 = SYM; v8 = a2; goto LABEL_5; } __asm { SVC 0x7B ; '{' } v6 = a3; if ( a3 != 0 ) { v8 = a3; v7 = SYM + 1; goto LABEL_5; } __asm { SVC 0x7B ; '{' } v6 = a4; if ( a4 != 0 ) { v8 = a4; v7 = SYM + 2; LABEL_5: v10 = v7; LABEL_16: objmap_insert(a0, v8, __SPAIR64__(a1, v10), 0); return v6; } if ( a0 << 31 == 0 ) v5 = 3; for ( i = v5; i < 0x20; ++i ) { v9 = a1 & (1 << i); if ( v9 != 0 ) { v8 = 0; v6 = SYM; v10 = i | SYM; goto LABEL_16; } } return v6; }", "tsu_verify_region": "int __fastcall tsu_verify_region(unsigned int a0, unsigned int a1, int a2, int a3, unsigned int a4, int *a5) { int v6; int record_by_uuid; unsigned int n; int v7; unsigned int v8; int v9; _BYTE dst[512]; _BYTE v10[32]; int v11; v11 = *(_DWORD *)SYM; bzero_core(dst, 0x200u); bzero_core(v10, 0x20u); if ( a1 == 0 ) return SYM; if ( a0 >= a4 || a1 > a4 || a4 - a1 < a0 ) return SYM; if ( (unsigned int)a5[2] > 0x200 ) return SYM + 99; record_by_uuid = find_record_by_uuid(SYM, &v9, &v8, &v7, &n); v6 = record_by_uuid; if ( record_by_uuid != 0 ) goto LABEL_12; __asm { SVC 0x66 ; 'f' } v6 = mac_oneshot((unsigned __int8)record_by_uuid, SYM, a3 + a0, a1, (int)v10, 32); if ( v6 != 0 || (memcpy_thunk((int)dst), buf_reverse_inplace(dst, n), (v6 = rsa_pad_and_verify((int)v10, 0x20u, v7, n, v9, v8, (int)dst)) != 0) ) { LABEL_12: log_event(0xBu, 6); log_event(9u, v6); log_event(0xAu, *a5); } return v6; }", "apob_header_validate": "int __fastcall apob_header_validate(int a0) { int v1; int v2; unsigned int v3; unsigned int i; v1 = 0; if ( *(unsigned __int8 *)(a0 + 4) >= 3u ) return SYM; if ( *(unsigned __int8 *)(a0 + 5) >= 6u ) return SYM; if ( *(_DWORD *)(a0 + 28) != 4096 ) return SYM; if ( *(_DWORD *)(a0 + 32) != 256 ) return SYM; if ( *(_DWORD *)(a0 + 20) > 0x4000000u ) return SYM; v2 = *(unsigned __int8 *)(a0 + 93); if ( v2 != 4 && v2 != 3 ) return SYM; if ( *(unsigned __int8 *)(a0 + 92) == 255 || *(unsigned __int8 *)(a0 + 80) == 255 || *(unsigned __int8 *)(a0 + 100) == 255 || *(unsigned __int8 *)(a0 + 96) == 255 || v2 == 4 && *(unsigned __int8 *)(a0 + 108) == 255 ) { return SYM; } v3 = *(unsigned __int8 *)(a0 + 37); if ( v3 > 4 ) return SYM; for ( i = 0; v3 > i; i = (unsigned __int8)(i + 1) ) { if ( *(unsigned __int8 *)(a0 + 4 * i + 48) == 255 ) return SYM; } return v1; }", "sysdrv_ta_image_commit": "int __fastcall sysdrv_ta_image_commit(unsigned int *a0, unsigned int a1, int a2) { int result; unsigned int v3; v3 = 0; result = ecc_curve_params_get((unsigned int *)SYM, a0, a2, &v3); if ( result != 0 ) { if ( result == SYM ) { SYM[1] = 2; return 0; } } else if ( a1 < v3 ) { return SYM - 1; } return result; }", "fifo_cmd_retry": "int __fastcall fifo_cmd_retry(_DWORD *a0) { char *v1; int result; int v2; int v3; v3 = 0; v1 = SYM + 5; v1[2] = *SYM; result = retry_op_3x(a0, 8, (int)v1, 3u); if ( result == 0 ) { __asm { SVC 0x56 ; 'V' } result = retry_with_timeout(a0, &v3); if ( result == 0 ) { v2 = SYM; if ( v3 != 2 ) return v2; result = retry_op_3x(a0, 8, SYM, 3u); if ( result == 0 ) { __asm { SVC 0x56 ; 'V' } result = retry_with_timeout(a0, &v3); if ( result == 0 ) { if ( v3 != 128 && v3 != 2 ) return v2; result = retry_op_3x(a0, 8, SYM + 3, 4u); if ( result == 0 ) { __asm { SVC 0x56 ; 'V' } result = retry_with_timeout(a0, &v3); if ( result == 0 && v3 != 128 ) return v2; } } } } } return result; }", "verify_image_signature": "int __fastcall verify_image_signature( unsigned int a0, int a1, unsigned int a2, int r3_0, unsigned int a3, unsigned int a4, unsigned int arg8, _DWORD *a5, _DWORD *a6, _DWORD *a7, int a8, _DWORD *a9) { int v10; unsigned int v11; int v12; int record_retry; int a13; int v14; int v15; int v16; unsigned int v17; unsigned int v18; int v19; int v20; unsigned int v21; int v22; int v23; unsigned int *v24; unsigned int v25; unsigned int v26; int v27; int v28; unsigned int v29; unsigned int v30; int v31; unsigned int v32; unsigned int v33; unsigned int v34; int v35; int v36; int a37; int v38; int v39; unsigned int v40[8]; _BYTE v41[1025]; _BYTE v42[48]; int v43; unsigned int v44; int v45; unsigned int v46; int v47; unsigned int v48; v44 = a0; v45 = a1; v46 = a2; v47 = r3_0; v10 = a1; v39 = *(_DWORD *)SYM; v43 = v39; v28 = 0; v30 = 0; v11 = (unsigned int)v41 & 0xFFFFFFE0; v38 = a1; v12 = map_and_flush_range((unsigned int)v41 & 0xFFFFFFE0, 1024, a3, a4); if ( v12 != 0 ) return v12; __asm { SVC 0x79 ; 'y' } a37 = SYM; __asm { SVC 0x79 ; 'y' } a13 = fw_type_to_class(a0); __asm { SVC 0x5E ; '^' } record_retry = find_record_retry((unsigned int)v41 & 0xFFFFFFE0, &v32, &v27, &v26, &v35, &v34, a13); _ZF = record_retry == 0; while ( _ZF ) { record_retry = rsa_keygen_params( (unsigned int)v41 & 0xFFFFFFE0, v46, arg8, v32, a0, &v30, (unsigned int *)&v36, &v33, v40, &v31); _ZF = record_retry == 0; if ( record_retry == 0 ) { *a7 = *(_DWORD *)(((unsigned int)v41 & 0xFFFFFFE0) + (v30 << 8) + 0x60); *a9 = *(unsigned __int16 *)(((unsigned int)v41 & 0xFFFFFFE0) + (v30 << 8) + 0x58); v25 = v33; v29 = a3 + v40[0]; if ( a4 != 0 ) v28 = v40[0] + a4; if ( v34 == 256 ) { v14 = 3; } else { if ( v34 != 512 ) { record_retry = SYM; break; } v14 = 4; } v15 = v14; record_retry = hash_ctx_init(v14); if ( record_retry == 0 ) { record_retry = hash_oneshot_65(v11 + (v32 << 8), v31, v15, 1); if ( record_retry == 0 ) { v16 = v31; v48 = v31 + (v32 << 8) + a3; while ( 1 ) { v17 = v36; if ( v36 == 0 ) break; if ( (unsigned int)v36 > 0x8000 ) v17 = 0x8000; v18 = v33; if ( v33 > v17 ) v18 = v17; v16 += v17; record_retry = buffer_pair_validate(SYM, v17, v48); if ( record_retry != 0 ) goto LABEL_48; v19 = (unsigned int)v36 <= 0x8000 ? hash_compare_digest(a37, v17, v16, v42, v15) : hash_oneshot_65(a37, v17, v15, 0); record_retry = v19; if ( v19 != 0 ) goto LABEL_48; if ( v18 != 0 ) { cache_op_select(a0); if ( a0 == 86 ) { v18 = v33; v20 = key_slot_find(a4 + 256, v33); } else { v20 = ecc_verify_wrapper(v10, v18, v47, a37); } record_retry = v20; if ( v20 != 0 ) goto LABEL_48; v33 -= v18; } v36 -= v17; v48 += v17; if ( v47 == 0 ) v10 += v18; } record_retry = digest_dispatch(v29, v28, v27, v26, v35, v34, (int)v42, v15); if ( record_retry != 0 ) { ecc_point_op(v38, v47, v25); } else { v21 = v11 + (v30 << 8); *(_WORD *)a8 = *(_WORD *)(v21 + 208); *(_BYTE *)(a8 + 2) = *(_BYTE *)(v21 + 210); v22 = v11 + (v30 << 8); if ( (*(_DWORD *)(v22 + 24) != 1 || (record_retry = key_unwrap(v22, v38 - 256, 0, 0)) == 0) && (v33 == 0 || (record_retry = ecc_verify_wrapper(v10, v33, v47, v48)) == 0) ) { v23 = SYM; *a5 = *(_DWORD *)(((unsigned int)v41 & 0xFFFFFFE0) + (v30 << 8) + 0x14) + *(_DWORD *)(((unsigned int)v41 & 0xFFFFFFE0) + (v30 << 8) + 0x70); *a6 = *(_DWORD *)(((unsigned int)v41 & 0xFFFFFFE0) + (v30 << 8) + 0x14); *(_DWORD *)(v23 + 4 * a0) = *(_DWORD *)(((unsigned int)v41 & 0xFFFFFFE0) + 0x60); v24 = (unsigned int *)SYM; *(_DWORD *)(SYM + 4 * a0) = *(_DWORD *)(((unsigned int)v41 & 0xFFFFFFE0) + 0x4C); if ( a0 == 13 ) { *v24 = v25; } else if ( a0 == 58 ) { v24[7] = v25; } } } } } break; } } LABEL_48: __asm { SVC 0x5F ; '_' } return record_retry; }", "mbox_buffer_map": "int __fastcall mbox_buffer_map() { unsigned int v0; unsigned int v1; int header; unsigned __int64 v2; int *v3; int *v4; int v5; int v6; int v7; int v8; int a9; int v10; unsigned __int8 v11[4]; int v12; int v13; int v14; int v15; a9 = 0; v10 = 0; v11[0] = -1; v0 = *((_DWORD *)SYM + 411); v1 = *((_DWORD *)SYM + 412); header = map_client_buffer(v1, v0, 0x40000u, v11, &v13, 0, 1, 0xFFFFu); if ( header != 0 ) goto LABEL_10; if ( *(_DWORD *)(v13 + 16) != SYM ) { header = SYM; LABEL_10: fw_slots_release_all(); goto LABEL_13; } v2 = __PAIR64__(v1, 0) + v0; v3 = SYM; v4 = SYM + 4; *((_QWORD *)SYM + 3) = v2; if ( read_reg_pair(v2, SHIDWORD(v2), v4) != 0 ) return header; __asm { SVC 0x6D ; 'm' } header = v11[0]; if ( v11[0] != 0 ) goto LABEL_10; header = spirom_read_header(); if ( header != 0 ) goto LABEL_10; header = loadfw_configure_engine(51, v5, v6); if ( header != 0 ) goto LABEL_10; header = verify_image_signature(0x33u, 0, 0x40000u, 0, 0, 0, 0x40000u, &a9, &v10, &v12, (int)&v14, &v15); if ( header != 0 ) goto LABEL_10; v8 = a9; v3[2] = a9; header = loadfw_validate_type(51, 0xFFFF, v8, v7); fuse_write_thunk(v12, 51, v15, 0xFFFF, 255, 2, 1, v14); if ( header != 0 ) goto LABEL_10; LABEL_13: if ( v11[0] != 255 ) __asm { SVC 0x6C ; 'l' } return header; }", "ret_err_000A_28": "int __fastcall ret_err_000A_28() { return SYM; }", "sysdrv_vccc_request": "int __fastcall sysdrv_vccc_request(__int64 *a0) { BOOL v1; __int64 v2; __int64 v3; int v4; int v5; int v6; int v7; int boot_params; int *v8; _BYTE *v9; int v10; int v11; _BYTE v12[225]; _BYTE dst[32]; _BYTE v13[32]; _BYTE v14[32]; _DWORD a[4]; a[2] = *(_DWORD *)SYM; v1 = false; v2 = *a0; v3 = a0[1]; v4 = *((_DWORD *)a0 + 1); v9 = nullptr; v10 = 0; v11 = 0; bzero_core(dst, 0x20u); a[0] = 0; a[1] = 0; bzero_core(v13, 0x20u); bzero_core(v14, 0x20u); if ( v4 != 132 || HIDWORD(v3) != 4 ) return SYM; if ( *(unsigned __int8 *)v2 << 31 != 0 && *(_DWORD *)(v2 + 4) == 128 && get_chip_id_pair(a, 8) == 0 ) { v6 = memcmp_be(a, (const void *)(v2 + 36), 8u); if ( v6 == 0 ) { __asm { SVC 0x66 ; 'f' } v7 = (unsigned __int8)v6; v9 = dst; v10 = 32; v11 = SYM; if ( digest_size_for_alg(&v9) == 0 ) { bzero((void *)((unsigned int)v12 & 0xFFFFFFE0), 0xE0u); if ( kdf_sp800108_ctr( v7, (int)dst, 32, aVcccServer, v2 + 36, 16, (int)v13, 0x20u, 2, (unsigned int)v12 & 0xFFFFFFE0) == 0 && hmac_sha256(v7, SYM, (int)v13, 32, v2 + 4, *(_DWORD *)(v2 + 4) - 32, (int)v14, 32) == 0 ) { v1 = ct_memcmp(v14, (const void *)(v2 + 100), 0x20u) == 0; } } } } boot_params = read_boot_params(SYM); v8 = SYM - 3; if ( boot_params == 0 ) { if ( v1 ) *SYM &= *(_DWORD *)(v2 + 92); boot_params = dram_window_get(0, v8[3]); if ( boot_params == 0 ) boot_params = dram_window_get(1u, v8[3]); } v5 = boot_params; *(_DWORD *)v3 = *(_DWORD *)(HIDWORD(v3) + 0xC); return v5; }", "mbox_slot_select": "int __fastcall mbox_slot_select() { char *v0; char v1; v0 = SYM - 2; if ( *SYM == 1 ) v1 = v0[28]; else v1 = v0[32]; if ( SYM[1] == v1 ) return 0; else return SYM; }", "reg_read_nop2": "int __fastcall reg_read_nop2(int a0) { __asm { SVC 0x7B ; '{' } return 0; }", "range_scan_entries": "int __fastcall range_scan_entries(unsigned __int64 a0, unsigned int a1, int a2) { int v3; unsigned __int64 v4; int v5; int v6; unsigned __int64 v7; unsigned __int64 v8; v3 = 0; v4 = a0 + a1; if ( v4 < a0 ) return SYM; v5 = 0; while ( 1 ) { v6 = SYM + 32 * v5; if ( *(_DWORD *)(v6 + 1304) != 0 ) { v7 = *(_QWORD *)(v6 + 1308); v8 = *(unsigned int *)(v6 + 1324) + v7; if ( v7 >= a0 && v7 < v4 ) break; if ( a0 < v8 && v4 >= v8 ) break; } if ( (unsigned int)++v5 >= 0xA ) return v3; } return SYM; }", "spi_wait_ready_long": "int __fastcall spi_wait_ready_long(int a0, int a1, int a2, int a3) { unsigned int v4; unsigned int v5; char *v6; int v7; _BYTE *v8; int v9; v9 = a3; v4 = 0; v5 = SYM; v6 = SYM; LOBYTE(v9) = 0; while ( 1 ) { delay_us(1); ++v4; v7 = ((int (__fastcall *)(int, _DWORD, _DWORD, _DWORD, int *, int))SYM)( *((_DWORD *)v6 + 1) + 44, 0, 0, 0, &v9, 1); if ( v7 != 0 ) break; v8 = *((_BYTE **)v6 + 1); if ( ((1 << v8[31]) & (unsigned __int8)v9) != (unsigned __int8)v8[32] && ((1 << v8[30]) & (unsigned __int8)v9) != (unsigned __int8)v8[33] ) { return v7; } if ( v4 > v5 ) { v7 = SYM; break; } } log_event(8u, 15); log_event(6u, v7); return v7; }", "flash_id_retry": "int __fastcall flash_id_retry(_DWORD *a0, _BYTE *a1) { unsigned __int64 hw_counter_us; int result; int v2; hw_counter_us = read_hw_counter_us(); do { result = flash_read_jedec_id(a0, a1); if ( result != 0 ) break; if ( *a1 != 0 ) break; __asm { SVC 0x56 ; 'V' } result = deadline_expired(hw_counter_us, 0x3E8u, v2); } while ( result == 0 ); return result; }", "reg_poll_timeout": "int __fastcall reg_poll_timeout(unsigned int a0) { unsigned int v1; v1 = 0; do { __asm { SVC 0x7B ; '{' } delay_us(10); v1 += 10; } while ( v1 < a0 ); return SYM; }", "retry_with_timeout": "int __fastcall retry_with_timeout(_DWORD *a0, _DWORD *a1) { int result; unsigned __int64 hw_counter_us; int v2; __int64 v3; int v4; _BYTE v5[4]; int v6; _DWORD v7[2]; _DWORD *v8; _DWORD *v9; v8 = a0; v9 = a1; v7[1] = *(_DWORD *)SYM; v7[0] = 0; result = flash_id_retry(a0, v5); if ( result == 0 ) { hw_counter_us = read_hw_counter_us(); v2 = SYM; v3 = hw_counter_us; do { result = fifo_transfer(v8, 8, SYM, 2u, (int)v7, &v6, 1u); if ( result != 0 ) break; *a1 = LOBYTE(v7[0]); *(_BYTE *)(v2 + 2) = v5[0]; result = retry_op_3x(v8, 8, SYM, 3u); if ( result != 0 ) break; result = flash_read_jedec_id(v8, v5); if ( result != 0 ) break; if ( v5[0] == 0 ) break; result = deadline_expired(v3, 0x3E8u, v4); } while ( result == 0 ); } return result; }", "ret_zero_9": "int __fastcall ret_zero_9() { return 0; }", "session_record_store": "int __fastcall session_record_store(_DWORD *a0, unsigned int a1) { int result; int v2; int v3; unsigned int v4; int v5; int v6; int v7; int v8; result = session_hmac_verify(a1); if ( result == 0 ) { v2 = SYM + 96 * a1; v3 = a0[1]; v4 = -v3 & 0xF; if ( v3 + v4 + 80 <= a0[3] ) { v5 = a0[2]; bzero_core((void *)v5, 0x50u); *(_DWORD *)(v5 + 48) = a0[1] + v4 + 80; *(_DWORD *)(v5 + 52) = a0[1]; *(_DWORD *)(v5 + 56) = v4; if ( v4 != 0 ) bzero((void *)(a0[1] + v5 + 80), v4); memcpy_thunk(v5 + 80); result = rand_fill_bytes((_BYTE *)(v5 + 32), 0x10u, v6, v7); if ( result == 0 ) { v8 = *(_DWORD *)(v5 + 48) - 32; result = aes_cmac_compute(a1, v2, 16, v5 + 32, 0x10u, SYM, v5 + 80, a0[1] + v4, v5 + 80, 0); if ( result == 0 ) return hmac_sha256(a1, SYM, v2 + 16, 32, v5 + 32, v8, v5, 32); } } else { return SYM; } } return result; }", "session_record_update": "int __fastcall session_record_update(int a0, int a1, int a2, int a3, unsigned int a4) { int result; result = session_hmac_verify(a4); if ( result == 0 ) { if ( a3 == 32 ) return hmac_sha256(a4, SYM, SYM + 96 * a4 + 16, 32, a0, a1, a2, 32); else return SYM; } return result; }", "tlv_buffer_copy": "int __fastcall tlv_buffer_copy(int *a0, unsigned int a1) { int v2; unsigned int v3; unsigned int i; int v4; _QWORD v5[64]; v2 = SYM; if ( a0 != nullptr ) { if ( a1 > 0x200 ) return SYM + 2; if ( a1 << 29 == 0 ) { memcpy(v5, a0, a1); v3 = a1 >> 3; for ( i = 0; i < v3; ++i ) { if ( fw_teardown_all(v5[i]) == 0 ) return SYM - 9; v4 = v5[i]; __asm { SVC 0x7C ; '|' } v2 = v4; } return v2; } } return SYM - 4; }", "status_word_store": "unsigned int __fastcall status_word_store(unsigned int result, int a0) { char *v1; v1 = (char *)*SYM + 4 * result; if ( result >= 0x20 ) { result -= 32; if ( result < 0x48 ) *((_DWORD *)v1 + 576) = a0; } else { *((_DWORD *)v1 + 320) = a0; } return result; }", "tlv_response_build": "int __fastcall tlv_response_build(int a0) { unsigned __int8 v1; int v2; int v3; int *v4; unsigned int v5; int device_desc; __int16 v6; int v7; int *v8; unsigned int a[8]; _WORD v9[2]; int v10; unsigned int v11; int v12; int v13; _BYTE dst[56]; _DWORD src[10]; src[8] = *(_DWORD *)SYM; v1 = (unsigned __int8)bzero_core(dst, 0x38u); __asm { SVC 0x66 ; 'f' } v2 = v1; bzero_core(src, 0x20u); bzero_core(a, 0x38u); if ( a0 == 0 ) return SYM + 5; if ( *SYM == nullptr ) return SYM + 6; v3 = SYM; if ( *(_DWORD *)(SYM + 4) > 0xAu ) return SYM; v4 = (int *)SYM; v5 = (*SYM)[10]; if ( v5 > *((_DWORD *)*SYM + 2) ) return SYM; v9[0] = (*SYM)[8]; v6 = HIWORD((*SYM)[8]); v11 = v5 + 1; v9[1] = v6; v10 = 1; v12 = *(_DWORD *)a0; v13 |= *(_BYTE *)(a0 + 8) & 1 & *(_BYTE *)(a0 + 12) & 1; v7 = hmac_sha256(v2, SYM, SYM, 32, (int)v9, 24, (int)src, 32); if ( v7 != 0 ) return v7; memcpy(a, src, sizeof(a)); v8 = (int *)(SYM + 8); v7 = spi_write_status(a, *(_DWORD *)(SYM + 8), 0x38u); if ( v7 != 0 ) return v7; device_desc = spi_load_device_desc(dst, *v8, 0x38u, 0); if ( device_desc == 0 ) { if ( memcmp_be(a, dst, 0x38u) != 0 ) { return SYM; } else { ++*(_DWORD *)(v3 + 4); v4[10] = v11; v4[9] = v10; v4[11] = v12; v4[12] = v13; } } return device_desc; }", "instance_mask_build": "int __fastcall instance_mask_build(unsigned int a0, int a1, int a2) { int v3; unsigned int v4; unsigned int i; int result; v3 = 0; v4 = (unsigned __int8)feature_entry_get(a0); if ( v4 != 0 ) { for ( i = 0; i < v4; i = (unsigned __int8)(i + 1) ) { if ( feature_enabled(a0, i) ) { result = a1 + v3; __asm { SVC 0x7C ; '|' } if ( a1 + v3 != 0 ) return result; } v3 += select_mem_attr(a0); } } return 0; }", "reg_write_sized": "int __fastcall reg_write_sized(int a0, int a1, int a2, int a3) { int result; result = a1; if ( a3 != 4 && a3 != 2 && a3 != 1 ) return SYM; __asm { SVC 0x95 } return result; }", "pcie_port_reg_write": "unsigned int __fastcall pcie_port_reg_write(int a0, int a1, int a2) { unsigned int v3; v3 = a1 + 24 * a0; if ( v3 >= 0x180 ) return SYM; __asm { SVC 0x7C ; '|' } return v3 + SYM; }", "tlv_field_write": "int __fastcall tlv_field_write(unsigned int *a0, int a1, int a2) { char *v3; int v4; char *v5; char *v6; unsigned int v7; unsigned int v8; int v9; int v10; if ( *SYM == 0 ) return SYM; v3 = (char *)SYM; v4 = SYM; v5 = (char *)SYM + 64; v6 = (char *)SYM + 0x4000; while ( *((_DWORD *)v5 + 3) == v4 ) { if ( memcmp_be(v5 + 16, a0, 0x10u) == 0 ) return SYM; v5 += *((unsigned __int16 *)v5 + 4); if ( v5 > v6 ) return SYM - 2; } if ( &v5[a2 + 32] > v6 ) return SYM; memcpy_thunk((int)(v5 + 16)); memcpy_thunk((int)(v5 + 32)); v7 = (a2 + 15) & 0xFFFFFFF0; if ( v7 != a2 ) bzero(&v5[a2 + 32], v7 - a2); *((_DWORD *)v5 + 3) = v4; *((_WORD *)v5 + 2) = 1; *((_WORD *)v5 + 5) = a2; *((_WORD *)v5 + 4) = v7 + 32; *(_DWORD *)v5 = checksum16((unsigned __int16 *)v5 + 16, (unsigned __int16)a2); if ( *(_DWORD *)v3 == -1 ) { v9 = 0; *(_DWORD *)v3 = SYM; *((_DWORD *)v3 + 1) = 0x4000; v10 = *((unsigned __int16 *)v5 + 4); v5 = v3; v8 = v10 + 64; } else { v8 = *((unsigned __int16 *)v5 + 4); v9 = v5 - v3; } return spi_write_verified(4u, 0, v9, v8, (unsigned int *)v5, 0); }", "ret_err_000A_29": "int __fastcall ret_err_000A_29() { return SYM; }", "ret_zero_10": "int __fastcall ret_zero_10() { return 0; }", "sysdrv_get_tee_capability": "int __fastcall sysdrv_get_tee_capability(bool *a0) { int result; bool v1; result = 0; if ( *SYM[0] == 24 ) { v1 = *SYM != 0 && *((_DWORD *)SYM + 2) > 1u; *a0 = v1; } return result; }", "ret_zero_11": "int __fastcall ret_zero_11() { return 0; }", "ret_zero_12": "int __fastcall ret_zero_12() { return 0; }", "ret_err_0008": "int __fastcall ret_err_0008() { return SYM; }", "ret_zero_13": "int __fastcall ret_zero_13() { return 0; }", "ret_err_0008_1": "int __fastcall ret_err_0008_1() { return SYM; }", "parity_over_bits": "int __fastcall parity_over_bits(unsigned int a0, int a1, unsigned int a2) { int v3; unsigned int i; v3 = 0; for ( i = 0; i < a2; ++i ) v3 ^= a0 >> *(_BYTE *)(a1 + i); return v3 & 1; }", "ret_not_supported": "int __fastcall ret_not_supported() { return SYM; }", "mbox_slot_clear": "int __fastcall mbox_slot_clear() { int *v0; v0 = SYM; __asm { SVC 0x5E ; '^' } if ( SYM[2] != 0 ) SYM[2] = 0; __asm { SVC 0x5F ; '_' } return *v0; }", "mbox_flag_read": "int __fastcall mbox_flag_read(_DWORD *a0) { int *v1; v1 = SYM; __asm { SVC 0x5E ; '^' } *a0 = (unsigned __int8)SYM[2]; __asm { SVC 0x5F ; '_' } return *v1; }", "is_digit_ascii": "BOOL __fastcall is_digit_ascii(int a0) { return (unsigned int)(a0 - 48) < 0xA; }", "deadline_expired": "int __fastcall deadline_expired(__int64 a0, unsigned int a1, int a2) { if ( 1000 * (unsigned __int64)a1 >= read_hw_counter_us() - a0 ) return 0; else return SYM; }", "fw_slot_scan_a": "int __fastcall fw_slot_scan_a(int a0) { unsigned int i; unsigned int j; int v1; for ( i = 0; i < 6; i = (unsigned __int8)(i + 1) ) { for ( j = 0; j < 2; j = (unsigned __int8)(j + 1) ) { v1 = (i << 25) + (j << 16); if ( v1 + SYM == a0 || v1 + SYM + 8 == a0 ) return 1; } } return 0; }", "fw_slot_scan_b": "int __fastcall fw_slot_scan_b(unsigned int a0) { unsigned int i; unsigned int j; int v1; for ( i = 0; i < 6; i = (unsigned __int8)(i + 1) ) { for ( j = 0; j < 2; j = (unsigned __int8)(j + 1) ) { v1 = (i << 25) + (j << 16); if ( v1 + SYM <= a0 && v1 + SYM + 28 >= a0 ) return 1; } } return 0; }", "fw_slot_scan_c": "int __fastcall fw_slot_scan_c(unsigned int a0) { unsigned int i; unsigned int j; int v1; for ( i = 0; i < 6; i = (unsigned __int8)(i + 1) ) { for ( j = 0; j < 2; j = (unsigned __int8)(j + 1) ) { v1 = (i << 25) + (j << 16); if ( v1 + SYM <= a0 && v1 + SYM + 8 >= a0 ) return 1; } } return 0; }", "fw_slot_any_busy": "BOOL __fastcall fw_slot_any_busy(unsigned int a0) { unsigned int i; unsigned int v1; unsigned int j; int v2; for ( i = 0; i < 6; i = (unsigned __int8)(i + 1) ) { v1 = 0; while ( 2 ) { for ( j = 0; j < 2; j = (unsigned __int8)(j + 1) ) { v2 = (i << 25) + (j << 12) + (v1 << 16); if ( v2 + SYM <= a0 && v2 + SYM + 152 >= a0 ) return (i << 25) + (j << 12) + (v1 << 16) + SYM + 44 != a0 && SYM + 72 + v2 != a0 && SYM + 76 + v2 != a0; } v1 = (unsigned __int8)(v1 + 1); if ( v1 < 2 ) continue; break; } } return false; }", "mbox_seq_get": "int __fastcall mbox_seq_get() { return *((unsigned __int16 *)SYM + 2); }", "ringbuf_status": "int __fastcall ringbuf_status(_WORD *a0, _WORD *a1) { int result; *a0 = *((_WORD *)SYM + 1); result = ringbuf_used(*SYM); *a1 = result; return result; }", "tlv_emit_record": "int __fastcall tlv_emit_record(int a0, int a1) { int *v2; unsigned int v3; unsigned int v4; unsigned int v5; _WORD *v6; v2 = SYM; *(_DWORD *)a1 = 0; v3 = ringbuf_read(*v2, a0, 0x10u); v4 = *(unsigned __int8 *)(a0 + 9); if ( v4 - 1 > 0x27 ) return 11; v5 = ringbuf_read(*v2, a0 + 16, v4) + v3; if ( *(unsigned __int8 *)(a0 + 9) + 16 != v5 ) return 12; v6 = SYM; *(_DWORD *)a1 = v5; if ( v6[1] != 0 ) --v6[1]; return 0; }", "tlv_len_check": "int __fastcall tlv_len_check(int a0, _DWORD *a1) { _DWORD *v2; int v3; v2 = SYM; v3 = *((_DWORD *)SYM + 2); if ( *(unsigned __int16 *)(a0 + 4) > (unsigned int)*((unsigned __int16 *)SYM + 2) ) return 15; *(_DWORD *)SYM = *(_DWORD *)a0; v2[1] = *(_DWORD *)(a0 + 4); memcpy_thunk(v3); *a1 = *(unsigned __int16 *)(a0 + 4) + 12; return 0; }", "tlv_emit_block3": "int __fastcall tlv_emit_block3(int a0) { _DWORD *v1; v1 = SYM; buf_append_dword(a0, *(_DWORD *)SYM); buf_append_dword(a0, *((unsigned __int16 *)v1 + 2)); return buf_append_dword(a0, v1[2]); }", "tlv_copy_bounded": "unsigned int __fastcall tlv_copy_bounded(unsigned int *a0) { int v1; unsigned int v2; unsigned int result; v1 = *((unsigned __int16 *)SYM + 2); memcpy_thunk(*a0); v2 = a0[1] + 4 * ((unsigned int)(v1 + 3) >> 2); a0[1] = v2; result = v2 + *a0; *a0 = result; return result; }", "tlv_payload_trim": "int __fastcall tlv_payload_trim(int a0) { int v1; unsigned int v2; int v3; unsigned int v4; BOOL v5; int v6; unsigned __int64 _4097; int *v7; unsigned int v8; unsigned int v9; _WORD *v10; unsigned int v11; int v12; int v13; v1 = a0 + 15; v2 = 0; v3 = *(unsigned __int8 *)(a0 + 9); if ( *(_BYTE *)(v3 + v1) != 0 ) return 3; v4 = v3 - 1; while ( v4 > v2 && *(_BYTE *)(a0 + v2 + 16) != 0 ) { if ( (unsigned int)*(unsigned __int8 *)(a0 + v2 + 16) - 32 >= 0x5F ) return 3; ++v2; } v5 = tlv_type_valid(a0); if ( !v5 ) return 3; _4097 = mbox_read_4097(v5, v6); v7 = SYM; *(_QWORD *)a0 = _4097; v8 = *(unsigned __int8 *)(a0 + 9) + 16; v9 = ringbuf_write(*v7, a0, v8); v10 = SYM; if ( v9 == 0 ) { v13 = 0; v11 = 0; while ( v11 < v8 && tlv_emit_record((int)&v12, (int)&v13) == 0 && v13 != 0 ) { v11 += v13; ++*v10; } v9 = ringbuf_write(*v7, a0, v8); } if ( v9 != v8 ) return 4; ++v10[1]; return 0; }", "tlv_seq_check": "int __fastcall tlv_seq_check(int a0, int a1) { _WORD *v2; _WORD *v3; v2 = (_WORD *)(a0 + 12); if ( *(_DWORD *)(a0 + 4) != *((_DWORD *)SYM + 1) ) return 15; if ( *(unsigned __int16 *)(a0 + 8) != *((unsigned __int16 *)SYM + 4) ) return 15; v3 = (_WORD *)((char *)SYM + 12); if ( v2[5] != *((_WORD *)SYM + 11) ) return 15; *v3 = *v2; v3[1] = v2[1]; *(_DWORD *)a1 = 40; return 0; }", "tlv_emit_block4": "int __fastcall tlv_emit_block4(int a0) { _DWORD *v1; v1 = SYM; buf_append_dword(a0, *(_DWORD *)SYM); buf_append_dword(a0, v1[1]); return buf_append_dword(a0, v1[2]); }", "tlv_state_reset": "int __fastcall tlv_state_reset() { _DWORD *v0; nop_hook_E228BC(); v0 = SYM; *(_DWORD *)SYM = 0; v0[1] = 0; v0[2] = 0; return 0; }", "tlv_emit_trailer": "int __fastcall tlv_emit_trailer(int a0, int a1, int a2, int a3) { _DWORD *v4; mbox_drain_pairs(a0, a1, a2, a3); bzero_core((void *)SYM, 0x1Cu); v4 = (_DWORD *)(SYM - 12); *v4 = 0; v4[1] = 0; v4[2] = 0; return 0; }", "mbox_drain_pairs": "void *__fastcall mbox_drain_pairs(int a0, int a1, int a2, int a3) { unsigned int v4; int v5; unsigned int v6; _DWORD v7[2]; v7[0] = a2; v7[1] = a3; v4 = *((unsigned __int16 *)SYM + 5) >> 3; v5 = 0; v6 = 0; v7[0] = 0; v7[1] = 0; while ( v6 < v4 && v6 < 0x400 ) { v5 = mbox_write_pairs((int)v7, 8u); v6 = (unsigned __int16)(v6 + 1); } return mbox_strobe_sequence(v5, a1, a2, a3); }", "mbox_backlog_get": "int __fastcall mbox_backlog_get() { return *((unsigned __int16 *)SYM + 5); }", "tlv_header_init": "int __fastcall tlv_header_init(int a0) { if ( a0 == 0 ) return 2; *(_DWORD *)a0 = 0; *(_DWORD *)(a0 + 4) = 0; *(_WORD *)a0 = -12885; *(_BYTE *)(a0 + 2) = -91; *(_BYTE *)(a0 + 3) = -76; *(_WORD *)(a0 + 4) = *((_WORD *)SYM + 4); *(_WORD *)(a0 + 6) = (unsigned int)(6554 * *((_DWORD *)SYM - 2)) >> 16; return 0; }", "mbox_strobe_sequence": "_DWORD *__fastcall mbox_strobe_sequence(int a0, int a1, int a2, int a3) { _DWORD *result; int v4; int v5; v4 = a2; v5 = a3; mbox_read_response(&v4, &v5, 12288); v4 |= 0x10u; mbox_write_response(v4, v5, 12288); v4 &= ~0x10u; mbox_write_response(v4, v5, 12288); v4 &= ~0x20u; mbox_write_response(v4, v5, 12288); mbox_write_response(0, 0, 12289); result = SYM; *(_WORD *)SYM = 0; return result; }", "tlv_emit_block2": "int __fastcall tlv_emit_block2(int a0) { int *v1; v1 = (int *)SYM; buf_append_dword(a0, *(_DWORD *)SYM); buf_append_dword(a0, v1[1]); buf_append_dword(a0, v1[2]); buf_append_dword(a0, v1[3]); buf_append_dword(a0, v1[4]); buf_append_dword(a0, v1[5]); return buf_append_dword(a0, v1[6]); }", "mbox_clear_flag": "__int64 __fastcall mbox_clear_flag(int a0) { unsigned int v1; unsigned int i; __int64 v2; int v3; int v4; v2 = 0; v3 = 0; v4 = 0; mbox_read_response(&v3, &v4, 12288); v3 &= ~0x100u; mbox_write_response(v3, v4, 12288); mbox_read_response(&v2, (_DWORD *)&v2 + 1, 12289); LODWORD(v2) = v2 & 0xBFFFFC00; v1 = *((unsigned __int16 *)SYM + 5) >> 3; for ( i = 0; i < v1 && i < 0x400; ++i ) { mbox_write_response(v2 | i, SHIDWORD(v2), 12289); mbox_read_response(&v3, &v4, 12291); buf_append_dword(a0, v3); buf_append_dword(a0, v4); } return v2; }", "mbox_request_parse": "int __fastcall mbox_request_parse() { unsigned __int16 *v0; int v1; int result; int v2; int v3; int v4; int v5; unsigned int v6; unsigned int v7; unsigned __int16 v8; unsigned int i; _DWORD v9[2]; _DWORD dst[2]; unsigned __int8 v10; int v11; int v12; __int16 v13; _BYTE v14[8]; unsigned __int16 v15; int v16; bzero_core(dst, 0x38u); v0 = (unsigned __int16 *)SYM; v1 = (unsigned __int16)(*((_WORD *)SYM + 5) - 16); if ( *((_DWORD *)SYM + 1) != 2 ) return 14; ringbuf_status(&v15, &v13); if ( v15 == 0 || v13 == 0 ) return 0; v4 = (unsigned __int8)*SYM[0]; if ( *SYM[0] != 0 ) { *SYM[0] = 0; v5 = (unsigned __int8)*SYM; if ( *SYM == 0 || (v5 = *v0, *v0 == 0) ) { mbox_drain_pairs(v5, v4, v2, v3); tlv_header_init((int)v14); mbox_write_pairs((int)v14, 8u); } } v13 += v13 & 7; v6 = v0[5]; v7 = (unsigned __int16)(v13 + *v0); if ( v6 < v7 ) { mbox_strobe_sequence(v7, v6, v2, v3); tlv_header_init((int)v14); mbox_write_pairs((int)v14, 8u); v13 = v1; v15 = (unsigned __int16)((unsigned int)(18725 * v1) >> 16) >> 4; } v8 = v0[1]; LOWORD(v12) = v15; LOWORD(v11) = 13330; HIWORD(v11) = v8; HIWORD(v12) = v13; v0[1] = v8 + 1; mbox_write_pairs((int)&v11, 8u); for ( i = 0; i < v15; i = (unsigned __int16)(i + 1) ) { bzero_core(dst, 0x38u); v16 = 0; if ( tlv_emit_record((int)dst, (int)&v16) != 0 || v16 == 0 ) break; result = mbox_write_pairs((int)dst, v10 + 16); if ( result != 0 ) return result; } v9[0] = v11 ^ dst[0]; v9[1] = v12 ^ dst[1]; return mbox_write_pairs((int)v9, 8u); }", "bus_settle_delay": "int __fastcall bus_settle_delay(int a0) { __asm { SVC 0x7C ; '|' } return delay_us_busy(10000); }", "mbox_read_4097": "unsigned __int64 __fastcall mbox_read_4097(int a0, int a1) { __int64 v2; mbox_read_response(&v2, (_DWORD *)&v2 + 1, 4097); return v2 & (*((unsigned int *)SYM + 3) | 0xFFFFFFFF00000000LL); }", "mbox_field1_get": "int __fastcall mbox_field1_get() { return *((_DWORD *)SYM + 1); }", "mbox_pair_get": "int __fastcall mbox_pair_get(int a0, int a1) { unsigned __int16 *v2; int result; v2 = (unsigned __int16 *)SYM; *(_WORD *)a0 = *(_WORD *)SYM; result = v2[1]; *(_WORD *)a1 = result; return result; }", "ret_const_18": "int __fastcall ret_const_18() { return 24; }", "mbox_pair_exchange": "int __fastcall mbox_pair_exchange(int a0, int a1, int a2, int a3) { int result; _WORD v4[2]; _WORD v5[2]; v4[1] = HIWORD(a2); v5[1] = HIWORD(a3); v4[0] = 0; v5[0] = 0; mbox_pair_get((int)v4, (int)v5); *(_WORD *)(a0 + 2) = v4[0]; LOWORD(result) = v5[0]; HIWORD(result) = *(_DWORD *)a0; *(_DWORD *)a0 = result; return result; }", "spi_sector_align": "int __fastcall spi_sector_align(unsigned int a0, int a1, _DWORD *a2) { return range_to_sector_span(a0, a1, *(_DWORD *)(*((_DWORD *)SYM + 1) + 12) << 10, (int)a2); }", "mbox_state_clear": "int __fastcall mbox_state_clear(int a0) { _WORD *v1; int v2; __int64 v3; _DWORD *v4; if ( a0 == 0 ) return 2; v1 = SYM; *(_WORD *)SYM = 0; v1[1] = 0; v1[2] = 0; LODWORD(v3) = ret_const_18(); HIDWORD(v3) = *(unsigned __int16 *)(a0 + 4); if ( (unsigned int)v3 >= HIDWORD(v3) ) return 7; v1[2] = WORD2(v3); *((_DWORD *)v1 + 2) = *(_DWORD *)a0; LODWORD(v3) = *(_DWORD *)a0; v4 = ringbuf_from_pair(v3, v2); *SYM = (int)v4; if ( v4 == nullptr ) return 2; if ( ringbuf_is_empty((int)v4) ) return 0; return 4; }", "mbox_state_store": "int __fastcall mbox_state_store(__int64 *a0) { _WORD *v1; __int64 v2; char *v3; unsigned int v4; int v5; unsigned int v6; if ( a0 == nullptr ) return 2; v1 = SYM; v2 = *a0; *((_DWORD *)SYM + 2) = *((_DWORD *)a0 + 2); *(_QWORD *)v1 = v2; v3 = (char *)(v1 + 6); v1[6] = 0; v1[7] = 0; *((_DWORD *)v1 + 4) = 2; v1[10] = *((_WORD *)a0 + 5); v1[11] = *((_WORD *)a0 + 4); v4 = 1; v5 = -1; v6 = (unsigned int)(6554 * HIDWORD(v2)) >> 16; if ( v6 != 0 ) { while ( v4 <= v6 ) { v4 *= 2; v5 *= 2; } if ( v6 - (v4 >> 1) < v4 - v6 ) v5 >>= 1; } else { v5 = 0; } *((_DWORD *)v3 + 3) = v5; mbox_write_response(2032, 0, 0); mbox_write_response(124, 0, 0); mbox_write_response(0, 0x200000, 4096); mbox_write_response(126, 0, 0); return 0; }", "tlv_record_emit": "int __fastcall tlv_record_emit(int a0, unsigned int a1, char a2, int *a3) { _BYTE *v4; unsigned int v5; char *v6; char v7; bzero_core(SYM, 0x38u); v4 = SYM; v5 = 0; *((_BYTE *)SYM + 8) = a2; do { if ( v5 >= a1 ) break; v6 = &v4[v5]; v7 = *(_BYTE *)(a0 + v5); v5 = (unsigned __int8)(v5 + 1); v6[10] = v7; } while ( v5 < 4 ); strcmp_words((_BYTE *)SYM + 16, a3, 39); v4[9] = 40; return 0; }", "mbox_region_init": "int __fastcall mbox_region_init() { if ( *((_BYTE *)SYM + 24) == 0 ) return SYM + 7; region_size_lookup(1); __asm { SVC 0x7C ; '|' } if ( SYM == 0 ) { __asm { SVC 0x7C ; '|' } if ( SYM == -4 ) __asm { SVC 0x7C ; '|' } } return SYM; }", "opcode_to_index": "int __fastcall opcode_to_index(int a0) { int result; if ( a0 == 72 ) return 12; if ( a0 > 72 ) { switch ( a0 ) { case 'Q': result = 17; break; case 'R': result = 22; break; case 'W': result = 18; break; case 'X': result = 19; break; case 'Y': result = 20; break; case 'Z': result = 23; break; case '[': result = 24; break; case '\\\\': result = 25; break; case ']': result = 26; break; case '^': result = 27; break; case '_': result = 28; break; case '`': result = 29; break; case 'a': result = 30; break; default: return 0; } } else { if ( a0 == 21 ) return 4; if ( a0 > 21 ) { if ( a0 == 34 ) return 21; if ( a0 > 34 ) { if ( a0 == 48 ) return 9; if ( a0 == 71 ) return 11; } else { switch ( a0 ) { case 25: return 5; case 26: return 7; case 33: return 16; default: break; } } } else { if ( a0 == 7 ) return 6; if ( a0 > 7 ) { if ( a0 == 8 ) return 1; if ( a0 == 20 ) return 3; } else { switch ( a0 ) { case 1: return 14; case 2: return 13; case 4: return 15; default: break; } } } return 0; } return result; }", "platform_ids_collect": "int __fastcall platform_ids_collect() { int v0; int v1; unsigned int v2; int result; int *v3; int i; unsigned int *v4; int v5; int v6; unsigned __int8 v7[4]; _DWORD v8[3]; int v9; unsigned int v10; unsigned int v11; v0 = 0; v7[0] = -1; v11 = 0; memset(v8, 0, sizeof(v8)); v9 = 0; v10 = 0; __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7B ; '{' } __asm { SVC 0x7C ; '|' } v1 = 0; while ( (int)(~((v9 | v10) >> 16 >> v1) << 31) >> 31 != -1 ) { if ( ++v1 >= 8 ) goto LABEL_4; } v0 = v1; LABEL_4: v2 = (v0 << 20) | 0xC0000000; result = region_base_by_id(21, (int)&v11); if ( result == 0 ) { result = map_client_buffer( (*(_QWORD *)SYM + (unsigned __int64)v11) >> 32, *(_DWORD *)SYM + v11, 0xA000u, v7, v8, 0, 1, 0xFFFFu); if ( result == 0 ) { v3 = (int *)SYM; for ( i = 0; i < 5120; ++i ) { v4 = (unsigned int *)(v8[0] + 8 * i); v5 = *v4 & 0x3FFFF; v6 = 0; while ( v5 != (unsigned int)v3[v6] >> 2 ) { if ( (unsigned int)++v6 >= 0x44 ) goto LABEL_12; } *v4 = v2 | v5; LABEL_12: ; } if ( v7[0] != 255 ) __asm { SVC 0x6C ; 'l' } return 0; } } return result; }", "delay_us_busy": "int __fastcall delay_us_busy(int result) { int v0; unsigned __int64 hw_counter_us; unsigned int v1; unsigned int v2; unsigned int v3; unsigned __int64 v4; bool v5; v0 = result; if ( result != 0 ) { hw_counter_us = read_hw_counter_us(); v1 = hw_counter_us; v2 = v0 + 1; v3 = HIDWORD(hw_counter_us); do { v4 = read_hw_counter_us() - __PAIR64__(v3, v1); v5 = (unsigned int)v4 >= v2; result = v4 - v2; } while ( HIDWORD(v4) < !v5 ); } return result; }", "mbox_field_select": "int __fastcall mbox_field_select(int a0, _DWORD *a1, int a2, int a3) { int v4; v4 = 0; *a1 = 0; switch ( a0 ) { case 7: *a1 = SYM; break; case 8: v4 = mbox_poll_if_ready(); break; case 9: goto LABEL_4; case 10: mbox_seq_set(1); LABEL_4: mbox_pair_exchange((int)a1, (int)a1, a2, a3); break; case 11: mbox_seq_set(2); break; default: v4 = 3; break; } return v4; }", "mbox_read_response": "int __fastcall mbox_read_response(_DWORD *a0, _DWORD *a1, int a2) { void *v3; int result; v3 = SYM; **(_DWORD **)SYM = a2 & 0x7FFFFFFF; *a0 = *(_DWORD *)(*(_DWORD *)v3 + 4); result = *(_DWORD *)(*(_DWORD *)v3 + 8); *a1 = result; return result; }", "mbox_request_check": "int __fastcall mbox_request_check(_DWORD *a0, unsigned int a1, int a2, int a3) { int result; _DWORD *v4; int v5; int v6; int v7; int v8; v8 = a3; if ( mbox_seq_get() + 256 > a1 ) return 7; if ( *a0 != SYM ) return 15; v5 = a0[1]; v4 = a0 + 1; if ( (unsigned int)(v5 - 260) >= 7 ) return 15; v6 = (int)(v4 + 1); result = tlv_len_check(v6, &v8); if ( result == 0 ) { v7 = v6 + v8; result = mbox_field_read(v7, &v8); if ( result == 0 ) { result = tlv_seq_check(v8 + v7, (int)&v8); if ( result == 0 ) { *SYM = 1; return 0; } } } return result; }", "ringbuf_is_empty": "BOOL __fastcall ringbuf_is_empty(int a0) { return *(_BYTE *)(a0 + 16) == 0 && *(_DWORD *)(a0 + 4) == *(_DWORD *)(a0 + 8); }", "ringbuf_read": "unsigned int __fastcall ringbuf_read(int a0, int a1, unsigned int a2) { unsigned int v3; unsigned int v4; bool v5; __int64 v6; if ( ringbuf_used(a0) >= a2 ) { v4 = *(_DWORD *)(a0 + 12) - *(_DWORD *)(a0 + 8); if ( v4 > a2 ) v4 = a2; memcpy_thunk(a1); if ( v4 < a2 ) memcpy_thunk(a1 + v4); *(_BYTE *)(a0 + 16) = 0; v6 = *(_QWORD *)(a0 + 8); v5 = HIDWORD(v6) - (int)v6 > a2; LODWORD(v6) = v6 + a2; if ( !v5 ) LODWORD(v6) = v6 - HIDWORD(v6); v3 = a2; *(_DWORD *)(a0 + 8) = v6; } return v3; }", "mbox_field_read": "int __fastcall mbox_field_read(int a0, _DWORD *a1) { int v2; unsigned int v3; int v4; __int64 v5; int v6; unsigned int v7; int v8; v2 = SYM; v3 = *(_DWORD *)(SYM + 12); v4 = *(_DWORD *)SYM; if ( *(_DWORD *)(a0 + 12) > v3 ) return 15; memcpy_thunk(SYM); *(_DWORD *)v2 = v4; *(_DWORD *)(v2 + 12) = v3; if ( v3 > *(_DWORD *)(a0 + 12) ) { *(_BYTE *)(v2 + 16) = 0; v5 = *(_QWORD *)(v2 + 4); if ( HIDWORD(v5) > (unsigned int)v5 ) { v6 = *(_DWORD *)(a0 + 12); v7 = v3 - v6; memcpy_thunk(v6 + v4); if ( (unsigned int)v5 <= v7 ) { v8 = *(_DWORD *)(v2 + 4) + *(_DWORD *)(a0 + 12); } else { memcpy_thunk(*(_DWORD *)v2); v8 = *(_DWORD *)(v2 + 4) - v7; } *(_DWORD *)(v2 + 4) = v8; } } *a1 = 36; return 0; }", "tlv_emit_block": "int __fastcall tlv_emit_block(int a0) { _DWORD *v1; v1 = SYM; buf_append_dword(a0, *(_DWORD *)SYM); buf_append_dword(a0, v1[1]); buf_append_dword(a0, v1[2]); buf_append_dword(a0, v1[3]); buf_append_dword(a0, *((unsigned __int8 *)v1 + 16)); buf_append_dword(a0, v1[5]); buf_append_dword(a0, v1[6]); buf_append_dword(a0, v1[7]); return buf_append_dword(a0, v1[8]); }", "ringbuf_used": "int __fastcall ringbuf_used(int a0) { int result; __int64 v1; result = *(_DWORD *)(a0 + 12); if ( *(_BYTE *)(a0 + 16) == 0 ) { v1 = *(_QWORD *)(a0 + 4); if ( (unsigned int)v1 < HIDWORD(v1) ) return result + v1 - HIDWORD(v1); else return v1 - HIDWORD(v1); } return result; }", "ringbuf_write": "unsigned int __fastcall ringbuf_write(int a0, int a1, unsigned int a2) { unsigned int v3; __int64 v4; unsigned int v5; unsigned int v6; int v7; int v8; int v9; v3 = 0; v4 = *(_QWORD *)(a0 + 4); if ( (unsigned int)v4 < HIDWORD(v4) ) v5 = HIDWORD(v4) - v4; else v5 = HIDWORD(v4) + *(_DWORD *)(a0 + 12) - v4; if ( v5 >= a2 ) { v6 = *(_DWORD *)(a0 + 12) - v4; if ( v6 > a2 ) v6 = a2; memcpy_thunk(v4 + *(_DWORD *)a0); if ( v6 < a2 ) memcpy_thunk(*(_DWORD *)a0); v7 = *(_DWORD *)(a0 + 12); v8 = *(_DWORD *)(a0 + 4); if ( v7 - v8 > a2 ) v9 = v8 + a2; else v9 = v8 + a2 - v7; *(_DWORD *)(a0 + 4) = v9; v3 = a2; *(_BYTE *)(a0 + 16) = v9 == *(_DWORD *)(a0 + 8); } return v3; }", "nop_hook_E228BC": "void __fastcall nop_hook_E228BC() { ; }", "ringbuf_from_pair": "_DWORD *__fastcall ringbuf_from_pair(__int64 a0, int a1) { _DWORD *v2; if ( (_DWORD)a0 == 0 || HIDWORD(a0) == 0 ) return nullptr; v2 = SYM; *(_DWORD *)SYM = a0; LODWORD(a0) = 0; v2[1] = 0; *((_QWORD *)v2 + 1) = a0; *((_BYTE *)v2 + 16) = 0; return v2; }", "mbox_write_checked": "int __fastcall mbox_write_checked(int a0, unsigned int a1, int a2, int a3) { if ( a0 == 0 || a3 == 0 ) return 2; if ( a1 <= 4 && (unsigned int)(a2 - 1) < 5 ) return 0; return 3; }", "buf_append_dword": "int __fastcall buf_append_dword(int result, int a0) { **(_DWORD **)result = a0; *(_DWORD *)result += 4; *(_DWORD *)(result + 4) += 4; return result; }", "mbox_enqueue_seq": "int __fastcall mbox_enqueue_seq(unsigned int a0, unsigned int *a1, int a2, int a3) { int v4; unsigned int v5; unsigned int v6; unsigned int v7; v6 = a2; v7 = a3; if ( a1 == nullptr ) return 10; v4 = mbox_seq_get(); v5 = v4 + mbox_backlog_get() + 256; if ( *a1 >= v5 ) { if ( a0 != 0 ) { v6 = a0; v7 = 0; buf_append_dword((int)&v6, SYM); buf_append_dword((int)&v6, SYM); buf_append_dword((int)&v6, 266); buf_append_dword((int)&v6, SYM + 1); tlv_emit_block3((int)&v6); buf_append_dword((int)&v6, SYM + 2); tlv_copy_bounded(&v6); buf_append_dword((int)&v6, SYM + 3); tlv_emit_block((int)&v6); buf_append_dword((int)&v6, SYM + 4); tlv_emit_block4((int)&v6); buf_append_dword((int)&v6, SYM + 5); tlv_emit_block2((int)&v6); buf_append_dword((int)&v6, SYM + 6); mbox_clear_flag((int)&v6); buf_append_dword((int)&v6, SYM + 255); *a1 = v7; return 0; } else { return 2; } } else { *a1 = v5; return 7; } }", "mbox_seq_set": "int __fastcall mbox_seq_set(int result) { *((_DWORD *)SYM + 1) = result; return result; }", "tlv_field_scan": "unsigned int __fastcall tlv_field_scan(unsigned int a0, int a1, _WORD *a2) { unsigned int v3; unsigned int v4; int v5; bool v6; v3 = 0; v4 = (unsigned __int16)*a2; while ( v3 < a0 ) { LOBYTE(v5) = 1; do { v6 = ((unsigned __int8)(*(_BYTE *)(a1 + v3) & v5) != 0) == v4 >> 15; v4 = (unsigned __int16)(2 * v4); if ( !v6 ) v4 ^= 0x8005u; v5 = (unsigned __int8)(2 * v5); } while ( v5 != 0 ); v3 = (unsigned __int8)(v3 + 1); } *a2 = v4; return v4 >> 8; }", "tlv_request_validate": "int __fastcall tlv_request_validate(unsigned __int8 *a0, int a1) { int v2; int v3; int v4; int v5; int v6; char *v7; int v8; _DWORD *v9; unsigned int v10; unsigned int v11; int v12; char v13; _BYTE *v14; unsigned int v15; _BYTE *v16; char v17; _WORD *v18; unsigned int v19; int v20; v2 = *a0; if ( (v2 & 0x88) != 0 || (v2 & 2) == 0 && *((_DWORD *)a0 + 2) == 0 || v2 << 31 == 0 && *((_DWORD *)a0 + 1) == 0 || v2 << 30 != 0 && *((_DWORD *)a0 + 6) == 0 || (v2 & 0x20) != 0 && *((_DWORD *)a0 + 3) == 0 || (v2 & 0x10) != 0 && *((_DWORD *)a0 + 3) == 0 || (v2 & 0x40) != 0 && *((_DWORD *)a0 + 4) == 0 ) { return 8; } if ( v2 << 30 == 0 || (v3 = *((_DWORD *)a0 + 6), ((v4 = *(unsigned __int8 *)(v3 + 32)) & 0x40) == 0) && (v4 & 0x80) != 0 && v2 << 29 >> 31 == v4 << 27 >> 31 ) { v5 = a1 + 32; memcpy_thunk(a1); v6 = a1 + 64; memcpy_thunk(v5); *(_BYTE *)v6 = 8; *(_BYTE *)(v6 + 1) = *a0; *(_WORD *)(v6 + 2) = *((_WORD *)a0 + 1); v7 = (char *)(v6 + 4); if ( (*a0 & 0x10) != 0 ) { v8 = *((_DWORD *)a0 + 3); *(_DWORD *)v7 = *(_DWORD *)v8; *((_DWORD *)v7 + 1) = *(_DWORD *)(v8 + 4); *((_WORD *)v7 + 4) = *(_WORD *)(v8 + 8); v7[10] = *(_BYTE *)(v8 + 10); v7 += 11; } else { if ( (*a0 & 0x20) != 0 ) { v9 = *((_DWORD **)a0 + 3); *(_DWORD *)v7 = *v9; *((_DWORD *)v7 + 1) = v9[1]; v7 += 8; } else { LOBYTE(v10) = 0; do { v10 = (unsigned __int8)(v10 + 1); *v7++ = 0; } while ( v10 < 8 ); } LOBYTE(v11) = 0; do { v11 = (unsigned __int8)(v11 + 1); *v7++ = 0; } while ( v11 < 3 ); } v12 = *((_DWORD *)a0 + 4); if ( v12 != 0 ) v13 = *(_BYTE *)(v12 + 8); else v13 = -18; *v7 = v13; v14 = v7 + 1; if ( (*a0 & 0x40) != 0 ) { *(_DWORD *)v14 = *(_DWORD *)(*((_DWORD *)a0 + 4) + 4); v14 += 4; } else { LOBYTE(v15) = 0; do { v15 = (unsigned __int8)(v15 + 1); *v14++ = 0; } while ( v15 < 4 ); } v16 = *((_BYTE **)a0 + 4); if ( v16 != nullptr ) { *v14 = *v16; v17 = *(_BYTE *)(*((_DWORD *)a0 + 4) + 1); } else { *v14 = 1; v17 = 35; } v14[1] = v17; v18 = v14 + 2; if ( (*a0 & 0x40) != 0 ) { *v18 = *(_WORD *)(*((_DWORD *)a0 + 4) + 2); } else { LOBYTE(v19) = 0; do { v19 = (unsigned __int8)(v19 + 1); *(_BYTE *)v18 = 0; v18 = (_WORD *)((char *)v18 + 1); } while ( v19 < 2 ); } v20 = *((_DWORD *)a0 + 6); if ( v20 != 0 ) *(_BYTE *)(v20 + 32) &= ~0x80u; return 0; } else { *(_BYTE *)(v3 + 32) = v4 & 0x7F; return 9; } }", "mbox_finalize": "int __fastcall mbox_finalize(int a0, int a1, int a2, int a3) { char *v4; int result; v4 = SYM; if ( *SYM == 0 ) return 10; result = tlv_emit_trailer((unsigned __int8)*SYM, a1, a2, a3); if ( result == 0 ) { result = tlv_state_reset(); if ( result == 0 ) *v4 = 0; } return result; }", "mbox_poll_if_ready": "int __fastcall mbox_poll_if_ready() { if ( *SYM != 0 ) return mbox_request_parse(); else return 10; }", "mbox_state_query": "int __fastcall mbox_state_query(int *a0) { if ( a0 == nullptr ) return 2; if ( *SYM == 0 ) return 10; *a0 = mbox_field1_get(); return 0; }", "mbox_state_publish": "int __fastcall mbox_state_publish(__int64 *a0) { char *v1; int result; v1 = SYM; if ( *SYM != 0 ) return 9; result = mbox_state_store(a0); if ( result == 0 ) { result = mbox_state_clear((int)a0 + 12); if ( result == 0 ) *v1 = 1; } return result; }", "mbox_send_pair": "int __fastcall mbox_send_pair(int a0, unsigned int a1, char a2, int *a3) { int result; if ( *SYM == 0 ) return 10; result = mbox_write_checked(a0, a1, a2, (int)a3); if ( result == 0 ) return tlv_emit_and_send(a0, a1, a2, a3); return result; }", "mbox_read_checked": "int __fastcall mbox_read_checked(int a0, _DWORD *a1) { int v2; if ( a1 == nullptr ) return 2; if ( *SYM != 0 ) return mbox_field_select(a0, a1, (unsigned __int8)*SYM, v2); return 10; }", "mbox_write_guarded": "int __fastcall mbox_write_guarded(_DWORD *a0) { unsigned int v1; int v2; if ( *SYM == 0 ) return 10; if ( a0 != nullptr ) return mbox_request_check(a0, v1, (unsigned __int8)*SYM, v2); return 2; }", "mbox_dispatch_if_ready": "int __fastcall mbox_dispatch_if_ready() { unsigned int v0; unsigned int *v1; int v2; if ( *SYM != 0 ) return mbox_enqueue_seq(v0, v1, (unsigned __int8)*SYM, v2); else return 10; }", "tlv_emit_and_send": "int __fastcall tlv_emit_and_send(int a0, unsigned int a1, char a2, int *a3) { int result; result = tlv_record_emit(a0, a1, a2, a3); if ( result == 0 ) { tlv_payload_trim(SYM); return 0; } return result; }", "tlv_type_valid": "BOOL __fastcall tlv_type_valid(int a0) { return (unsigned int)*(unsigned __int8 *)(a0 + 8) - 1 < 5; }", "mbox_write_response": "int __fastcall mbox_write_response(int a0, int a1, int a2) { void *v3; int result; v3 = SYM; *(_DWORD *)(*(_DWORD *)SYM + 4) = a0; *(_DWORD *)(*(_DWORD *)v3 + 8) = a1; result = *(_DWORD *)v3; **(_DWORD **)v3 = a2 | 0x80000000; return result; }", "mbox_write_pairs": "int __fastcall mbox_write_pairs(int a0, unsigned int a1) { unsigned int i; if ( a1 << 29 != 0 ) return 3; for ( i = 0; i < a1 >> 3; i = (unsigned __int16)(i + 1) ) mbox_write_response(*(_DWORD *)(a0 + 8 * i), *(_DWORD *)(a0 + 8 * i + 4), 4154); *(_WORD *)SYM += a1; return 0; }", "name_lookup_or_default": "char *__fastcall name_lookup_or_default(int a0, _BYTE *a1) { int v2; if ( a1 != nullptr && *a1 != 0 && (fmt_tail_jump(), v2 != 0) ) return nullptr; else return (char *)&(*SYM)[3705241] + 2; }", "heap2_hook_call": "int __fastcall heap2_hook_call() { return SYM(); }", "memcmp2_be": "int __fastcall memcmp2_be(const void *a, const void *b, unsigned int n) { unsigned int v0; unsigned int v1; int v2; int v3; int v4; int v5; int v6; int v7; int v8; if ( ((unsigned int)a | (unsigned int)b) << 30 == 0 ) { while ( n >= 4 ) { v0 = *(_DWORD *)a; a = (char *)a + 4; v1 = *(_DWORD *)b; b = (char *)b + 4; n -= 4; if ( v0 != v1 ) { if ( bswap32(v0) <= bswap32(v1) ) return -1; else return 1; } } } if ( n == 0 ) return 0; if ( n << 31 == 0 ) goto LABEL_11; ++n; do { v7 = *(unsigned __int8 *)a; a = (char *)a + 1; v6 = v7; v8 = *(unsigned __int8 *)b; b = (char *)b + 1; v5 = v6 - v8; if ( v5 != 0 ) break; n -= 2; if ( n == 0 ) break; LABEL_11: v3 = *(unsigned __int8 *)a; a = (char *)a + 1; v2 = v3; v4 = *(unsigned __int8 *)b; b = (char *)b + 1; v5 = v2 - v4; } while ( v5 == 0 ); return v5; }", "memcpy2": "int __fastcall memcpy2(int result, char *a0, unsigned int a1) { int v2; unsigned int v3; char v4; char v5; bool v6; bool v7; unsigned int v8; char v9; char v10; bool v11; unsigned int v12; char *v13; int v14; int v15; int v16; bool v17; bool v18; signed int v19; char *v20; char v21; char v22; _BYTE *v23; if ( a1 > 3 ) { v3 = result & 3; if ( (result & 3) != 0 ) { v5 = *a0++; v4 = v5; v6 = v3 >= 2; v7 = (result & 3) == 3; v8 = a1 + v3; if ( (result & 3) != 3 ) { v9 = *a0++; LOBYTE(v3) = v9; } *(_BYTE *)result++ = v4; if ( !v6 ) { v10 = *a0++; v4 = v10; } if ( !v7 ) *(_BYTE *)result++ = v3; a1 = v8 - 4; if ( !v6 ) *(_BYTE *)result++ = v4; } LOBYTE(v2) = (unsigned __int8)a0 & 3; if ( ((unsigned __int8)a0 & 3) == 0 ) return (int)memcpy2_aligned((int *)result, (int *)a0, a1); v11 = a1 >= 8; v12 = a1 - 8; while ( v11 ) { v14 = *(_DWORD *)a0; v13 = a0 + 4; v2 = v14; v11 = v12 >= 8; v12 -= 8; v15 = *(_DWORD *)v13; a0 = v13 + 4; LOBYTE(v3) = v15; *(_DWORD *)result = v2; *(_DWORD *)(result + 4) = v15; result += 8; } a1 = v12 + 4; if ( (a1 & 0x80000000) == 0 ) { v16 = *(_DWORD *)a0; a0 += 4; LOBYTE(v2) = v16; *(_DWORD *)result = v16; result += 4; } } v17 = __CFSHL__(a1, 31); v19 = a1 << 31; v18 = v19 < 0; if ( v17 ) { v21 = *a0; v20 = a0 + 1; LOBYTE(v2) = v21; v22 = *v20; a0 = v20 + 1; LOBYTE(v3) = v22; } if ( v19 < 0 ) LOBYTE(v19) = *a0; if ( v17 ) { *(_BYTE *)result = v2; v23 = (_BYTE *)(result + 1); *v23 = v3; result = (int)(v23 + 1); } if ( v18 ) *(_BYTE *)result++ = v19; return result; }", "memmove2": "void *__fastcall memmove2(void *dst, const void *src, unsigned int n) { char v0; bool v1; unsigned int v2; void *result; int v3; bool v4; char v5; bool v6; unsigned int v7; int v8; unsigned int v9; int v10; char *v11; int v12; bool v13; bool v14; signed int v15; int v16; char v17; char v18; char *v19; unsigned int i; int v20; int v21; int v22; int v23; int v24; int v25; int v26; bool v27; bool v28; int v29; __int16 v30; v2 = (_BYTE *)dst - (_BYTE *)src; v1 = dst > src; if ( dst >= src ) v1 = n > v2; if ( !v1 ) return (void *)memcpy2((int)dst, (char *)src, n); result = (char *)dst + n; v3 = (int)src + n; if ( n <= 3 ) goto LABEL_17; v4 = ((unsigned __int8)result & 3) == 0; do { if ( !v4 ) { v5 = *(_BYTE *)--v3; --n; *((char *)result - 1) = v5; result = (char *)result - 1; } v4 = ((unsigned __int8)result & 3) == 0; } while ( ((unsigned __int8)result & 3) != 0 ); LOBYTE(v2) = v3 & 3; if ( (v3 & 3) != 0 ) { v6 = n >= 8; v7 = n - 8; while ( v6 ) { v9 = *(_DWORD *)(v3 - 4); v8 = v3 - 4; v2 = v9; v6 = v7 >= 8; v7 -= 8; v10 = *(_DWORD *)(v8 - 4); v3 = v8 - 4; v0 = v10; *((_DWORD *)result - 1) = v2; v11 = (char *)result - 4; *((_DWORD *)v11 - 1) = v10; result = v11 - 4; } n = v7 + 4; if ( (n & 0x80000000) == 0 ) { v12 = *(_DWORD *)(v3 - 4); v3 -= 4; LOBYTE(v2) = v12; *((_DWORD *)result - 1) = v12; result = (char *)result - 4; } LABEL_17: v13 = __CFSHL__(n, 31); v15 = n << 31; v14 = v15 < 0; if ( v13 ) { v17 = *(_BYTE *)(v3 - 1); v16 = v3 - 1; LOBYTE(v2) = v17; v18 = *(_BYTE *)(v16 - 1); v3 = v16 - 1; v0 = v18; } if ( v15 < 0 ) LOBYTE(v15) = *(_BYTE *)(v3 - 1); if ( v13 ) { *((char *)result - 1) = v2; v19 = (char *)result - 1; *(v19 - 1) = v0; result = v19 - 1; } if ( v14 ) *((char *)result - 1) = v15; return result; } v6 = n >= 0x10; for ( i = n - 16; v6; result = (char *)result - 16 ) { v20 = *(_DWORD *)(v3 - 16); v21 = *(_DWORD *)(v3 - 12); v22 = *(_DWORD *)(v3 - 8); v23 = *(_DWORD *)(v3 - 4); v3 -= 16; v6 = i >= 0x10; i -= 16; *((_DWORD *)result - 4) = v20; *((_DWORD *)result - 3) = v21; *((_DWORD *)result - 2) = v22; *((_DWORD *)result - 1) = v23; } LOWORD(v24) = 0; if ( __CFSHL__(i, 29) ) { v24 = *(_DWORD *)(v3 - 8); v25 = *(_DWORD *)(v3 - 4); v3 -= 8; *((_DWORD *)result - 2) = v24; *((_DWORD *)result - 1) = v25; result = (char *)result - 8; } if ( (i & 4) != 0 ) { v26 = *(_DWORD *)(v3 - 4); v3 -= 4; LOWORD(v24) = v26; *((_DWORD *)result - 1) = v26; result = (char *)result - 4; } if ( (i & 3) != 0 ) { v27 = __CFSHL__(i, 31); v29 = i << 31; v28 = v29 < 0; if ( v27 ) { v30 = *(_WORD *)(v3 - 2); v3 -= 2; LOWORD(v24) = v30; } if ( v29 < 0 ) LOBYTE(v29) = *(_BYTE *)(v3 - 1); if ( v27 ) { *((_WORD *)result - 1) = v24; result = (char *)result - 2; } if ( v28 ) *((char *)result - 1) = v29; } return result; }", "bzero2_thunk": "void __fastcall bzero2_thunk(int a0, int a1, int a2) { JUMPOUT(ADDR); }", "heap2_zero_block": "_BYTE *__fastcall heap2_zero_block(_BYTE *result, unsigned int a0) { int v1; _BYTE *v2; if ( a0 >= 4 ) { if ( ((unsigned __int8)result & 3) != 0 ) { v1 = 4 - ((unsigned __int8)result & 3); if ( v1 != 2 ) *result++ = 0; if ( v1 >= 2 ) *(_WORD *)result = 0; } JUMPOUT(ADDR); } if ( __CFSHL__(a0, 31) ) { *result = 0; v2 = result + 1; *v2 = 0; result = v2 + 1; } if ( (a0 & 1) != 0 ) *result++ = 0; return result; }", "bzero2": "_DWORD *__fastcall bzero2(_DWORD *result, unsigned int a0) { bool v1; unsigned int v2; _DWORD *v3; int v4; int v5; v1 = a0 >= 0x20; v2 = a0 - 32; do { if ( !v1 ) break; *result = 0; result[1] = 0; result[2] = 0; result[3] = 0; v3 = result + 4; *v3 = 0; v3[1] = 0; v3[2] = 0; v3[3] = 0; result = v3 + 4; v1 = v2 >= 0x20; v2 -= 32; } while ( v1 ); v1 = __CFSHL__(v2, 28); v4 = v2 << 28; if ( v1 ) { *result = 0; result[1] = 0; result[2] = 0; result[3] = 0; result += 4; } if ( v4 < 0 ) { *result = 0; result[1] = 0; result += 2; } v1 = __CFSHL__(v4, 2); v5 = 4 * v4; if ( v1 ) *result++ = 0; if ( v5 != 0 ) { if ( v5 < 0 ) { *(_WORD *)result = 0; result = (_DWORD *)((char *)result + 2); } if ( (v5 & 0x40000000) != 0 ) { *(_BYTE *)result = 0; return (_DWORD *)((char *)result + 1); } } return result; }", "memcpy2_aligned": "int *__fastcall memcpy2_aligned(int *result, int *a0, unsigned int a1) { int v2; unsigned int i; int *v3; int v4; int v5; int v6; int v7; int *v8; int v9; int v10; int v11; int v12; int v13; int v14; int v15; int v16; bool v17; bool v18; int v19; __int16 v20; v17 = a1 >= 0x20; for ( i = a1 - 32; v17; result = v8 + 4 ) { v4 = *a0; v5 = a0[1]; v6 = a0[2]; v7 = a0[3]; v3 = a0 + 4; v17 = i >= 0x20; i -= 32; *result = v4; result[1] = v5; result[2] = v6; result[3] = v7; v8 = result + 4; v2 = *v3; v9 = v3[1]; v10 = v3[2]; v11 = v3[3]; a0 = v3 + 4; *v8 = v2; v8[1] = v9; v8[2] = v10; v8[3] = v11; } if ( __CFSHL__(i, 28) ) { v2 = *a0; v12 = a0[1]; v13 = a0[2]; v14 = a0[3]; a0 += 4; *result = v2; result[1] = v12; result[2] = v13; result[3] = v14; result += 4; } if ( (i & 8) != 0 ) { v2 = *a0; v15 = a0[1]; a0 += 2; *result = v2; result[1] = v15; result += 2; } if ( __CFSHL__(i, 30) ) { v16 = *a0++; LOWORD(v2) = v16; *result++ = v16; } if ( i << 30 != 0 ) { v17 = __CFSHL__(i, 31); v19 = i << 31; v18 = v19 < 0; if ( v17 ) { v20 = *(_WORD *)a0; a0 = (int *)((char *)a0 + 2); LOWORD(v2) = v20; } if ( v19 < 0 ) LOBYTE(v19) = *(_BYTE *)a0; if ( v17 ) { *(_WORD *)result = v2; result = (int *)((char *)result + 2); } if ( v18 ) { *(_BYTE *)result = v19; return (int *)((char *)result + 1); } } return result; }", "heap2_init_pool": "int __fastcall heap2_init_pool(unsigned int *a0, int a1) { unsigned int v2; v2 = ((unsigned int)a0 + 31) & 0xFFFFFFF0; a0[3] = v2; *(_DWORD *)v2 = a0; *(_DWORD *)(v2 + 4) = 0; *(_DWORD *)(v2 + 8) = 0; *(_BYTE *)(v2 + 16) = 1; *(_BYTE *)(v2 + 17) = 86; *(_DWORD *)(v2 + 12) = a1 - (a0[3] - (_DWORD)a0) - 32; *a0 = v2; a0[1] = v2; a0[2] = *(_DWORD *)(v2 + 0xC); return 0; }", "heap2_alloc_from_pool": "int __fastcall heap2_alloc_from_pool(int a0, int *a1, int a2) { int v3; unsigned int v4; int v5; int v6; unsigned int v7; int v8; int v9; int v10; v3 = 0; v4 = (a0 + 15) & 0xFFFFFFF0; if ( v4 == 0 ) return 0; v5 = a1[1]; v6 = v5; while ( *(_BYTE *)(v6 + 16) == 0 || *(_DWORD *)(v6 + 12) < v4 ) { v6 = *(_DWORD *)(v6 + 4); if ( v6 == 0 ) v6 = *a1; if ( v6 == v5 ) goto LABEL_15; } if ( *(_DWORD *)(v6 + 12) < v4 + 32 ) { *(_BYTE *)(v6 + 16) = 0; } else { v7 = v6 + v4; *(_DWORD *)(v7 + 32) = a1; *(_DWORD *)(v7 + 36) = v6; *(_DWORD *)(v7 + 40) = *(_DWORD *)(v6 + 8); *(_BYTE *)(v7 + 48) = 1; *(_DWORD *)(v7 + 44) = *(_DWORD *)(v6 + 12) - v4 - 32; *(_BYTE *)(v7 + 49) = 86; v8 = v6 + v4 + 32; *(_BYTE *)(v6 + 16) = 0; *(_DWORD *)(v6 + 24) = a0; *(_DWORD *)(v6 + 8) = v8; *(_DWORD *)(v6 + 12) = v4; v9 = *(_DWORD *)(v6 + v4 + 40); if ( v9 != 0 ) *(_DWORD *)(v9 + 4) = v8; else *a1 = v8; } *(_DWORD *)(v6 + 20) = a2; a1[2] = a1[2] - *(_DWORD *)(v6 + 12) - 32; v3 = v6 + 32; LABEL_15: v10 = *(_DWORD *)(v5 + 8); if ( v10 == 0 ) v10 = a1[3]; a1[1] = v10; return v3; }", "heap2_free_to_pool": "int __fastcall heap2_free_to_pool(int result) { int *v0; int v1; int v2; int v3; int v4; int v5; int v6; int v7; int v8; if ( result != 0 ) { v0 = *(int **)(result - 32); v0[2] += *(_DWORD *)(result - 20) + 32; *(_BYTE *)(result - 16) = 1; v1 = v0[1]; result -= 32; if ( v1 == result ) { v2 = *(_DWORD *)(v1 + 8); if ( v2 == 0 ) v2 = v0[3]; v0[1] = v2; } v3 = *(_DWORD *)(result + 4); if ( v3 != 0 && *(_BYTE *)(v3 + 16) != 0 ) { *(_DWORD *)(v3 + 12) += *(_DWORD *)(result + 12) + 32; v4 = *(_DWORD *)(result + 8); *(_DWORD *)(v3 + 8) = v4; if ( v4 != 0 ) *(_DWORD *)(v4 + 4) = v3; else *v0 = v3; *(_BYTE *)(result + 17) = 0; result = v3; } v5 = *(_DWORD *)(result + 8); if ( v5 != 0 && *(_BYTE *)(v5 + 16) != 0 ) { v6 = v0[1]; if ( v6 == v5 ) { v7 = *(_DWORD *)(v6 + 8); if ( v7 == 0 ) v7 = v0[3]; v0[1] = v7; } *(_DWORD *)(result + 12) += *(_DWORD *)(v5 + 12) + 32; v8 = *(_DWORD *)(v5 + 8); *(_DWORD *)(result + 8) = v8; if ( v8 != 0 ) *(_DWORD *)(v8 + 4) = result; else *v0 = result; *(_BYTE *)(v5 + 17) = 0; } } return result; }", "heap2_op_dispatch": "int __fastcall heap2_op_dispatch(int a0) { int v1; v1 = 0; switch ( *(_DWORD *)a0 ) { case ' ': *(_DWORD *)(a0 + 64) = heap2_alloc( *(_DWORD *)(a0 + 56), *(_DWORD *)(a0 + 60), *(unsigned int **)(a0 + 68), *(_DWORD *)(a0 + 72)); break; case '!': *(_DWORD *)(a0 + 56) = heap2_realloc( *(char **)(a0 + 56), *(_DWORD *)(a0 + 60), *(unsigned int **)(a0 + 64), *(_DWORD *)(a0 + 68)); break; case '\"': heap2_free(*(_DWORD **)(a0 + 56)); break; case '#': memmove2(*(void **)(a0 + 56), *(const void **)(a0 + 60), *(_DWORD *)(a0 + 64)); break; case '$': v1 = memcmp2_be(*(const void **)(a0 + 56), *(const void **)(a0 + 60), *(_DWORD *)(a0 + 64)); break; case '%': bzero2_thunk(*(_DWORD *)(a0 + 56), *(_DWORD *)(a0 + 64), *(unsigned __int8 *)(a0 + 60)); break; default: v1 = SYM; break; } return v1; }", "heap2_free": "_DWORD *__fastcall heap2_free(_DWORD *result) { if ( result != nullptr ) { if ( *((_BYTE *)result - 15) == 86 && *((_BYTE *)result - 16) == 0 ) return (_DWORD *)heap2_free_to_pool((int)result); else return bzero2((_DWORD *)0xFFFFFF00, 0x40u); } return result; }", "heap2_alloc": "_BYTE *__fastcall heap2_alloc(unsigned int a0, int a1, unsigned int *a2, int a3) { _BYTE *v4; _BYTE *v5; if ( a2[1] == 0 && heap2_init_pool(a2, a3) != 0 ) return nullptr; v4 = (_BYTE *)heap2_alloc_from_pool(a0, (int *)a2, a1); v5 = v4; if ( v4 != nullptr && a1 == 0 ) heap2_zero_block(v4, a0); return v5; }", "heap2_realloc": "char *__fastcall heap2_realloc(char *a0, unsigned int a1, unsigned int *a2, int a3) { char *v4; unsigned int v5; char *v6; char *v7; v4 = a0; if ( a0 == nullptr ) return heap2_alloc(a1, 0, a2, a3); if ( *(a0 - 15) != 86 || *(a0 - 16) == 1 ) { bzero2((_DWORD *)0xFFFFFF00, 0x40u); } else { v5 = *((_DWORD *)a0 - 2); if ( v5 > a1 ) v5 = a1; v6 = heap2_alloc(a1, *((_DWORD *)a0 - 3), a2, a3); v7 = v6; if ( v6 != nullptr ) { memcpy2((int)v6, v4, v5); heap2_free(v4); return v7; } else { return nullptr; } } return v4; }"}
|