Skip to content

Commit

Permalink
Add custom serializers
Browse files Browse the repository at this point in the history
  • Loading branch information
n0900 committed Oct 3, 2024
1 parent 536046a commit c211cc1
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ package at.asitplus.dif.rqes.CollectionEntries
import at.asitplus.dif.rqes.Enums.ConformanceLevelEnum
import at.asitplus.dif.rqes.Enums.SignatureFormat
import at.asitplus.dif.rqes.Enums.SignedEnvelopeProperty
import at.asitplus.dif.rqes.Serializer.Asn1EncodableBase64Serializer
import at.asitplus.signum.indispensable.asn1.Asn1Element
import at.asitplus.signum.indispensable.asn1.ObjectIdentifier
import kotlinx.serialization.EncodeDefault
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonObject

/**
* CSC: Class used as part of [SignatureRequestParameters]
Expand Down Expand Up @@ -39,17 +41,19 @@ data class Document(
val signAlgo: ObjectIdentifier,

/**
* TODO: Serializer
* The Base64-encoded DER-encoded ASN.1 signature parameters
*/
@SerialName("signAlgoParams")
val signAlgoParams: String? = null,
@Serializable(Asn1EncodableBase64Serializer::class)
val signAlgoParams: Asn1Element? = null,

/**
* TODO: CSC P. 80
* Defined in CSC v2.0.0.2 P. 81
* Defines a second way to encode all attributes, none of which are necessary
* Will be ignored until use-case arises
*/
@SerialName("signed_props")
val signedProps: List<String>? = null,
val signedProps: List<JsonObject>? = null,

/**
* if omitted/null it is assumed to have value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ import at.asitplus.dif.rqes.Enums.ConformanceLevelEnum
import at.asitplus.dif.rqes.Enums.SignatureFormat
import at.asitplus.dif.rqes.Enums.SignedEnvelopeProperty
import at.asitplus.dif.rqes.Hashes
import at.asitplus.dif.rqes.Serializer.Asn1EncodableBase64Serializer
import at.asitplus.dif.rqes.contentEquals
import at.asitplus.dif.rqes.contentHashCode
import at.asitplus.signum.indispensable.asn1.Asn1Element
import at.asitplus.signum.indispensable.asn1.ObjectIdentifier
import io.ktor.util.reflect.*
import kotlinx.serialization.EncodeDefault
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonObject


/**
Expand Down Expand Up @@ -50,24 +52,26 @@ data class CscDocumentDigest(
val conformanceLevel: ConformanceLevelEnum? = null,

/**
* TODO use Indespensable [SignatureAlgorithm]? <- needs to be extended to point to OID
* The OID of the algorithm to use for signing
*/
@SerialName("signAlgo")
val signAlgo: ObjectIdentifier,

/**
* TODO: Serializer
* The Base64-encoded DER-encoded ASN.1 signature parameters
* The Base64-encoded DER-encoded ASN.1 signature algorithm parameters if required by
* the signature algorithm - Necessary for RSASSA-PSS for example
*/
@SerialName("signAlgoParams")
val signAlgoParams: String? = null,
@Serializable(Asn1EncodableBase64Serializer::class)
val signAlgoParams: Asn1Element? = null,

/**
* TODO: CSC P. 80
* Defined in CSC v2.0.0.2 P. 81
* Defines a second way to encode all attributes, none of which are necessary
* Will be ignored until use-case arises
*/
@SerialName("signed_props")
val signedProps: List<String>? = null,
val signedProps: List<JsonObject>? = null,

/**
* if omitted/null it is assumed to have value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,8 @@ data class RqesDocumentDigestEntry private constructor(
require(hash != null || dataToBeSignedRepresentation != null)
require(hashAlgorithmOID?.toString() iff hash?.toString())
require(dtbsrHashAlgorithmOID?.toString() iff dataToBeSignedRepresentation?.toString())
require(documentLocationUri?.toString() iff hash?.toString())
require(documentLocationMethod?.toString() iff documentLocationUri?.toString())
require(documentLocationUri iff hash?.toString())
require(documentLocationMethod?.toString() iff documentLocationUri)
}

override fun equals(other: Any?): Boolean {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package at.asitplus.dif.rqes.Serializer

import at.asitplus.signum.indispensable.asn1.Asn1Element
import at.asitplus.signum.indispensable.asn1.encoding.parse
import io.matthewnelson.encoding.base64.Base64
import io.matthewnelson.encoding.core.Decoder.Companion.decodeToByteArray
import io.matthewnelson.encoding.core.Encoder.Companion.encodeToString
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

object Asn1EncodableBase64Serializer : KSerializer<Asn1Element> {
override val descriptor = PrimitiveSerialDescriptor("Asn1Encodable", PrimitiveKind.STRING)

override fun deserialize(decoder: Decoder): Asn1Element {
return Asn1Element.parse(decoder.decodeString().decodeToByteArray(Base64()))
}

override fun serialize(encoder: Encoder, value: Asn1Element) {
encoder.encodeString(value.derEncoded.encodeToString(Base64()))
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@ import at.asitplus.dif.rqes.Enums.SignatureQualifierEnum
import at.asitplus.dif.rqes.Enums.SignedEnvelopeProperty
import at.asitplus.openid.AuthorizationDetails
import at.asitplus.openid.OpenIdConstants
import at.asitplus.signum.indispensable.asn1.Asn1Element
import at.asitplus.signum.indispensable.asn1.KnownOIDs.sha_256
import at.asitplus.signum.indispensable.asn1.ObjectIdentifier
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonObject

/**
* TODO: Find new home (different subfolder most likely)
Expand Down Expand Up @@ -82,8 +84,8 @@ data class RqesRequest(
signatureFormat: SignatureFormat,
conformanceLevelEnum: ConformanceLevelEnum? = ConformanceLevelEnum.ADESBB,
signAlgorithm: ObjectIdentifier,
signAlgoParam: String? = null,
signedProps: List<String>? = null,
signAlgoParam: Asn1Element? = null,
signedProps: List<JsonObject>? = null,
signedEnvelopeProperty: SignedEnvelopeProperty? = SignedEnvelopeProperty.defaultProperty(signatureFormat)
): CscDocumentDigest =
CscDocumentDigest(
Expand Down

0 comments on commit c211cc1

Please sign in to comment.