apdu_response.cc 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/apdu/apdu_response.h"
  5. #include <utility>
  6. #include "base/numerics/safe_conversions.h"
  7. namespace apdu {
  8. // static
  9. absl::optional<ApduResponse> ApduResponse::CreateFromMessage(
  10. base::span<const uint8_t> data) {
  11. // Invalid message size, data is appended by status byte.
  12. if (data.size() < 2)
  13. return absl::nullopt;
  14. uint16_t status_bytes = data[data.size() - 2] << 8;
  15. status_bytes |= data[data.size() - 1];
  16. return ApduResponse(std::vector<uint8_t>(data.begin(), data.end() - 2),
  17. static_cast<Status>(status_bytes));
  18. }
  19. ApduResponse::ApduResponse(std::vector<uint8_t> data, Status response_status)
  20. : data_(std::move(data)), response_status_(response_status) {}
  21. ApduResponse::ApduResponse(ApduResponse&& that) = default;
  22. ApduResponse& ApduResponse::operator=(ApduResponse&& that) = default;
  23. ApduResponse::~ApduResponse() = default;
  24. std::vector<uint8_t> ApduResponse::GetEncodedResponse() const {
  25. std::vector<uint8_t> encoded_response = data_;
  26. encoded_response.push_back(
  27. base::strict_cast<uint16_t>(response_status_) >> 8 & 0xff);
  28. encoded_response.push_back(base::strict_cast<uint16_t>(response_status_) &
  29. 0xff);
  30. return encoded_response;
  31. }
  32. } // namespace apdu