SecretString.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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/Platform.h>
  8. #include <LibCore/SecretString.h>
  9. #if defined(AK_OS_MACOS)
  10. # define __STDC_WANT_LIB_EXT1__ 1
  11. #endif
  12. #include <string.h>
  13. namespace Core {
  14. SecretString SecretString::take_ownership(char*& cstring, size_t length)
  15. {
  16. auto buffer = ByteBuffer::copy(cstring, length);
  17. VERIFY(buffer.has_value());
  18. #if defined(AK_OS_MACOS)
  19. memset_s(cstring, length, 0, length);
  20. #else
  21. explicit_bzero(cstring, length);
  22. #endif
  23. free(cstring);
  24. return SecretString(buffer.release_value());
  25. }
  26. SecretString SecretString::take_ownership(ByteBuffer&& buffer)
  27. {
  28. return SecretString(move(buffer));
  29. }
  30. SecretString::SecretString(ByteBuffer&& buffer)
  31. : m_secure_buffer(move(buffer))
  32. {
  33. }
  34. SecretString::~SecretString()
  35. {
  36. // Note: We use explicit_bzero to avoid the zeroing from being optimized out by the compiler,
  37. // which is possible if memset was to be used here.
  38. if (!m_secure_buffer.is_empty()) {
  39. #if defined(AK_OS_MACOS)
  40. memset_s(m_secure_buffer.data(), m_secure_buffer.size(), 0, m_secure_buffer.size());
  41. #else
  42. explicit_bzero(m_secure_buffer.data(), m_secure_buffer.capacity());
  43. #endif
  44. }
  45. }
  46. }