@@ -34,6 +34,18 @@ class SHA2 : DigestType {
3434 }
3535}
3636
37+ class SHA3 : DigestType {
38+ public enum Variant {
39+ case sha512
40+ }
41+
42+ public init ( variant: SHA3 . Variant ) { }
43+
44+ public func calculate( for bytes: Array < UInt8 > ) -> Array < UInt8 > {
45+ return Array < UInt8 > ( )
46+ }
47+ }
48+
3749struct Digest {
3850 static func md5( _ bytes: Array < UInt8 > ) -> Array < UInt8 > {
3951 return MD5 ( ) . calculate ( for: bytes)
@@ -50,6 +62,10 @@ struct Digest {
5062 static func sha2( _ bytes: Array < UInt8 > , variant: SHA2 . Variant ) -> Array < UInt8 > {
5163 return SHA2 ( variant: variant) . calculate ( for: bytes)
5264 }
65+
66+ static func sha3( _ bytes: Array < UInt8 > , variant: SHA3 . Variant ) -> Array < UInt8 > {
67+ return SHA3 ( variant: variant) . calculate ( for: bytes)
68+ }
5369}
5470
5571extension Array where Element == UInt8 {
@@ -68,6 +84,14 @@ extension Array where Element == UInt8 {
6884 func sha512( ) -> [ Element ] {
6985 return Digest . sha512 ( self )
7086 }
87+
88+ func sha2( _ variant: SHA2 . Variant ) -> [ Element ] {
89+ return Digest . sha2 ( self , variant: variant)
90+ }
91+
92+ func sha3( _ variant: SHA3 . Variant ) -> [ Element ] {
93+ return Digest . sha3 ( self , variant: variant)
94+ }
7195}
7296
7397extension Data {
@@ -86,6 +110,14 @@ extension Data {
86110 func sha512( ) -> Data {
87111 return Data ( Digest . sha512 ( bytes) )
88112 }
113+
114+ func sha2( _ variant: SHA2 . Variant ) -> Data {
115+ return Data ( Digest . sha2 ( bytes, variant: variant) )
116+ }
117+
118+ func sha3( _ variant: SHA3 . Variant ) -> Data {
119+ return Data ( Digest . sha3 ( bytes, variant: variant) )
120+ }
89121}
90122
91123extension String {
@@ -104,47 +136,97 @@ extension String {
104136 func sha512( ) -> String {
105137 return self . bytes. sha512 ( ) . toHexString ( )
106138 }
139+
140+ func sha2( _ variant: SHA2 . Variant ) -> String {
141+ return self . bytes. sha2 ( variant) . toHexString ( )
142+ }
143+
144+ func sha3( _ variant: SHA3 . Variant ) -> String {
145+ return self . bytes. sha3 ( variant) . toHexString ( )
146+ }
107147}
108148
109149// --- tests ---
110150
111- func testArrays( harmlessArray: Array < UInt8 > , passwdArray: Array < UInt8 > ) {
151+ func testArrays( harmlessArray: Array < UInt8 > , phoneNumberArray : Array < UInt8 > , passwdArray: Array < UInt8 > ) {
112152 _ = MD5 ( ) . calculate ( for: harmlessArray) // GOOD (not sensitive)
153+ _ = MD5 ( ) . calculate ( for: phoneNumberArray) // BAD [NOT DETECTED]
113154 _ = MD5 ( ) . calculate ( for: passwdArray) // BAD
114155 _ = SHA1 ( ) . calculate ( for: harmlessArray) // GOOD (not sensitive)
156+ _ = SHA1 ( ) . calculate ( for: phoneNumberArray) // BAD [NOT DETECTED]
115157 _ = SHA1 ( ) . calculate ( for: passwdArray) // BAD
116158 _ = SHA2 ( variant: . sha512) . calculate ( for: harmlessArray) // GOOD
117- _ = SHA2 ( variant: . sha512) . calculate ( for: passwdArray) // GOOD
159+ _ = SHA2 ( variant: . sha512) . calculate ( for: phoneNumberArray) // GOOD
160+ _ = SHA2 ( variant: . sha512) . calculate ( for: passwdArray) // BAD [NOT DETECTED]
161+ _ = SHA3 ( variant: . sha512) . calculate ( for: harmlessArray) // GOOD
162+ _ = SHA3 ( variant: . sha512) . calculate ( for: phoneNumberArray) // GOOD
163+ _ = SHA3 ( variant: . sha512) . calculate ( for: passwdArray) // BAD [NOT DETECTED]
118164
119165 _ = Digest . md5 ( harmlessArray) // GOOD (not sensitive)
166+ _ = Digest . md5 ( phoneNumberArray) // BAD [NOT DETECTED]
120167 _ = Digest . md5 ( passwdArray) // BAD
121168 _ = Digest . sha1 ( harmlessArray) // GOOD (not sensitive)
169+ _ = Digest . sha1 ( phoneNumberArray) // BAD [NOT DETECTED]
122170 _ = Digest . sha1 ( passwdArray) // BAD
123- _ = Digest . sha512 ( harmlessArray) // GOOD
124- _ = Digest . sha512 ( passwdArray) // GOOD
171+ _ = Digest . sha512 ( harmlessArray) // GOOD (not sensitive)
172+ _ = Digest . sha512 ( phoneNumberArray) // GOOD
173+ _ = Digest . sha512 ( passwdArray) // BAD [NOT DETECTED]
174+ _ = Digest . sha2 ( harmlessArray, variant: . sha512) // GOOD (not sensitive)
175+ _ = Digest . sha2 ( phoneNumberArray, variant: . sha512) // GOOD
176+ _ = Digest . sha2 ( passwdArray, variant: . sha512) // BAD [NOT DETECTED]
177+ _ = Digest . sha3 ( harmlessArray, variant: . sha512) // GOOD (not sensitive)
178+ _ = Digest . sha3 ( phoneNumberArray, variant: . sha512) // GOOD
179+ _ = Digest . sha3 ( passwdArray, variant: . sha512) // BAD [NOT DETECTED]
125180
126181 _ = harmlessArray. md5 ( ) // GOOD (not sensitive)
182+ _ = phoneNumberArray. md5 ( ) // BAD [NOT DETECTED]
127183 _ = passwdArray. md5 ( ) // BAD
128184 _ = harmlessArray. sha1 ( ) // GOOD (not sensitive)
185+ _ = phoneNumberArray. sha1 ( ) // BAD [NOT DETECTED]
129186 _ = passwdArray. sha1 ( ) // BAD
130187 _ = harmlessArray. sha512 ( ) // GOOD
131- _ = passwdArray. sha512 ( ) // GOOD
188+ _ = phoneNumberArray. sha512 ( ) // GOOD
189+ _ = passwdArray. sha512 ( ) // BAD [NOT DETECTED]
190+ _ = harmlessArray. sha2 ( . sha512) // GOOD
191+ _ = phoneNumberArray. sha2 ( . sha512) // GOOD
192+ _ = passwdArray. sha2 ( . sha512) // BAD [NOT DETECTED]
193+ _ = harmlessArray. sha3 ( . sha512) // GOOD
194+ _ = phoneNumberArray. sha3 ( . sha512) // GOOD
195+ _ = passwdArray. sha3 ( . sha512) // BAD [NOT DETECTED]
132196}
133197
134- func testData( harmlessData: Data , passwdData: Data ) {
198+ func testData( harmlessData: Data , medicalData : Data , passwdData: Data ) {
135199 _ = harmlessData. md5 ( ) // GOOD (not sensitive)
200+ _ = medicalData. md5 ( ) // BAD
136201 _ = passwdData. md5 ( ) // BAD
137202 _ = harmlessData. sha1 ( ) // GOOD (not sensitive)
203+ _ = medicalData. sha1 ( ) // BAD
138204 _ = passwdData. sha1 ( ) // BAD
139205 _ = harmlessData. sha512 ( ) // GOOD
140- _ = passwdData. sha512 ( ) // GOOD
206+ _ = medicalData. sha512 ( ) // GOOD
207+ _ = passwdData. sha512 ( ) // BAD [NOT DETECTED]
208+ _ = harmlessData. sha2 ( . sha512) // GOOD
209+ _ = medicalData. sha2 ( . sha512) // GOOD
210+ _ = passwdData. sha2 ( . sha512) // BAD [NOT DETECTED]
211+ _ = harmlessData. sha3 ( . sha512) // GOOD
212+ _ = medicalData. sha3 ( . sha512) // GOOD
213+ _ = passwdData. sha3 ( . sha512) // BAD [NOT DETECTED]
141214}
142215
143- func testStrings( passwd: String ) {
216+ func testStrings( creditCardNumber : String , passwd: String ) {
144217 _ = " harmless " . md5 ( ) // GOOD (not sensitive)
218+ _ = creditCardNumber. md5 ( ) // BAD
145219 _ = passwd. md5 ( ) // BAD
146220 _ = " harmless " . sha1 ( ) // GOOD (not sensitive)
221+ _ = creditCardNumber. sha1 ( ) // BAD
147222 _ = passwd. sha1 ( ) // BAD
148223 _ = " harmless " . sha512 ( ) // GOOD
149- _ = passwd. sha512 ( ) // GOOD
224+ _ = creditCardNumber. sha512 ( ) // GOOD
225+ _ = passwd. sha512 ( ) // BAD [NOT DETECTED]
226+ _ = " harmless " . sha2 ( . sha512) // GOOD
227+ _ = creditCardNumber. sha2 ( . sha512) // GOOD
228+ _ = passwd. sha2 ( . sha512) // BAD [NOT DETECTED]
229+ _ = " harmless " . sha3 ( . sha512) // GOOD
230+ _ = creditCardNumber. sha3 ( . sha512) // GOOD
231+ _ = passwd. sha3 ( . sha512) // BAD [NOT DETECTED]
150232}
0 commit comments