-
Notifications
You must be signed in to change notification settings - Fork 15
/
SHA256.swift
127 lines (102 loc) · 3.47 KB
/
SHA256.swift
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
117
118
119
120
121
122
123
124
125
126
127
//
// SHA256.swift
// CryptoCoin
//
// Created by Sjors Provoost on 07-07-14.
//
// Swift wrapper for CCHmac
import Foundation
import CommonCrypto
public struct SHA256 {
public static func digest (input : NSData) -> NSData {
let digestLength = HMACAlgorithm.SHA256.digestLength()
var hash = [UInt8](count: digestLength, repeatedValue: 0)
CC_SHA256(input.bytes, UInt32(input.length), &hash)
return NSData(bytes: hash, length: digestLength)
}
// Takes a string representation of a hexadecimal number
public static func hexStringDigest (input : String) -> NSData {
let data = SHA256.dataFromHexString(input)
return digest(data)
}
// Returns a string representation of a hexadecimal number
public static func hexStringDigest (input : NSData) -> String {
return hexStringFromData(digest(input))
}
// Takes a string representation of a hexadecimal number and returns a
// string represenation of the resulting 256 bit hash.
public static func hexStringDigest (input : String) -> String {
let digest: NSData = hexStringDigest(input)
return hexStringFromData(digest)
}
public static func dataFromHexString(input: String) -> NSData {
// Based on: http://stackoverflow.com/a/2505561/313633
var data = NSMutableData()
var string = ""
for char in input {
string.append(char)
if(count(string) == 2) {
let scanner = NSScanner(string: string)
var value: CUnsignedInt = 0
scanner.scanHexInt(&value)
data.appendBytes(&value, length: 1)
string = ""
}
}
return data as NSData
}
public static func hexStringFromData(input: NSData) -> String {
let sha256description = input.description as String
// TODO: more elegant way to convert NSData to a hex string
var result: String = ""
for char in sha256description {
switch char {
case "0", "1", "2", "3", "4", "5", "6", "7","8","9", "a", "b", "c", "d", "e", "f":
result.append(char)
default:
result += ""
}
}
return result
}
}
// http://stackoverflow.com/a/24411522/313633
enum HMACAlgorithm {
case MD5, SHA1, SHA224, SHA256, SHA384, SHA512
func toCCEnum() -> CCHmacAlgorithm {
var result: Int = 0
switch self {
case .MD5:
result = kCCHmacAlgMD5
case .SHA1:
result = kCCHmacAlgSHA1
case .SHA224:
result = kCCHmacAlgSHA224
case .SHA256:
result = kCCHmacAlgSHA256
case .SHA384:
result = kCCHmacAlgSHA384
case .SHA512:
result = kCCHmacAlgSHA512
}
return CCHmacAlgorithm(result)
}
func digestLength() -> Int {
var result: CInt = 0
switch self {
case .MD5:
result = CC_MD5_DIGEST_LENGTH
case .SHA1:
result = CC_SHA1_DIGEST_LENGTH
case .SHA224:
result = CC_SHA224_DIGEST_LENGTH
case .SHA256:
result = CC_SHA256_DIGEST_LENGTH
case .SHA384:
result = CC_SHA384_DIGEST_LENGTH
case .SHA512:
result = CC_SHA512_DIGEST_LENGTH
}
return Int(result)
}
}