Skip to content

Commit

Permalink
get log entry config
Browse files Browse the repository at this point in the history
Signed-off-by: pstlouis <[email protected]>
  • Loading branch information
PatStLouis committed Sep 8, 2024
1 parent a4be71c commit 8c505da
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 3 deletions.
2 changes: 2 additions & 0 deletions server/app/plugins/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from .askar import AskarStorage, AskarVerifier
from .trust_did_web import TrustDidWeb

__all__ = [
"AskarVerifier",
"AskarStorage",
"TrustDidWeb"
]
97 changes: 97 additions & 0 deletions server/app/plugins/trust_did_web.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
from config import settings
from datetime import datetime, timezone
import canonicaljson
import json
from multiformats import multihash, multibase


class TrustDidWeb:
def __init__(self):
self.did_string_base = r'did:tdw:{SCID}:'+settings.DOMAIN

def _define_parameters(self, update_key=None, next_key=None, ttl=100):
# https://identity.foundation/trustdidweb/#generate-scid
parameters = {
"method": 'did:tdw:0.3',
"scid": r"{SCID}",
"updateKeys": [update_key],
"portable": False,
"prerotation": False,
"nextKeyHashes": [],
# "witness": {},
"deactivated": False,
"ttl": ttl,
}
return parameters

def _generate_entry_hash(self, log_entry):
# https://identity.foundation/trustdidweb/#generate-entry-hash
jcs = canonicaljson.encode_canonical_json(log_entry)
multihash = multihash.digest(jcs.encode(), 'sha2-256').hex()
encoded = multibase.encode(multihash, 'base58btc')[1:]
return encoded

def _generate_scid(self, log_entry):
# https://identity.foundation/trustdidweb/#generate-scid
jcs = canonicaljson.encode_canonical_json(log_entry)
multihash = multihash.digest(jcs.encode(), 'sha2-256').hex()
encoded = multibase.encode(multihash, 'base58btc')[1:]
return encoded

def _add_placeholder_scid(self, item):
if isinstance(item, str):
return item.replace('did:web:', r'did:tdw:{SCID}:')
elif isinstance(item, list):
item['id'].replace('did:web:', r'did:tdw:{SCID}:')
return item
else:
pass

def _web_to_tdw(self, did_doc):
did_doc['id'] = self._add_placeholder_scid(did_doc['id'])
for idx, item in enumerate(did_doc['verificationMethod']):
did_doc['verificationMethod'][idx] = self._add_placeholder_scid(did_doc['verificationMethod'][idx])

def _init_parameters(self):
return {
"method": 'did:tdw:0.3',
"scid": r"{SCID}",
"updateKeys": [],
"portable": False,
"prerotation": False,
"nextKeyHashes": [],
"deactivated": False,
}

def _init_did_doc(self):
return {
"@context": [],
"id": r"{SCID}",
}
def provision_log_entry(self, did_doc):
did_doc['id'] = did_doc['id'].replace('did:web:', r'did:tdw:{SCID}:')
return [
r'{SCID}',
str(datetime.now(timezone.utc).isoformat("T", "seconds")),
self._init_parameters(),
{
"value": did_doc
}
]

def create(self, did_doc):
# https://identity.foundation/trustdidweb/#create-register
did_string = did_doc['id'].replace('did:web:', r'did:tdw:{SCID}:')
authorized_keys = []
initial_did_doc = self._web_to_tdw(did_doc)
parameters = self._define_parameters(update_key=did_doc['verificaitonMethod'][0]['publicKeyMultibase'])
did_log_entry = [
r'{SCID}',
str(datetime.now().isoformat('T', 'seconds')),
parameters,
{"value": initial_did_doc}
]
scid = self._generate_scid(did_log_entry)
did_log_entry = json.loads(json.dumps(did_log_entry).replace('{SCID}', scid))
log_entry_hash = self._generate_entry_hash(did_log_entry)
did_log_entry[0] = f'1-{log_entry_hash}'
15 changes: 12 additions & 3 deletions server/app/routers/identifiers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from fastapi.responses import JSONResponse
from app.models.web_requests import RegisterDID
from config import settings
from app.plugins import AskarVerifier, AskarStorage
from app.plugins import AskarVerifier, AskarStorage, TrustDidWeb
from app.dependencies import (
identifier_available,
did_document_exists,
Expand All @@ -15,12 +15,21 @@

@router.get("/{namespace}/{identifier}", summary="Request DID configuration.")
async def get_did(
namespace: str, identifier: str, dependency=Depends(identifier_available)
namespace: str, identifier: str, logs: bool = False, dependency=Depends(identifier_available)
):
did_doc = create_did_doc_template(namespace, identifier)
if logs:
return JSONResponse(
status_code=200,
content={
"logEntry": TrustDidWeb().provision_log_entry(did_doc),
"options": AskarVerifier().create_proof_config(),
},
)
return JSONResponse(
status_code=200,
content={
"document": create_did_doc_template(namespace, identifier),
"document": did_doc,
"options": AskarVerifier().create_proof_config(),
},
)
Expand Down
1 change: 1 addition & 0 deletions server/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class Settings(BaseSettings):
if "POSTGRES_URI" in os.environ
else "sqlite://app.db"
)
SCID_PLACEHOLDER: str = '{SCID}'


settings = Settings()

0 comments on commit 8c505da

Please sign in to comment.