CompositeKey.swift 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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: .isoLatin1) else {
  27. throw KDBError.invalidPassword
  28. }
  29. if password.isEmpty, key.isEmpty {
  30. throw KDBError.emptyCompositeKey
  31. }
  32. if key.isEmpty {
  33. return SHA256.hash(password)
  34. }
  35. if password.isEmpty {
  36. return key
  37. }
  38. return SHA256.hash(SHA256.hash(password) + key)
  39. }
  40. }