KeyBuffer.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /*
  2. * Copyright (C) 2017 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #ifndef ANDROID_VOLD_KEYBUFFER_H
  17. #define ANDROID_VOLD_KEYBUFFER_H
  18. #include <cstring>
  19. #include <memory>
  20. #include <vector>
  21. namespace android {
  22. namespace vold {
  23. /**
  24. * Variant of memset() that should never be optimized away. Borrowed from keymaster code.
  25. */
  26. #ifdef __clang__
  27. #define OPTNONE __attribute__((optnone))
  28. #else // not __clang__
  29. #define OPTNONE __attribute__((optimize("O0")))
  30. #endif // not __clang__
  31. inline OPTNONE void* memset_s(void* s, int c, size_t n) {
  32. if (!s) return s;
  33. return memset(s, c, n);
  34. }
  35. #undef OPTNONE
  36. // Allocator that delegates useful work to standard one but zeroes data before deallocating.
  37. class ZeroingAllocator : public std::allocator<char> {
  38. public:
  39. void deallocate(pointer p, size_type n) {
  40. memset_s(p, 0, n);
  41. std::allocator<char>::deallocate(p, n);
  42. }
  43. };
  44. // Char vector that zeroes memory when deallocating.
  45. using KeyBuffer = std::vector<char, ZeroingAllocator>;
  46. // Convenience methods to concatenate key buffers.
  47. KeyBuffer operator+(KeyBuffer&& lhs, const KeyBuffer& rhs);
  48. KeyBuffer operator+(KeyBuffer&& lhs, const char* rhs);
  49. } // namespace vold
  50. } // namespace android
  51. #endif