CompositeKey.swift 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. // CompositeKey.swift
  2. // This file is part of KeePassKit.
  3. //
  4. // Copyright © 2019 Maxime Epain. All rights reserved.
  5. //
  6. // KeePassKit is free software: you can redistribute it and/or modify
  7. // it under the terms of the GNU General Public License as published by
  8. // the Free Software Foundation, either version 3 of the License, or
  9. // (at your option) any later version.
  10. //
  11. // KeePassKit is distributed in the hope that it will be useful,
  12. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. // GNU General Public License for more details.
  15. //
  16. // You should have received a copy of the GNU General Public License
  17. // along with KeePassKit. If not, see <https://www.gnu.org/licenses/>.
  18. import Binary
  19. import Crypto
  20. public protocol CompositeKey {
  21. var password: String { get }
  22. var key: Bytes { get }
  23. }
  24. extension CompositeKey {
  25. func serialize() throws -> Bytes {
  26. guard let password = Bytes(string: password, using: .utf8) else {
  27. throw KDBXError.invalidPassword
  28. }
  29. if password.isEmpty, key.isEmpty {
  30. throw KDBXError.emptyCompositeKey
  31. }
  32. let hash = SHA256()
  33. if !password.isEmpty {
  34. hash.update(SHA256.hash(password))
  35. }
  36. if !key.isEmpty {
  37. hash.update(key)
  38. }
  39. return hash.final
  40. }
  41. }