Skip to content

Commit

Permalink
Internet Identity using FIDO2 in C# (#19)
Browse files Browse the repository at this point in the history
* Target .net standard

* Setup plastic ignore

* plasticscm ignore syntax

* DelegationIdentity json format as used by @dfinity/agent-js & @dfinity/internet-identity

* Load session JSON data from file.

Note that the file contents will allow a bearer to act on behalf of the the user! Keep it out of the repo...

* Instructions for building & installing ClientGenerator tool locally

* For debugging: accept existing command line args if they are present

* corrected .net version (Standard doesn't work for applications)

* Strip comment lines from .did file

* Fix for parsing uncommon Candid interface file syntax; and add some better errors

* File renamed (Visual Studio doesn't save the .csproj file as often as it should!)

* Add InternetIdentity project to solution

* Add generated Internet Identity client interface

* Fix errors in generated code; and document the problem

* Blockout of Login flow - get the real user identity, use it to sign a delegation chain

* More fixes in generated code

* Make Plastic XLink

* Checking native fido2 binaries (for win64)

* Refactor: make TypeSourceGenerator into non-static class; and corresponding methods related to type generation into non-static methods

* Try to handle type aliases to user-defined candid types correctly

* Distinguish declaration vs. usage cases: type usage always refers to the proper type alias

* Regenerate from candid (using alias-to-alias fixes)

* First pass implementation of WebAuthnIdentity

* Bug fixes: the delegation identity public key is the key FROM which we delegate; and the delegation public key raw bytes should be DER encoded (not the keytype-dependant representation!)

* Support changing identity being used in IIConnection

* Various small fixes to get DelegationChain to behave correctly.

- Fix CBOR serialization.
- Make correct format string (escaping {} characters).
- Use DER encoded Pubkey as the WebauthnSignIdentity pubkey.
- Remove Fido2 options which sometimes give 'unsupported operation'?

* Remove GetOID and GetRawBytes from IPublicKey.

There is no sensible interpretation of public keys in general the IC spec which operates on the "raw bytes", i.e. the keytype-defendant representation. In order to work with the raw bytes, you must know the concrete key type, so each concrete key type class can provide these methods if it so desires.

* Implement prepare_delegation & get_delegation portion of II auth flow

* Update example to perform full login flow

* Naming conventions

* Make SignIdentityBase into async function

* Start Fido2 assert as a long running Task, otherwise it blocks a thread for a potentially very long time

* Better handling of FidoDevice.Close - we must call this even if Assert throws an error

* Bug fix: Candid recursive type reference always refers to the enclosing type being defined.

In particular, note that a single recursive type may refer to itself in multiple different positions.

* Save/restore identity between runs

* Refactor

* Micro-optimization: don't need spaces in the client data json.

* Experiments with serialization formats

* Validate IC timestamps on delegation chain

* Don't need so many type ids

* Script for easy publishing

* Move project from pointless subdirectory up one level

* Misc fixes

* Update Fido2Net

* Cleanup

* Fixing merge conflicts

* More

* Fixing public keys

* Fixing tests

* Removing COSE

* Adding submodule checkout

* Adding internet identity to the build

* Update DerEncodedPublicKey.cs

* Update dotnet.yml

Co-authored-by: yuriy.toporovskyy@apocalypse333.com <yuriy.toporovskyy@apocalypse333.com>
  • Loading branch information
Gekctek and yuriy0 committed Jan 19, 2023
1 parent f2d0685 commit c2a56cb
Show file tree
Hide file tree
Showing 87 changed files with 3,441 additions and 768 deletions.
12 changes: 12 additions & 0 deletions .config/dotnet-tools.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"version": 1,
"isRoot": true,
"tools": {
"edjcase.icp.clientgenerator": {
"version": "9.44.22-pre",
"commands": [
"candid-client-generator"
]
}
}
}
13 changes: 13 additions & 0 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ jobs:

steps:
- uses: actions/checkout@v3
- name: Checkout submodule
uses: Mushus/checkout-submodule@v1.0.1
with:
submodulePath: Fido2Net
- name: Setup .NET
uses: actions/setup-dotnet@v2
with:
Expand Down Expand Up @@ -41,6 +45,15 @@ jobs:
name: binaries-agent
path: publish-agent

- name: Publish Internet Identity Dlls
run: dotnet publish ./src/InternetIdentity --no-restore -c Release -o ./publish-internet-identity

- name: Upload Internet Identity Binaries Artifact
uses: actions/upload-artifact@v2
with:
name: binaries-internet-identity
path: publish-internet-identity

- name: Publish ClientGenerator Dlls
run: dotnet publish ./src/ClientGenerator --no-restore -c Release -o ./publish-clientgenerator

Expand Down
12 changes: 9 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2

- name: Setup Dotnet
uses: actions/setup-dotnet@v1
with:
Expand All @@ -20,15 +20,21 @@ jobs:

- name: Push Candid
run: dotnet nuget push EdjCase.ICP.Candid.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json

- name: Pack Agent
run: dotnet pack src/Agent/EdjCase.ICP.Agent.csproj --configuration Release /p:Version=${{ github.event.release.tag_name }} --output . --include-symbols --include-source

- name: Push Agent
run: dotnet nuget push EdjCase.ICP.Agent.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json

- name: Pack Internet Identity
run: dotnet pack src/InternetIdentity/EdjCase.ICP.InternetIdentity.csproj --configuration Release /p:Version=${{ github.event.release.tag_name }} --output . --include-symbols --include-source

- name: Push Internet Identity
run: dotnet nuget push EdjCase.ICP.InternetIdentity.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json

- name: Pack Client Generator
run: dotnet pack src/ClientGenerator/EdjCase.ICP.ClientGenerator.csproj --configuration Release /p:Version=${{ github.event.release.tag_name }} --output . --include-symbols --include-source

- name: Push Client Generator
run: dotnet nuget push EdjCase.ICP.ClientGenerator.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json
run: dotnet nuget push EdjCase.ICP.ClientGenerator.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json
15 changes: 14 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,17 @@ x86/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
bin
Bin
[Oo]bj/
obj
Obj
[Ll]og/
[Ll]ogs/

# Visual Studio 2015/2017 cache/options directory
.vs/
.vs
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

Expand Down Expand Up @@ -174,7 +179,7 @@ publish/
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.pubxml.user
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
Expand All @@ -184,6 +189,7 @@ PublishScripts/

# NuGet Packages
*.nupkg
nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
Expand Down Expand Up @@ -216,6 +222,7 @@ _pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
^.*\.cache$
# but keep track of directories ending in .cache
!?*.[Cc]ache/

Expand Down Expand Up @@ -348,3 +355,9 @@ MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/

launchSettings.json
/dist

# Secret test files
test_SessionIdentity.json
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "Fido2Net"]
path = Fido2Net
url = http://github.com/yuriy0/Fido2Net.git
1 change: 1 addition & 0 deletions Fido2Net
Submodule Fido2Net added at 43a5bf
206 changes: 109 additions & 97 deletions ICP.sln
Original file line number Diff line number Diff line change
@@ -1,97 +1,109 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.1.32113.165
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9A64FA9E-AC6C-4C1F-B648-E9E64F172EA8}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
README.md = README.md
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EdjCase.ICP.Agent", "src\Agent\EdjCase.ICP.Agent.csproj", "{773B18A6-5864-4FAE-B6B0-A863FE8F151C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EdjCase.ICP.Candid", "src\Candid\EdjCase.ICP.Candid.csproj", "{8EF917C9-479A-4DE1-9FE1-EB0066BA601A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.CLI", "samples\Sample.CLI\Sample.CLI.csproj", "{99A0577B-3900-4A2D-905A-777FD86C60F8}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F71B8320-C279-4A79-A8D4-4039DB39D522}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Candid.Tests", "test\Common.Tests\Candid.Tests.csproj", "{7F367130-1A9C-4E87-AA50-620767F10EF7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.BlazorWebAssembly.Server", "samples\Sample.BlazorWebAssembly\Server\Sample.BlazorWebAssembly.Server.csproj", "{BF698A87-5C8D-4C60-B704-9F1045156639}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.BlazorWebAssembly.Client", "samples\Sample.BlazorWebAssembly\Client\Sample.BlazorWebAssembly.Client.csproj", "{0C78536E-AD2B-47CF-A784-3EBF49DD0A47}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{7FADA9D9-5FDA-4CFB-8A53-A578A61FBBA9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Shared", "samples\Sample.Shared\Sample.Shared.csproj", "{DDCE02AF-6DEE-485B-AA69-C69F0973E00B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.RestAPI", "samples\Sample.RestAPI\Sample.RestAPI.csproj", "{F76CA92C-211B-46A7-8B21-A808291B268E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EdjCase.ICP.ClientGenerator", "src\ClientGenerator\EdjCase.ICP.ClientGenerator.csproj", "{1C184ECB-7653-4DC1-B453-E529656897CB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EdjCase.Cryptography.BLS", "src\EdjCase.Cryptography.BLS\EdjCase.Cryptography.BLS.csproj", "{DE71EFA5-C09A-4A04-9C27-DE2D360A3D10}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{773B18A6-5864-4FAE-B6B0-A863FE8F151C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{773B18A6-5864-4FAE-B6B0-A863FE8F151C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{773B18A6-5864-4FAE-B6B0-A863FE8F151C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{773B18A6-5864-4FAE-B6B0-A863FE8F151C}.Release|Any CPU.Build.0 = Release|Any CPU
{8EF917C9-479A-4DE1-9FE1-EB0066BA601A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8EF917C9-479A-4DE1-9FE1-EB0066BA601A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8EF917C9-479A-4DE1-9FE1-EB0066BA601A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8EF917C9-479A-4DE1-9FE1-EB0066BA601A}.Release|Any CPU.Build.0 = Release|Any CPU
{99A0577B-3900-4A2D-905A-777FD86C60F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{99A0577B-3900-4A2D-905A-777FD86C60F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{99A0577B-3900-4A2D-905A-777FD86C60F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{99A0577B-3900-4A2D-905A-777FD86C60F8}.Release|Any CPU.Build.0 = Release|Any CPU
{7F367130-1A9C-4E87-AA50-620767F10EF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7F367130-1A9C-4E87-AA50-620767F10EF7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7F367130-1A9C-4E87-AA50-620767F10EF7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7F367130-1A9C-4E87-AA50-620767F10EF7}.Release|Any CPU.Build.0 = Release|Any CPU
{BF698A87-5C8D-4C60-B704-9F1045156639}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BF698A87-5C8D-4C60-B704-9F1045156639}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BF698A87-5C8D-4C60-B704-9F1045156639}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BF698A87-5C8D-4C60-B704-9F1045156639}.Release|Any CPU.Build.0 = Release|Any CPU
{0C78536E-AD2B-47CF-A784-3EBF49DD0A47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0C78536E-AD2B-47CF-A784-3EBF49DD0A47}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0C78536E-AD2B-47CF-A784-3EBF49DD0A47}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0C78536E-AD2B-47CF-A784-3EBF49DD0A47}.Release|Any CPU.Build.0 = Release|Any CPU
{DDCE02AF-6DEE-485B-AA69-C69F0973E00B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DDCE02AF-6DEE-485B-AA69-C69F0973E00B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DDCE02AF-6DEE-485B-AA69-C69F0973E00B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DDCE02AF-6DEE-485B-AA69-C69F0973E00B}.Release|Any CPU.Build.0 = Release|Any CPU
{F76CA92C-211B-46A7-8B21-A808291B268E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F76CA92C-211B-46A7-8B21-A808291B268E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F76CA92C-211B-46A7-8B21-A808291B268E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F76CA92C-211B-46A7-8B21-A808291B268E}.Release|Any CPU.Build.0 = Release|Any CPU
{1C184ECB-7653-4DC1-B453-E529656897CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1C184ECB-7653-4DC1-B453-E529656897CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1C184ECB-7653-4DC1-B453-E529656897CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1C184ECB-7653-4DC1-B453-E529656897CB}.Release|Any CPU.Build.0 = Release|Any CPU
{DE71EFA5-C09A-4A04-9C27-DE2D360A3D10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DE71EFA5-C09A-4A04-9C27-DE2D360A3D10}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DE71EFA5-C09A-4A04-9C27-DE2D360A3D10}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DE71EFA5-C09A-4A04-9C27-DE2D360A3D10}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{99A0577B-3900-4A2D-905A-777FD86C60F8} = {7FADA9D9-5FDA-4CFB-8A53-A578A61FBBA9}
{7F367130-1A9C-4E87-AA50-620767F10EF7} = {F71B8320-C279-4A79-A8D4-4039DB39D522}
{BF698A87-5C8D-4C60-B704-9F1045156639} = {7FADA9D9-5FDA-4CFB-8A53-A578A61FBBA9}
{0C78536E-AD2B-47CF-A784-3EBF49DD0A47} = {7FADA9D9-5FDA-4CFB-8A53-A578A61FBBA9}
{DDCE02AF-6DEE-485B-AA69-C69F0973E00B} = {7FADA9D9-5FDA-4CFB-8A53-A578A61FBBA9}
{F76CA92C-211B-46A7-8B21-A808291B268E} = {7FADA9D9-5FDA-4CFB-8A53-A578A61FBBA9}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3103E11A-E792-49EE-98C5-B2F3709DB088}
EndGlobalSection
EndGlobal

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.1.32113.165
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9A64FA9E-AC6C-4C1F-B648-E9E64F172EA8}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
README.md = README.md
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EdjCase.ICP.Agent", "src\Agent\EdjCase.ICP.Agent.csproj", "{773B18A6-5864-4FAE-B6B0-A863FE8F151C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EdjCase.ICP.Candid", "src\Candid\EdjCase.ICP.Candid.csproj", "{8EF917C9-479A-4DE1-9FE1-EB0066BA601A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.CLI", "samples\Sample.CLI\Sample.CLI.csproj", "{99A0577B-3900-4A2D-905A-777FD86C60F8}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F71B8320-C279-4A79-A8D4-4039DB39D522}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Candid.Tests", "test\Common.Tests\Candid.Tests.csproj", "{7F367130-1A9C-4E87-AA50-620767F10EF7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.BlazorWebAssembly.Server", "samples\Sample.BlazorWebAssembly\Server\Sample.BlazorWebAssembly.Server.csproj", "{BF698A87-5C8D-4C60-B704-9F1045156639}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.BlazorWebAssembly.Client", "samples\Sample.BlazorWebAssembly\Client\Sample.BlazorWebAssembly.Client.csproj", "{0C78536E-AD2B-47CF-A784-3EBF49DD0A47}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{7FADA9D9-5FDA-4CFB-8A53-A578A61FBBA9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Shared", "samples\Sample.Shared\Sample.Shared.csproj", "{DDCE02AF-6DEE-485B-AA69-C69F0973E00B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.RestAPI", "samples\Sample.RestAPI\Sample.RestAPI.csproj", "{F76CA92C-211B-46A7-8B21-A808291B268E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EdjCase.ICP.ClientGenerator", "src\ClientGenerator\EdjCase.ICP.ClientGenerator.csproj", "{1C184ECB-7653-4DC1-B453-E529656897CB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EdjCase.ICP.InternetIdentity", "src\InternetIdentity\EdjCase.ICP.InternetIdentity.csproj", "{6030010B-7BA2-4305-B999-F92995478E02}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fido2Net", "Fido2Net\Fido2Net\Fido2Net.csproj", "{9539D54D-1FBA-43D2-A813-E9EDB7976765}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EdjCase.Cryptography.BLS", "src\EdjCase.Cryptography.BLS\EdjCase.Cryptography.BLS.csproj", "{DE71EFA5-C09A-4A04-9C27-DE2D360A3D10}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{773B18A6-5864-4FAE-B6B0-A863FE8F151C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{773B18A6-5864-4FAE-B6B0-A863FE8F151C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{773B18A6-5864-4FAE-B6B0-A863FE8F151C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{773B18A6-5864-4FAE-B6B0-A863FE8F151C}.Release|Any CPU.Build.0 = Release|Any CPU
{8EF917C9-479A-4DE1-9FE1-EB0066BA601A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8EF917C9-479A-4DE1-9FE1-EB0066BA601A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8EF917C9-479A-4DE1-9FE1-EB0066BA601A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8EF917C9-479A-4DE1-9FE1-EB0066BA601A}.Release|Any CPU.Build.0 = Release|Any CPU
{99A0577B-3900-4A2D-905A-777FD86C60F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{99A0577B-3900-4A2D-905A-777FD86C60F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{99A0577B-3900-4A2D-905A-777FD86C60F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{99A0577B-3900-4A2D-905A-777FD86C60F8}.Release|Any CPU.Build.0 = Release|Any CPU
{7F367130-1A9C-4E87-AA50-620767F10EF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7F367130-1A9C-4E87-AA50-620767F10EF7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7F367130-1A9C-4E87-AA50-620767F10EF7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7F367130-1A9C-4E87-AA50-620767F10EF7}.Release|Any CPU.Build.0 = Release|Any CPU
{BF698A87-5C8D-4C60-B704-9F1045156639}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BF698A87-5C8D-4C60-B704-9F1045156639}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BF698A87-5C8D-4C60-B704-9F1045156639}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BF698A87-5C8D-4C60-B704-9F1045156639}.Release|Any CPU.Build.0 = Release|Any CPU
{0C78536E-AD2B-47CF-A784-3EBF49DD0A47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0C78536E-AD2B-47CF-A784-3EBF49DD0A47}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0C78536E-AD2B-47CF-A784-3EBF49DD0A47}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0C78536E-AD2B-47CF-A784-3EBF49DD0A47}.Release|Any CPU.Build.0 = Release|Any CPU
{DDCE02AF-6DEE-485B-AA69-C69F0973E00B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DDCE02AF-6DEE-485B-AA69-C69F0973E00B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DDCE02AF-6DEE-485B-AA69-C69F0973E00B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DDCE02AF-6DEE-485B-AA69-C69F0973E00B}.Release|Any CPU.Build.0 = Release|Any CPU
{F76CA92C-211B-46A7-8B21-A808291B268E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F76CA92C-211B-46A7-8B21-A808291B268E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F76CA92C-211B-46A7-8B21-A808291B268E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F76CA92C-211B-46A7-8B21-A808291B268E}.Release|Any CPU.Build.0 = Release|Any CPU
{1C184ECB-7653-4DC1-B453-E529656897CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1C184ECB-7653-4DC1-B453-E529656897CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1C184ECB-7653-4DC1-B453-E529656897CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1C184ECB-7653-4DC1-B453-E529656897CB}.Release|Any CPU.Build.0 = Release|Any CPU
{6030010B-7BA2-4305-B999-F92995478E02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6030010B-7BA2-4305-B999-F92995478E02}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6030010B-7BA2-4305-B999-F92995478E02}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6030010B-7BA2-4305-B999-F92995478E02}.Release|Any CPU.Build.0 = Release|Any CPU
{9539D54D-1FBA-43D2-A813-E9EDB7976765}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9539D54D-1FBA-43D2-A813-E9EDB7976765}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9539D54D-1FBA-43D2-A813-E9EDB7976765}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9539D54D-1FBA-43D2-A813-E9EDB7976765}.Release|Any CPU.Build.0 = Release|Any CPU
{DE71EFA5-C09A-4A04-9C27-DE2D360A3D10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DE71EFA5-C09A-4A04-9C27-DE2D360A3D10}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DE71EFA5-C09A-4A04-9C27-DE2D360A3D10}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DE71EFA5-C09A-4A04-9C27-DE2D360A3D10}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{99A0577B-3900-4A2D-905A-777FD86C60F8} = {7FADA9D9-5FDA-4CFB-8A53-A578A61FBBA9}
{7F367130-1A9C-4E87-AA50-620767F10EF7} = {F71B8320-C279-4A79-A8D4-4039DB39D522}
{BF698A87-5C8D-4C60-B704-9F1045156639} = {7FADA9D9-5FDA-4CFB-8A53-A578A61FBBA9}
{0C78536E-AD2B-47CF-A784-3EBF49DD0A47} = {7FADA9D9-5FDA-4CFB-8A53-A578A61FBBA9}
{DDCE02AF-6DEE-485B-AA69-C69F0973E00B} = {7FADA9D9-5FDA-4CFB-8A53-A578A61FBBA9}
{F76CA92C-211B-46A7-8B21-A808291B268E} = {7FADA9D9-5FDA-4CFB-8A53-A578A61FBBA9}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3103E11A-E792-49EE-98C5-B2F3709DB088}
EndGlobalSection
EndGlobal
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,17 @@ dotnet tool install -g EdjCase.ICP.ClientGenerator
candid-client-generator -f "location/to/service.did" -o "location/to/output" -n "My.Namespace.IC" -c "MyClient"
```

### Installing local tool for development

Build with the version of `src/ClientGenerator/EdjCase.ICP.ClientGenerator.csproj` set to some pre-release version (anything not available in NuGet repositories).

e.g.:

```
(cd src/ClientGenerator/ ; dotnet pack --configuration Debug -property:Version=99.99.99-pre)
dotnet tool install EdjCase.ICP.ClientGenerator --local --add-source ./src/ClientGenerator/nupkg --version 99.99.99-pre --ignore-failed-sources
```

# Links

- [IC Http Interface Spec](https://smartcontracts.org/docs/current/references/ic-interface-spec)
Expand Down
Loading

0 comments on commit c2a56cb

Please sign in to comment.