title: Equivalent of CBCBlockCipherMac from bouncycastle for swift
body: <p>I need to re-implement for iOS (swift) a cryptographic operation done for an Android app (kotlin) thanks to bouncycastle's lbrary.
  The kotlin code is :</p>
  
  <pre><code>val mac = "9D3391051A4E774B".hexStringToByteArray()
  val macKey = "89D7B23D500D492FA01DC53B44864AB8".hexStringToByteArray()
  val cipheredData = "E77A914D5C94A04B6D8E10BA7A56A015AC2C40167F867A97B6349F29F3100D6D".hexStringToByteArray()
  
  var macBlock = CBCBlockCipherMac(AESEngine(), ISO7816d4Padding())
  macBlock.init(KeyParameter(macKey))
  macBlock.update(cipheredData, 0, cipheredData.size)
  var output = ByteArray(8)
  macBlock.doFinal(output, 0)
  
  if(output.toHex() == mac.toHex()) {
      print("equals !!")
  } else {
      print("not equals : ${output.toHex()}")
  }
  </code></pre>
  
  <p>This code works, the found mac from the output is the same as the original 'mac' property.</p>
  
  <p>I tried using swift Library CryptoSwift with this code :</p>
  
  <pre><code>let mac = Data(hex: "9D3391051A4E774B")
  let macKey = Data(hex: "89D7B23D500D492FA01DC53B44864AB8")
  let cipheredData = Data(hex: "E77A914D5C94A04B6D8E10BA7A56A015AC2C40167F867A97B6349F29F3100D6D")
  
  do {
      var output = try CBCMAC(key: macKey.bytes).authenticate(cipheredData.bytes)
      checkOutput(mac: mac, output: output)
  } catch {
      debugPrint("Exception \(error)")
  }
  </code></pre>
  
  <p>But this doesn't work. The algorithm behind the CryptoSwift's CBCMAC class is not doing the same think as bouncycastle's CBCBlockCipherMac.</p>
  
  <p>I also tried using apple's CommonCrypto library but there is no CBCMAC authentification, only HMAC. I didn't find any way of doing CBC-MAC authentification easily for iOS plateform.</p>