Contrail reworked and finished
This commit is contained in:
		
							parent
							
								
									f64412fdc7
								
							
						
					
					
						commit
						e4e3b5ba8b
					
				
							
								
								
									
										30
									
								
								src/commonMain/kotlin/net/sergeych/crypto2/Contrail.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/commonMain/kotlin/net/sergeych/crypto2/Contrail.kt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
package net.sergeych.crypto2
 | 
			
		||||
 | 
			
		||||
import net.sergeych.bintools.CRC
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The crc8-protected binary data manipulation. It uses crc8-bluetooth polynomial (0xA7)
 | 
			
		||||
 * flavor. Note that crc8 provides good protection only for relatively small data sets.
 | 
			
		||||
 */
 | 
			
		||||
object Contrail {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *  Create a contrail by adding a crc byte to the end of [data]. The Result is always one byte longer.
 | 
			
		||||
     */
 | 
			
		||||
    fun create(data: UByteArray): UByteArray = data + CRC.crc8(data.toByteArray())
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check the contrail is valid.
 | 
			
		||||
     */
 | 
			
		||||
    fun isValid(data: UByteArray): Boolean = CRC.crc8(
 | 
			
		||||
        data.copyOfRange(0, data.size - 1).toByteArray()
 | 
			
		||||
    ) == data.last()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check that the contrail is valid and extracts its data
 | 
			
		||||
     * @return the data without crc or null if it is not valid
 | 
			
		||||
     */
 | 
			
		||||
    fun unpack(contrailData: UByteArray): UByteArray? =
 | 
			
		||||
        if (isValid(contrailData)) contrailData.sliceArray(0..<contrailData.size - 1) else null
 | 
			
		||||
}
 | 
			
		||||
@ -1,9 +0,0 @@
 | 
			
		||||
package net.sergeych.crypto2
 | 
			
		||||
 | 
			
		||||
import net.sergeych.bintools.CRC
 | 
			
		||||
 | 
			
		||||
fun isValidContrail(data: UByteArray): Boolean = CRC.crc8(
 | 
			
		||||
    data.copyOfRange(1, data.size).toByteArray()
 | 
			
		||||
) == data[0]
 | 
			
		||||
 | 
			
		||||
fun createContrail(data: UByteArray): UByteArray = ubyteArrayOf(CRC.crc8(data.toByteArray())) + data
 | 
			
		||||
@ -1,19 +1,21 @@
 | 
			
		||||
import kotlinx.coroutines.test.runTest
 | 
			
		||||
import net.sergeych.crypto2.Contrail
 | 
			
		||||
import net.sergeych.crypto2.NumericNonce
 | 
			
		||||
import net.sergeych.crypto2.createContrail
 | 
			
		||||
import net.sergeych.crypto2.initCrypto
 | 
			
		||||
import net.sergeych.crypto2.isValidContrail
 | 
			
		||||
import kotlin.test.*
 | 
			
		||||
 | 
			
		||||
class ToolsTest {
 | 
			
		||||
    @Test
 | 
			
		||||
    fun testContrails() = runTest {
 | 
			
		||||
        initCrypto()
 | 
			
		||||
        val c = createContrail(ubyteArrayOf(1u, 2u, 3u, 4u, 5u))
 | 
			
		||||
        assertEquals(134u, c[0])
 | 
			
		||||
        assertTrue { isValidContrail(c) }
 | 
			
		||||
        c[2] = 11u
 | 
			
		||||
        assertFalse { isValidContrail(c) }
 | 
			
		||||
        val data = ubyteArrayOf(1u, 2u, 3u, 4u, 5u)
 | 
			
		||||
        val c = Contrail.create(data)
 | 
			
		||||
        assertTrue { Contrail.isValid(c) }
 | 
			
		||||
        c[2] = c[2] xor 11u
 | 
			
		||||
        assertFalse { Contrail.isValid(c) }
 | 
			
		||||
        c[2] = c[2] xor 11u
 | 
			
		||||
        assertTrue { Contrail.isValid(c) }
 | 
			
		||||
        assertContentEquals(data,Contrail.unpack(c))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user