File: Digests.swift.gyb

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: 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 (116 lines) | stat: -rw-r--r-- 4,313 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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#if CRYPTO_IN_SWIFTPM && !CRYPTO_IN_SWIFTPM_FORCE_BUILD_API
@_exported import CryptoKit
#else
// MARK: - Generated file, do NOT edit
// any edits of this file WILL be overwritten and thus discarded
// see section `gyb` in `README` for details.
%{
digests_and_length = [{"name": "SHA256", "count": 32},{"name": "SHA384","count":48},{"name":"SHA512", "count": 64},{"name":"SHA1", "count":20, "prefix":"Insecure "},{"name":"MD5", "count":16, "prefix":"Insecure "}]
}%
% for HF in digests_and_length:
%{
    name = HF["name"]
    byteCount = HF["count"]
    wordsCount = (byteCount*8)//64 + (0 if ((byteCount*8)%64) == 0 else 1)
}%
%{
    if "prefix" in HF.keys():
        protocol_prefix = ""
        protocol_prefix = protocol_prefix + "extension " + HF["prefix"] + "{"
        protocol_suffix = "}"
        parent = HF["prefix"].strip() + "/" + name
    else:
        protocol_prefix = ""
        protocol_suffix = ""
        parent = name
        
    if name == "SHA1" or name == "MD5":
        abstract = "The output of a " + name + " hash."
    else:
        abstract = "The output of a Secure Hashing Algorithm 2 (SHA-2) hash with a " + name[-3:] + "-bit digest."
}%
${protocol_prefix}
// MARK: - ${name}Digest + DigestPrivate
/// ${abstract}
public struct ${name}Digest: DigestPrivate {
    let bytes: (${(wordsCount-1)*"UInt64, "+"UInt64"})
    
    init?(bufferPointer: UnsafeRawBufferPointer) {
        guard bufferPointer.count == ${byteCount} else {
            return nil
        }

        var bytes = (${(wordsCount-1)*"UInt64(0), "+"UInt64(0)"})
        withUnsafeMutableBytes(of: &bytes) { targetPtr in
            targetPtr.copyMemory(from: bufferPointer)
        }
        self.bytes = bytes
    }
    
    /// The number of bytes in the digest.
    public static var byteCount: Int {
        return ${byteCount}
    }
    
    /// Invokes the given closure with a buffer pointer covering the raw bytes of
    /// the digest.
    ///
    /// - Parameters:
    ///   - body: A closure that takes a raw buffer pointer to the bytes of the digest
    /// and returns the digest.
    ///
    /// - Returns: The digest, as returned from the body closure.
    public func withUnsafeBytes<R>(_ body: (UnsafeRawBufferPointer) throws -> R) rethrows -> R {
        return try Swift.withUnsafeBytes(of: bytes) {
            let boundsCheckedPtr = UnsafeRawBufferPointer(start: $0.baseAddress,
                                                          count: Self.byteCount)
            return try body(boundsCheckedPtr)
        }
    }

    private func toArray() -> ArraySlice<UInt8> {
        var array = [UInt8]()
        array.appendByte(bytes.0)
        % for index in range(wordsCount-1):
        array.appendByte(bytes.${index+1})
        % end
        return array.prefix(upTo: ${name}Digest.byteCount)
    }
    
    /// A human-readable description of the digest.
    public var description: String {
        return "\("${name}") digest: \(toArray().hexString)"
    }
    
    /// Hashes the essential components of the digest by feeding them into the
    /// given hash function.
    ///
    /// This method is part of the digest’s conformance to Swift standard library’s
    /// <doc://com.apple.documentation/documentation/swift/hashable> protocol, making
    /// it possible to compare digests. Don’t confuse that hashing with the
    /// cryptographically secure hashing that you use to create the digest in the
    /// first place by, for example, calling ``${parent}/hash(data:)``.
    ///
    /// - Parameters:
    ///   - hasher: The hash function to use when combining the components of
    /// the digest.
    public func hash(into hasher: inout Hasher) {
        self.withUnsafeBytes { hasher.combine(bytes: $0) }
    }
}
${protocol_suffix}
% end
#endif // Linux or !SwiftPM