summaryrefslogtreecommitdiff
path: root/src/core/hle/service/es
diff options
context:
space:
mode:
authorGravatar Zach Hilman2019-04-10 13:59:41 -0400
committerGravatar Zach Hilman2019-07-07 21:38:33 -0400
commitf15f73a555f0a4eeda5eb675b1a30aadf695e74f (patch)
tree4f17be65e2286de7b06bf577dac30c1e10404b0f /src/core/hle/service/es
parentkey_manager: Add accessors/helpers for ticket management (diff)
downloadyuzu-f15f73a555f0a4eeda5eb675b1a30aadf695e74f.tar.gz
yuzu-f15f73a555f0a4eeda5eb675b1a30aadf695e74f.tar.xz
yuzu-f15f73a555f0a4eeda5eb675b1a30aadf695e74f.zip
es: Implement ETicket ImportTicket (1)
Takes a ticket and certificate and installs it to the KeyManager.
Diffstat (limited to 'src/core/hle/service/es')
-rw-r--r--src/core/hle/service/es/es.cpp46
1 files changed, 45 insertions, 1 deletions
diff --git a/src/core/hle/service/es/es.cpp b/src/core/hle/service/es/es.cpp
index 6701cb913..787927be0 100644
--- a/src/core/hle/service/es/es.cpp
+++ b/src/core/hle/service/es/es.cpp
@@ -2,16 +2,21 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "core/crypto/key_manager.h"
6#include "core/hle/ipc_helpers.h"
5#include "core/hle/service/service.h" 7#include "core/hle/service/service.h"
6 8
7namespace Service::ES { 9namespace Service::ES {
8 10
11constexpr ResultCode ERROR_INVALID_ARGUMENT{ErrorModule::ETicket, 2};
12constexpr ResultCode ERROR_INVALID_RIGHTS_ID{ErrorModule::ETicket, 3};
13
9class ETicket final : public ServiceFramework<ETicket> { 14class ETicket final : public ServiceFramework<ETicket> {
10public: 15public:
11 explicit ETicket() : ServiceFramework{"es"} { 16 explicit ETicket() : ServiceFramework{"es"} {
12 // clang-format off 17 // clang-format off
13 static const FunctionInfo functions[] = { 18 static const FunctionInfo functions[] = {
14 {1, nullptr, "ImportTicket"}, 19 {1, &ETicket::ImportTicket, "ImportTicket"},
15 {2, nullptr, "ImportTicketCertificateSet"}, 20 {2, nullptr, "ImportTicketCertificateSet"},
16 {3, nullptr, "DeleteTicket"}, 21 {3, nullptr, "DeleteTicket"},
17 {4, nullptr, "DeletePersonalizedTicket"}, 22 {4, nullptr, "DeletePersonalizedTicket"},
@@ -52,6 +57,45 @@ public:
52 // clang-format on 57 // clang-format on
53 RegisterHandlers(functions); 58 RegisterHandlers(functions);
54 } 59 }
60
61private:
62 bool CheckRightsId(Kernel::HLERequestContext& ctx, const u128& rights_id) {
63 if (rights_id == u128{}) {
64 LOG_ERROR(Service_ETicket, "The rights ID was invalid!");
65 IPC::ResponseBuilder rb{ctx, 2};
66 rb.Push(ERROR_INVALID_RIGHTS_ID);
67 return false;
68 }
69
70 return true;
71 }
72
73 void ImportTicket(Kernel::HLERequestContext& ctx) {
74 IPC::RequestParser rp{ctx};
75 const auto ticket = ctx.ReadBuffer();
76 const auto cert = ctx.ReadBuffer(1);
77
78 if (ticket.size() < sizeof(Core::Crypto::TicketRaw)) {
79 LOG_ERROR(Service_ETicket, "The input buffer is not large enough!");
80 IPC::ResponseBuilder rb{ctx, 2};
81 rb.Push(ERROR_INVALID_ARGUMENT);
82 return;
83 }
84
85 Core::Crypto::TicketRaw raw;
86 std::memcpy(raw.data(), ticket.data(), sizeof(Core::Crypto::TicketRaw));
87
88 if (!keys.AddTicketPersonalized(raw)) {
89 LOG_ERROR(Service_ETicket, "The ticket could not be imported!");
90 IPC::ResponseBuilder rb{ctx, 2};
91 rb.Push(ERROR_INVALID_ARGUMENT);
92 return;
93 }
94
95 IPC::ResponseBuilder rb{ctx, 2};
96 rb.Push(RESULT_SUCCESS);
97 }
98
55}; 99};
56 100
57void InstallInterfaces(SM::ServiceManager& service_manager) { 101void InstallInterfaces(SM::ServiceManager& service_manager) {