diff --git a/CHANGELOG.md b/CHANGELOG.md index fc9e225e..aad782f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Release 5.1.0: - Add `credentialScheme` and `subjectPublicKey` to internal `CredentialToBeIssued` - Refactor `issueCredential` of `Issuer` to directly get the credential-to-be-issued - Replace `buildIssuerCredentialDataProviderOverride` in `CredentialIssuer` with `credentialProvider` to extract user information into a credential + - Remove `dataProvider` from `IssuerAgent`s constructor, as it is not needed with the new issuing interface anyway Release 5.0.1: - Update JsonPath4K to 2.4.0 diff --git a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/CredentialJsonInteropTest.kt b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/CredentialJsonInteropTest.kt index 515c688e..e3ec503a 100644 --- a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/CredentialJsonInteropTest.kt +++ b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/CredentialJsonInteropTest.kt @@ -20,7 +20,7 @@ class CredentialJsonInteropTest : FreeSpec({ holderKeyMaterial = EphemeralKeyWithoutCert() subjectCredentialStore = InMemorySubjectCredentialStore() holderAgent = HolderAgent(holderKeyMaterial, subjectCredentialStore) - issuerAgent = IssuerAgent(EphemeralKeyWithSelfSignedCert(), DummyCredentialDataProvider()) + issuerAgent = IssuerAgent(EphemeralKeyWithSelfSignedCert()) } "Plain jwt credential path resolving" { diff --git a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopCombinedProtocolTest.kt b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopCombinedProtocolTest.kt index 3f9419e1..09798ff6 100644 --- a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopCombinedProtocolTest.kt +++ b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopCombinedProtocolTest.kt @@ -268,10 +268,7 @@ private suspend fun Holder.storeJwtCredential( credentialScheme: ConstantIndex.CredentialScheme, ) { storeCredential( - IssuerAgent( - EphemeralKeyWithoutCert(), - DummyCredentialDataProvider(), - ).issueCredential( + IssuerAgent().issueCredential( DummyCredentialDataProvider().getCredential( holderKeyMaterial.publicKey, credentialScheme, @@ -286,10 +283,7 @@ private suspend fun Holder.storeSdJwtCredential( credentialScheme: ConstantIndex.CredentialScheme, ) { storeCredential( - IssuerAgent( - EphemeralKeyWithoutCert(), - DummyCredentialDataProvider(), - ).issueCredential( + IssuerAgent().issueCredential( DummyCredentialDataProvider().getCredential( holderKeyMaterial.publicKey, credentialScheme, @@ -303,10 +297,7 @@ private suspend fun Holder.storeIsoCredential( holderKeyMaterial: KeyMaterial, credentialScheme: ConstantIndex.CredentialScheme, ) = storeCredential( - IssuerAgent( - EphemeralKeyWithSelfSignedCert(), - DummyCredentialDataProvider(), - ).issueCredential( + IssuerAgent(EphemeralKeyWithSelfSignedCert()).issueCredential( DummyCredentialDataProvider().getCredential( holderKeyMaterial.publicKey, credentialScheme, diff --git a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopCombinedProtocolTwoStepTest.kt b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopCombinedProtocolTwoStepTest.kt index 0032faf8..17d9e850 100644 --- a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopCombinedProtocolTwoStepTest.kt +++ b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopCombinedProtocolTwoStepTest.kt @@ -206,10 +206,7 @@ private suspend fun Holder.storeSdJwtCredential( credentialScheme: ConstantIndex.CredentialScheme, ) { storeCredential( - IssuerAgent( - EphemeralKeyWithoutCert(), - DummyCredentialDataProvider(), - ).issueCredential( + IssuerAgent().issueCredential( DummyCredentialDataProvider().getCredential( holderKeyMaterial.publicKey, credentialScheme, @@ -223,10 +220,7 @@ private suspend fun Holder.storeIsoCredential( holderKeyMaterial: KeyMaterial, credentialScheme: ConstantIndex.CredentialScheme, ) = storeCredential( - IssuerAgent( - EphemeralKeyWithSelfSignedCert(), - DummyCredentialDataProvider(), - ).issueCredential( + IssuerAgent(EphemeralKeyWithSelfSignedCert()).issueCredential( DummyCredentialDataProvider().getCredential( holderKeyMaterial.publicKey, credentialScheme, diff --git a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopInteropTest.kt b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopInteropTest.kt index 918c9e76..cfac1c66 100644 --- a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopInteropTest.kt +++ b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopInteropTest.kt @@ -46,10 +46,7 @@ class OidcSiopInteropTest : FreeSpec({ beforeEach { holderKeyMaterial = EphemeralKeyWithoutCert() holderAgent = HolderAgent(holderKeyMaterial) - val issuerAgent = IssuerAgent( - EphemeralKeyWithoutCert(), - DummyCredentialDataProvider(), - ) + val issuerAgent = IssuerAgent() holderAgent.storeCredential( issuerAgent.issueCredential( DummyCredentialDataProvider().getCredential( diff --git a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopIsoProtocolTest.kt b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopIsoProtocolTest.kt index 95903dc5..3aceb9c1 100644 --- a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopIsoProtocolTest.kt +++ b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopIsoProtocolTest.kt @@ -37,10 +37,7 @@ class OidcSiopIsoProtocolTest : FreeSpec({ walletUrl = "https://example.com/wallet/${uuid4()}" holderAgent = HolderAgent(holderKeyMaterial) - val issuerAgent = IssuerAgent( - EphemeralKeyWithSelfSignedCert(), - DummyCredentialDataProvider(), - ) + val issuerAgent = IssuerAgent(EphemeralKeyWithSelfSignedCert()) holderAgent.storeCredential( issuerAgent.issueCredential( DummyCredentialDataProvider().getCredential( diff --git a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopProtocolTest.kt b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopProtocolTest.kt index 71500592..7b03796d 100644 --- a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopProtocolTest.kt +++ b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopProtocolTest.kt @@ -52,10 +52,7 @@ class OidcSiopProtocolTest : FreeSpec({ holderAgent = HolderAgent(holderKeyMaterial) holderAgent.storeCredential( - IssuerAgent( - EphemeralKeyWithoutCert(), - DummyCredentialDataProvider(), - ).issueCredential( + IssuerAgent().issueCredential( DummyCredentialDataProvider().getCredential( holderKeyMaterial.publicKey, ConstantIndex.AtomicAttribute2023, diff --git a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopSdJwtProtocolTest.kt b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopSdJwtProtocolTest.kt index ec18e670..7cf5a6ce 100644 --- a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopSdJwtProtocolTest.kt +++ b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopSdJwtProtocolTest.kt @@ -36,10 +36,7 @@ class OidcSiopSdJwtProtocolTest : FreeSpec({ verifierAgent = VerifierAgent(verifierKeyMaterial) holderAgent.storeCredential( - IssuerAgent( - EphemeralKeyWithoutCert(), - DummyCredentialDataProvider(), - ).issueCredential( + IssuerAgent().issueCredential( DummyCredentialDataProvider().getCredential( holderKeyMaterial.publicKey, ConstantIndex.AtomicAttribute2023, diff --git a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopWalletScopeSupportTest.kt b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopWalletScopeSupportTest.kt index 0ee0cfda..f9b78524 100644 --- a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopWalletScopeSupportTest.kt +++ b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopWalletScopeSupportTest.kt @@ -89,12 +89,8 @@ class OidcSiopWalletScopeSupportTest : FreeSpec({ } "get empty scope works even without available credentials" { - val issuerAgent = IssuerAgent( - EphemeralKeyWithSelfSignedCert(), - DummyCredentialDataProvider(), - ) holderAgent.storeCredential( - issuerAgent.issueCredential( + IssuerAgent(EphemeralKeyWithSelfSignedCert()).issueCredential( DummyCredentialDataProvider().getCredential( holderKeyMaterial.publicKey, ConstantIndex.AtomicAttribute2023, @@ -134,12 +130,8 @@ class OidcSiopWalletScopeSupportTest : FreeSpec({ } "get MdocMdlWithGivenName scope with available credentials succeeds" { - val issuerAgent = IssuerAgent( - EphemeralKeyWithSelfSignedCert(), - DummyCredentialDataProvider(), - ) holderAgent.storeCredential( - issuerAgent.issueCredential( + IssuerAgent(EphemeralKeyWithSelfSignedCert()).issueCredential( DummyCredentialDataProvider().getCredential( holderKeyMaterial.publicKey, MobileDrivingLicenceScheme, diff --git a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopX509SanDnsTest.kt b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopX509SanDnsTest.kt index d148a1db..f17a50e9 100644 --- a/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopX509SanDnsTest.kt +++ b/vck-openid/src/commonTest/kotlin/at/asitplus/wallet/lib/oidc/OidcSiopX509SanDnsTest.kt @@ -43,10 +43,7 @@ class OidcSiopX509SanDnsTest : FreeSpec({ verifierKeyMaterial = EphemeralKeyWithSelfSignedCert(extensions = extensions) holderAgent = HolderAgent(holderKeyMaterial) holderAgent.storeCredential( - IssuerAgent( - EphemeralKeyWithoutCert(), - DummyCredentialDataProvider(), - ).issueCredential( + IssuerAgent().issueCredential( DummyCredentialDataProvider().getCredential( holderKeyMaterial.publicKey, ConstantIndex.AtomicAttribute2023, diff --git a/vck/src/commonMain/kotlin/at/asitplus/wallet/lib/agent/EmptyCredentialDataProvider.kt b/vck/src/commonMain/kotlin/at/asitplus/wallet/lib/agent/EmptyCredentialDataProvider.kt deleted file mode 100644 index 6174292c..00000000 --- a/vck/src/commonMain/kotlin/at/asitplus/wallet/lib/agent/EmptyCredentialDataProvider.kt +++ /dev/null @@ -1,16 +0,0 @@ -package at.asitplus.wallet.lib.agent - -import at.asitplus.KmmResult -import at.asitplus.signum.indispensable.CryptoPublicKey -import at.asitplus.wallet.lib.data.ConstantIndex - -object EmptyCredentialDataProvider : IssuerCredentialDataProvider { - - override fun getCredential( - subjectPublicKey: CryptoPublicKey, - credentialScheme: ConstantIndex.CredentialScheme, - representation: ConstantIndex.CredentialRepresentation, - claimNames: Collection? - ): KmmResult = KmmResult.failure(NotImplementedError()) - -} \ No newline at end of file diff --git a/vck/src/commonMain/kotlin/at/asitplus/wallet/lib/agent/IssuerAgent.kt b/vck/src/commonMain/kotlin/at/asitplus/wallet/lib/agent/IssuerAgent.kt index b26f0936..21b87e0f 100644 --- a/vck/src/commonMain/kotlin/at/asitplus/wallet/lib/agent/IssuerAgent.kt +++ b/vck/src/commonMain/kotlin/at/asitplus/wallet/lib/agent/IssuerAgent.kt @@ -35,7 +35,6 @@ class IssuerAgent( private val validator: Validator, private val issuerCredentialStore: IssuerCredentialStore = InMemoryIssuerCredentialStore(), private val revocationListBaseUrl: String = "https://wallet.a-sit.at/backend/credentials/status", - private val dataProvider: IssuerCredentialDataProvider = EmptyCredentialDataProvider, private val zlibService: ZlibService = DefaultZlibService(), private val revocationListLifetime: Duration = 48.hours, private val jwsService: JwsService, @@ -46,28 +45,14 @@ class IssuerAgent( private val timePeriodProvider: TimePeriodProvider = FixedTimePeriodProvider, ) : Issuer { - constructor( - keyMaterial: KeyMaterial = EphemeralKeyWithoutCert(), - dataProvider: IssuerCredentialDataProvider = EmptyCredentialDataProvider, - ) : this( - validator = Validator(), - jwsService = DefaultJwsService(DefaultCryptoService(keyMaterial)), - coseService = DefaultCoseService(DefaultCryptoService(keyMaterial)), - dataProvider = dataProvider, - keyMaterial = keyMaterial, - cryptoAlgorithms = setOf(keyMaterial.signatureAlgorithm), - ) - constructor( keyMaterial: KeyMaterial = EphemeralKeyWithoutCert(), issuerCredentialStore: IssuerCredentialStore = InMemoryIssuerCredentialStore(), - dataProvider: IssuerCredentialDataProvider = EmptyCredentialDataProvider, ) : this( validator = Validator(), issuerCredentialStore = issuerCredentialStore, jwsService = DefaultJwsService(DefaultCryptoService(keyMaterial)), coseService = DefaultCoseService(DefaultCryptoService(keyMaterial)), - dataProvider = dataProvider, keyMaterial = keyMaterial, cryptoAlgorithms = setOf(keyMaterial.signatureAlgorithm), ) diff --git a/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/AgentRevocationTest.kt b/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/AgentRevocationTest.kt index 13c09960..d4ba11cc 100644 --- a/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/AgentRevocationTest.kt +++ b/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/AgentRevocationTest.kt @@ -28,11 +28,7 @@ class AgentRevocationTest : FreeSpec({ beforeEach { issuerCredentialStore = InMemoryIssuerCredentialStore() - issuer = IssuerAgent( - EphemeralKeyWithoutCert(), - issuerCredentialStore, - DummyCredentialDataProvider() - ) + issuer = IssuerAgent(EphemeralKeyWithoutCert(), issuerCredentialStore) verifierKeyMaterial = EphemeralKeyWithoutCert() verifier = VerifierAgent(verifierKeyMaterial) expectedRevokedIndexes = issuerCredentialStore.revokeRandomCredentials() diff --git a/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/AgentSdJwtTest.kt b/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/AgentSdJwtTest.kt index 81e77964..0246be18 100644 --- a/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/AgentSdJwtTest.kt +++ b/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/AgentSdJwtTest.kt @@ -37,11 +37,7 @@ class AgentSdJwtTest : FreeSpec({ beforeEach { issuerCredentialStore = InMemoryIssuerCredentialStore() holderCredentialStore = InMemorySubjectCredentialStore() - issuer = IssuerAgent( - EphemeralKeyWithoutCert(), - issuerCredentialStore, - DummyCredentialDataProvider(), - ) + issuer = IssuerAgent(EphemeralKeyWithoutCert(), issuerCredentialStore) holderKeyMaterial = EphemeralKeyWithSelfSignedCert() holder = HolderAgent(holderKeyMaterial, holderCredentialStore) verifier = VerifierAgent() @@ -160,11 +156,10 @@ private fun buildPresentationDefinition(vararg attributeName: String) = Presenta ) suspend fun createFreshSdJwtKeyBinding(challenge: String, verifierId: String): String { - val issuer = IssuerAgent(EphemeralKeyWithoutCert(), DummyCredentialDataProvider()) val holderKeyMaterial = EphemeralKeyWithoutCert() val holder = HolderAgent(holderKeyMaterial) holder.storeCredential( - issuer.issueCredential( + IssuerAgent().issueCredential( DummyCredentialDataProvider().getCredential( holderKeyMaterial.publicKey, ConstantIndex.AtomicAttribute2023, diff --git a/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/AgentTest.kt b/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/AgentTest.kt index 57575052..72af2e95 100644 --- a/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/AgentTest.kt +++ b/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/AgentTest.kt @@ -30,11 +30,7 @@ class AgentTest : FreeSpec({ beforeEach { issuerCredentialStore = InMemoryIssuerCredentialStore() holderCredentialStore = InMemorySubjectCredentialStore() - issuer = IssuerAgent( - EphemeralKeyWithoutCert(), - issuerCredentialStore, - DummyCredentialDataProvider(), - ) + issuer = IssuerAgent(EphemeralKeyWithoutCert(), issuerCredentialStore) holderKeyMaterial = EphemeralKeyWithoutCert() holder = HolderAgent(holderKeyMaterial, holderCredentialStore) verifier = VerifierAgent(holderKeyMaterial) diff --git a/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/ValidatorVcTest.kt b/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/ValidatorVcTest.kt index 06468482..e4b2fb02 100644 --- a/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/ValidatorVcTest.kt +++ b/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/ValidatorVcTest.kt @@ -36,7 +36,7 @@ class ValidatorVcTest : FreeSpec() { beforeEach { issuerCredentialStore = InMemoryIssuerCredentialStore() issuerKeyMaterial = EphemeralKeyWithoutCert() - issuer = IssuerAgent(issuerKeyMaterial, issuerCredentialStore, dataProvider) + issuer = IssuerAgent(issuerKeyMaterial, issuerCredentialStore) issuerJwsService = DefaultJwsService(DefaultCryptoService(issuerKeyMaterial)) verifierKeyMaterial = EphemeralKeyWithoutCert() verifier = VerifierAgent(verifierKeyMaterial) @@ -44,7 +44,7 @@ class ValidatorVcTest : FreeSpec() { "credentials are valid for" { val credential = issuer.issueCredential( - DummyCredentialDataProvider().getCredential( + dataProvider.getCredential( verifierKeyMaterial.publicKey, ConstantIndex.AtomicAttribute2023, ConstantIndex.CredentialRepresentation.PLAIN_JWT, @@ -57,7 +57,7 @@ class ValidatorVcTest : FreeSpec() { "revoked credentials are not valid" { val credential = issuer.issueCredential( - DummyCredentialDataProvider().getCredential( + dataProvider.getCredential( verifierKeyMaterial.publicKey, ConstantIndex.AtomicAttribute2023, ConstantIndex.CredentialRepresentation.PLAIN_JWT, @@ -82,7 +82,7 @@ class ValidatorVcTest : FreeSpec() { "wrong subject keyId is not be valid" { val credential = issuer.issueCredential( - DummyCredentialDataProvider().getCredential( + dataProvider.getCredential( EphemeralKeyWithoutCert().publicKey, ConstantIndex.AtomicAttribute2023, ConstantIndex.CredentialRepresentation.PLAIN_JWT, @@ -96,7 +96,7 @@ class ValidatorVcTest : FreeSpec() { "credential with invalid JWS format is not valid" { val credential = issuer.issueCredential( - DummyCredentialDataProvider().getCredential( + dataProvider.getCredential( verifierKeyMaterial.publicKey, ConstantIndex.AtomicAttribute2023, ConstantIndex.CredentialRepresentation.PLAIN_JWT, diff --git a/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/ValidatorVpTest.kt b/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/ValidatorVpTest.kt index f2260cef..6b069170 100644 --- a/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/ValidatorVpTest.kt +++ b/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/agent/ValidatorVpTest.kt @@ -37,11 +37,7 @@ class ValidatorVpTest : FreeSpec({ beforeEach { validator = Validator() issuerCredentialStore = InMemoryIssuerCredentialStore() - issuer = IssuerAgent( - EphemeralKeyWithoutCert(), - issuerCredentialStore, - DummyCredentialDataProvider(), - ) + issuer = IssuerAgent(EphemeralKeyWithoutCert(), issuerCredentialStore) holderCredentialStore = InMemorySubjectCredentialStore() holderKeyMaterial = EphemeralKeyWithoutCert() holder = HolderAgent(holderKeyMaterial, holderCredentialStore) diff --git a/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/iso/Tag24SerializationTest.kt b/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/iso/Tag24SerializationTest.kt index c2cda790..42cdd768 100644 --- a/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/iso/Tag24SerializationTest.kt +++ b/vck/src/commonTest/kotlin/at/asitplus/wallet/lib/iso/Tag24SerializationTest.kt @@ -81,9 +81,8 @@ class Tag24SerializationTest : FreeSpec({ } "IssuerSigned from IssuerAgent" { - val issuerAgent = IssuerAgent(dataProvider = DummyCredentialDataProvider()) val holderKeyMaterial = EphemeralKeyWithSelfSignedCert() - val issuedCredential = issuerAgent.issueCredential( + val issuedCredential = IssuerAgent().issueCredential( DummyCredentialDataProvider().getCredential( holderKeyMaterial.publicKey, ConstantIndex.AtomicAttribute2023,