File: KeyWrapping.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (98 lines) | stat: -rw-r--r-- 5,429 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftCrypto open source project
//
// Copyright (c) 2019-2020 Apple Inc. and the SwiftCrypto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.md for the list of SwiftCrypto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import XCTest

#if CRYPTO_IN_SWIFTPM && !CRYPTO_IN_SWIFTPM_FORCE_BUILD_API
// Skip tests that require @testable imports of CryptoKit.
#else
#if !CRYPTO_IN_SWIFTPM_FORCE_BUILD_API
@testable import CryptoKit
#else
@testable import Crypto
#endif

class KeyWrappingTests: XCTestCase {
    func testAESWrapTestVectors() throws {
        struct wrapVector {
            let kek: SymmetricKey
            let key: SymmetricKey
            let wrap: Data
        }

        let vector: [wrapVector] = [
            // Corecrypto Test Vector
            wrapVector(kek: try SymmetricKey(data: Data(hexString: "f59782f1dceb0544a8da06b34969b9212b55ce6dcbdd0975a33f4b3f88b538da")),
                       key: try SymmetricKey(data: Data(hexString: "73d33060b5f9f2eb5785c0703ddfa704")),
                       wrap: try Data(hexString: "2e63946ea3c090902fa1558375fdb2907742ac74e39403fc")),
            // IETF Test Vector - Wrap 128 bits of Key Data with a 128-bit KEK
            wrapVector(kek: try SymmetricKey(data: Data(hexString: "000102030405060708090A0B0C0D0E0F")),
                       key: try SymmetricKey(data: Data(hexString: "00112233445566778899AABBCCDDEEFF")),
                       wrap: try Data(hexString: "1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5")),
            // IETF Test Vector - Wrap 128 bits of Key Data with a 192-bit KEK
            wrapVector(kek: try SymmetricKey(data: Data(hexString: "000102030405060708090A0B0C0D0E0F1011121314151617")),
                       key: try SymmetricKey(data: Data(hexString: "00112233445566778899AABBCCDDEEFF")),
                       wrap: try Data(hexString: "96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D")),
            // IETF Test Vector - Wrap 128 bits of Key Data with a 256-bit KEK
            wrapVector(kek: try SymmetricKey(data: Data(hexString: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F")),
                       key: try SymmetricKey(data: Data(hexString: "00112233445566778899AABBCCDDEEFF")),
                       wrap: try Data(hexString: "64E8C3F9CE0F5BA263E9777905818A2A93C8191E7D6E8AE7")),
            // IETF Test Vector - Wrap 192 bits of Key Data with a 192-bit KEK
            wrapVector(kek: try SymmetricKey(data: Data(hexString: "000102030405060708090A0B0C0D0E0F1011121314151617")),
                       key: try SymmetricKey(data: Data(hexString: "00112233445566778899AABBCCDDEEFF0001020304050607")),
                       wrap: try Data(hexString: "031D33264E15D33268F24EC260743EDCE1C6C7DDEE725A936BA814915C6762D2")),
            // IETF Test Vector - Wrap 192 bits of Key Data with a 256-bit KEK
            wrapVector(kek: try SymmetricKey(data: Data(hexString: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F")),
                       key: try SymmetricKey(data: Data(hexString: "00112233445566778899AABBCCDDEEFF0001020304050607")),
                       wrap: try Data(hexString: "A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1")),
            // IETF Test Vector - Wrap 256 bits of Key Data with a 256-bit KEK
            wrapVector(kek: try SymmetricKey(data: Data(hexString: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F")),
                       key: try SymmetricKey(data: Data(hexString: "00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F")),
                       wrap: try Data(hexString: "28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21"))
        ]

        try vector.forEach { e in
            let kek = SymmetricKey(data: e.kek)
            var wrapped = try AES.KeyWrap.wrap(e.key, using: kek)
            XCTAssertEqual(e.wrap, wrapped)
            let unwrapped = try AES.KeyWrap.unwrap(wrapped, using: kek)
            XCTAssertEqual(e.key, unwrapped)

            wrapped[0] = wrapped[0] ^ 1

            XCTAssertThrowsError(try AES.KeyWrap.unwrap(wrapped, using: kek))
        }
    }

    func testWrappingAndUnwrappingEmptinessFails() throws {
        let kek = try SymmetricKey(data: Data(hexString: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"))
        let key = SymmetricKey(data: Data())

        XCTAssertThrowsError(try AES.KeyWrap.wrap(key, using: kek))

        let zeroLengthUnwrapped = Data()
        XCTAssertThrowsError(try AES.KeyWrap.unwrap(zeroLengthUnwrapped, using: kek))
    }

    func testWrappingUnwrappingWithTheEmptyKeyFails() throws {
        let kek = SymmetricKey(data: Data())
        let key = try SymmetricKey(data: Data(hexString: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"))

        XCTAssertThrowsError(try AES.KeyWrap.wrap(key, using: kek))

        let wrappedKey = try Data(hexString: "28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21")
        XCTAssertThrowsError(try AES.KeyWrap.unwrap(wrappedKey, using: kek))
    }
}

#endif // CRYPTO_IN_SWIFTPM