1313
1414#pragma once
1515
16+ #include < boost/algorithm/string/case_conv.hpp>
1617#include < boost/algorithm/string/predicate.hpp>
1718#include < cstdint>
1819#include < cstring>
2223#include < string_view>
2324#include < array>
2425#include < iterator>
25- #include < boost/variant.hpp>
26- #include < boost/blank.hpp>
2726#include < boost/algorithm/string.hpp>
2827#include " fmt/format.h"
29- #include " common/ceph_crypto.h"
3028#include " common/armor.h"
31- #include " rgw_blake3_digest.h"
32- #include " rgw_crc_digest.h"
33- #include " rgw_xxh_digest.h"
3429#include < boost/algorithm/hex.hpp>
3530#include " rgw_hex.h"
3631#include " rgw_b64.h"
@@ -83,11 +78,6 @@ namespace rgw { namespace cksum {
8378
8479 namespace ba = boost::algorithm;
8580
86- static inline std::string safe_upcase_str (std::string s) {
87- std::transform (s.begin (), s.end (), s.begin (), ::toupper);
88- return s;
89- }
90-
9181 class Cksum {
9282 public:
9383 static constexpr std::array<Desc, 8 > checksums =
@@ -112,8 +102,10 @@ namespace rgw { namespace cksum {
112102 Cksum (Type _type, const char * _armored_text)
113103 : type(_type) {
114104 const auto & ckd = checksums[uint16_t (type)];
115- (void ) ceph_unarmor ((char *) digest.begin (), (char *) digest.begin () + ckd.digest_size ,
116- _armored_text, _armored_text + std::strlen (_armored_text));
105+ (void ) ceph_unarmor ((char *) digest.begin (),
106+ (char *) digest.begin () + ckd.digest_size ,
107+ _armored_text,
108+ _armored_text + std::strlen (_armored_text));
117109 }
118110
119111 const char * type_string () const {
@@ -138,7 +130,7 @@ namespace rgw { namespace cksum {
138130
139131 std::string element_name () const {
140132 std::string ts{type_string ()};
141- return fmt::format (" Checksum{}" , safe_upcase_str (ts));
133+ return fmt::format (" Checksum{}" , boost::to_upper_copy (ts));
142134 }
143135
144136 std::string_view raw () const {
@@ -150,7 +142,6 @@ namespace rgw { namespace cksum {
150142 std::string hs;
151143 const auto & ckd = checksums[uint16_t (type)];
152144 hs.resize (ckd.armored_size );
153- memset (hs.data (), 0 , hs.length ());
154145 ceph_armor ((char *) hs.data (), (char *) hs.data () + ckd.armored_size ,
155146 (char *) digest.begin (), (char *) digest.begin () +
156147 ckd.digest_size );
@@ -199,6 +190,12 @@ namespace rgw { namespace cksum {
199190
200191 static inline const std::optional<rgw::cksum::Cksum> no_cksum{std::nullopt };
201192
193+ static inline std::string to_string (const Type type) {
194+ std::string hs;
195+ const auto & ckd = Cksum::checksums[uint16_t (type)];
196+ return ckd.name ;
197+ }
198+
202199 static inline Type parse_cksum_type (const char * name)
203200 {
204201 for (const auto & ck : Cksum::checksums) {
@@ -226,117 +223,4 @@ namespace rgw { namespace cksum {
226223 parse_cksum_type_hdr (hdr_name) != Type::none;
227224 } /* is_cksum_hdr */
228225
229- class Digest {
230- public:
231- virtual void Restart () = 0;
232- virtual void Update (const unsigned char *input, size_t length) = 0;
233- virtual void Update (const ceph::buffer::list& bl) = 0;
234- virtual void Final (unsigned char *digest) = 0;
235- virtual ~Digest () {}
236- };
237-
238- template <class T >
239- class TDigest : public Digest
240- {
241- T d;
242- public:
243- TDigest () {}
244- TDigest (TDigest&& rhs) noexcept
245- : d(std::move(rhs.d))
246- {}
247- void Restart () override { d.Restart (); }
248- void Update (const unsigned char * data, uint64_t len) override {
249- d.Update (data, len);
250- }
251- void Update (const ceph::buffer::list& bl) {
252- for (auto & p : bl.buffers ()) {
253- d.Update ((const unsigned char *)p.c_str (), p.length ());
254- }
255- }
256- void Final (unsigned char * digest) override {
257- d.Final (digest);
258- }
259- };
260-
261- typedef TDigest<rgw::digest::Blake3> Blake3;
262- typedef TDigest<rgw::digest::Crc32> Crc32;
263- typedef TDigest<rgw::digest::Crc32c> Crc32c;
264- typedef TDigest<rgw::digest::XXH3> XXH3;
265- typedef TDigest<ceph::crypto::SHA1> SHA1;
266- typedef TDigest<ceph::crypto::SHA256> SHA256;
267- typedef TDigest<ceph::crypto::SHA512> SHA512;
268-
269- typedef boost::variant<boost::blank,
270- Blake3,
271- Crc32,
272- Crc32c,
273- XXH3,
274- SHA1,
275- SHA256,
276- SHA512> DigestVariant;
277-
278- struct get_digest_ptr : public boost ::static_visitor<Digest*>
279- {
280- get_digest_ptr () {};
281- Digest* operator ()(const boost::blank& b) const { return nullptr ; }
282- Digest* operator ()(Blake3& digest) const { return &digest; }
283- Digest* operator ()(Crc32& digest) const { return &digest; }
284- Digest* operator ()(Crc32c& digest) const { return &digest; }
285- Digest* operator ()(XXH3& digest) const { return &digest; }
286- Digest* operator ()(SHA1& digest) const { return &digest; }
287- Digest* operator ()(SHA256& digest) const { return &digest; }
288- Digest* operator ()(SHA512& digest) const { return &digest; }
289- };
290-
291- static inline Digest* get_digest (DigestVariant& ev)
292- {
293- return boost::apply_visitor (get_digest_ptr{}, ev);
294- }
295-
296- static inline DigestVariant digest_factory (const Type cksum_type)
297- {
298- switch (cksum_type) {
299- case Type::blake3:
300- return Blake3 ();
301- break ;
302- case Type::sha256:
303- return SHA256 ();
304- break ;
305- case Type::crc32:
306- return Crc32 ();
307- break ;
308- case Type::crc32c:
309- return Crc32c ();
310- break ;
311- case Type::xxh3:
312- return XXH3 ();
313- break ;
314- case Type::sha512:
315- return SHA512 ();
316- break ;
317- case Type::sha1:
318- return SHA1 ();
319- break ;
320- case Type::none:
321- break ;
322- };
323- return boost::blank ();
324- } /* digest_factory */
325-
326- static inline Cksum finalize_digest (Digest* digest, Type type)
327- {
328- Cksum cksum (type);
329- if (digest) {
330- auto data = cksum.digest .data ();
331- digest->Final (data);
332- }
333- return cksum;
334- }
335-
336- static inline std::string to_string (const Type type) {
337- std::string hs;
338- const auto & ckd = Cksum::checksums[uint16_t (type)];
339- return ckd.name ;
340- }
341-
342226}} /* namespace */
0 commit comments