From bfa249a2f8e61f43b3f19f6db7dec4406fabe429 Mon Sep 17 00:00:00 2001 From: Ahmed Moussa Date: Thu, 30 Nov 2023 01:19:08 +0200 Subject: [PATCH] ci: add manual trigger for docs update Signed-off-by: Ahmed Moussa --- .github/workflows/release-documentation.yml | 59 +++++++++ build.gradle.kts | 7 +- didpeer/build.gradle.kts | 39 +++++- didpeer/docs/DIDPeer.md | 130 ++++++++++++++++++++ 4 files changed, 228 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/release-documentation.yml create mode 100644 didpeer/docs/DIDPeer.md diff --git a/.github/workflows/release-documentation.yml b/.github/workflows/release-documentation.yml new file mode 100644 index 0000000..b7ec36c --- /dev/null +++ b/.github/workflows/release-documentation.yml @@ -0,0 +1,59 @@ +--- +# kics-scan ignore +name: "Release Documentation" + +defaults: + run: + shell: bash + +env: + JAVA_VERSION: 11 + NODEJS_VERSION: 16.17.0 + ATALA_GITHUB_ACTOR: ${{ secrets.ATALA_GITHUB_ACTOR }} + ATALA_GITHUB_TOKEN: ${{ secrets.ATALA_GITHUB_TOKEN }} + +on: + workflow_dispatch: + push: + tags: + - "*" + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: "Checkout the repo" + uses: actions/checkout@v3 + + - name: "Validate Gradle Wrapper" + uses: gradle/wrapper-validation-action@v1 + + - name: "Cache gradle" + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + ~/.konan + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: "Install Java ${{ env.JAVA_VERSION }}" + uses: actions/setup-java@v3 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: "zulu" + + - name: "Dokka Documentation Generation" + run: | + ./gradlew dokkaHtml + + - name: "Push" + uses: s0/git-publish-subdir-action@develop + env: + REPO: self + BRANCH: gh-pages # The branch name where you want to push the assets + FOLDER: "didpeer/build/dokka/html/" # The directory where your assets are generated + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # GitHub will automatically add this - you don't need to bother getting a token + MESSAGE: "feat(docs): ({sha}) {msg}" # The commit message diff --git a/build.gradle.kts b/build.gradle.kts index 323cdb8..545bc31 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,7 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin plugins { - id("org.jetbrains.dokka") version "1.7.10" + id("org.jetbrains.dokka") version "1.9.10" id("maven-publish") } @@ -15,6 +15,7 @@ buildscript { dependencies { classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.20") classpath("com.android.tools.build:gradle:7.2.2") + classpath("org.jetbrains.dokka:dokka-base:1.9.10") } } @@ -53,7 +54,3 @@ allprojects { rootProject.plugins.withType(NodeJsRootPlugin::class.java) { rootProject.extensions.getByType(NodeJsRootExtension::class.java).nodeVersion = "16.17.0" } - -tasks.dokkaGfmMultiModule.configure { - outputDirectory.set(buildDir.resolve("dokkaCustomMultiModuleOutput")) -} diff --git a/didpeer/build.gradle.kts b/didpeer/build.gradle.kts index 888f4d4..e3de206 100644 --- a/didpeer/build.gradle.kts +++ b/didpeer/build.gradle.kts @@ -1,6 +1,7 @@ import org.gradle.internal.os.OperatingSystem import org.jetbrains.dokka.gradle.DokkaTask import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackOutput.Target +import java.net.URL val currentModuleName: String = "DIDCommDIDPeer" val os: OperatingSystem = OperatingSystem.current() @@ -169,8 +170,42 @@ android { } // Dokka implementation -tasks.withType { - moduleName.set(project.name) +tasks.withType().configureEach { + moduleName.set(currentModuleName) moduleVersion.set(rootProject.version.toString()) description = "This is a Kotlin Multiplatform Library for Mercury DIDPeer" + pluginConfiguration { + customAssets = listOf(rootDir.resolve("Logo.png")) + } + dokkaSourceSets { + configureEach { + jdkVersion.set(11) + languageVersion.set("1.7.20") + apiVersion.set("2.0") + includes.from( + "docs/DIDPeer.md" + ) + sourceLink { + localDirectory.set(projectDir.resolve("src")) + remoteUrl.set(URL("https://github.com/input-output-hk/atala-prism-didcomm-kmm/tree/main/src")) + remoteLineSuffix.set("#L") + } + externalDocumentationLink { + url.set(URL("https://kotlinlang.org/api/latest/jvm/stdlib/")) + } + externalDocumentationLink { + url.set(URL("https://kotlinlang.org/api/kotlinx.serialization/")) + } + externalDocumentationLink { + url.set(URL("https://api.ktor.io/")) + } + externalDocumentationLink { + url.set(URL("https://kotlinlang.org/api/kotlinx-datetime/")) + packageListUrl.set(URL("https://kotlinlang.org/api/kotlinx-datetime/")) + } + externalDocumentationLink { + url.set(URL("https://kotlinlang.org/api/kotlinx.coroutines/")) + } + } + } } diff --git a/didpeer/docs/DIDPeer.md b/didpeer/docs/DIDPeer.md new file mode 100644 index 0000000..e3c717b --- /dev/null +++ b/didpeer/docs/DIDPeer.md @@ -0,0 +1,130 @@ +# Module DIDCommDIDPeer + +[![Kotlin](https://img.shields.io/badge/kotlin-1.8.20-blue.svg?logo=kotlin)](http://kotlinlang.org) + +![android](https://camo.githubusercontent.com/b1d9ad56ab51c4ad1417e9a5ad2a8fe63bcc4755e584ec7defef83755c23f923/687474703a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d616e64726f69642d3645444238442e7376673f7374796c653d666c6174) +![ios](https://camo.githubusercontent.com/1fec6f0d044c5e1d73656bfceed9a78fd4121b17e82a2705d2a47f6fd1f0e3e5/687474703a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d696f732d4344434443442e7376673f7374796c653d666c6174) +![jvm](https://camo.githubusercontent.com/700f5dcd442fd835875568c038ae5cd53518c80ae5a0cf12c7c5cf4743b5225b/687474703a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6a766d2d4442343133442e7376673f7374796c653d666c6174) +![js](https://camo.githubusercontent.com/3e0a143e39915184b54b60a2ecedec75e801f396d34b5b366c94ec3604f7e6bd/687474703a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6a732d4638444235442e7376673f7374796c653d666c6174) +![getNode-js](https://camo.githubusercontent.com/d08fda729ceebcae0f23c83499ca8f06105350f037661ac9a4cc7f58edfdbca9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6e6f64656a732d3638613036332e7376673f7374796c653d666c6174) + +![Atala Prism Logo](images/Logo.png) + +Implementation of the [Peer DID method specification](https://identity.foundation/peer-did-method-spec/) in Kotlin MultiPlatform with support for the following targets: + +- JS +- iOS +- Android +- JVM + +This implementation is a re-implementation of this repo but for Kotlin Multiplatform + +- [peer-did-jvm](https://github.com/sicpa-dlab/peer-did-jvm) + +## Example + +Example code: + +```kotlin +val encryptionKeys = listOf( + VerificationMaterialAgreement( + type = VerificationMethodTypeAgreement.X25519_KEY_AGREEMENT_KEY_2019, + format = VerificationMaterialFormatPeerDID.BASE58, + value = "DmgBSHMqaZiYqwNMEJJuxWzsGGC8jUYADrfSdBrC6L8s", + ) +) +val signingKeys = listOf( + VerificationMaterialAuthentication( + type = VerificationMethodTypeAuthentication.ED25519_VERIFICATION_KEY_2018, + format = VerificationMaterialFormatPeerDID.BASE58, + value = "ByHnpUCFb1vAfh9CFZ8ZkmUZguURW8nSw889hy6rD8L7", + ) +) +val service = + """ + { + "type": "DIDCommMessaging", + "serviceEndpoint": "https://example.com/endpoint1", + "routingKeys": ["did:example:somemediator#somekey1"], + "accept": ["didcomm/v2", "didcomm/aip2;env=rfc587"] + } + """ + +val peerDIDAlgo0 = createPeerDIDNumalgo0(signingKeys[0]) +val peerDIDAlgo2 = createPeerDIDNumalgo2( + encryptionKeys, signingKeys, service +) + +val didDocAlgo0Json = resolvePeerDID(peerDIDAlgo0) +val didDocAlgo2Json = resolvePeerDID(peerDIDAlgo2) + +val didDocAlgo0 = DIDDocPeerDID.fromJson(didDocAlgo0Json) +val didDocAlgo2 = DIDDocPeerDID.fromJson(didDocAlgo2Json) +``` + +Example of DID documents: + +### DIDDoc algo 0: +```json +{ + "id": "did:peer:0z6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V", + "authentication": [ + { + "id": "did:peer:0z6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V#6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V", + "type": "Ed25519VerificationKey2020", + "controller": "did:peer:0z6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V", + "publicKeyMultibase": "ByHnpUCFb1vAfh9CFZ8ZkmUZguURW8nSw889hy6rD8L7" + } + ] +} +``` +### did_doc_algo_2 +```json +{ + "id": "did:peer:2.Ez6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V.Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCIsInIiOlsiZGlkOmV4YW1wbGU6c29tZW1lZGlhdG9yI3NvbWVrZXkiXSwiYSI6WyJkaWRjb21tL3YyIiwiZGlkY29tbS9haXAyO2Vudj1yZmM1ODciXX0", + "authentication": [ + { + "id": "did:peer:2.Ez6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V.Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCIsInIiOlsiZGlkOmV4YW1wbGU6c29tZW1lZGlhdG9yI3NvbWVrZXkiXSwiYSI6WyJkaWRjb21tL3YyIiwiZGlkY29tbS9haXAyO2Vudj1yZmM1ODciXX0#6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V", + "type": "Ed25519VerificationKey2020", + "controller": "did:peer:2.Ez6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V.Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCIsInIiOlsiZGlkOmV4YW1wbGU6c29tZW1lZGlhdG9yI3NvbWVrZXkiXSwiYSI6WyJkaWRjb21tL3YyIiwiZGlkY29tbS9haXAyO2Vudj1yZmM1ODciXX0", + "publicKeyMultibase": "z6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V" + }, + { + "id": "did:peer:2.Ez6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V.Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCIsInIiOlsiZGlkOmV4YW1wbGU6c29tZW1lZGlhdG9yI3NvbWVrZXkiXSwiYSI6WyJkaWRjb21tL3YyIiwiZGlkY29tbS9haXAyO2Vudj1yZmM1ODciXX0#6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg", + "type": "Ed25519VerificationKey2020", + "controller": "did:peer:2.Ez6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V.Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCIsInIiOlsiZGlkOmV4YW1wbGU6c29tZW1lZGlhdG9yI3NvbWVrZXkiXSwiYSI6WyJkaWRjb21tL3YyIiwiZGlkY29tbS9haXAyO2Vudj1yZmM1ODciXX0", + "publicKeyMultibase": "z6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg" + } + ], + "keyAgreement": [ + { + "id": "did:peer:2.Ez6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V.Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCIsInIiOlsiZGlkOmV4YW1wbGU6c29tZW1lZGlhdG9yI3NvbWVrZXkiXSwiYSI6WyJkaWRjb21tL3YyIiwiZGlkY29tbS9haXAyO2Vudj1yZmM1ODciXX0#6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc", + "type": "X25519KeyAgreementKey2020", + "controller": "did:peer:2.Ez6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V.Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCIsInIiOlsiZGlkOmV4YW1wbGU6c29tZW1lZGlhdG9yI3NvbWVrZXkiXSwiYSI6WyJkaWRjb21tL3YyIiwiZGlkY29tbS9haXAyO2Vudj1yZmM1ODciXX0", + "publicKeyMultibase": "z6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc" + } + ], + "service": [ + { + "id": "did:peer:2.Ez6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V.Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCIsInIiOlsiZGlkOmV4YW1wbGU6c29tZW1lZGlhdG9yI3NvbWVrZXkiXSwiYSI6WyJkaWRjb21tL3YyIiwiZGlkY29tbS9haXAyO2Vudj1yZmM1ODciXX0#didcommmessaging-0", + "type": "DIDCommMessaging", + "serviceEndpoint": "https://example.com/endpoint", + "routingKeys": [ + "did:example:somemediator#somekey" + ], + "accept": [ + "didcomm/v2", "didcomm/aip2;env=rfc587" + ] + } + ] +} +``` + +## Assumptions and limitations +- Only static layers [1, 2a, 2b](https://identity.foundation/peer-did-method-spec/#layers-of-support) are supported +- Only `X25519` keys are support for key agreement +- Only `Ed25519` keys are support for authentication +- Supported verification materials (input and in the resolved DID DOC): + - [Default] 2020 verification materials (`Ed25519VerificationKey2020` and `X25519KeyAgreementKey2020`) with multibase base58 (`publicKeyMultibase`) public key encoding. + - JWK (`JsonWebKey2020`) using JWK (`publicKeyJwk`) public key encoding + - 2018/2019 verification materials (`Ed25519VerificationKey2018` and `X25519KeyAgreementKey2019`) using base58 (`publicKeyBase58`) public key encoding.