Guest User

title key dumping

a guest
Dec 7th, 2018
411
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     void TitleKeyWnd::dump()
  2.     {
  3.         DzWnd* dz = DzWnd::instance();
  4.         if (!dz)
  5.         {
  6.             return;
  7.         }
  8.  
  9.         dz->drawLoadingScreen(string(translate().get("Dumping prodinfo")), 0, 1);
  10.         dumpProdInfo();
  11.         RsaKeyPair kp = keys().getRsaKeypair();
  12.  
  13.         dz->drawLoadingScreen(string(translate().get("Dumping ticket databases")), 0, 1);
  14.  
  15.         items().resize(0);
  16.         Fat32<::File> f;
  17.  
  18.         if (f.open("system:/", ::File::Mode::R))
  19.         {
  20.             u64 ticketsFound = 0;
  21.  
  22.             auto ticketScanner = [&ticketsFound, &kp, this](Buffer<u8>& buffer, u32 cluster)
  23.             {
  24.                 for (u64 i = 0; i < buffer.size(); i += 0x100)
  25.                 {
  26.                     if (buffer[i] == 0x04 && buffer[i + 1] == 0x00 && buffer[i + 2] == 0x01 && buffer[i + 3] == 0x00)
  27.                     {
  28.  
  29.                         const TicketHeader* header = reinterpret_cast<const TicketHeader*>(buffer.buffer(i));
  30.                         const TicketData* data = reinterpret_cast<const TicketData*>(buffer.buffer(i + sizeof(TicketHeader) - 0x200 + header->signatureSize() + header->padding()));
  31.  
  32.                         integer<128> key;
  33.  
  34.                         DzWnd::instance()->drawLoadingScreen(string(translate().get("Processing tickets")), ticketsFound % 100, 100);
  35.  
  36.                         if (data->titleKeyType == 1) // personal ticket
  37.                         {
  38.                             mbedtls_rsa_context ctx;
  39.                             mbedtls_rsa_init(&ctx, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256);
  40.  
  41.                             mbedtls_mpi_read_binary(&ctx.E, (const u8*)&kp.D, sizeof(kp.D));
  42.                             mbedtls_mpi_read_binary(&ctx.N, (const u8*)&kp.N, sizeof(kp.N));
  43.                             mbedtls_mpi_read_binary(&ctx.D, (const u8*)&kp.D, sizeof(kp.D));
  44.  
  45.                             ctx.len = sizeof(kp.D);
  46.  
  47.                             size_t len;
  48.                             Buffer<u8> result;
  49.                             result.resize(0x200);
  50.                             integer<256> label("E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855");
  51.                             if (!mbedtls_rsa_rsaes_oaep_decrypt(&ctx, NULL, NULL, MBEDTLS_RSA_PUBLIC, (const u8*)&label, sizeof(label), &len, (const u8*)&data->titleKeyBlock, result.buffer(), 0x200))
  52.                             {
  53.                                 key = *reinterpret_cast<integer<128>*>(result.buffer());
  54.                             }
  55.                             else
  56.                             {
  57.                                 continue;
  58.                             }
  59.                         }
  60.                         else
  61.                         {
  62.                             key = reinterpret_cast<const integer<128>&>(data->titleKeyBlock);
  63.                         }
  64.  
  65.                         items().push(Row::TitleKey(data->rightsId, key));
  66.                         ticketsFound++;
  67.                     }
  68.                 }
  69.                 return true;
  70.             };
  71.  
  72.             f.readChain("/save/80000000000000e1", ticketScanner);
  73.             f.readChain("/save/80000000000000e2", ticketScanner);
  74.             f.close();
  75.             exportKeys();
  76.         }
  77.         else
  78.         {
  79.             error("Faile dto open system partition\n");
  80.         }
  81.     }
RAW Paste Data