OLD | NEW |
| (Empty) |
1 // Copyright 2014 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 | |
5 #include "media/cast/transport/utility/transport_encryption_handler.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "crypto/encryptor.h" | |
9 #include "crypto/symmetric_key.h" | |
10 #include "media/cast/transport/cast_transport_defines.h" | |
11 | |
12 namespace media { | |
13 namespace cast { | |
14 namespace transport { | |
15 | |
16 TransportEncryptionHandler::TransportEncryptionHandler() | |
17 : key_(), encryptor_(), iv_mask_(), is_activated_(false) {} | |
18 | |
19 TransportEncryptionHandler::~TransportEncryptionHandler() {} | |
20 | |
21 bool TransportEncryptionHandler::Initialize(std::string aes_key, | |
22 std::string aes_iv_mask) { | |
23 is_activated_ = false; | |
24 if (aes_iv_mask.size() == kAesKeySize && aes_key.size() == kAesKeySize) { | |
25 iv_mask_ = aes_iv_mask; | |
26 key_.reset( | |
27 crypto::SymmetricKey::Import(crypto::SymmetricKey::AES, aes_key)); | |
28 encryptor_.reset(new crypto::Encryptor()); | |
29 encryptor_->Init(key_.get(), crypto::Encryptor::CTR, std::string()); | |
30 is_activated_ = true; | |
31 } else if (aes_iv_mask.size() != 0 || aes_key.size() != 0) { | |
32 DCHECK_EQ(aes_iv_mask.size(), 0u) | |
33 << "Invalid Crypto configuration: aes_iv_mask.size"; | |
34 DCHECK_EQ(aes_key.size(), 0u) | |
35 << "Invalid Crypto configuration: aes_key.size"; | |
36 return false; | |
37 } | |
38 return true; | |
39 } | |
40 | |
41 bool TransportEncryptionHandler::Encrypt(uint32 frame_id, | |
42 const base::StringPiece& data, | |
43 std::string* encrypted_data) { | |
44 if (!is_activated_) | |
45 return false; | |
46 if (!encryptor_->SetCounter(GetAesNonce(frame_id, iv_mask_))) { | |
47 NOTREACHED() << "Failed to set counter"; | |
48 return false; | |
49 } | |
50 if (!encryptor_->Encrypt(data, encrypted_data)) { | |
51 NOTREACHED() << "Encrypt error"; | |
52 return false; | |
53 } | |
54 return true; | |
55 } | |
56 | |
57 bool TransportEncryptionHandler::Decrypt(uint32 frame_id, | |
58 const base::StringPiece& ciphertext, | |
59 std::string* plaintext) { | |
60 if (!is_activated_) { | |
61 return false; | |
62 } | |
63 if (!encryptor_->SetCounter(transport::GetAesNonce(frame_id, iv_mask_))) { | |
64 NOTREACHED() << "Failed to set counter"; | |
65 return false; | |
66 } | |
67 if (!encryptor_->Decrypt(ciphertext, plaintext)) { | |
68 VLOG(1) << "Decryption error"; | |
69 return false; | |
70 } | |
71 return true; | |
72 } | |
73 | |
74 } // namespace transport | |
75 } // namespace cast | |
76 } // namespace media | |
OLD | NEW |