SecretString.cpp 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. /*
  2. * Copyright (c) 2021, Brian Gianforcaro <bgianf@serenityos.org>
  3. * Copyright (c) 2021, Mustafa Quraish <mustafa@cs.toronto.edu>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <AK/Memory.h>
  8. #include <LibCore/SecretString.h>
  9. namespace Core {
  10. SecretString SecretString::take_ownership(char*& cstring, size_t length)
  11. {
  12. auto buffer = ByteBuffer::copy(cstring, length);
  13. VERIFY(buffer.has_value());
  14. secure_zero(cstring, length);
  15. free(cstring);
  16. cstring = nullptr;
  17. return SecretString(buffer.release_value());
  18. }
  19. SecretString SecretString::take_ownership(ByteBuffer&& buffer)
  20. {
  21. return SecretString(move(buffer));
  22. }
  23. SecretString::SecretString(ByteBuffer&& buffer)
  24. : m_secure_buffer(move(buffer))
  25. {
  26. }
  27. SecretString::~SecretString()
  28. {
  29. // Note: We use secure_zero to avoid the zeroing from being optimized out by the compiler,
  30. // which is possible if memset was to be used here.
  31. if (!m_secure_buffer.is_empty()) {
  32. secure_zero(m_secure_buffer.data(), m_secure_buffer.capacity());
  33. }
  34. }
  35. }