mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:12:43 +00:00 
			
		
		
		
	LibTLS: Switch to Hash::Manager for hashing and add SHA1
Now we can talk to google.com
This commit is contained in:
		
							parent
							
								
									43a49f5fff
								
							
						
					
					
						commit
						bb46e5f608
					
				
					 6 changed files with 157 additions and 95 deletions
				
			
		|  | @ -27,6 +27,7 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <AK/Optional.h> | ||||
| #include <AK/OwnPtr.h> | ||||
| #include <LibCrypto/Hash/HashFunction.h> | ||||
| #include <LibCrypto/Hash/MD5.h> | ||||
| #include <LibCrypto/Hash/SHA1.h> | ||||
|  | @ -124,7 +125,7 @@ public: | |||
|     Manager(const Manager& other) // NOT a copy constructor!
 | ||||
|     { | ||||
|         m_pre_init_buffer = ByteBuffer::create_zeroed(0); // will not be used
 | ||||
|         initialise(other.m_kind); | ||||
|         initialize(other.m_kind); | ||||
|     } | ||||
| 
 | ||||
|     Manager(HashKind kind) | ||||
|  | @ -135,6 +136,10 @@ public: | |||
| 
 | ||||
|     ~Manager() | ||||
|     { | ||||
|         m_sha1 = nullptr; | ||||
|         m_sha256 = nullptr; | ||||
|         m_sha512 = nullptr; | ||||
|         m_md5 = nullptr; | ||||
|     } | ||||
| 
 | ||||
|     virtual void update(const ByteBuffer& buffer) override { update(buffer.data(), buffer.size()); }; | ||||
|  | @ -143,13 +148,13 @@ public: | |||
|     { | ||||
|         switch (m_kind) { | ||||
|         case HashKind::MD5: | ||||
|             return md5.value().digest_size(); | ||||
|             return m_md5->digest_size(); | ||||
|         case HashKind::SHA1: | ||||
|             return sha1.value().digest_size(); | ||||
|             return m_sha1->digest_size(); | ||||
|         case HashKind::SHA256: | ||||
|             return sha256.value().digest_size(); | ||||
|             return m_sha256->digest_size(); | ||||
|         case HashKind::SHA512: | ||||
|             return sha512.value().digest_size(); | ||||
|             return m_sha512->digest_size(); | ||||
|         default: | ||||
|         case HashKind::None: | ||||
|             return 0; | ||||
|  | @ -180,16 +185,16 @@ public: | |||
|         m_kind = kind; | ||||
|         switch (kind) { | ||||
|         case HashKind::MD5: | ||||
|             md5 = MD5 {}; | ||||
|             m_md5 = make<MD5>(); | ||||
|             break; | ||||
|         case HashKind::SHA1: | ||||
|             sha1 = SHA1 {}; | ||||
|             m_sha1 = make<SHA1>(); | ||||
|             break; | ||||
|         case HashKind::SHA256: | ||||
|             sha256 = SHA256 {}; | ||||
|             m_sha256 = make<SHA256>(); | ||||
|             break; | ||||
|         case HashKind::SHA512: | ||||
|             sha512 = SHA512 {}; | ||||
|             m_sha512 = make<SHA512>(); | ||||
|             break; | ||||
|         default: | ||||
|         case HashKind::None: | ||||
|  | @ -199,46 +204,48 @@ public: | |||
| 
 | ||||
|     virtual void update(const u8* data, size_t length) override | ||||
|     { | ||||
|         auto size = m_pre_init_buffer.size(); | ||||
|         switch (m_kind) { | ||||
|         case HashKind::MD5: | ||||
|             if (m_pre_init_buffer.size()) | ||||
|                 md5.value().update(m_pre_init_buffer); | ||||
|             md5.value().update(data, length); | ||||
|             if (size) | ||||
|                 m_md5->update(m_pre_init_buffer); | ||||
|             m_md5->update(data, length); | ||||
|             break; | ||||
|         case HashKind::SHA1: | ||||
|             if (m_pre_init_buffer.size()) | ||||
|                 sha1.value().update(m_pre_init_buffer); | ||||
|             sha1.value().update(data, length); | ||||
|             if (size) | ||||
|                 m_sha1->update(m_pre_init_buffer); | ||||
|             m_sha1->update(data, length); | ||||
|             break; | ||||
|         case HashKind::SHA256: | ||||
|             if (m_pre_init_buffer.size()) | ||||
|                 sha256.value().update(m_pre_init_buffer); | ||||
|             sha256.value().update(data, length); | ||||
|             if (size) | ||||
|                 m_sha256->update(m_pre_init_buffer); | ||||
|             m_sha256->update(data, length); | ||||
|             break; | ||||
|         case HashKind::SHA512: | ||||
|             if (m_pre_init_buffer.size()) | ||||
|                 sha512.value().update(m_pre_init_buffer); | ||||
|             sha512.value().update(data, length); | ||||
|             if (size) | ||||
|                 m_sha512->update(m_pre_init_buffer); | ||||
|             m_sha512->update(data, length); | ||||
|             break; | ||||
|         default: | ||||
|         case HashKind::None: | ||||
|             m_pre_init_buffer.append(data, length); | ||||
|             return; | ||||
|         } | ||||
|         m_pre_init_buffer.clear(); | ||||
|         if (size) | ||||
|             m_pre_init_buffer.clear(); | ||||
|     } | ||||
| 
 | ||||
|     virtual DigestType peek() override | ||||
|     { | ||||
|         switch (m_kind) { | ||||
|         case HashKind::MD5: | ||||
|             return { md5.value().peek() }; | ||||
|             return { m_md5->peek() }; | ||||
|         case HashKind::SHA1: | ||||
|             return { sha1.value().peek() }; | ||||
|             return { m_sha1->peek() }; | ||||
|         case HashKind::SHA256: | ||||
|             return { sha256.value().peek() }; | ||||
|             return { m_sha256->peek() }; | ||||
|         case HashKind::SHA512: | ||||
|             return { sha512.value().peek() }; | ||||
|             return { m_sha512->peek() }; | ||||
|         default: | ||||
|         case HashKind::None: | ||||
|             ASSERT_NOT_REACHED(); | ||||
|  | @ -255,18 +262,19 @@ public: | |||
| 
 | ||||
|     virtual void reset() override | ||||
|     { | ||||
|         m_pre_init_buffer.clear(); | ||||
|         switch (m_kind) { | ||||
|         case HashKind::MD5: | ||||
|             md5.value().reset(); | ||||
|             m_md5->reset(); | ||||
|             break; | ||||
|         case HashKind::SHA1: | ||||
|             sha1.value().reset(); | ||||
|             m_sha1->reset(); | ||||
|             break; | ||||
|         case HashKind::SHA256: | ||||
|             sha256.value().reset(); | ||||
|             m_sha256->reset(); | ||||
|             break; | ||||
|         case HashKind::SHA512: | ||||
|             sha512.value().reset(); | ||||
|             m_sha512->reset(); | ||||
|             break; | ||||
|         default: | ||||
|         case HashKind::None: | ||||
|  | @ -278,13 +286,13 @@ public: | |||
|     { | ||||
|         switch (m_kind) { | ||||
|         case HashKind::MD5: | ||||
|             return md5.value().class_name(); | ||||
|             return m_md5->class_name(); | ||||
|         case HashKind::SHA1: | ||||
|             return sha1.value().class_name(); | ||||
|             return m_sha1->class_name(); | ||||
|         case HashKind::SHA256: | ||||
|             return sha256.value().class_name(); | ||||
|             return m_sha256->class_name(); | ||||
|         case HashKind::SHA512: | ||||
|             return sha512.value().class_name(); | ||||
|             return m_sha512->class_name(); | ||||
|         default: | ||||
|         case HashKind::None: | ||||
|             return "UninitializedHashManager"; | ||||
|  | @ -297,10 +305,10 @@ public: | |||
|     } | ||||
| 
 | ||||
| private: | ||||
|     Optional<SHA1> sha1; | ||||
|     Optional<SHA256> sha256; | ||||
|     Optional<SHA512> sha512; | ||||
|     Optional<MD5> md5; | ||||
|     OwnPtr<SHA1> m_sha1; | ||||
|     OwnPtr<SHA256> m_sha256; | ||||
|     OwnPtr<SHA512> m_sha512; | ||||
|     OwnPtr<MD5> m_md5; | ||||
|     HashKind m_kind { HashKind::None }; | ||||
|     ByteBuffer m_pre_init_buffer; | ||||
| }; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 AnotherTest
						AnotherTest