|
| 1 | + |
| 2 | +// --- stubs --- |
| 3 | + |
| 4 | +// These stubs roughly follows the same structure as classes from CryptoSwift |
| 5 | +class AES |
| 6 | +{ |
| 7 | + init(key: Array<UInt8>, blockMode: BlockMode, padding: Padding) { } |
| 8 | + init(key: Array<UInt8>, blockMode: BlockMode) { } |
| 9 | + init(key: String, iv: String) { } |
| 10 | + init(key: String, iv: String, padding: Padding) { } |
| 11 | +} |
| 12 | + |
| 13 | +class Blowfish |
| 14 | +{ |
| 15 | + init(key: Array<UInt8>, blockMode: BlockMode, padding: Padding) { } |
| 16 | + init(key: Array<UInt8>, blockMode: BlockMode) { } |
| 17 | + init(key: String, iv: String) { } |
| 18 | + init(key: String, iv: String, padding: Padding) { } |
| 19 | +} |
| 20 | + |
| 21 | +class HMAC |
| 22 | +{ |
| 23 | + init(key: Array<UInt8>) { } |
| 24 | + init(key: Array<UInt8>, variant: Variant) { } |
| 25 | + init(key: String) { } |
| 26 | + init(key: String, variant: Variant) { } |
| 27 | +} |
| 28 | + |
| 29 | +class ChaCha20 |
| 30 | +{ |
| 31 | + init(key: Array<UInt8>, iv: Array<UInt8>) { } |
| 32 | + init(key: String, iv: String) { } |
| 33 | +} |
| 34 | + |
| 35 | +class CBCMAC |
| 36 | +{ |
| 37 | + init(key: Array<UInt8>) { } |
| 38 | +} |
| 39 | + |
| 40 | +class CMAC |
| 41 | +{ |
| 42 | + init(key: Array<UInt8>) { } |
| 43 | +} |
| 44 | + |
| 45 | +class Poly1305 |
| 46 | +{ |
| 47 | + init(key: Array<UInt8>) { } |
| 48 | +} |
| 49 | + |
| 50 | +class Rabbit |
| 51 | +{ |
| 52 | + init(key: Array<UInt8>) { } |
| 53 | + init(key: String) { } |
| 54 | + init(key: Array<UInt8>, iv: Array<UInt8>) { } |
| 55 | + init(key: String, iv: String) { } |
| 56 | +} |
| 57 | + |
| 58 | +enum Variant { |
| 59 | + case md5, sha1, sha2, sha3 |
| 60 | +} |
| 61 | + |
| 62 | +protocol BlockMode { } |
| 63 | + |
| 64 | +struct CBC: BlockMode { |
| 65 | + init() { } |
| 66 | +} |
| 67 | + |
| 68 | +protocol PaddingProtocol { } |
| 69 | + |
| 70 | +enum Padding: PaddingProtocol { |
| 71 | + case noPadding, zeroPadding, pkcs7, pkcs5, eme_pkcs1v15, emsa_pkcs1v15, iso78164, iso10126 |
| 72 | +} |
| 73 | + |
| 74 | +// Helper functions |
| 75 | +func getConstantString() -> String { |
| 76 | + "this string is constant" |
| 77 | +} |
| 78 | + |
| 79 | +func getConstantArray() -> Array<UInt8> { |
| 80 | + [UInt8](getConstantString().utf8) |
| 81 | +} |
| 82 | + |
| 83 | +func getRandomArray() -> Array<UInt8> { |
| 84 | + (0..<10).map({ _ in UInt8.random(in: 0...UInt8.max) }) |
| 85 | +} |
| 86 | + |
| 87 | +// --- tests --- |
| 88 | + |
| 89 | +func test() { |
| 90 | + let key: Array<UInt8> = [0x2a, 0x3a, 0x80, 0x05, 0xaf, 0x46, 0x58, 0x2d, 0x66, 0x52, 0x10, 0xae, 0x86, 0xd3, 0x8e, 0x8f] |
| 91 | + let key2 = getConstantArray() |
| 92 | + let keyString = getConstantString() |
| 93 | + |
| 94 | + let randomArray = getRandomArray() |
| 95 | + let randomKey = getRandomArray() |
| 96 | + let randomKeyString = String(cString: getRandomArray()) |
| 97 | + |
| 98 | + let blockMode = CBC() |
| 99 | + let padding = Padding.noPadding |
| 100 | + let variant = Variant.sha2 |
| 101 | + |
| 102 | + let iv = getRandomArray() |
| 103 | + let ivString = String(cString: iv) |
| 104 | + |
| 105 | + // AES test cases |
| 106 | + let ab1 = AES(key: key2, blockMode: blockMode, padding: padding) // BAD [NOT DETECTED] |
| 107 | + let ab2 = AES(key: key2, blockMode: blockMode) // BAD [NOT DETECTED] |
| 108 | + let ab3 = AES(key: keyString, iv: ivString) // BAD |
| 109 | + let ab4 = AES(key: keyString, iv: ivString, padding: padding) // BAD |
| 110 | + |
| 111 | + let ag1 = AES(key: randomKey, blockMode: blockMode, padding: padding) // GOOD |
| 112 | + let ag2 = AES(key: randomKey, blockMode: blockMode) // GOOD |
| 113 | + let ag3 = AES(key: randomKeyString, iv: ivString) // GOOD |
| 114 | + let ag4 = AES(key: randomKeyString, iv: ivString, padding: padding) // GOOD |
| 115 | + |
| 116 | + // HMAC test cases |
| 117 | + let hb1 = HMAC(key: key) // BAD |
| 118 | + let hb2 = HMAC(key: key, variant: variant) // BAD |
| 119 | + let hb3 = HMAC(key: keyString) // BAD |
| 120 | + let hb4 = HMAC(key: keyString, variant: variant) // BAD |
| 121 | + |
| 122 | + let hg1 = HMAC(key: randomKey) // GOOD |
| 123 | + let hg2 = HMAC(key: randomKey, variant: variant) // GOOD |
| 124 | + let hg3 = HMAC(key: randomKeyString) // GOOD |
| 125 | + let hg4 = HMAC(key: randomKeyString, variant: variant) // GOOD |
| 126 | + |
| 127 | + // ChaCha20 test cases |
| 128 | + let cb1 = ChaCha20(key: key, iv: iv) // BAD |
| 129 | + let cb2 = ChaCha20(key: keyString, iv: ivString) // BAD |
| 130 | + |
| 131 | + let cg1 = ChaCha20(key: randomKey, iv: iv) // GOOD |
| 132 | + let cg2 = ChaCha20(key: randomKeyString, iv: ivString) // GOOD |
| 133 | + |
| 134 | + // CBCMAC test cases |
| 135 | + let cmb1 = CBCMAC(key: key) // BAD |
| 136 | + |
| 137 | + let cmg1 = CBCMAC(key: randomKey) // GOOD |
| 138 | + |
| 139 | + // CMAC test cases |
| 140 | + let cmacb1 = CMAC(key: key) // BAD |
| 141 | + |
| 142 | + let cmacg1 = CMAC(key: randomKey) // GOOD |
| 143 | + |
| 144 | + // Poly1305 test cases |
| 145 | + let pb1 = Poly1305(key: key) // BAD |
| 146 | + |
| 147 | + let pg1 = Poly1305(key: randomKey) // GOOD |
| 148 | + |
| 149 | + // Blowfish test cases |
| 150 | + let bb1 = Blowfish(key: key, blockMode: blockMode, padding: padding) // BAD |
| 151 | + let bb2 = Blowfish(key: key, blockMode: blockMode) // BAD |
| 152 | + let bb3 = Blowfish(key: keyString, iv: ivString) // BAD |
| 153 | + let bb4 = Blowfish(key: keyString, iv: ivString, padding: padding) // BAD |
| 154 | + |
| 155 | + let bg1 = Blowfish(key: randomKey, blockMode: blockMode, padding: padding) // GOOD |
| 156 | + let bg2 = Blowfish(key: randomKey, blockMode: blockMode) // GOOD |
| 157 | + let bg3 = Blowfish(key: randomKeyString, iv: ivString) // GOOD |
| 158 | + let bg4 = Blowfish(key: randomKeyString, iv: ivString, padding: padding) // GOOD |
| 159 | + |
| 160 | + // Rabbit |
| 161 | + let rb1 = Rabbit(key: key) // BAD |
| 162 | + let rb2 = Rabbit(key: keyString) // BAD |
| 163 | + let rb3 = Rabbit(key: key, iv: iv) // BAD |
| 164 | + let rb4 = Rabbit(key: keyString, iv: ivString) // BAD |
| 165 | + |
| 166 | + let rg1 = Rabbit(key: randomKey) // GOOD |
| 167 | + let rg2 = Rabbit(key: randomKeyString) // GOOD |
| 168 | + let rg3 = Rabbit(key: randomKey, iv: iv) // GOOD |
| 169 | + let rg4 = Rabbit(key: randomKeyString, iv: ivString) // GOOD |
| 170 | +} |
0 commit comments