Virgil Security Crypto library  2.2.2
VirgilOperationRandom.h
1 
37 #ifndef VIRGIL_CRYPTO_VIRGIL_RANDOM_H
38 #define VIRGIL_CRYPTO_VIRGIL_RANDOM_H
39 
40 #include <virgil/crypto/VirgilByteArray.h>
41 
42 #include <memory>
43 
44 namespace virgil { namespace crypto { inline namespace primitive {
45 
52 private:
53  template<class Impl>
54  struct Model;
55 
56 public:
62  template<class Impl>
63  VirgilOperationRandom(Impl impl) : self_(new Model<Impl>(std::move(impl))) {}
64 
70  VirgilByteArray randomize(size_t bytesNum) {
71  return self_->doRandomize(bytesNum);
72  }
73 
78 
80  VirgilOperationRandom(const VirgilOperationRandom& other) : self_(other.self_->doCopy()) {}
81 
82  VirgilOperationRandom(VirgilOperationRandom&& other) noexcept = default;
83 
84  VirgilOperationRandom& operator=(const VirgilOperationRandom& other) {
85  VirgilOperationRandom tmp(other);
86  *this = std::move(tmp);
87  return *this;
88  }
89 
90  VirgilOperationRandom& operator=(VirgilOperationRandom&& other) noexcept = default;
91 
92  ~VirgilOperationRandom() noexcept = default;
94 
95 private:
96  struct Concept {
97  virtual VirgilByteArray doRandomize(size_t bytesNum) = 0;
98 
99  virtual Concept* doCopy() const = 0;
100  };
101 
102  template<class Random>
103  struct Model : Concept {
104  explicit Model(Random randomImpl) : impl_(std::move(randomImpl)) {}
105 
106  VirgilByteArray doRandomize(size_t bytesNum) override {
107  return impl_.randomize(bytesNum);
108  }
109 
110  Concept* doCopy() const override {
111  return new Model(*this);
112  }
113 
114  private:
115  Random impl_;
116  };
117 
118 private:
119  std::unique_ptr<Concept> self_;
120 };
121 
122 }}}
123 
124 #endif //VIRGIL_CRYPTO_VIRGIL_RANDOM_H
VirgilByteArray randomize(size_t bytesNum)
Return random sequence.
Definition: VirgilOperationRandom.h:70
Definition: VirgilHash.h:265
Root namespace for all Virgil Security libraries.
Definition: VirgilAsn1Compatible.h:46
static VirgilOperationRandom getDefault()
Return default implementation.
std::vector< unsigned char > VirgilByteArray
This type represents a sequence of bytes.
Definition: VirgilByteArray.h:54
Define proxy interface for the Randomization functionality.
Definition: VirgilOperationRandom.h:51
VirgilOperationRandom(Impl impl)
Captures implementation object.
Definition: VirgilOperationRandom.h:63