addressed review comments
This commit is contained in:
parent
eaaa76b922
commit
ab76b0b684
@ -233,7 +233,7 @@ void LoadNativeFirmKeysOld3DS() {
|
|||||||
firm->Read(0, firm_buffer.size(), firm_buffer.data());
|
firm->Read(0, firm_buffer.size(), firm_buffer.data());
|
||||||
firm->Close();
|
firm->Close();
|
||||||
|
|
||||||
constexpr std::size_t SLOT_0x25_KEY_X_SECRET_OFFSET = 934444;
|
constexpr std::size_t SLOT_0x25_KEY_X_SECRET_OFFSET = 933480;
|
||||||
constexpr std::size_t SLOT_0x25_KEY_X_SECRET_SIZE = 64;
|
constexpr std::size_t SLOT_0x25_KEY_X_SECRET_SIZE = 64;
|
||||||
std::vector<u8> secret_data(SLOT_0x25_KEY_X_SECRET_SIZE);
|
std::vector<u8> secret_data(SLOT_0x25_KEY_X_SECRET_SIZE);
|
||||||
std::memcpy(secret_data.data(), firm_buffer.data() + SLOT_0x25_KEY_X_SECRET_OFFSET,
|
std::memcpy(secret_data.data(), firm_buffer.data() + SLOT_0x25_KEY_X_SECRET_OFFSET,
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <cryptopp/hex.h>
|
||||||
#include <cryptopp/integer.h>
|
#include <cryptopp/integer.h>
|
||||||
#include <cryptopp/nbtheory.h>
|
#include <cryptopp/nbtheory.h>
|
||||||
#include <cryptopp/sha.h>
|
#include <cryptopp/sha.h>
|
||||||
@ -37,6 +38,11 @@ std::vector<u8> RsaSlot::GetSignature(const std::vector<u8>& message) {
|
|||||||
CryptoPP::Integer(modulus.data(), modulus.size()));
|
CryptoPP::Integer(modulus.data(), modulus.size()));
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << std::hex << sig;
|
ss << std::hex << sig;
|
||||||
|
CryptoPP::HexDecoder decoder;
|
||||||
|
decoder.Put(reinterpret_cast<unsigned char*>(ss.str().data()), ss.str().size());
|
||||||
|
decoder.MessageEnd();
|
||||||
|
std::vector<u8> result(decoder.MaxRetrievable());
|
||||||
|
decoder.Get(result.data(), result.size());
|
||||||
return HexToBytes(ss.str());
|
return HexToBytes(ss.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,19 +86,27 @@ RsaSlot GetSlot(std::size_t slot_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<u8> CreateASN1Message(const std::vector<u8>& data) {
|
std::vector<u8> CreateASN1Message(const std::vector<u8>& data) {
|
||||||
static constexpr auto asn1_header =
|
static constexpr std::array<u8, 224> asn1_header = {
|
||||||
"0001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
{0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
"FFFFFFFFFFFFFFFFFFFFFFFF003031300D060960864801650304020105000420";
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
std::vector<u8> message = HexToBytes(asn1_header);
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x30, 0x31, 0x30, 0x0D, 0x06,
|
||||||
|
0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20}};
|
||||||
|
|
||||||
|
std::vector<u8> message(asn1_header.begin(), asn1_header.end());
|
||||||
CryptoPP::SHA256 sha;
|
CryptoPP::SHA256 sha;
|
||||||
std::array<u8, CryptoPP::SHA256::DIGESTSIZE> hash;
|
message.resize(message.size() + CryptoPP::SHA256::DIGESTSIZE);
|
||||||
sha.CalculateDigest(hash.data(), data.data(), data.size());
|
sha.CalculateDigest(message.data() + asn1_header.size(), data.data(), data.size());
|
||||||
std::copy(hash.begin(), hash.end(), std::back_inserter(message));
|
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user