Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ipc/brokerable_attachment.h" | 5 #include "ipc/brokerable_attachment.h" |
| 6 | 6 |
| 7 #include "ipc/attachment_broker.h" | |
| 8 | |
| 9 #if USE_ATTACHMENT_BROKER | |
| 7 #include "crypto/random.h" | 10 #include "crypto/random.h" |
| 11 #endif | |
| 8 | 12 |
| 9 namespace IPC { | 13 namespace IPC { |
| 10 | 14 |
| 11 namespace { | 15 namespace { |
| 12 | 16 |
| 13 // In order to prevent mutually untrusted processes from stealing resources from | 17 // In order to prevent mutually untrusted processes from stealing resources from |
| 14 // one another, the nonce must be secret. This generates a 128-bit, | 18 // one another, the nonce must be secret. This generates a 128-bit, |
| 15 // cryptographicaly-strong random number. | 19 // cryptographicaly-strong random number. |
| 16 BrokerableAttachment::AttachmentId GetRandomId() { | 20 BrokerableAttachment::AttachmentId GetRandomId() { |
| 17 BrokerableAttachment::AttachmentId id; | 21 BrokerableAttachment::AttachmentId id; |
| 22 #if USE_ATTACHMENT_BROKER | |
| 18 crypto::RandBytes(id.nonce, BrokerableAttachment::kNonceSize); | 23 crypto::RandBytes(id.nonce, BrokerableAttachment::kNonceSize); |
| 24 #endif | |
| 19 return id; | 25 return id; |
|
Tom Sepez
2015/08/17 18:29:39
nit: feels wrong to allow this to return a known k
erikchen
2015/08/18 05:59:46
I agree. I've changed the no-parameter constructor
| |
| 20 } | 26 } |
| 21 | 27 |
| 22 } // namespace | 28 } // namespace |
| 23 | 29 |
| 24 BrokerableAttachment::BrokerableAttachment() | 30 // The size of the nonce array in AttachmentId must match kNonceSize. |
| 25 : id_(GetRandomId()), needs_brokering_(false) {} | 31 const size_t BrokerableAttachment::kNonceSize = 16; |
| 26 | 32 |
| 27 BrokerableAttachment::BrokerableAttachment(const AttachmentId& id, | 33 BrokerableAttachment::AttachmentId::AttachmentId(const char* start_address, |
| 28 bool needs_brokering) | 34 size_t size) { |
| 29 : id_(id), needs_brokering_(needs_brokering) {} | 35 DCHECK_EQ(size, BrokerableAttachment::kNonceSize); |
| 36 for (size_t i = 0; i < BrokerableAttachment::kNonceSize; ++i) | |
| 37 nonce[i] = start_address[i]; | |
| 38 } | |
| 30 | 39 |
| 31 BrokerableAttachment::~BrokerableAttachment() { | 40 void BrokerableAttachment::AttachmentId::SerializeToBuffer(char* start_address, |
| 41 size_t size) { | |
| 42 DCHECK_EQ(size, BrokerableAttachment::kNonceSize); | |
| 43 for (size_t i = 0; i < BrokerableAttachment::kNonceSize; ++i) | |
| 44 start_address[i] = nonce[i]; | |
| 32 } | 45 } |
| 33 | 46 |
| 47 bool BrokerableAttachment::AttachmentId::operator==( | |
| 48 const AttachmentId& rhs) const { | |
| 49 for (size_t i = 0; i < kNonceSize; ++i) { | |
| 50 if (nonce[i] != rhs.nonce[i]) | |
| 51 return false; | |
| 52 } | |
| 53 return true; | |
| 54 } | |
| 55 | |
| 56 bool BrokerableAttachment::AttachmentId::operator<( | |
| 57 const AttachmentId& rhs) const { | |
| 58 for (size_t i = 0; i < kNonceSize; ++i) { | |
| 59 if (nonce[i] < rhs.nonce[i]) | |
| 60 return true; | |
| 61 if (nonce[i] > rhs.nonce[i]) | |
| 62 return false; | |
| 63 } | |
| 64 return false; | |
| 65 } | |
| 66 | |
| 67 BrokerableAttachment::BrokerableAttachment() : id_(GetRandomId()) {} | |
| 68 | |
| 69 BrokerableAttachment::BrokerableAttachment(const AttachmentId& id) : id_(id) {} | |
| 70 | |
| 71 BrokerableAttachment::~BrokerableAttachment() {} | |
| 72 | |
| 34 BrokerableAttachment::AttachmentId BrokerableAttachment::GetIdentifier() const { | 73 BrokerableAttachment::AttachmentId BrokerableAttachment::GetIdentifier() const { |
| 35 return id_; | 74 return id_; |
| 36 } | 75 } |
| 37 | 76 |
| 38 bool BrokerableAttachment::NeedsBrokering() const { | 77 bool BrokerableAttachment::NeedsBrokering() const { |
| 39 return needs_brokering_; | 78 return GetBrokerableType() == PLACEHOLDER; |
| 40 } | |
| 41 | |
| 42 void BrokerableAttachment::SetNeedsBrokering(bool needs_brokering) { | |
| 43 needs_brokering_ = needs_brokering; | |
| 44 } | 79 } |
| 45 | 80 |
| 46 BrokerableAttachment::Type BrokerableAttachment::GetType() const { | 81 BrokerableAttachment::Type BrokerableAttachment::GetType() const { |
| 47 return TYPE_BROKERABLE_ATTACHMENT; | 82 return TYPE_BROKERABLE_ATTACHMENT; |
| 48 } | 83 } |
| 49 | 84 |
| 85 #if defined(OS_POSIX) | |
| 86 base::PlatformFile BrokerableAttachment::TakePlatformFile() { | |
| 87 NOTREACHED(); | |
| 88 return base::PlatformFile(); | |
| 89 } | |
| 90 #endif // OS_POSIX | |
| 91 | |
| 50 } // namespace IPC | 92 } // namespace IPC |
| OLD | NEW |