1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file. 4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/local_discovery/privetv3_crypto_provider.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/logging.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace local_discovery { 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A stub session type used for development/debugging. 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kAuthMethodEmpty[] = "empty"; 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kHandshakeStateComplete[] = "complete"; 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kStubVerificationCode[] = "SAMPLE"; 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrivetV3CryptoProviderEmpty : public PrivetV3CryptoProvider { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrivetV3CryptoProviderEmpty(); 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~PrivetV3CryptoProviderEmpty(); 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // PrivetV3CryptoProvider implementation. 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual HandshakeState GetState() OVERRIDE; 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual std::string GetAuthMethod() OVERRIDE; 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual HandshakeState GetNextStep(int* step, std::string* package) OVERRIDE; 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual HandshakeState SetStepResponse(int step, 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& state, 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& package) OVERRIDE; 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual std::string GetVerificationCode() OVERRIDE; 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual HandshakeState AcceptVerificationCode() OVERRIDE; 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool EncryptData(const std::string& input, 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string* output) OVERRIDE; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HandshakeState state_; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<PrivetV3CryptoProvider> Create( 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& available_auth_methods) { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < available_auth_methods.size(); i++) { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (available_auth_methods[i] == kAuthMethodEmpty) { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<PrivetV3CryptoProvider>( 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new PrivetV3CryptoProviderEmpty()); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return scoped_ptr<PrivetV3CryptoProvider>(); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PrivetV3CryptoProviderEmpty::PrivetV3CryptoProviderEmpty() 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : state_(IN_PROGRESS) { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrivetV3CryptoProviderEmpty::~PrivetV3CryptoProviderEmpty() { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)PrivetV3CryptoProvider::HandshakeState PrivetV3CryptoProviderEmpty::GetState() { 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return state_; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string PrivetV3CryptoProviderEmpty::GetAuthMethod() { 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return kAuthMethodEmpty; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PrivetV3CryptoProvider::HandshakeState PrivetV3CryptoProviderEmpty::GetNextStep( 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int* step, 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string* package) { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(state_ == IN_PROGRESS); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *step = 0; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) package->clear(); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_ = AWAITING_RESPONSE; 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return state_; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PrivetV3CryptoProvider::HandshakeState 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PrivetV3CryptoProviderEmpty::SetStepResponse(int step, 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& state, 8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& package) { 8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(state_ == AWAITING_RESPONSE); 8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool success = 8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) (step == 0 && package.empty() && state == kHandshakeStateComplete); 8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (success) { 8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) state_ = AWAITING_USER_VERIFICATION; 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) state_ = HANDSHAKE_ERROR; 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return state_; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string PrivetV3CryptoProviderEmpty::GetVerificationCode() { 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(state_ == AWAITING_USER_VERIFICATION); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return kStubVerificationCode; 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PrivetV3CryptoProvider::HandshakeState 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PrivetV3CryptoProviderEmpty::AcceptVerificationCode() { 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(state_ == AWAITING_USER_VERIFICATION); 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (state_ = HANDSHAKE_COMPLETE); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool PrivetV3CryptoProviderEmpty::EncryptData(const std::string& input, 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string* output) { 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *output = input; 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace local_discovery 1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch