From 434f410f7605196c8f2c3ac0ce1073b5002bf2ef Mon Sep 17 00:00:00 2001 From: mikeplotean Date: Wed, 5 Feb 2025 22:01:24 +0200 Subject: [PATCH] fix: revocation policy encoded list decoding - condider bit order left-to-right --- .../policies/policies/RevocationPolicy.jvm.kt | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/waltid-libraries/credentials/waltid-verification-policies/src/jvmMain/kotlin/id/walt/policies/policies/RevocationPolicy.jvm.kt b/waltid-libraries/credentials/waltid-verification-policies/src/jvmMain/kotlin/id/walt/policies/policies/RevocationPolicy.jvm.kt index 066defa45..46dde112f 100644 --- a/waltid-libraries/credentials/waltid-verification-policies/src/jvmMain/kotlin/id/walt/policies/policies/RevocationPolicy.jvm.kt +++ b/waltid-libraries/credentials/waltid-verification-policies/src/jvmMain/kotlin/id/walt/policies/policies/RevocationPolicy.jvm.kt @@ -1,5 +1,6 @@ package id.walt.policies.policies +import id.walt.policies.policies.StreamUtils.getBitValue import io.github.oshai.kotlinlogging.KotlinLogging import io.ktor.client.* import io.ktor.client.plugins.contentnegotiation.* @@ -100,20 +101,30 @@ object StreamUtils { } private fun extractBitValue(bytes: ByteArray, index: ULong, bitSize: UInt): List { - val bitSet = BitSet.valueOf(bytes) + val bits = bytes.toBitSequence() val bitStart = index * bitSize % BITS_PER_BYTE - val result = mutableListOf() - for (i in bitStart..() + while (b++ < bitSize) { + result.add(bitSet.iterator().next()) } - return result + return result.map { if (it) '1' else '0' } } } fun get(bitstring: String, idx: ULong? = null, bitSize: Int = 1) = - idx?.let { StreamUtils.getBitValue(GZIPInputStream(Base64Utils.decode(bitstring).inputStream()), it, bitSize) } + idx?.let { getBitValue(GZIPInputStream(Base64Utils.decode(bitstring).inputStream()), it, bitSize) } fun isBinaryValue(value: List) = setOf('0', '1').let { valid -> value.all { it in valid } +} + +fun ByteArray.toBitSequence(): Sequence = sequence { + for (byte in this@toBitSequence) { + for (i in 7 downTo 0) { // Iterate through bits from left to right (MSB to LSB) + val bit = (byte.toInt() shr i) and 1 == 1 // Extract the i-th bit + yield(bit) + } + } } \ No newline at end of file