xref: /aosp_15_r20/external/webrtc/rtc_base/crypt_string.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef RTC_BASE_CRYPT_STRING_H_
12*d9f75844SAndroid Build Coastguard Worker #define RTC_BASE_CRYPT_STRING_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <string.h>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include <memory>
17*d9f75844SAndroid Build Coastguard Worker #include <string>
18*d9f75844SAndroid Build Coastguard Worker #include <vector>
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker namespace rtc {
21*d9f75844SAndroid Build Coastguard Worker 
22*d9f75844SAndroid Build Coastguard Worker class CryptStringImpl {
23*d9f75844SAndroid Build Coastguard Worker  public:
~CryptStringImpl()24*d9f75844SAndroid Build Coastguard Worker   virtual ~CryptStringImpl() {}
25*d9f75844SAndroid Build Coastguard Worker   virtual size_t GetLength() const = 0;
26*d9f75844SAndroid Build Coastguard Worker   virtual void CopyTo(char* dest, bool nullterminate) const = 0;
27*d9f75844SAndroid Build Coastguard Worker   virtual std::string UrlEncode() const = 0;
28*d9f75844SAndroid Build Coastguard Worker   virtual CryptStringImpl* Copy() const = 0;
29*d9f75844SAndroid Build Coastguard Worker   virtual void CopyRawTo(std::vector<unsigned char>* dest) const = 0;
30*d9f75844SAndroid Build Coastguard Worker };
31*d9f75844SAndroid Build Coastguard Worker 
32*d9f75844SAndroid Build Coastguard Worker class EmptyCryptStringImpl : public CryptStringImpl {
33*d9f75844SAndroid Build Coastguard Worker  public:
~EmptyCryptStringImpl()34*d9f75844SAndroid Build Coastguard Worker   ~EmptyCryptStringImpl() override {}
35*d9f75844SAndroid Build Coastguard Worker   size_t GetLength() const override;
36*d9f75844SAndroid Build Coastguard Worker   void CopyTo(char* dest, bool nullterminate) const override;
37*d9f75844SAndroid Build Coastguard Worker   std::string UrlEncode() const override;
38*d9f75844SAndroid Build Coastguard Worker   CryptStringImpl* Copy() const override;
39*d9f75844SAndroid Build Coastguard Worker   void CopyRawTo(std::vector<unsigned char>* dest) const override;
40*d9f75844SAndroid Build Coastguard Worker };
41*d9f75844SAndroid Build Coastguard Worker 
42*d9f75844SAndroid Build Coastguard Worker class CryptString {
43*d9f75844SAndroid Build Coastguard Worker  public:
44*d9f75844SAndroid Build Coastguard Worker   CryptString();
GetLength()45*d9f75844SAndroid Build Coastguard Worker   size_t GetLength() const { return impl_->GetLength(); }
CopyTo(char * dest,bool nullterminate)46*d9f75844SAndroid Build Coastguard Worker   void CopyTo(char* dest, bool nullterminate) const {
47*d9f75844SAndroid Build Coastguard Worker     impl_->CopyTo(dest, nullterminate);
48*d9f75844SAndroid Build Coastguard Worker   }
49*d9f75844SAndroid Build Coastguard Worker   CryptString(const CryptString& other);
50*d9f75844SAndroid Build Coastguard Worker   explicit CryptString(const CryptStringImpl& impl);
51*d9f75844SAndroid Build Coastguard Worker   ~CryptString();
52*d9f75844SAndroid Build Coastguard Worker   CryptString& operator=(const CryptString& other) {
53*d9f75844SAndroid Build Coastguard Worker     if (this != &other) {
54*d9f75844SAndroid Build Coastguard Worker       impl_.reset(other.impl_->Copy());
55*d9f75844SAndroid Build Coastguard Worker     }
56*d9f75844SAndroid Build Coastguard Worker     return *this;
57*d9f75844SAndroid Build Coastguard Worker   }
Clear()58*d9f75844SAndroid Build Coastguard Worker   void Clear() { impl_.reset(new EmptyCryptStringImpl()); }
UrlEncode()59*d9f75844SAndroid Build Coastguard Worker   std::string UrlEncode() const { return impl_->UrlEncode(); }
CopyRawTo(std::vector<unsigned char> * dest)60*d9f75844SAndroid Build Coastguard Worker   void CopyRawTo(std::vector<unsigned char>* dest) const {
61*d9f75844SAndroid Build Coastguard Worker     return impl_->CopyRawTo(dest);
62*d9f75844SAndroid Build Coastguard Worker   }
63*d9f75844SAndroid Build Coastguard Worker 
64*d9f75844SAndroid Build Coastguard Worker  private:
65*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<const CryptStringImpl> impl_;
66*d9f75844SAndroid Build Coastguard Worker };
67*d9f75844SAndroid Build Coastguard Worker 
68*d9f75844SAndroid Build Coastguard Worker }  // namespace rtc
69*d9f75844SAndroid Build Coastguard Worker 
70*d9f75844SAndroid Build Coastguard Worker #endif  // RTC_BASE_CRYPT_STRING_H_
71