| 
									
										
										
										
											2021-09-12 06:54:57 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2021, Brian Gianforcaro <bgianf@serenityos.org> | 
					
						
							| 
									
										
										
										
											2021-09-13 16:48:22 -04:00
										 |  |  |  * Copyright (c) 2021, Mustafa Quraish <mustafa@serenityos.org> | 
					
						
							| 
									
										
										
										
											2021-09-12 06:54:57 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-12 14:29:23 -07:00
										 |  |  | #include <AK/Memory.h>
 | 
					
						
							| 
									
										
										
										
											2021-09-12 06:54:57 -07:00
										 |  |  | #include <LibCore/SecretString.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Core { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SecretString SecretString::take_ownership(char*& cstring, size_t length) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto buffer = ByteBuffer::copy(cstring, length); | 
					
						
							|  |  |  |     VERIFY(buffer.has_value()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-12 14:29:23 -07:00
										 |  |  |     secure_zero(cstring, length); | 
					
						
							| 
									
										
										
										
											2021-09-12 06:54:57 -07:00
										 |  |  |     free(cstring); | 
					
						
							| 
									
										
										
										
											2021-09-12 14:29:23 -07:00
										 |  |  |     cstring = nullptr; | 
					
						
							| 
									
										
										
										
											2021-09-12 06:54:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return SecretString(buffer.release_value()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SecretString SecretString::take_ownership(ByteBuffer&& buffer) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return SecretString(move(buffer)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SecretString::SecretString(ByteBuffer&& buffer) | 
					
						
							|  |  |  |     : m_secure_buffer(move(buffer)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SecretString::~SecretString() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-09-12 14:29:23 -07:00
										 |  |  |     // Note: We use secure_zero to avoid the zeroing from being optimized out by the compiler,
 | 
					
						
							| 
									
										
										
										
											2021-09-12 12:47:00 -04:00
										 |  |  |     // which is possible if memset was to be used here.
 | 
					
						
							| 
									
										
										
										
											2021-09-12 06:54:57 -07:00
										 |  |  |     if (!m_secure_buffer.is_empty()) { | 
					
						
							| 
									
										
										
										
											2021-09-12 14:29:23 -07:00
										 |  |  |         secure_zero(m_secure_buffer.data(), m_secure_buffer.capacity()); | 
					
						
							| 
									
										
										
										
											2021-09-12 06:54:57 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |