1*00c7fec1SAndroid Build Coastguard Worker /* 2*00c7fec1SAndroid Build Coastguard Worker ** 3*00c7fec1SAndroid Build Coastguard Worker ** Copyright 2019, The Android Open Source Project 4*00c7fec1SAndroid Build Coastguard Worker ** 5*00c7fec1SAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License"); 6*00c7fec1SAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License. 7*00c7fec1SAndroid Build Coastguard Worker ** You may obtain a copy of the License at 8*00c7fec1SAndroid Build Coastguard Worker ** 9*00c7fec1SAndroid Build Coastguard Worker ** http://www.apache.org/licenses/LICENSE-2.0 10*00c7fec1SAndroid Build Coastguard Worker ** 11*00c7fec1SAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software 12*00c7fec1SAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS, 13*00c7fec1SAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*00c7fec1SAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and 15*00c7fec1SAndroid Build Coastguard Worker ** limitations under the License. 16*00c7fec1SAndroid Build Coastguard Worker */ 17*00c7fec1SAndroid Build Coastguard Worker 18*00c7fec1SAndroid Build Coastguard Worker #define LOG_TAG "gatekeeperd" 19*00c7fec1SAndroid Build Coastguard Worker 20*00c7fec1SAndroid Build Coastguard Worker #include <gatekeeper/GateKeeperResponse.h> 21*00c7fec1SAndroid Build Coastguard Worker 22*00c7fec1SAndroid Build Coastguard Worker #include <binder/Parcel.h> 23*00c7fec1SAndroid Build Coastguard Worker 24*00c7fec1SAndroid Build Coastguard Worker #include <android-base/logging.h> 25*00c7fec1SAndroid Build Coastguard Worker 26*00c7fec1SAndroid Build Coastguard Worker namespace android { 27*00c7fec1SAndroid Build Coastguard Worker namespace service { 28*00c7fec1SAndroid Build Coastguard Worker namespace gatekeeper { 29*00c7fec1SAndroid Build Coastguard Worker readFromParcel(const Parcel * in)30*00c7fec1SAndroid Build Coastguard Workerstatus_t GateKeeperResponse::readFromParcel(const Parcel* in) { 31*00c7fec1SAndroid Build Coastguard Worker if (in == nullptr) { 32*00c7fec1SAndroid Build Coastguard Worker LOG(ERROR) << "readFromParcel got null in parameter"; 33*00c7fec1SAndroid Build Coastguard Worker return BAD_VALUE; 34*00c7fec1SAndroid Build Coastguard Worker } 35*00c7fec1SAndroid Build Coastguard Worker timeout_ = 0; 36*00c7fec1SAndroid Build Coastguard Worker should_reenroll_ = false; 37*00c7fec1SAndroid Build Coastguard Worker payload_ = {}; 38*00c7fec1SAndroid Build Coastguard Worker response_code_ = ResponseCode(in->readInt32()); 39*00c7fec1SAndroid Build Coastguard Worker if (response_code_ == ResponseCode::OK) { 40*00c7fec1SAndroid Build Coastguard Worker should_reenroll_ = in->readInt32(); 41*00c7fec1SAndroid Build Coastguard Worker ssize_t length = in->readInt32(); 42*00c7fec1SAndroid Build Coastguard Worker if (length > 0) { 43*00c7fec1SAndroid Build Coastguard Worker length = in->readInt32(); 44*00c7fec1SAndroid Build Coastguard Worker const uint8_t* buf = reinterpret_cast<const uint8_t*>(in->readInplace(length)); 45*00c7fec1SAndroid Build Coastguard Worker if (buf == nullptr) { 46*00c7fec1SAndroid Build Coastguard Worker LOG(ERROR) << "readInplace returned null buffer for length " << length; 47*00c7fec1SAndroid Build Coastguard Worker return BAD_VALUE; 48*00c7fec1SAndroid Build Coastguard Worker } 49*00c7fec1SAndroid Build Coastguard Worker payload_.resize(length); 50*00c7fec1SAndroid Build Coastguard Worker std::copy(buf, buf + length, payload_.data()); 51*00c7fec1SAndroid Build Coastguard Worker } 52*00c7fec1SAndroid Build Coastguard Worker } else if (response_code_ == ResponseCode::RETRY) { 53*00c7fec1SAndroid Build Coastguard Worker timeout_ = in->readInt32(); 54*00c7fec1SAndroid Build Coastguard Worker } 55*00c7fec1SAndroid Build Coastguard Worker return NO_ERROR; 56*00c7fec1SAndroid Build Coastguard Worker } writeToParcel(Parcel * out) const57*00c7fec1SAndroid Build Coastguard Workerstatus_t GateKeeperResponse::writeToParcel(Parcel* out) const { 58*00c7fec1SAndroid Build Coastguard Worker if (out == nullptr) { 59*00c7fec1SAndroid Build Coastguard Worker LOG(ERROR) << "writeToParcel got null out parameter"; 60*00c7fec1SAndroid Build Coastguard Worker return BAD_VALUE; 61*00c7fec1SAndroid Build Coastguard Worker } 62*00c7fec1SAndroid Build Coastguard Worker out->writeInt32(int32_t(response_code_)); 63*00c7fec1SAndroid Build Coastguard Worker if (response_code_ == ResponseCode::OK) { 64*00c7fec1SAndroid Build Coastguard Worker out->writeInt32(should_reenroll_); 65*00c7fec1SAndroid Build Coastguard Worker out->writeInt32(payload_.size()); 66*00c7fec1SAndroid Build Coastguard Worker if (payload_.size() != 0) { 67*00c7fec1SAndroid Build Coastguard Worker out->writeInt32(payload_.size()); 68*00c7fec1SAndroid Build Coastguard Worker uint8_t* buf = reinterpret_cast<uint8_t*>(out->writeInplace(payload_.size())); 69*00c7fec1SAndroid Build Coastguard Worker if (buf == nullptr) { 70*00c7fec1SAndroid Build Coastguard Worker LOG(ERROR) << "writeInplace returned null buffer for length " << payload_.size(); 71*00c7fec1SAndroid Build Coastguard Worker return BAD_VALUE; 72*00c7fec1SAndroid Build Coastguard Worker } 73*00c7fec1SAndroid Build Coastguard Worker std::copy(payload_.begin(), payload_.end(), buf); 74*00c7fec1SAndroid Build Coastguard Worker } 75*00c7fec1SAndroid Build Coastguard Worker } else if (response_code_ == ResponseCode::RETRY) { 76*00c7fec1SAndroid Build Coastguard Worker out->writeInt32(timeout_); 77*00c7fec1SAndroid Build Coastguard Worker } 78*00c7fec1SAndroid Build Coastguard Worker return NO_ERROR; 79*00c7fec1SAndroid Build Coastguard Worker } 80*00c7fec1SAndroid Build Coastguard Worker 81*00c7fec1SAndroid Build Coastguard Worker } // namespace gatekeeper 82*00c7fec1SAndroid Build Coastguard Worker } // namespace service 83*00c7fec1SAndroid Build Coastguard Worker } // namespace android 84