Skip to content

Commit ef56907

Browse files
committed
fix key tags
1 parent 85c5dbc commit ef56907

File tree

2 files changed

+68
-45
lines changed

2 files changed

+68
-45
lines changed

formats/cbor/commonMain/src/kotlinx/serialization/cbor/internal/Encoder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ internal class StructuredCborWriter(cbor: Cbor) : CborWriter(cbor) {
287287
//TODO check if cborelement and be done
288288
val name = descriptor.getElementName(index)
289289
if (!descriptor.hasArrayTag()) {
290-
val keyTags = descriptor.getKeyTags(index)
290+
val keyTags = if (cbor.configuration.encodeKeyTags) descriptor.getKeyTags(index) else null
291291

292292
if ((descriptor.kind !is StructureKind.LIST) && (descriptor.kind !is StructureKind.MAP) && (descriptor.kind !is PolymorphicKind)) {
293293
//indices are put into the name field. we don't want to write those, as it would result in double writes

formats/cbor/commonTest/src/kotlinx/serialization/cbor/CborTaggedTest.kt

Lines changed: 67 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,6 @@ class CborTaggedTest {
236236
val structFromHex = cbor.decodeFromHexString(CborElement.serializer(), referenceHexString)
237237
val struct = cbor.encodeToCbor(DataWithTags.serializer(), reference)
238238
assertEquals(struct, structFromHex)
239-
240239
assertEquals(reference, cbor.decodeFromCbor(DataWithTags.serializer(), struct))
241240
assertEquals(referenceHexString, cbor.encodeToHexString(CborElement.serializer(), struct))
242241

@@ -249,68 +248,99 @@ class CborTaggedTest {
249248
verifyValueTags = true
250249
verifyObjectTags = true
251250
}
252-
assertEquals(
253-
referenceHexStringDefLen,
254-
cborDef.encodeToHexString(DataWithTags.serializer(), reference)
255-
)
251+
assertEquals(referenceHexStringDefLen, cborDef.encodeToHexString(DataWithTags.serializer(), reference))
252+
val structDefFromHex = cborDef.decodeFromHexString(CborElement.serializer(), referenceHexStringDefLen)
253+
val structDef = cborDef.encodeToCbor(DataWithTags.serializer(), reference)
254+
assertEquals(structDef, structDefFromHex)
255+
assertEquals(reference, cborDef.decodeFromCbor(DataWithTags.serializer(), structDef))
256+
assertEquals(referenceHexStringDefLen, cborDef.encodeToHexString(CborElement.serializer(), structDef))
257+
256258

257259
assertEquals(reference, Cbor.CoseCompliant.decodeFromHexString(DataWithTags.serializer(), referenceHexString))
260+
val structCoseFromHex = Cbor.CoseCompliant.decodeFromHexString(CborElement.serializer(), referenceHexString)
261+
val structCose = Cbor.CoseCompliant.encodeToCbor(DataWithTags.serializer(), reference)
262+
assertEquals(structCose, structCoseFromHex)
263+
assertEquals(reference, Cbor.CoseCompliant.decodeFromCbor(DataWithTags.serializer(), structCose))
264+
258265
assertEquals(
259266
reference,
260267
Cbor.CoseCompliant.decodeFromHexString(DataWithTags.serializer(), referenceHexStringDefLen)
261268
)
269+
val structCoseFromHexDef =
270+
Cbor.CoseCompliant.decodeFromHexString(CborElement.serializer(), referenceHexStringDefLen)
271+
val structCoseDef = Cbor.CoseCompliant.encodeToCbor(DataWithTags.serializer(), reference)
272+
assertEquals(structCoseDef, structCoseFromHexDef)
273+
assertEquals(reference, Cbor.CoseCompliant.decodeFromCbor(DataWithTags.serializer(), structCoseDef))
262274

263275
}
264276

265277
@Test
266278
fun writeReadUntaggedKeys() {
267-
assertEquals(noKeyTags, Cbor {
279+
val cborNoKeyTags = Cbor {
268280
encodeKeyTags = false
269281
encodeValueTags = true
270282
encodeObjectTags = true
271283
verifyKeyTags = false
272284
verifyValueTags = true
273285
verifyObjectTags = true
274-
}.encodeToHexString(DataWithTags.serializer(), reference))
275-
assertEquals(
276-
noKeyTagsDefLen,
277-
Cbor {
278-
useDefiniteLengthEncoding = true
279-
encodeKeyTags = false
280-
encodeValueTags = true
281-
encodeObjectTags = true
282-
verifyKeyTags = true
283-
verifyValueTags = true
284-
verifyObjectTags = true
285-
}.encodeToHexString(
286-
DataWithTags.serializer(),
287-
reference
288-
)
289-
)
290-
assertEquals(reference, Cbor {
291-
encodeKeyTags = true
292-
encodeValueTags = true
293-
encodeObjectTags = true
294-
verifyValueTags = true
295-
verifyObjectTags = true
296-
verifyKeyTags = false
297-
}.decodeFromHexString(noKeyTags))
298-
assertEquals(reference, Cbor {
299-
encodeKeyTags = true
286+
}
287+
assertEquals(noKeyTags, cborNoKeyTags.encodeToHexString(DataWithTags.serializer(), reference))
288+
(cborNoKeyTags to noKeyTags).let { (cbor, hex) ->
289+
val struct = cbor.encodeToCbor(DataWithTags.serializer(), reference)
290+
assertEquals(struct, cbor.decodeFromHexString(CborElement.serializer(), hex))
291+
assertEquals(reference, cbor.decodeFromCbor(DataWithTags.serializer(), struct))
292+
}
293+
294+
val cborNoKeyTagsDefLen = Cbor {
295+
useDefiniteLengthEncoding = true
296+
encodeKeyTags = false
300297
encodeValueTags = true
301298
encodeObjectTags = true
299+
verifyKeyTags = true
302300
verifyValueTags = true
303301
verifyObjectTags = true
304-
verifyKeyTags = false
305-
}.decodeFromHexString(noKeyTagsDefLen))
306-
assertEquals(reference, Cbor {
302+
}
303+
assertEquals(noKeyTagsDefLen, cborNoKeyTagsDefLen.encodeToHexString(DataWithTags.serializer(), reference))
304+
(cborNoKeyTagsDefLen to noKeyTagsDefLen).let { (cbor, hex) ->
305+
val struct = cbor.encodeToCbor(DataWithTags.serializer(), reference)
306+
assertEquals(struct, cbor.decodeFromHexString(CborElement.serializer(), hex))
307+
// this must fail, because encoding/decoding is not symmetric with the current config (the struct does not have the tags, but the hex string does)
308+
assertFailsWith(CborDecodingException::class) {
309+
assertEquals(reference, cbor.decodeFromCbor(DataWithTags.serializer(), struct))
310+
}
311+
}
312+
313+
val cborEncodingKeyTags = Cbor {
307314
encodeKeyTags = true
308315
encodeValueTags = true
309316
encodeObjectTags = true
310317
verifyValueTags = true
311318
verifyObjectTags = true
312319
verifyKeyTags = false
313-
}.decodeFromHexString(referenceHexString))
320+
}
321+
assertEquals(reference, cborEncodingKeyTags.decodeFromHexString(noKeyTags))
322+
(cborEncodingKeyTags to noKeyTags).let { (cbor, hex) ->
323+
val struct = cbor.encodeToCbor(DataWithTags.serializer(), reference)
324+
// this must not be equal, because the scruct has the tags, but the hex string doesn't
325+
assertNotEquals(struct, cbor.decodeFromHexString(CborElement.serializer(), hex))
326+
assertEquals(reference, cbor.decodeFromCbor(DataWithTags.serializer(), struct))
327+
}
328+
329+
assertEquals(reference, cborEncodingKeyTags.decodeFromHexString(noKeyTagsDefLen))
330+
(cborEncodingKeyTags to noKeyTagsDefLen).let { (cbor, hex) ->
331+
val struct = cbor.encodeToCbor(DataWithTags.serializer(), reference)
332+
// this must not be equals, because the scruct has the tags, but the hex string doesn't (as above)
333+
assertNotEquals(struct, cbor.decodeFromHexString(CborElement.serializer(), hex))
334+
assertEquals(reference, cbor.decodeFromCbor(DataWithTags.serializer(), struct))
335+
}
336+
337+
338+
assertEquals(reference, cborEncodingKeyTags.decodeFromHexString(referenceHexString))
339+
(cborNoKeyTags to noKeyTags).let { (cbor, hex) ->
340+
val struct = cbor.encodeToCbor(DataWithTags.serializer(), reference)
341+
assertEquals(struct, cbor.decodeFromHexString(CborElement.serializer(), hex))
342+
assertEquals(reference, cbor.decodeFromCbor(DataWithTags.serializer(), struct))
343+
}
314344

315345
assertFailsWith(CborDecodingException::class) {
316346
Cbor.CoseCompliant.decodeFromHexString(
@@ -320,14 +350,7 @@ class CborTaggedTest {
320350
}
321351

322352
assertFailsWith(CborDecodingException::class) {
323-
Cbor {
324-
encodeKeyTags = true
325-
encodeValueTags = true
326-
encodeObjectTags = true
327-
verifyValueTags = true
328-
verifyObjectTags = true
329-
verifyKeyTags = false
330-
}.decodeFromHexString(DataWithTags.serializer(), noValueTags)
353+
cborEncodingKeyTags.decodeFromHexString(DataWithTags.serializer(), noValueTags)
331354
}
332355
}
333356

0 commit comments

Comments
 (0)