1 #include <hwtrust/hwtrust.h>
2 #include <hwtrust/lib.rs.h>
3 
4 using android::base::Error;
5 using android::base::Result;
6 
7 namespace hwtrust {
8 
9 struct BoxedDiceChain {
10     ::rust::Box<rust::DiceChain> chain;
11 };
12 
13 // Define with a full definition of BoxedDiceChain to satisfy unique_ptr.
~DiceChain()14 DiceChain::~DiceChain() {}
15 
DiceChain(std::unique_ptr<BoxedDiceChain> chain,size_t size)16 DiceChain::DiceChain(std::unique_ptr<BoxedDiceChain> chain, size_t size) noexcept
17       : chain_(std::move(chain)), size_(size) {}
18 
Verify(const std::vector<uint8_t> & chain,DiceChain::Kind kind)19 Result<DiceChain> DiceChain::Verify(const std::vector<uint8_t>& chain, DiceChain::Kind kind) noexcept {
20   rust::DiceChainKind chainKind;
21   switch (kind) {
22     case DiceChain::Kind::kVsr13:
23       chainKind = rust::DiceChainKind::Vsr13;
24       break;
25     case DiceChain::Kind::kVsr14:
26       chainKind = rust::DiceChainKind::Vsr14;
27       break;
28     case DiceChain::Kind::kVsr15:
29       chainKind = rust::DiceChainKind::Vsr15;
30       break;
31     case DiceChain::Kind::kVsr16:
32       chainKind = rust::DiceChainKind::Vsr16;
33       break;
34   }
35   auto res = rust::VerifyDiceChain({chain.data(), chain.size()}, chainKind);
36   if (!res.error.empty()) {
37       return Error() << static_cast<std::string>(res.error);
38   }
39   BoxedDiceChain boxedChain = { std::move(res.chain) };
40   auto diceChain = std::make_unique<BoxedDiceChain>(std::move(boxedChain));
41   return DiceChain(std::move(diceChain), res.len);
42 }
43 
CosePublicKeys() const44 Result<std::vector<std::vector<uint8_t>>> DiceChain::CosePublicKeys() const noexcept {
45   std::vector<std::vector<uint8_t>> result;
46   for (auto i = 0; i < size_; ++i) {
47     auto key = rust::GetDiceChainPublicKey(*chain_->chain, i);
48     if (key.empty()) {
49       return Error() << "Failed to get public key from chain entry " << i;
50     }
51     result.emplace_back(key.begin(), key.end());
52   }
53   return result;
54 }
55 
IsProper() const56 bool DiceChain::IsProper() const noexcept {
57   return rust::IsDiceChainProper(*chain_->chain);
58 }
59 
60 } // namespace hwtrust
61