Add mix columns

This commit is contained in:
Ugljesa Jovanovic 2019-09-16 23:56:08 +02:00 committed by Ugljesa Jovanovic
parent 15799f33c0
commit d72d55ef71
No known key found for this signature in database
GPG Key ID: 33A5F353387711A5
2 changed files with 81 additions and 19 deletions

View File

@ -92,6 +92,24 @@ class Aes {
stateMatrix[3] = arrayOf(stateMatrix[3][3], stateMatrix[3][0], stateMatrix[3][1], stateMatrix[3][2]) stateMatrix[3] = arrayOf(stateMatrix[3][3], stateMatrix[3][0], stateMatrix[3][1], stateMatrix[3][2])
} }
fun mixColumns() {
val stateMixed : Array<Array<UByte>> = (0 until 4).map {
Array<UByte>(4) { 0U }
}.toTypedArray()
for (c in 0 .. 3) {
stateMixed[0][c] = (2U gfm stateMatrix[0][c]) xor galoisFieldMultiply(3U, stateMatrix[1][c]) xor stateMatrix[2][c] xor stateMatrix[3][c]
stateMixed[1][c] = stateMatrix[0][c] xor (2U gfm stateMatrix[1][c]) xor (3U gfm stateMatrix[2][c]) xor stateMatrix[3][c]
stateMixed[2][c] = stateMatrix[0][c] xor stateMatrix[1][c] xor (2U gfm stateMatrix[2][c]) xor (3U gfm stateMatrix[3][c])
stateMixed[3][c] = 3U gfm stateMatrix[0][c] xor stateMatrix[1][c] xor stateMatrix[2][c] xor (2U gfm stateMatrix[3][c])
}
stateMixed.copyInto(stateMatrix)
}
fun galoisFieldAdd(first : UByte, second : UByte) : UByte {
return first xor second
}
fun galoisFieldMultiply(first : UByte, second : UByte) : UByte { fun galoisFieldMultiply(first : UByte, second : UByte) : UByte {
var result : UInt = 0U var result : UInt = 0U
var firstInt = first.toUInt() var firstInt = first.toUInt()
@ -112,6 +130,10 @@ class Aes {
return result.toUByte() return result.toUByte()
} }
infix fun UInt.gfm(second : UByte) : UByte {
return galoisFieldMultiply(this.toUByte(), second)
}
fun expandKey(key: AesKey) { fun expandKey(key: AesKey) {
} }

View File

@ -20,7 +20,7 @@ class AesTest {
val aes = Aes() val aes = Aes()
fakeState.copyInto(aes.stateMatrix) fakeState.copyInto(aes.stateMatrix)
aes.subBytes() aes.subBytes()
aes.stateMatrix.forEach{ aes.stateMatrix.forEach {
println(it.joinToString { it.toString(16) }) println(it.joinToString { it.toString(16) })
} }
assertTrue { assertTrue {
@ -45,7 +45,7 @@ class AesTest {
val aes = Aes() val aes = Aes()
fakeState.copyInto(aes.stateMatrix) fakeState.copyInto(aes.stateMatrix)
aes.shiftRows() aes.shiftRows()
aes.stateMatrix.forEach{ aes.stateMatrix.forEach {
println(it.joinToString { it.toString(16) }) println(it.joinToString { it.toString(16) })
} }
assertTrue { assertTrue {
@ -55,12 +55,52 @@ class AesTest {
@Test @Test
fun testGaloisMultiply() { fun testGaloisMultiply() {
//Samples from FIPS-197
assertTrue {
val a = 0x57U val a = 0x57U
val b = 0x83U val b = 0x83U
val aes = Aes() val aes = Aes()
val c = aes.galoisFieldMultiply(a.toUByte(), b.toUByte()) val c = aes.galoisFieldMultiply(a.toUByte(), b.toUByte())
assertTrue {
c == 0xC1U.toUByte() c == 0xC1U.toUByte()
} }
assertTrue {
val a = 0x57U
val b = 0x13U
val aes = Aes()
val c = aes.galoisFieldMultiply(a.toUByte(), b.toUByte())
c == 0xFEU.toUByte()
}
}
@Test
fun testMixColumns() {
//Test vectors from wikipedia
val fakeState = arrayOf(
ubyteArrayOf(0xdbU, 0xf2U, 0x01U, 0xc6U).toTypedArray(),
ubyteArrayOf(0x13U, 0x0aU, 0x01U, 0xc6U).toTypedArray(),
ubyteArrayOf(0x53U, 0x22U, 0x01U, 0xc6U).toTypedArray(),
ubyteArrayOf(0x45U, 0x5cU, 0x01U, 0xc6U).toTypedArray()
)
val expectedState = arrayOf(
ubyteArrayOf(0x8eU, 0x9fU, 0x01U, 0xc6U).toTypedArray(),
ubyteArrayOf(0x4dU, 0xdcU, 0x01U, 0xc6U).toTypedArray(),
ubyteArrayOf(0xa1U, 0x58U, 0x01U, 0xc6U).toTypedArray(),
ubyteArrayOf(0xbcU, 0x9dU, 0x01U, 0xc6U).toTypedArray()
)
val aes = Aes()
fakeState.copyInto(aes.stateMatrix)
aes.mixColumns()
aes.stateMatrix.forEach {
println(it.joinToString { it.toString(16) })
}
assertTrue {
aes.stateMatrix.contentDeepEquals(expectedState)
}
} }
} }