{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Verify a FHIR Digitally Signing FHIR Bundle or QuestionnaireResponse Object\n", "\n", "This is a Jupyter Notebook using Python 3.7 and openSSl to create JSON Web Signature (JWS)(see RFC 7515) and attach it to a FHIR Bundle or QuestionnaireResponse resource.\n", "\n", "- If the resource is a Bundle use Bundle.signature\n", "- If the resource is a QuestionnaireResponse use its [Signature extension](http://hl7.org/fhir/StructureDefinition/questionnaireresponse-signature\n", ")\n", "\n", "See: http://build.fhir.org/signatures.html\n", "\n", "*Although self-signed certificates are used for the purpose of these examples, they are not recommended for production systems.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Import Libraries" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "from requests import get, post\n", "from json import dumps, loads\n", "from pathlib import Path\n", "# from datetime import datetime\n", "# import pytz\n", "from jose import jws #python JWS package\n", "from base64 import urlsafe_b64encode, b64decode\n", "from jcs import canonicalize #package for a JCS (RFC 8785) compliant canonicalizer.\n", "from lxml import etree" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "...fetching payload from /Users/ehaas/Documents/FHIR/davinci-ecdx/output/Parameters-cdex-parameters-example2.json ....\n", "Parameters Attachment Content Example\n", "{\n", " \"resourceType\": \"Bundle\",\n", " \"id\": \"cdex-document-digital-sig-example\",\n", " \"identifier\": {\n", " \"system\": \"urn:ietf:rfc:3986\",\n", " \"value\": \"urn:uuid:c173535e-135e-48e3-ab64-38bacc68dba8\"\n", " },\n", " \"type\": \"document\",\n", " \"timestamp\": \"2021-10-25T20:16:29-07:00\",\n", " \"entry\": [\n", " {\n", " \"fullUrl\": \"urn:uuid:17a80a8d-4cf1-4deb-a1fd-2db1130e5f76\",\n", " \"resource\": {\n", " \"resourceType\": \"Composition\",\n", " \"id\": \"17a80a8d-4cf1-4deb-a1fd-2db1130e5f76\",\n", " \"text\": {\n", " \"status\": \"generated\",\n", " \"div\": \"

Medical Records Document

This document, titled "Active Conditions," was created on October 25, 2021, by Dr. John Hancock, who also legally attested to its accuracy on the same date. It summarizes the active medical conditions for a patient based on an emergency encounter on October 25, 2021. The document includes one section detailing an active condition: Type 2 Diabetes Mellitus.

\"\n", " },\n", " \"status\": \"final\",\n", " \"type\": {\n", " \"coding\": [\n", " {\n", " \"system\": \"http://loinc.org\",\n", " \"code\": \"11503-0\"\n", " }\n", " ],\n", " \"text\": \"Medical records\"\n", " },\n", " \"subject\": {\n", " \"reference\": \"urn:uuid:970af6c9-5bbd-4067-b6c1-d9b2c823aece\",\n", " \"display\": \"Example Patient\"\n", " },\n", " \"encounter\": {\n", " \"reference\": \"urn:uuid:5ce5c83a-000f-47d2-941c-039358cc9112\",\n", " \"display\": \"Example Encounter\"\n", " },\n", " \"date\": \"2021-10-25T20:16:29-07:00\",\n", " \"author\": [\n", " {\n", " \"reference\": \"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\",\n", " \"display\": \"Example Practitioner\"\n", " }\n", " ],\n", " \"title\": \"Active Conditions\",\n", " \"attester\": [\n", " {\n", " \"mode\": \"legal\",\n", " \"time\": \"2021-10-25T20:16:29-07:00\",\n", " \"party\": {\n", " \"reference\": \"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\",\n", " \"display\": \"Example Practitioner\"\n", " }\n", " }\n", " ],\n", " \"section\": [\n", " {\n", " \"title\": \"Active Condition 1\",\n", " \"entry\": [\n", " {\n", " \"reference\": \"urn:uuid:014a68ec-d691-49e0-b980-91b0d924e570\"\n", " }\n", " ]\n", " }\n", " ]\n", " }\n", " },\n", " {\n", " \"fullUrl\": \"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\",\n", " \"resource\": {\n", " \"resourceType\": \"Practitioner\",\n", " \"id\": \"0820c16d-91de-4dfa-a3a6-f140a516a9bc\",\n", " \"meta\": {\n", " \"lastUpdated\": \"2013-05-05T16:13:03Z\"\n", " },\n", " \"text\": {\n", " \"status\": \"generated\",\n", " \"div\": \"

Practitioner Information

Dr. John Hancock is a healthcare provider with National Provider Identifier (NPI) 9941339100. He authored and attested to the medical records document.

\"\n", " },\n", " \"identifier\": [\n", " {\n", " \"system\": \"http://hl7.org/fhir/sid/us-npi\",\n", " \"value\": \"9941339100\"\n", " }\n", " ],\n", " \"name\": [\n", " {\n", " \"family\": \"Hancock\",\n", " \"given\": [\n", " \"John\"\n", " ]\n", " }\n", " ]\n", " }\n", " },\n", " {\n", " \"fullUrl\": \"urn:uuid:970af6c9-5bbd-4067-b6c1-d9b2c823aece\",\n", " \"resource\": {\n", " \"resourceType\": \"Patient\",\n", " \"id\": \"970af6c9-5bbd-4067-b6c1-d9b2c823aece\",\n", " \"text\": {\n", " \"status\": \"generated\",\n", " \"div\": \"

Patient Information

CDEX Example Patient, a male, is identified by member ID Member123 in the payer system http://example.org/cdex/payer/member-ids. He is the subject of this medical records document. The patient said, "I feel great!"

\"\n", " },\n", " \"identifier\": [\n", " {\n", " \"type\": {\n", " \"coding\": [\n", " {\n", " \"system\": \"http://terminology.hl7.org/CodeSystem/v2-0203\",\n", " \"code\": \"MB\"\n", " }\n", " ]\n", " },\n", " \"system\": \"http://example.org/cdex/payer/member-ids\",\n", " \"value\": \"Member123\"\n", " }\n", " ],\n", " \"active\": true,\n", " \"name\": [\n", " {\n", " \"text\": \"CDEX Example Patient\",\n", " \"family\": \"Patient\",\n", " \"given\": [\n", " \"CDEX Example\"\n", " ]\n", " }\n", " ],\n", " \"gender\": \"male\"\n", " }\n", " },\n", " {\n", " \"fullUrl\": \"urn:uuid:014a68ec-d691-49e0-b980-91b0d924e570\",\n", " \"resource\": {\n", " \"resourceType\": \"Condition\",\n", " \"id\": \"014a68ec-d691-49e0-b980-91b0d924e570\",\n", " \"text\": {\n", " \"status\": \"generated\",\n", " \"div\": \"

Active Condition

The patient has an active diagnosis of Type 2 Diabetes Mellitus (SNOMED CT: 44054006), first identified in 2006. This condition was documented by Dr. John Hancock and is listed as a problem on the patient\\u2019s problem list.

\"\n", " },\n", " \"identifier\": [\n", " {\n", " \"system\": \"urn:oid:1.3.6.1.4.1.22812.4.111.0.4.1.2.1\",\n", " \"value\": \"1\"\n", " }\n", " ],\n", " \"clinicalStatus\": {\n", " \"coding\": [\n", " {\n", " \"system\": \"http://terminology.hl7.org/CodeSystem/condition-clinical\",\n", " \"code\": \"active\"\n", " }\n", " ]\n", " },\n", " \"category\": [\n", " {\n", " \"coding\": [\n", " {\n", " \"system\": \"http://terminology.hl7.org/CodeSystem/condition-category\",\n", " \"code\": \"problem-list-item\",\n", " \"display\": \"Problem List Item\"\n", " }\n", " ],\n", " \"text\": \"Problem List Item\"\n", " }\n", " ],\n", " \"code\": {\n", " \"coding\": [\n", " {\n", " \"system\": \"http://snomed.info/sct\",\n", " \"code\": \"44054006\",\n", " \"display\": \"Type 2 Diabetes Mellitus\"\n", " }\n", " ]\n", " },\n", " \"subject\": {\n", " \"reference\": \"urn:uuid:970af6c9-5bbd-4067-b6c1-d9b2c823aece\"\n", " },\n", " \"onsetDateTime\": \"2006\",\n", " \"asserter\": {\n", " \"reference\": \"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\"\n", " }\n", " }\n", " },\n", " {\n", " \"fullUrl\": \"urn:uuid:5ce5c83a-000f-47d2-941c-039358cc9112\",\n", " \"resource\": {\n", " \"resourceType\": \"Encounter\",\n", " \"id\": \"5ce5c83a-000f-47d2-941c-039358cc9112\",\n", " \"text\": {\n", " \"status\": \"generated\",\n", " \"div\": \"

Encounter Details

An emergency encounter occurred on October 25, 2021, from 8:10 PM to 8:16 PM, involving CDEX Example Patient and attended by Dr. John Hancock at CDEX Example Organization. The encounter type is unspecified (SNOMED CT: 261665006).

\"\n", " },\n", " \"status\": \"finished\",\n", " \"class\": {\n", " \"system\": \"http://terminology.hl7.org/CodeSystem/v3-ActCode\",\n", " \"code\": \"EMER\"\n", " },\n", " \"type\": [\n", " {\n", " \"coding\": [\n", " {\n", " \"system\": \"http://snomed.info/sct\",\n", " \"code\": \"261665006\",\n", " \"display\": \"Unknown (qualifier value)\"\n", " }\n", " ],\n", " \"text\": \"Unknown (qualifier value)\"\n", " }\n", " ],\n", " \"subject\": {\n", " \"reference\": \"urn:uuid:970af6c9-5bbd-4067-b6c1-d9b2c823aece\",\n", " \"display\": \"CDEX Example Patient\"\n", " },\n", " \"participant\": [\n", " {\n", " \"individual\": {\n", " \"reference\": \"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\",\n", " \"display\": \"John Hancock\"\n", " }\n", " }\n", " ],\n", " \"period\": {\n", " \"start\": \"2021-10-25T20:10:29-07:00\",\n", " \"end\": \"2021-10-25T20:16:29-07:00\"\n", " },\n", " \"serviceProvider\": {\n", " \"reference\": \"urn:uuid:e37f004b-dc10-422b-b833-cdaa10a055a3\",\n", " \"display\": \"CDEX Example Organization\"\n", " }\n", " }\n", " },\n", " {\n", " \"fullUrl\": \"urn:uuid:e37f004b-dc10-422b-b833-cdaa10a055a3\",\n", " \"resource\": {\n", " \"resourceType\": \"Organization\",\n", " \"id\": \"e37f004b-dc10-422b-b833-cdaa10a055a3\",\n", " \"text\": {\n", " \"status\": \"generated\",\n", " \"div\": \"

Organization Information

CDEX Example Organization, located at 1 CDEX Lane, Boston, MA 01002, USA, is the service provider for the documented encounter. Contact details include phone: (+1) 555-555-5555 and email: customer-service@example.org. The organization's NPI is 1234567893.

\"\n", " },\n", " \"identifier\": [\n", " {\n", " \"system\": \"http://hl7.org/fhir/sid/us-npi\",\n", " \"value\": \"1234567893\"\n", " }\n", " ],\n", " \"active\": true,\n", " \"name\": \"CDEX Example Organization\",\n", " \"telecom\": [\n", " {\n", " \"system\": \"phone\",\n", " \"value\": \"(+1) 555-555-5555\"\n", " },\n", " {\n", " \"system\": \"email\",\n", " \"value\": \"customer-service@example.org\"\n", " }\n", " ],\n", " \"address\": [\n", " {\n", " \"line\": [\n", " \"1 CDEX Lane\"\n", " ],\n", " \"city\": \"Boston\",\n", " \"state\": \"MA\",\n", " \"postalCode\": \"01002\",\n", " \"country\": \"USA\"\n", " }\n", " ]\n", " }\n", " }\n", " ],\n", " \"signature\": {\n", " \"type\": [\n", " {\n", " \"system\": \"urn:iso-astm:E1762-95:2013\",\n", " \"code\": \"1.2.840.10065.1.12.1.5\",\n", " \"display\": \"Verification Signature\"\n", " }\n", " ],\n", " \"when\": \"2020-10-23T04:54:56.048+00:00\",\n", " \"who\": {\n", " \"identifier\": {\n", " \"type\": {\n", " \"coding\": [\n", " {\n", " \"system\": \"http://terminology.hl7.org/CodeSystem/v2-0203\",\n", " \"code\": \"NPI\"\n", " }\n", " ]\n", " },\n", " \"system\": \"http://hl7.org/fhir/sid/us-npi\",\n", " \"value\": \"9941339100\"\n", " },\n", " \"display\": \"John Hancock, MD\"\n", " },\n", " \"onBehalfOf\": {\n", " \"identifier\": {\n", " \"system\": \"http://hl7.org/fhir/sid/us-npi\",\n", " \"value\": \"1234567893\"\n", " }\n", " },\n", " \"targetFormat\": \"application/fhir+json;canonicalization=http://hl7.org/fhir/canonicalization/json#document\",\n", " \"sigFormat\": \"application/jose\",\n", " \"data\": \"ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNkltSm1ZbVV6WlRWak1EUTNNRFEwTkRVM05qVTBPREV4TXpreU9HUTFaakZsTkdVelpqSmxaV0lpTENKcmRIa2lPaUpTVXlJc0luTnBaMVFpT2lJeU1ESXdMVEV3TFRJelZEQTBPalUwT2pVMkxqQTBPQ3N3TURvd01DSXNJbk55UTIxeklqcGJleUpqYjIxdFNXUWlPbnNpWkdWell5STZJbFpsY21sbWFXTmhkR2x2YmlCVGFXZHVZWFIxY21VaUxDSnBaQ0k2SW5WeWJqcHZhV1E2TVM0eUxqZzBNQzR4TURBMk5TNHhMakV5TGpFdU5TSjlMQ0pqYjIxdFVYVmhiSE1pT2xzaVZtVnlhV1pwWTJGMGFXOXVJRzltSUcxbFpHbGpZV3dnY21WamIzSmtJR2x1ZEdWbmNtbDBlU0pkZlYwc0luUjVjQ0k2SWtwWFZDSXNJbmcxWXlJNld5Sk5TVWxHVm5wRFEwRTNLMmRCZDBsQ1FXZEpWVUp1TkROR05FOHhNVEI2Vms1SVVGVjBRbTV1V0dZek0wWlJkM2RFVVZsS1MyOWFTV2gyWTA1QlVVVk1RbEZCZDJkYVZYaERla0ZLUW1kT1ZrSkJXVlJCYkZaVVRWSk5kMFZSV1VSV1VWRkpSRUZ3UkZsWGVIQmFiVGw1WW0xc2FFMVNTWGRGUVZsRVZsRlJTRVJCYkZSWldGWjZXVmQ0Y0dSSE9IaElWRUZpUW1kT1ZrSkJiMDFHUlZZMFdWY3hkMkpIVldkVU0wcHVXVmMxY0dWdFJqQmhWemwxVFZKcmQwWjNXVVJXVVZGRVJFSkNTMkl5YUhWSlJXaG9ZbTFPZGxreWMzTkpSVEZGVFZOTmQwbFJXVXBMYjFwSmFIWmpUa0ZSYTBKR2FGSnhZVWRHZFZreU9XcGhNRUpzWlVkR2RHTkhlR3hNYlRsNVducEJaVVozTUhsT1ZFRXlUV3BWZVUxNlJYbE5lbXhoUm5jd2VVNTZRVEpOVkZWNVRYcEZlVTE2YkdGTlNVZFdUVkZ6ZDBOUldVUldVVkZIUlhkS1ZsVjZSVlJOUWtWSFFURlZSVU5CZDB0Uk1rWnpZVmRhZG1OdE5YQlpWRVZUVFVKQlIwRXhWVVZDZDNkS1ZUSkdNV015Um5OaFdGSjJUVkl3ZDBkM1dVUldVVkZMUkVKU1JtVkhSblJqUjNoc1NVVTVlVm95Um5WaFdIQm9aRWRzZG1KcVJWcE5RbU5IUVRGVlJVRjNkMUZUYlRsdlltbENTVmxYTldwaU1rNXlURU5DVGxKRVJXcE5RMFZIUTFOeFIxTkpZak5FVVVWS1FWSlpWV0Z0YUdoaWJVNTJXVEowUVZwWWFHaGlXRUp6V2xNMWRtTnRZM2RuWjBkcFRVRXdSME5UY1VkVFNXSXpSRkZGUWtGUlZVRkJORWxDYW5kQmQyZG5SMHRCYjBsQ1oxRkRZMWh0ZGxnMk1FZEJOVWNyUkd3MGFWSnVPVlJUTDNkVVJqRkdWRWc1VW0xeVVESTVSelpZVTA5MVZrUkZaMGRhZDFWVVNra3ZUMnRTVEZCcUswcFZTM2t2YTAxWk0xbHROREZyTTBwU2NqaE9ja28zVldOcVpqTlVaVEpaTUhwdFVrMW1SMHRQTWxnM2NEQXhTV1E0Y2tkb2JtSnpWR3RYYW5ONlkyTnJha3RQVkdzM1JUUklXRTgzV0ZGdFZuWlNXbUZRY21wdVZsWnplalpoU1ZWdGJWVjVRbVZ0VlhoelVGRjRjV3RrTnpkNlVrdGxNVW9yWmsxaWNHSlRibUZHTWxNMVNEbEpOVWx3VVhVelpYSlRhazUzZFc1MWJVcEJMelZ6VGtGVFRWVm1LMXB5U3pWb2RIZFFabXh2Ym14V1FUbElSVkJ2Tms0MWRFcHpRMDFGV1RWeGExcEJXRVExTlZCVlltWTRTWGh5WkRNcmRERnBXRTVCWjAxa1dGQndPVTVxWm0xcmVtRklUM05TTlVWTU56aHZWbVowUzBnNFdFMW5jemxNSzFoWWFHTnRjQ3RUZFZOaVZWUXJiR0ZSUm01TFdsbzJOakZGUWpoVlZsRkhVR2h6U0dOMVdYbzNUUzhyUjBRM2JHdHRialYzTjJjMmFYcFpNRFZFY3pGMFpIUm9NMmhDSzBVeFpUQldPR0ZzTUN0SVdYaFlkRzFNTWpoUFluSjFjbHAwTlZaUFZEWXpObUZDVjJWaGF6TnRNV3gwSzBwTWFWUlhkMk5KV0hWeWFVcDNXRU5STjFjeVQyaEpjbXhsUW01ME5WbFNaRVl2Vm5kclFXWTFRbkEwTUVSTGNsbFRka0pVTDNnelVHRnlZbU5CY3pWeWRXRTBUV2w2ZEhwM2VrMURRWGRGUVVGaFQwSnVSRU5DYlZSQlNrSm5UbFpJVWsxRlFXcEJRVTFCYzBkQk1WVmtSSGRSUlVGM1NVWTBSRUpuUW1kT1ZraFNSVVZYVkVKWVoyYzVNMlF6WTNWYVdHaG9ZbGhDYzFwVE5YWmpiV1ZuUjFGWlNsbEpXa2xCV1dJMVYzZFJSMjlCZDAxRGFtczFUa1JGZWsxNmEzaE5SRU5IUzFkb01HUklRbnBQYVRoMldsaG9hR0pZUW5OYVV6VjJZMjFqZGxwdGFIQmphVGxSWTIxR2FtUkhiREJoVnpsMVdsaEpkazFVU1hwTlFqQkhRVEZWWkVSblVWZENRbE12ZG1vMVkwSklRa1ZTV0ZwVloxSlBVMnBXT0dWVWFqaDFObnBCVGtKbmEzRm9hMmxIT1hjd1FrRlJjMFpCUVU5RFFWbEZRV1pIYURCbWRqYzJRazE1VW5CcGJpODJiVEpPYms5QmQxbE9LMWRaVGxjMFduZFJTMUJ2YUN0cFFrWnFaMkl2WjFoYUwzZ3paRzVIY1RKU1ZXNVNTRXg1WW1OMmNVOTNRemgwTkN0TU1sRmhaVzUwZWk5NlUweG1Ra2xwU0ZBcmRuUmhkVlp2TkZscGNsVkxTVVpQTlU1clJHSlFVbmRGV0RaYWNHOTBkMUpGTW5BeldWQlBjVzFNYWxWd2RYRmxla3RTWm5WNlptWkZVMGxIUTFkbU5tSkJXbTlJT0c5MmVYcHJjRlZQZUZReWJHTktUREpaVVdkNFlVVkZLeTlOVDBWRWVHSjVMMGMxZEU1c1NGZFZNWEp0TWpsRVdrUTJhVlJ1T0VaSVRVOWlORVJCWlV4ek4yUmxWVUpMWlVGNGJVTk9NWGN3TjBsaVNHWlVXQ3M0ZUc5NlFtczRiVFJ5VVdGU1NUSkdZV05IWTA0dlV6UlBhMmxwYW14b2ExbHVSR1JpWWpaYWIwbENPVGxCVFVjdk1IUk5aMWRuYURVMVJrTk1PWGN5ZVhWaVJrUnpVaXN4ZVZwWE5YYzJlSFpXZFdKR2IzRXlja3RKV1U0MlFsUk5WRE0wT1U0clMxbEdVbFJpSzNCWU1EUlJSa1pEY1ZneFQzbDFVVVZLYWtwd1dtRjFURWxXVTIxVllWWjZSRmRrWVZKdGREQnlhMHhFTmxJNE5YUm9XVXB3VG5oTmNqUnZRWEp6ZVRWcGJEVk1NRXBXVFVWWVJ6RXhRMmhGZUZKRFNqZFljMmhyZEV4cWFpdEJPR3hrVlZKeVRFaFNWMWh2ZEhnMmJVNVdjRE1yVFc5cFEyaDROMUJtYmtkMlExQmhVSFpyVEZGeGFXVTRaRGh5YXpCbGFrNHpJbDE5Li5JU2JVQ3J5T29oQjB3U3RoSWdOVkhSaVNTLVBmcjh1dnRKb29ac3dSQlE0R3R0Vk4taG13c0VKQTNMcVE5Nmd3NkRWcHBfYkNsUy0yeDBZZWRvejJiT212REZLNmdrekhMdW83LXJVbHhfR0dZYUJNQ25qWjJNZnpZZmZLR3VzeGRqNHBYQzJlRHIyeHQyYlNJZG4wR3JnRnJxM21idFNXdmtvTTdRcVE5czZZQTZnSEI2RVJjcjVpREgteEhIZW0ydzNGRWNrWUpRODBiVVhxeVladS1MbGFYWnluNW11RW02MVVxeGFCMjdFeElkeGZJUnRIbGdPMUh3VldQYVZUa01hNzYwTXNwNmxzMDduQ0FKVnVrOFZ6VkFCbWg3M3FXZ3JEcC1UdU5DNWJiSzFSY3RXM1dWOXZteVE4MF84Z28xOE9ONjJZb2NLeGFWRWwxQzFzdGI2dW9oUE9kbU5CQUhxYzJtM2F6UlFxVU9rdkt0UHl5V3hlQkNoSVR6LWhqNmpCTS1ERDVZWERFdFVJd21OTDVnZXB1STdzZFZNemZtX2R4ZjcyM3Y4bEhFTjAyd1JXSUh3UldIWkFiMndpempsYVZJSEptUWJ5YXVyQi1BVUdvb0dNM2FGaC1YVkJLSFVIMVhwZldwRmtfS2thMmE1Vkw0bldrWG9VbXEyRw==\"\n", " }\n", "}\n" ] } ], "source": [ "local_file = True\n", "# local_file = False\n", "\n", "# bundle_id = \"signed_object.json\" # insert bundle or questionnaireresponse id here\n", "# bundle_id = 'Bundle-cdex-searchbundle-digital-sig-example.json'\n", "# bundle_id = 'Bundle-cdex-document-digital-sig-example.json'\n", "# bundle_id = 'QuestionnaireResponse-cdex-questionnaireresponse-example4.json'\n", "bundle_id = 'Parameters-cdex-parameters-example2.json'\n", "# bundle_id = 'cdex-parameters-example2.json'\n", "# bundle_id = 'cdex-document-digital-sig-example.json'\n", "\n", "# url = \"https://argopatientlist.aidbox.app/fhir/Bundle\"\n", "# url = 'http://test.fhir.org/r4/Bundle'\n", "# url = 'https://hl7.org/fhir/us/davinci-cdex'\n", "url = 'https://build.fhir.org/ig/HL7/davinci-ecdx/'\n", "\n", "def fetch_payload():\n", "\n", " print(f'...fetching payload from {url}/{bundle_id} ....')\n", " username = \"basic\"\n", " password = \"secret\"\n", " headers = {\"Accept\": \"application/fhir+json\" , \"Content-Type\": \"application/fhir+json\"}\n", "\n", " r = get(f'{url}/{bundle_id}', auth=(username, password), headers = headers)\n", " my_obj = r.json()\n", " # print(\"=\"*80)\n", " # print(\"STATUS: \",r.status_code)\n", "\n", " # print(\"=\"*80)\n", " # print(\"HEADERS:\\n\")\n", " # for k,v in r.headers.items():\n", " # print(f'{k} = {v}')\n", " # print(\"=\"*80)\n", " # print(\"BODY:\\n\")\n", " # print(dumps(my_obj,indent=2))\n", " return(my_obj)\n", "\n", "if local_file: \n", " # in_path = '/Users/ehaas/Documents/FHIR/davinci-ecdx/CDEX-Signatures/out_files'\n", " in_path = '/Users/ehaas/Documents/FHIR/davinci-ecdx/output'\n", " # in_path = '/Users/ehaas/Documents/FHIR/davinci-ecdx/input/examples' \n", " # in_path = '/Users/ehaas/Downloads/'\n", " path = Path(in_path) / bundle_id\n", " print(f'...fetching payload from {path} ....')\n", " my_obj =loads(path.read_text())\n", " if my_obj['resourceType'] == \"Parameters\":\n", " print('Parameters Attachment Content Example')\n", " my_obj = my_obj['parameter'][7]['part'][2]['resource']\n", "else:\n", " my_obj = fetch_payload()\n", "print(dumps(my_obj,indent=2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Receiver/Verifier Steps" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Remove the Signature from the Bundle or QR" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'type': [{'system': 'urn:iso-astm:E1762-95:2013',\n", " 'code': '1.2.840.10065.1.12.1.5',\n", " 'display': 'Verification Signature'}],\n", " 'when': '2020-10-23T04:54:56.048+00:00',\n", " 'who': {'identifier': {'type': {'coding': [{'system': 'http://terminology.hl7.org/CodeSystem/v2-0203',\n", " 'code': 'NPI'}]},\n", " 'system': 'http://hl7.org/fhir/sid/us-npi',\n", " 'value': '9941339100'},\n", " 'display': 'John Hancock, MD'},\n", " 'onBehalfOf': {'identifier': {'system': 'http://hl7.org/fhir/sid/us-npi',\n", " 'value': '1234567893'}},\n", " 'targetFormat': 'application/fhir+json;canonicalization=http://hl7.org/fhir/canonicalization/json#document',\n", " 'sigFormat': 'application/jose',\n", " 'data': 'ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNkltSm1ZbVV6WlRWak1EUTNNRFEwTkRVM05qVTBPREV4TXpreU9HUTFaakZsTkdVelpqSmxaV0lpTENKcmRIa2lPaUpTVXlJc0luTnBaMVFpT2lJeU1ESXdMVEV3TFRJelZEQTBPalUwT2pVMkxqQTBPQ3N3TURvd01DSXNJbk55UTIxeklqcGJleUpqYjIxdFNXUWlPbnNpWkdWell5STZJbFpsY21sbWFXTmhkR2x2YmlCVGFXZHVZWFIxY21VaUxDSnBaQ0k2SW5WeWJqcHZhV1E2TVM0eUxqZzBNQzR4TURBMk5TNHhMakV5TGpFdU5TSjlMQ0pqYjIxdFVYVmhiSE1pT2xzaVZtVnlhV1pwWTJGMGFXOXVJRzltSUcxbFpHbGpZV3dnY21WamIzSmtJR2x1ZEdWbmNtbDBlU0pkZlYwc0luUjVjQ0k2SWtwWFZDSXNJbmcxWXlJNld5Sk5TVWxHVm5wRFEwRTNLMmRCZDBsQ1FXZEpWVUp1TkROR05FOHhNVEI2Vms1SVVGVjBRbTV1V0dZek0wWlJkM2RFVVZsS1MyOWFTV2gyWTA1QlVVVk1RbEZCZDJkYVZYaERla0ZLUW1kT1ZrSkJXVlJCYkZaVVRWSk5kMFZSV1VSV1VWRkpSRUZ3UkZsWGVIQmFiVGw1WW0xc2FFMVNTWGRGUVZsRVZsRlJTRVJCYkZSWldGWjZXVmQ0Y0dSSE9IaElWRUZpUW1kT1ZrSkJiMDFHUlZZMFdWY3hkMkpIVldkVU0wcHVXVmMxY0dWdFJqQmhWemwxVFZKcmQwWjNXVVJXVVZGRVJFSkNTMkl5YUhWSlJXaG9ZbTFPZGxreWMzTkpSVEZGVFZOTmQwbFJXVXBMYjFwSmFIWmpUa0ZSYTBKR2FGSnhZVWRHZFZreU9XcGhNRUpzWlVkR2RHTkhlR3hNYlRsNVducEJaVVozTUhsT1ZFRXlUV3BWZVUxNlJYbE5lbXhoUm5jd2VVNTZRVEpOVkZWNVRYcEZlVTE2YkdGTlNVZFdUVkZ6ZDBOUldVUldVVkZIUlhkS1ZsVjZSVlJOUWtWSFFURlZSVU5CZDB0Uk1rWnpZVmRhZG1OdE5YQlpWRVZUVFVKQlIwRXhWVVZDZDNkS1ZUSkdNV015Um5OaFdGSjJUVkl3ZDBkM1dVUldVVkZMUkVKU1JtVkhSblJqUjNoc1NVVTVlVm95Um5WaFdIQm9aRWRzZG1KcVJWcE5RbU5IUVRGVlJVRjNkMUZUYlRsdlltbENTVmxYTldwaU1rNXlURU5DVGxKRVJXcE5RMFZIUTFOeFIxTkpZak5FVVVWS1FWSlpWV0Z0YUdoaWJVNTJXVEowUVZwWWFHaGlXRUp6V2xNMWRtTnRZM2RuWjBkcFRVRXdSME5UY1VkVFNXSXpSRkZGUWtGUlZVRkJORWxDYW5kQmQyZG5SMHRCYjBsQ1oxRkRZMWh0ZGxnMk1FZEJOVWNyUkd3MGFWSnVPVlJUTDNkVVJqRkdWRWc1VW0xeVVESTVSelpZVTA5MVZrUkZaMGRhZDFWVVNra3ZUMnRTVEZCcUswcFZTM2t2YTAxWk0xbHROREZyTTBwU2NqaE9ja28zVldOcVpqTlVaVEpaTUhwdFVrMW1SMHRQTWxnM2NEQXhTV1E0Y2tkb2JtSnpWR3RYYW5ONlkyTnJha3RQVkdzM1JUUklXRTgzV0ZGdFZuWlNXbUZRY21wdVZsWnplalpoU1ZWdGJWVjVRbVZ0VlhoelVGRjRjV3RrTnpkNlVrdGxNVW9yWmsxaWNHSlRibUZHTWxNMVNEbEpOVWx3VVhVelpYSlRhazUzZFc1MWJVcEJMelZ6VGtGVFRWVm1LMXB5U3pWb2RIZFFabXh2Ym14V1FUbElSVkJ2Tms0MWRFcHpRMDFGV1RWeGExcEJXRVExTlZCVlltWTRTWGh5WkRNcmRERnBXRTVCWjAxa1dGQndPVTVxWm0xcmVtRklUM05TTlVWTU56aHZWbVowUzBnNFdFMW5jemxNSzFoWWFHTnRjQ3RUZFZOaVZWUXJiR0ZSUm01TFdsbzJOakZGUWpoVlZsRkhVR2h6U0dOMVdYbzNUUzhyUjBRM2JHdHRialYzTjJjMmFYcFpNRFZFY3pGMFpIUm9NMmhDSzBVeFpUQldPR0ZzTUN0SVdYaFlkRzFNTWpoUFluSjFjbHAwTlZaUFZEWXpObUZDVjJWaGF6TnRNV3gwSzBwTWFWUlhkMk5KV0hWeWFVcDNXRU5STjFjeVQyaEpjbXhsUW01ME5WbFNaRVl2Vm5kclFXWTFRbkEwTUVSTGNsbFRka0pVTDNnelVHRnlZbU5CY3pWeWRXRTBUV2w2ZEhwM2VrMURRWGRGUVVGaFQwSnVSRU5DYlZSQlNrSm5UbFpJVWsxRlFXcEJRVTFCYzBkQk1WVmtSSGRSUlVGM1NVWTBSRUpuUW1kT1ZraFNSVVZYVkVKWVoyYzVNMlF6WTNWYVdHaG9ZbGhDYzFwVE5YWmpiV1ZuUjFGWlNsbEpXa2xCV1dJMVYzZFJSMjlCZDAxRGFtczFUa1JGZWsxNmEzaE5SRU5IUzFkb01HUklRbnBQYVRoMldsaG9hR0pZUW5OYVV6VjJZMjFqZGxwdGFIQmphVGxSWTIxR2FtUkhiREJoVnpsMVdsaEpkazFVU1hwTlFqQkhRVEZWWkVSblVWZENRbE12ZG1vMVkwSklRa1ZTV0ZwVloxSlBVMnBXT0dWVWFqaDFObnBCVGtKbmEzRm9hMmxIT1hjd1FrRlJjMFpCUVU5RFFWbEZRV1pIYURCbWRqYzJRazE1VW5CcGJpODJiVEpPYms5QmQxbE9LMWRaVGxjMFduZFJTMUJ2YUN0cFFrWnFaMkl2WjFoYUwzZ3paRzVIY1RKU1ZXNVNTRXg1WW1OMmNVOTNRemgwTkN0TU1sRmhaVzUwZWk5NlUweG1Ra2xwU0ZBcmRuUmhkVlp2TkZscGNsVkxTVVpQTlU1clJHSlFVbmRGV0RaYWNHOTBkMUpGTW5BeldWQlBjVzFNYWxWd2RYRmxla3RTWm5WNlptWkZVMGxIUTFkbU5tSkJXbTlJT0c5MmVYcHJjRlZQZUZReWJHTktUREpaVVdkNFlVVkZLeTlOVDBWRWVHSjVMMGMxZEU1c1NGZFZNWEp0TWpsRVdrUTJhVlJ1T0VaSVRVOWlORVJCWlV4ek4yUmxWVUpMWlVGNGJVTk9NWGN3TjBsaVNHWlVXQ3M0ZUc5NlFtczRiVFJ5VVdGU1NUSkdZV05IWTA0dlV6UlBhMmxwYW14b2ExbHVSR1JpWWpaYWIwbENPVGxCVFVjdk1IUk5aMWRuYURVMVJrTk1PWGN5ZVhWaVJrUnpVaXN4ZVZwWE5YYzJlSFpXZFdKR2IzRXlja3RKV1U0MlFsUk5WRE0wT1U0clMxbEdVbFJpSzNCWU1EUlJSa1pEY1ZneFQzbDFVVVZLYWtwd1dtRjFURWxXVTIxVllWWjZSRmRrWVZKdGREQnlhMHhFTmxJNE5YUm9XVXB3VG5oTmNqUnZRWEp6ZVRWcGJEVk1NRXBXVFVWWVJ6RXhRMmhGZUZKRFNqZFljMmhyZEV4cWFpdEJPR3hrVlZKeVRFaFNWMWh2ZEhnMmJVNVdjRE1yVFc5cFEyaDROMUJtYmtkMlExQmhVSFpyVEZGeGFXVTRaRGh5YXpCbGFrNHpJbDE5Li5JU2JVQ3J5T29oQjB3U3RoSWdOVkhSaVNTLVBmcjh1dnRKb29ac3dSQlE0R3R0Vk4taG13c0VKQTNMcVE5Nmd3NkRWcHBfYkNsUy0yeDBZZWRvejJiT212REZLNmdrekhMdW83LXJVbHhfR0dZYUJNQ25qWjJNZnpZZmZLR3VzeGRqNHBYQzJlRHIyeHQyYlNJZG4wR3JnRnJxM21idFNXdmtvTTdRcVE5czZZQTZnSEI2RVJjcjVpREgteEhIZW0ydzNGRWNrWUpRODBiVVhxeVladS1MbGFYWnluNW11RW02MVVxeGFCMjdFeElkeGZJUnRIbGdPMUh3VldQYVZUa01hNzYwTXNwNmxzMDduQ0FKVnVrOFZ6VkFCbWg3M3FXZ3JEcC1UdU5DNWJiSzFSY3RXM1dWOXZteVE4MF84Z28xOE9ONjJZb2NLeGFWRWwxQzFzdGI2dW9oUE9kbU5CQUhxYzJtM2F6UlFxVU9rdkt0UHl5V3hlQkNoSVR6LWhqNmpCTS1ERDVZWERFdFVJd21OTDVnZXB1STdzZFZNemZtX2R4ZjcyM3Y4bEhFTjAyd1JXSUh3UldIWkFiMndpempsYVZJSEptUWJ5YXVyQi1BVUdvb0dNM2FGaC1YVkJLSFVIMVhwZldwRmtfS2thMmE1Vkw0bldrWG9VbXEyRw=='}" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if my_obj['resourceType'] == 'Bundle':\n", " recd_signature = my_obj.pop('signature', None) #for Bundles\n", "elif my_obj['resourceType'] == 'QuestionnaireResponse':\n", " try:\n", " for i, extension in enumerate(my_obj['extension']):\n", " if extension['url'] == 'http://hl7.org/fhir/StructureDefinition/questionnaireresponse-signature':\n", " my_obj_signature_ext = my_obj['extension'].pop(i) # remove element\n", " recd_signature = my_obj_signature_ext['valueSignature']\n", " if i == 0:\n", " my_obj.pop('extension') # remove extension if empty\n", " except KeyError:\n", " print('No signature extension found')\n", "else:\n", " print('Not a Bundle or QuestionnaireResponse')\n", "\n", "recd_signature" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Canonicalize the resource using IETF JSON Canonicalization Scheme (JCS):\n", "\n", "- Remove the id and meta elements if present before JCS canonicalization\n", "- Canonicalize the XHTML in the Narrative using C14 N 1.0 before JCS canonicalization" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b'{\"entry\":[{\"fullUrl\":\"urn:uuid:17a80a8d-4cf1-4deb-a1fd-2db1130e5f76\",\"resource\":{\"attester\":[{\"mode\":\"legal\",\"party\":{\"display\":\"Example Practitioner\",\"reference\":\"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\"},\"time\":\"2021-10-25T20:16:29-07:00\"}],\"author\":[{\"display\":\"Example Practitioner\",\"reference\":\"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\"}],\"date\":\"2021-10-25T20:16:29-07:00\",\"encounter\":{\"display\":\"Example Encounter\",\"reference\":\"urn:uuid:5ce5c83a-000f-47d2-941c-039358cc9112\"},\"id\":\"17a80a8d-4cf1-4deb-a1fd-2db1130e5f76\",\"resourceType\":\"Composition\",\"section\":[{\"entry\":[{\"reference\":\"urn:uuid:014a68ec-d691-49e0-b980-91b0d924e570\"}],\"title\":\"Active Condition 1\"}],\"status\":\"final\",\"subject\":{\"display\":\"Example Patient\",\"reference\":\"urn:uuid:970af6c9-5bbd-4067-b6c1-d9b2c823aece\"},\"text\":{\"div\":\"

Medical Records Document

This document, titled "Active Conditions," was created on October 25, 2021, by Dr. John Hancock, who also legally attested to its accuracy on the same date. It summarizes the active medical conditions for a patient based on an emergency encounter on October 25, 2021. The document includes one section detailing an active condition: Type 2 Diabetes Mellitus.

\",\"status\":\"generated\"},\"title\":\"Active Conditions\",\"type\":{\"coding\":[{\"code\":\"11503-0\",\"system\":\"http://loinc.org\"}],\"text\":\"Medical records\"}}},{\"fullUrl\":\"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\",\"resource\":{\"id\":\"0820c16d-91de-4dfa-a3a6-f140a516a9bc\",\"identifier\":[{\"system\":\"http://hl7.org/fhir/sid/us-npi\",\"value\":\"9941339100\"}],\"meta\":{\"lastUpdated\":\"2013-05-05T16:13:03Z\"},\"name\":[{\"family\":\"Hancock\",\"given\":[\"John\"]}],\"resourceType\":\"Practitioner\",\"text\":{\"div\":\"

Practitioner Information

Dr. John Hancock is a healthcare provider with National Provider Identifier (NPI) 9941339100. He authored and attested to the medical records document.

\",\"status\":\"generated\"}}},{\"fullUrl\":\"urn:uuid:970af6c9-5bbd-4067-b6c1-d9b2c823aece\",\"resource\":{\"active\":true,\"gender\":\"male\",\"id\":\"970af6c9-5bbd-4067-b6c1-d9b2c823aece\",\"identifier\":[{\"system\":\"http://example.org/cdex/payer/member-ids\",\"type\":{\"coding\":[{\"code\":\"MB\",\"system\":\"http://terminology.hl7.org/CodeSystem/v2-0203\"}]},\"value\":\"Member123\"}],\"name\":[{\"family\":\"Patient\",\"given\":[\"CDEX Example\"],\"text\":\"CDEX Example Patient\"}],\"resourceType\":\"Patient\",\"text\":{\"div\":\"

Patient Information

CDEX Example Patient, a male, is identified by member ID Member123 in the payer system http://example.org/cdex/payer/member-ids. He is the subject of this medical records document. The patient said, "I feel great!"

\",\"status\":\"generated\"}}},{\"fullUrl\":\"urn:uuid:014a68ec-d691-49e0-b980-91b0d924e570\",\"resource\":{\"asserter\":{\"reference\":\"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\"},\"category\":[{\"coding\":[{\"code\":\"problem-list-item\",\"display\":\"Problem List Item\",\"system\":\"http://terminology.hl7.org/CodeSystem/condition-category\"}],\"text\":\"Problem List Item\"}],\"clinicalStatus\":{\"coding\":[{\"code\":\"active\",\"system\":\"http://terminology.hl7.org/CodeSystem/condition-clinical\"}]},\"code\":{\"coding\":[{\"code\":\"44054006\",\"display\":\"Type 2 Diabetes Mellitus\",\"system\":\"http://snomed.info/sct\"}]},\"id\":\"014a68ec-d691-49e0-b980-91b0d924e570\",\"identifier\":[{\"system\":\"urn:oid:1.3.6.1.4.1.22812.4.111.0.4.1.2.1\",\"value\":\"1\"}],\"onsetDateTime\":\"2006\",\"resourceType\":\"Condition\",\"subject\":{\"reference\":\"urn:uuid:970af6c9-5bbd-4067-b6c1-d9b2c823aece\"},\"text\":{\"div\":\"

Active Condition

The patient has an active diagnosis of Type 2 Diabetes Mellitus (SNOMED CT: 44054006), first identified in 2006. This condition was documented by Dr. John Hancock and is listed as a problem on the patient\\xe2\\x80\\x99s problem list.

\",\"status\":\"generated\"}}},{\"fullUrl\":\"urn:uuid:5ce5c83a-000f-47d2-941c-039358cc9112\",\"resource\":{\"class\":{\"code\":\"EMER\",\"system\":\"http://terminology.hl7.org/CodeSystem/v3-ActCode\"},\"id\":\"5ce5c83a-000f-47d2-941c-039358cc9112\",\"participant\":[{\"individual\":{\"display\":\"John Hancock\",\"reference\":\"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\"}}],\"period\":{\"end\":\"2021-10-25T20:16:29-07:00\",\"start\":\"2021-10-25T20:10:29-07:00\"},\"resourceType\":\"Encounter\",\"serviceProvider\":{\"display\":\"CDEX Example Organization\",\"reference\":\"urn:uuid:e37f004b-dc10-422b-b833-cdaa10a055a3\"},\"status\":\"finished\",\"subject\":{\"display\":\"CDEX Example Patient\",\"reference\":\"urn:uuid:970af6c9-5bbd-4067-b6c1-d9b2c823aece\"},\"text\":{\"div\":\"

Encounter Details

An emergency encounter occurred on October 25, 2021, from 8:10 PM to 8:16 PM, involving CDEX Example Patient and attended by Dr. John Hancock at CDEX Example Organization. The encounter type is unspecified (SNOMED CT: 261665006).

\",\"status\":\"generated\"},\"type\":[{\"coding\":[{\"code\":\"261665006\",\"display\":\"Unknown (qualifier value)\",\"system\":\"http://snomed.info/sct\"}],\"text\":\"Unknown (qualifier value)\"}]}},{\"fullUrl\":\"urn:uuid:e37f004b-dc10-422b-b833-cdaa10a055a3\",\"resource\":{\"active\":true,\"address\":[{\"city\":\"Boston\",\"country\":\"USA\",\"line\":[\"1 CDEX Lane\"],\"postalCode\":\"01002\",\"state\":\"MA\"}],\"id\":\"e37f004b-dc10-422b-b833-cdaa10a055a3\",\"identifier\":[{\"system\":\"http://hl7.org/fhir/sid/us-npi\",\"value\":\"1234567893\"}],\"name\":\"CDEX Example Organization\",\"resourceType\":\"Organization\",\"telecom\":[{\"system\":\"phone\",\"value\":\"(+1) 555-555-5555\"},{\"system\":\"email\",\"value\":\"customer-service@example.org\"}],\"text\":{\"div\":\"

Organization Information

CDEX Example Organization, located at 1 CDEX Lane, Boston, MA 01002, USA, is the service provider for the documented encounter. Contact details include phone: (+1) 555-555-5555 and email: customer-service@example.org. The organization\\'s NPI is 1234567893.

\",\"status\":\"generated\"}}}],\"identifier\":{\"system\":\"urn:ietf:rfc:3986\",\"value\":\"urn:uuid:c173535e-135e-48e3-ab64-38bacc68dba8\"},\"resourceType\":\"Bundle\",\"timestamp\":\"2021-10-25T20:16:29-07:00\",\"type\":\"document\"}'\n", "6571\n", "Length before xhtml canonicalization for entry Composition:: 520\n", "

Medical Records Document

This document, titled \"Active Conditions,\" was created on October 25, 2021, by Dr. John Hancock, who also legally attested to its accuracy on the same date. It summarizes the active medical conditions for a patient based on an emergency encounter on October 25, 2021. The document includes one section detailing an active condition: Type 2 Diabetes Mellitus.

\n", "Length after xhtml canonicalization for entry Composition:: 510\n", "Length before xhtml canonicalization for entry Practitioner:: 304\n", "

Practitioner Information

Dr. John Hancock is a healthcare provider with National Provider Identifier (NPI) 9941339100. He authored and attested to the medical records document.

\n", "Length after xhtml canonicalization for entry Practitioner:: 304\n", "Length before xhtml canonicalization for entry Patient:: 367\n", "

Patient Information

CDEX Example Patient, a male, is identified by member ID Member123 in the payer system http://example.org/cdex/payer/member-ids. He is the subject of this medical records document. The patient said, \"I feel great!\"

\n", "Length after xhtml canonicalization for entry Patient:: 357\n", "Length before xhtml canonicalization for entry Condition:: 362\n", "

Active Condition

The patient has an active diagnosis of Type 2 Diabetes Mellitus (SNOMED CT: 44054006), first identified in 2006. This condition was documented by Dr. John Hancock and is listed as a problem on the patient’s problem list.

\n", "Length after xhtml canonicalization for entry Condition:: 362\n", "Length before xhtml canonicalization for entry Encounter:: 372\n", "

Encounter Details

An emergency encounter occurred on October 25, 2021, from 8:10 PM to 8:16 PM, involving CDEX Example Patient and attended by Dr. John Hancock at CDEX Example Organization. The encounter type is unspecified (SNOMED CT: 261665006).

\n", "Length after xhtml canonicalization for entry Encounter:: 372\n", "Length before xhtml canonicalization for entry Organization:: 408\n", "

Organization Information

CDEX Example Organization, located at 1 CDEX Lane, Boston, MA 01002, USA, is the service provider for the documented encounter. Contact details include phone: (+1) 555-555-5555 and email: customer-service@example.org. The organization's NPI is 1234567893.

\n", "Length after xhtml canonicalization for entry Organization:: 408\n" ] }, { "data": { "text/plain": [ "(b'{\"entry\":[{\"fullUrl\":\"urn:uuid:17a80a8d-4cf1-4deb-a1fd-2db1130e5f76\",\"resource\":{\"attester\":[{\"mode\":\"legal\",\"party\":{\"display\":\"Example Practitioner\",\"reference\":\"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\"},\"time\":\"2021-10-25T20:16:29-07:00\"}],\"author\":[{\"display\":\"Example Practitioner\",\"reference\":\"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\"}],\"date\":\"2021-10-25T20:16:29-07:00\",\"encounter\":{\"display\":\"Example Encounter\",\"reference\":\"urn:uuid:5ce5c83a-000f-47d2-941c-039358cc9112\"},\"id\":\"17a80a8d-4cf1-4deb-a1fd-2db1130e5f76\",\"resourceType\":\"Composition\",\"section\":[{\"entry\":[{\"reference\":\"urn:uuid:014a68ec-d691-49e0-b980-91b0d924e570\"}],\"title\":\"Active Condition 1\"}],\"status\":\"final\",\"subject\":{\"display\":\"Example Patient\",\"reference\":\"urn:uuid:970af6c9-5bbd-4067-b6c1-d9b2c823aece\"},\"text\":{\"div\":\"

Medical Records Document

This document, titled \\\\\"Active Conditions,\\\\\" was created on October 25, 2021, by Dr. John Hancock, who also legally attested to its accuracy on the same date. It summarizes the active medical conditions for a patient based on an emergency encounter on October 25, 2021. The document includes one section detailing an active condition: Type 2 Diabetes Mellitus.

\",\"status\":\"generated\"},\"title\":\"Active Conditions\",\"type\":{\"coding\":[{\"code\":\"11503-0\",\"system\":\"http://loinc.org\"}],\"text\":\"Medical records\"}}},{\"fullUrl\":\"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\",\"resource\":{\"id\":\"0820c16d-91de-4dfa-a3a6-f140a516a9bc\",\"identifier\":[{\"system\":\"http://hl7.org/fhir/sid/us-npi\",\"value\":\"9941339100\"}],\"meta\":{\"lastUpdated\":\"2013-05-05T16:13:03Z\"},\"name\":[{\"family\":\"Hancock\",\"given\":[\"John\"]}],\"resourceType\":\"Practitioner\",\"text\":{\"div\":\"

Practitioner Information

Dr. John Hancock is a healthcare provider with National Provider Identifier (NPI) 9941339100. He authored and attested to the medical records document.

\",\"status\":\"generated\"}}},{\"fullUrl\":\"urn:uuid:970af6c9-5bbd-4067-b6c1-d9b2c823aece\",\"resource\":{\"active\":true,\"gender\":\"male\",\"id\":\"970af6c9-5bbd-4067-b6c1-d9b2c823aece\",\"identifier\":[{\"system\":\"http://example.org/cdex/payer/member-ids\",\"type\":{\"coding\":[{\"code\":\"MB\",\"system\":\"http://terminology.hl7.org/CodeSystem/v2-0203\"}]},\"value\":\"Member123\"}],\"name\":[{\"family\":\"Patient\",\"given\":[\"CDEX Example\"],\"text\":\"CDEX Example Patient\"}],\"resourceType\":\"Patient\",\"text\":{\"div\":\"

Patient Information

CDEX Example Patient, a male, is identified by member ID Member123 in the payer system http://example.org/cdex/payer/member-ids. He is the subject of this medical records document. The patient said, \\\\\"I feel great!\\\\\"

\",\"status\":\"generated\"}}},{\"fullUrl\":\"urn:uuid:014a68ec-d691-49e0-b980-91b0d924e570\",\"resource\":{\"asserter\":{\"reference\":\"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\"},\"category\":[{\"coding\":[{\"code\":\"problem-list-item\",\"display\":\"Problem List Item\",\"system\":\"http://terminology.hl7.org/CodeSystem/condition-category\"}],\"text\":\"Problem List Item\"}],\"clinicalStatus\":{\"coding\":[{\"code\":\"active\",\"system\":\"http://terminology.hl7.org/CodeSystem/condition-clinical\"}]},\"code\":{\"coding\":[{\"code\":\"44054006\",\"display\":\"Type 2 Diabetes Mellitus\",\"system\":\"http://snomed.info/sct\"}]},\"id\":\"014a68ec-d691-49e0-b980-91b0d924e570\",\"identifier\":[{\"system\":\"urn:oid:1.3.6.1.4.1.22812.4.111.0.4.1.2.1\",\"value\":\"1\"}],\"onsetDateTime\":\"2006\",\"resourceType\":\"Condition\",\"subject\":{\"reference\":\"urn:uuid:970af6c9-5bbd-4067-b6c1-d9b2c823aece\"},\"text\":{\"div\":\"

Active Condition

The patient has an active diagnosis of Type 2 Diabetes Mellitus (SNOMED CT: 44054006), first identified in 2006. This condition was documented by Dr. John Hancock and is listed as a problem on the patient\\xe2\\x80\\x99s problem list.

\",\"status\":\"generated\"}}},{\"fullUrl\":\"urn:uuid:5ce5c83a-000f-47d2-941c-039358cc9112\",\"resource\":{\"class\":{\"code\":\"EMER\",\"system\":\"http://terminology.hl7.org/CodeSystem/v3-ActCode\"},\"id\":\"5ce5c83a-000f-47d2-941c-039358cc9112\",\"participant\":[{\"individual\":{\"display\":\"John Hancock\",\"reference\":\"urn:uuid:0820c16d-91de-4dfa-a3a6-f140a516a9bc\"}}],\"period\":{\"end\":\"2021-10-25T20:16:29-07:00\",\"start\":\"2021-10-25T20:10:29-07:00\"},\"resourceType\":\"Encounter\",\"serviceProvider\":{\"display\":\"CDEX Example Organization\",\"reference\":\"urn:uuid:e37f004b-dc10-422b-b833-cdaa10a055a3\"},\"status\":\"finished\",\"subject\":{\"display\":\"CDEX Example Patient\",\"reference\":\"urn:uuid:970af6c9-5bbd-4067-b6c1-d9b2c823aece\"},\"text\":{\"div\":\"

Encounter Details

An emergency encounter occurred on October 25, 2021, from 8:10 PM to 8:16 PM, involving CDEX Example Patient and attended by Dr. John Hancock at CDEX Example Organization. The encounter type is unspecified (SNOMED CT: 261665006).

\",\"status\":\"generated\"},\"type\":[{\"coding\":[{\"code\":\"261665006\",\"display\":\"Unknown (qualifier value)\",\"system\":\"http://snomed.info/sct\"}],\"text\":\"Unknown (qualifier value)\"}]}},{\"fullUrl\":\"urn:uuid:e37f004b-dc10-422b-b833-cdaa10a055a3\",\"resource\":{\"active\":true,\"address\":[{\"city\":\"Boston\",\"country\":\"USA\",\"line\":[\"1 CDEX Lane\"],\"postalCode\":\"01002\",\"state\":\"MA\"}],\"id\":\"e37f004b-dc10-422b-b833-cdaa10a055a3\",\"identifier\":[{\"system\":\"http://hl7.org/fhir/sid/us-npi\",\"value\":\"1234567893\"}],\"name\":\"CDEX Example Organization\",\"resourceType\":\"Organization\",\"telecom\":[{\"system\":\"phone\",\"value\":\"(+1) 555-555-5555\"},{\"system\":\"email\",\"value\":\"customer-service@example.org\"}],\"text\":{\"div\":\"

Organization Information

CDEX Example Organization, located at 1 CDEX Lane, Boston, MA 01002, USA, is the service provider for the documented encounter. Contact details include phone: (+1) 555-555-5555 and email: customer-service@example.org. The organization\\'s NPI is 1234567893.

\",\"status\":\"generated\"}}}],\"identifier\":{\"system\":\"urn:ietf:rfc:3986\",\"value\":\"urn:uuid:c173535e-135e-48e3-ab64-38bacc68dba8\"},\"resourceType\":\"Bundle\",\"timestamp\":\"2021-10-25T20:16:29-07:00\",\"type\":\"document\"}',\n", " 6555)" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def canonicalize_xhtml(narrative_div):\n", " parser = etree.XMLParser(remove_blank_text=True)\n", " root = etree.fromstring(narrative_div, parser)\n", " # Canonicalize the XML using C14N 1.0\n", " canonicalized_str = etree.tostring(root, method=\"c14n\", with_comments=False).decode('utf-8')\n", " print(canonicalized_str)\n", " return canonicalized_str\n", "\n", "my_obj_id = my_obj.pop('id', None)\n", "my_obj_meta = my_obj.pop('meta', None)\n", "# print(dumps(my_obj, indent=2))\n", "\n", "canonical_obj = canonicalize(my_obj)\n", "print(canonical_obj)\n", "print(len(canonical_obj))\n", "if recd_signature['targetFormat'] == \"application/fhir+json;canonicalization=http://hl7.org/fhir/canonicalization/json+xml#document\":\n", " try:\n", " my_obj['text']['div'] = canonicalize_xhtml(my_obj['text']['div'])\n", " except KeyError as e:\n", " print(f\"KeyError no {my_obj['resourceType']}.{e}\")\n", "try:\n", " for bundle_entry in my_obj['entry']:\n", " try:\n", " print(f\"Length before xhtml canonicalization for entry {bundle_entry['resource']['resourceType']}:: {len(bundle_entry['resource']['text']['div'])}\")\n", " bundle_entry['resource']['text']['div'] = canonicalize_xhtml(bundle_entry['resource']['text']['div'])\n", " print(f\"Length after xhtml canonicalization for entry {bundle_entry['resource']['resourceType']}:: {len(bundle_entry['resource']['text']['div'])}\")\n", " except KeyError as e:\n", " print(f\"KeyError no bundle_entry['resource'][{e}]\")\n", " continue\n", "except KeyError as e:\n", " print(f\"KeyError no {my_obj['resourceType']}.{e}\")\n", "\n", "canonical_obj = canonicalize(my_obj)\n", "canonical_obj, len(canonical_obj)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. Transform canonicalize Bundle to a base64 format using the Base64-URL algorithm." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'eyJlbnRyeSI6W3siZnVsbFVybCI6InVybjp1dWlkOjE3YTgwYThkLTRjZjEtNGRlYi1hMWZkLTJkYjExMzBlNWY3NiIsInJlc291cmNlIjp7ImF0dGVzdGVyIjpbeyJtb2RlIjoibGVnYWwiLCJwYXJ0eSI6eyJkaXNwbGF5IjoiRXhhbXBsZSBQcmFjdGl0aW9uZXIiLCJyZWZlcmVuY2UiOiJ1cm46dXVpZDowODIwYzE2ZC05MWRlLTRkZmEtYTNhNi1mMTQwYTUxNmE5YmMifSwidGltZSI6IjIwMjEtMTAtMjVUMjA6MTY6MjktMDc6MDAifV0sImF1dGhvciI6W3siZGlzcGxheSI6IkV4YW1wbGUgUHJhY3RpdGlvbmVyIiwicmVmZXJlbmNlIjoidXJuOnV1aWQ6MDgyMGMxNmQtOTFkZS00ZGZhLWEzYTYtZjE0MGE1MTZhOWJjIn1dLCJkYXRlIjoiMjAyMS0xMC0yNVQyMDoxNjoyOS0wNzowMCIsImVuY291bnRlciI6eyJkaXNwbGF5IjoiRXhhbXBsZSBFbmNvdW50ZXIiLCJyZWZlcmVuY2UiOiJ1cm46dXVpZDo1Y2U1YzgzYS0wMDBmLTQ3ZDItOTQxYy0wMzkzNThjYzkxMTIifSwiaWQiOiIxN2E4MGE4ZC00Y2YxLTRkZWItYTFmZC0yZGIxMTMwZTVmNzYiLCJyZXNvdXJjZVR5cGUiOiJDb21wb3NpdGlvbiIsInNlY3Rpb24iOlt7ImVudHJ5IjpbeyJyZWZlcmVuY2UiOiJ1cm46dXVpZDowMTRhNjhlYy1kNjkxLTQ5ZTAtYjk4MC05MWIwZDkyNGU1NzAifV0sInRpdGxlIjoiQWN0aXZlIENvbmRpdGlvbiAxIn1dLCJzdGF0dXMiOiJmaW5hbCIsInN1YmplY3QiOnsiZGlzcGxheSI6IkV4YW1wbGUgUGF0aWVudCIsInJlZmVyZW5jZSI6InVybjp1dWlkOjk3MGFmNmM5LTViYmQtNDA2Ny1iNmMxLWQ5YjJjODIzYWVjZSJ9LCJ0ZXh0Ijp7ImRpdiI6IjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI-PGEgbmFtZT1cIkNvbXBvc2l0aW9uXzE3YTgwYThkLTRjZjEtNGRlYi1hMWZkLTJkYjExMzBlNWY3NlwiPiA8L2E-PGgzPk1lZGljYWwgUmVjb3JkcyBEb2N1bWVudDwvaDM-PHA-VGhpcyBkb2N1bWVudCwgdGl0bGVkIFwiQWN0aXZlIENvbmRpdGlvbnMsXCIgd2FzIGNyZWF0ZWQgb24gT2N0b2JlciAyNSwgMjAyMSwgYnkgRHIuIEpvaG4gSGFuY29jaywgd2hvIGFsc28gbGVnYWxseSBhdHRlc3RlZCB0byBpdHMgYWNjdXJhY3kgb24gdGhlIHNhbWUgZGF0ZS4gSXQgc3VtbWFyaXplcyB0aGUgYWN0aXZlIG1lZGljYWwgY29uZGl0aW9ucyBmb3IgYSBwYXRpZW50IGJhc2VkIG9uIGFuIGVtZXJnZW5jeSBlbmNvdW50ZXIgb24gT2N0b2JlciAyNSwgMjAyMS4gVGhlIGRvY3VtZW50IGluY2x1ZGVzIG9uZSBzZWN0aW9uIGRldGFpbGluZyBhbiBhY3RpdmUgY29uZGl0aW9uOiBUeXBlIDIgRGlhYmV0ZXMgTWVsbGl0dXMuPC9wPjwvZGl2PiIsInN0YXR1cyI6ImdlbmVyYXRlZCJ9LCJ0aXRsZSI6IkFjdGl2ZSBDb25kaXRpb25zIiwidHlwZSI6eyJjb2RpbmciOlt7ImNvZGUiOiIxMTUwMy0wIiwic3lzdGVtIjoiaHR0cDovL2xvaW5jLm9yZyJ9XSwidGV4dCI6Ik1lZGljYWwgcmVjb3JkcyJ9fX0seyJmdWxsVXJsIjoidXJuOnV1aWQ6MDgyMGMxNmQtOTFkZS00ZGZhLWEzYTYtZjE0MGE1MTZhOWJjIiwicmVzb3VyY2UiOnsiaWQiOiIwODIwYzE2ZC05MWRlLTRkZmEtYTNhNi1mMTQwYTUxNmE5YmMiLCJpZGVudGlmaWVyIjpbeyJzeXN0ZW0iOiJodHRwOi8vaGw3Lm9yZy9maGlyL3NpZC91cy1ucGkiLCJ2YWx1ZSI6Ijk5NDEzMzkxMDAifV0sIm1ldGEiOnsibGFzdFVwZGF0ZWQiOiIyMDEzLTA1LTA1VDE2OjEzOjAzWiJ9LCJuYW1lIjpbeyJmYW1pbHkiOiJIYW5jb2NrIiwiZ2l2ZW4iOlsiSm9obiJdfV0sInJlc291cmNlVHlwZSI6IlByYWN0aXRpb25lciIsInRleHQiOnsiZGl2IjoiPGRpdiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj48YSBuYW1lPVwiUHJhY3RpdGlvbmVyXzA4MjBjMTZkLTkxZGUtNGRmYS1hM2E2LWYxNDBhNTE2YTliY1wiPiA8L2E-PGgzPlByYWN0aXRpb25lciBJbmZvcm1hdGlvbjwvaDM-PHA-RHIuIEpvaG4gSGFuY29jayBpcyBhIGhlYWx0aGNhcmUgcHJvdmlkZXIgd2l0aCBOYXRpb25hbCBQcm92aWRlciBJZGVudGlmaWVyIChOUEkpIDk5NDEzMzkxMDAuIEhlIGF1dGhvcmVkIGFuZCBhdHRlc3RlZCB0byB0aGUgbWVkaWNhbCByZWNvcmRzIGRvY3VtZW50LjwvcD48L2Rpdj4iLCJzdGF0dXMiOiJnZW5lcmF0ZWQifX19LHsiZnVsbFVybCI6InVybjp1dWlkOjk3MGFmNmM5LTViYmQtNDA2Ny1iNmMxLWQ5YjJjODIzYWVjZSIsInJlc291cmNlIjp7ImFjdGl2ZSI6dHJ1ZSwiZ2VuZGVyIjoibWFsZSIsImlkIjoiOTcwYWY2YzktNWJiZC00MDY3LWI2YzEtZDliMmM4MjNhZWNlIiwiaWRlbnRpZmllciI6W3sic3lzdGVtIjoiaHR0cDovL2V4YW1wbGUub3JnL2NkZXgvcGF5ZXIvbWVtYmVyLWlkcyIsInR5cGUiOnsiY29kaW5nIjpbeyJjb2RlIjoiTUIiLCJzeXN0ZW0iOiJodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL3YyLTAyMDMifV19LCJ2YWx1ZSI6Ik1lbWJlcjEyMyJ9XSwibmFtZSI6W3siZmFtaWx5IjoiUGF0aWVudCIsImdpdmVuIjpbIkNERVggRXhhbXBsZSJdLCJ0ZXh0IjoiQ0RFWCBFeGFtcGxlIFBhdGllbnQifV0sInJlc291cmNlVHlwZSI6IlBhdGllbnQiLCJ0ZXh0Ijp7ImRpdiI6IjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI-PGEgbmFtZT1cIlBhdGllbnRfOTcwYWY2YzktNWJiZC00MDY3LWI2YzEtZDliMmM4MjNhZWNlXCI-IDwvYT48aDM-UGF0aWVudCBJbmZvcm1hdGlvbjwvaDM-PHA-Q0RFWCBFeGFtcGxlIFBhdGllbnQsIGEgbWFsZSwgaXMgaWRlbnRpZmllZCBieSBtZW1iZXIgSUQgTWVtYmVyMTIzIGluIHRoZSBwYXllciBzeXN0ZW0gaHR0cDovL2V4YW1wbGUub3JnL2NkZXgvcGF5ZXIvbWVtYmVyLWlkcy4gSGUgaXMgdGhlIHN1YmplY3Qgb2YgdGhpcyBtZWRpY2FsIHJlY29yZHMgZG9jdW1lbnQuIFRoZSBwYXRpZW50IHNhaWQsIFwiSSBmZWVsIGdyZWF0IVwiPC9wPjwvZGl2PiIsInN0YXR1cyI6ImdlbmVyYXRlZCJ9fX0seyJmdWxsVXJsIjoidXJuOnV1aWQ6MDE0YTY4ZWMtZDY5MS00OWUwLWI5ODAtOTFiMGQ5MjRlNTcwIiwicmVzb3VyY2UiOnsiYXNzZXJ0ZXIiOnsicmVmZXJlbmNlIjoidXJuOnV1aWQ6MDgyMGMxNmQtOTFkZS00ZGZhLWEzYTYtZjE0MGE1MTZhOWJjIn0sImNhdGVnb3J5IjpbeyJjb2RpbmciOlt7ImNvZGUiOiJwcm9ibGVtLWxpc3QtaXRlbSIsImRpc3BsYXkiOiJQcm9ibGVtIExpc3QgSXRlbSIsInN5c3RlbSI6Imh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vY29uZGl0aW9uLWNhdGVnb3J5In1dLCJ0ZXh0IjoiUHJvYmxlbSBMaXN0IEl0ZW0ifV0sImNsaW5pY2FsU3RhdHVzIjp7ImNvZGluZyI6W3siY29kZSI6ImFjdGl2ZSIsInN5c3RlbSI6Imh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vY29uZGl0aW9uLWNsaW5pY2FsIn1dfSwiY29kZSI6eyJjb2RpbmciOlt7ImNvZGUiOiI0NDA1NDAwNiIsImRpc3BsYXkiOiJUeXBlIDIgRGlhYmV0ZXMgTWVsbGl0dXMiLCJzeXN0ZW0iOiJodHRwOi8vc25vbWVkLmluZm8vc2N0In1dfSwiaWQiOiIwMTRhNjhlYy1kNjkxLTQ5ZTAtYjk4MC05MWIwZDkyNGU1NzAiLCJpZGVudGlmaWVyIjpbeyJzeXN0ZW0iOiJ1cm46b2lkOjEuMy42LjEuNC4xLjIyODEyLjQuMTExLjAuNC4xLjIuMSIsInZhbHVlIjoiMSJ9XSwib25zZXREYXRlVGltZSI6IjIwMDYiLCJyZXNvdXJjZVR5cGUiOiJDb25kaXRpb24iLCJzdWJqZWN0Ijp7InJlZmVyZW5jZSI6InVybjp1dWlkOjk3MGFmNmM5LTViYmQtNDA2Ny1iNmMxLWQ5YjJjODIzYWVjZSJ9LCJ0ZXh0Ijp7ImRpdiI6IjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI-PGEgbmFtZT1cIkNvbmRpdGlvbl8wMTRhNjhlYy1kNjkxLTQ5ZTAtYjk4MC05MWIwZDkyNGU1NzBcIj4gPC9hPjxoMz5BY3RpdmUgQ29uZGl0aW9uPC9oMz48cD5UaGUgcGF0aWVudCBoYXMgYW4gYWN0aXZlIGRpYWdub3NpcyBvZiBUeXBlIDIgRGlhYmV0ZXMgTWVsbGl0dXMgKFNOT01FRCBDVDogNDQwNTQwMDYpLCBmaXJzdCBpZGVudGlmaWVkIGluIDIwMDYuIFRoaXMgY29uZGl0aW9uIHdhcyBkb2N1bWVudGVkIGJ5IERyLiBKb2huIEhhbmNvY2sgYW5kIGlzIGxpc3RlZCBhcyBhIHByb2JsZW0gb24gdGhlIHBhdGllbnTigJlzIHByb2JsZW0gbGlzdC48L3A-PC9kaXY-Iiwic3RhdHVzIjoiZ2VuZXJhdGVkIn19fSx7ImZ1bGxVcmwiOiJ1cm46dXVpZDo1Y2U1YzgzYS0wMDBmLTQ3ZDItOTQxYy0wMzkzNThjYzkxMTIiLCJyZXNvdXJjZSI6eyJjbGFzcyI6eyJjb2RlIjoiRU1FUiIsInN5c3RlbSI6Imh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vdjMtQWN0Q29kZSJ9LCJpZCI6IjVjZTVjODNhLTAwMGYtNDdkMi05NDFjLTAzOTM1OGNjOTExMiIsInBhcnRpY2lwYW50IjpbeyJpbmRpdmlkdWFsIjp7ImRpc3BsYXkiOiJKb2huIEhhbmNvY2siLCJyZWZlcmVuY2UiOiJ1cm46dXVpZDowODIwYzE2ZC05MWRlLTRkZmEtYTNhNi1mMTQwYTUxNmE5YmMifX1dLCJwZXJpb2QiOnsiZW5kIjoiMjAyMS0xMC0yNVQyMDoxNjoyOS0wNzowMCIsInN0YXJ0IjoiMjAyMS0xMC0yNVQyMDoxMDoyOS0wNzowMCJ9LCJyZXNvdXJjZVR5cGUiOiJFbmNvdW50ZXIiLCJzZXJ2aWNlUHJvdmlkZXIiOnsiZGlzcGxheSI6IkNERVggRXhhbXBsZSBPcmdhbml6YXRpb24iLCJyZWZlcmVuY2UiOiJ1cm46dXVpZDplMzdmMDA0Yi1kYzEwLTQyMmItYjgzMy1jZGFhMTBhMDU1YTMifSwic3RhdHVzIjoiZmluaXNoZWQiLCJzdWJqZWN0Ijp7ImRpc3BsYXkiOiJDREVYIEV4YW1wbGUgUGF0aWVudCIsInJlZmVyZW5jZSI6InVybjp1dWlkOjk3MGFmNmM5LTViYmQtNDA2Ny1iNmMxLWQ5YjJjODIzYWVjZSJ9LCJ0ZXh0Ijp7ImRpdiI6IjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI-PGEgbmFtZT1cIkVuY291bnRlcl81Y2U1YzgzYS0wMDBmLTQ3ZDItOTQxYy0wMzkzNThjYzkxMTJcIj4gPC9hPjxoMz5FbmNvdW50ZXIgRGV0YWlsczwvaDM-PHA-QW4gZW1lcmdlbmN5IGVuY291bnRlciBvY2N1cnJlZCBvbiBPY3RvYmVyIDI1LCAyMDIxLCBmcm9tIDg6MTAgUE0gdG8gODoxNiBQTSwgaW52b2x2aW5nIENERVggRXhhbXBsZSBQYXRpZW50IGFuZCBhdHRlbmRlZCBieSBEci4gSm9obiBIYW5jb2NrIGF0IENERVggRXhhbXBsZSBPcmdhbml6YXRpb24uIFRoZSBlbmNvdW50ZXIgdHlwZSBpcyB1bnNwZWNpZmllZCAoU05PTUVEIENUOiAyNjE2NjUwMDYpLjwvcD48L2Rpdj4iLCJzdGF0dXMiOiJnZW5lcmF0ZWQifSwidHlwZSI6W3siY29kaW5nIjpbeyJjb2RlIjoiMjYxNjY1MDA2IiwiZGlzcGxheSI6IlVua25vd24gKHF1YWxpZmllciB2YWx1ZSkiLCJzeXN0ZW0iOiJodHRwOi8vc25vbWVkLmluZm8vc2N0In1dLCJ0ZXh0IjoiVW5rbm93biAocXVhbGlmaWVyIHZhbHVlKSJ9XX19LHsiZnVsbFVybCI6InVybjp1dWlkOmUzN2YwMDRiLWRjMTAtNDIyYi1iODMzLWNkYWExMGEwNTVhMyIsInJlc291cmNlIjp7ImFjdGl2ZSI6dHJ1ZSwiYWRkcmVzcyI6W3siY2l0eSI6IkJvc3RvbiIsImNvdW50cnkiOiJVU0EiLCJsaW5lIjpbIjEgQ0RFWCBMYW5lIl0sInBvc3RhbENvZGUiOiIwMTAwMiIsInN0YXRlIjoiTUEifV0sImlkIjoiZTM3ZjAwNGItZGMxMC00MjJiLWI4MzMtY2RhYTEwYTA1NWEzIiwiaWRlbnRpZmllciI6W3sic3lzdGVtIjoiaHR0cDovL2hsNy5vcmcvZmhpci9zaWQvdXMtbnBpIiwidmFsdWUiOiIxMjM0NTY3ODkzIn1dLCJuYW1lIjoiQ0RFWCBFeGFtcGxlIE9yZ2FuaXphdGlvbiIsInJlc291cmNlVHlwZSI6Ik9yZ2FuaXphdGlvbiIsInRlbGVjb20iOlt7InN5c3RlbSI6InBob25lIiwidmFsdWUiOiIoKzEpIDU1NS01NTUtNTU1NSJ9LHsic3lzdGVtIjoiZW1haWwiLCJ2YWx1ZSI6ImN1c3RvbWVyLXNlcnZpY2VAZXhhbXBsZS5vcmcifV0sInRleHQiOnsiZGl2IjoiPGRpdiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj48YSBuYW1lPVwiT3JnYW5pemF0aW9uX2UzN2YwMDRiLWRjMTAtNDIyYi1iODMzLWNkYWExMGEwNTVhM1wiPiA8L2E-PGgzPk9yZ2FuaXphdGlvbiBJbmZvcm1hdGlvbjwvaDM-PHA-Q0RFWCBFeGFtcGxlIE9yZ2FuaXphdGlvbiwgbG9jYXRlZCBhdCAxIENERVggTGFuZSwgQm9zdG9uLCBNQSAwMTAwMiwgVVNBLCBpcyB0aGUgc2VydmljZSBwcm92aWRlciBmb3IgdGhlIGRvY3VtZW50ZWQgZW5jb3VudGVyLiBDb250YWN0IGRldGFpbHMgaW5jbHVkZSBwaG9uZTogKCsxKSA1NTUtNTU1LTU1NTUgYW5kIGVtYWlsOiBjdXN0b21lci1zZXJ2aWNlQGV4YW1wbGUub3JnLiBUaGUgb3JnYW5pemF0aW9uJ3MgTlBJIGlzIDEyMzQ1Njc4OTMuPC9wPjwvZGl2PiIsInN0YXR1cyI6ImdlbmVyYXRlZCJ9fX1dLCJpZGVudGlmaWVyIjp7InN5c3RlbSI6InVybjppZXRmOnJmYzozOTg2IiwidmFsdWUiOiJ1cm46dXVpZDpjMTczNTM1ZS0xMzVlLTQ4ZTMtYWI2NC0zOGJhY2M2OGRiYTgifSwicmVzb3VyY2VUeXBlIjoiQnVuZGxlIiwidGltZXN0YW1wIjoiMjAyMS0xMC0yNVQyMDoxNjoyOS0wNzowMCIsInR5cGUiOiJkb2N1bWVudCJ9'" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "recd_b64_canonical_obj = urlsafe_b64encode(canonical_obj).decode()\n", "recd_b64_canonical_obj = recd_b64_canonical_obj.replace(\"=\",\"\") #remove padding since decode package doesn't use them \n", "recd_b64_canonical_obj" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4. Get the base64 encoded JWS from the `Bundle.signature.data` element" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNkltSm1ZbVV6WlRWak1EUTNNRFEwTkRVM05qVTBPREV4TXpreU9HUTFaakZsTkdVelpqSmxaV0lpTENKcmRIa2lPaUpTVXlJc0luTnBaMVFpT2lJeU1ESXdMVEV3TFRJelZEQTBPalUwT2pVMkxqQTBPQ3N3TURvd01DSXNJbk55UTIxeklqcGJleUpqYjIxdFNXUWlPbnNpWkdWell5STZJbFpsY21sbWFXTmhkR2x2YmlCVGFXZHVZWFIxY21VaUxDSnBaQ0k2SW5WeWJqcHZhV1E2TVM0eUxqZzBNQzR4TURBMk5TNHhMakV5TGpFdU5TSjlMQ0pqYjIxdFVYVmhiSE1pT2xzaVZtVnlhV1pwWTJGMGFXOXVJRzltSUcxbFpHbGpZV3dnY21WamIzSmtJR2x1ZEdWbmNtbDBlU0pkZlYwc0luUjVjQ0k2SWtwWFZDSXNJbmcxWXlJNld5Sk5TVWxHVm5wRFEwRTNLMmRCZDBsQ1FXZEpWVUp1TkROR05FOHhNVEI2Vms1SVVGVjBRbTV1V0dZek0wWlJkM2RFVVZsS1MyOWFTV2gyWTA1QlVVVk1RbEZCZDJkYVZYaERla0ZLUW1kT1ZrSkJXVlJCYkZaVVRWSk5kMFZSV1VSV1VWRkpSRUZ3UkZsWGVIQmFiVGw1WW0xc2FFMVNTWGRGUVZsRVZsRlJTRVJCYkZSWldGWjZXVmQ0Y0dSSE9IaElWRUZpUW1kT1ZrSkJiMDFHUlZZMFdWY3hkMkpIVldkVU0wcHVXVmMxY0dWdFJqQmhWemwxVFZKcmQwWjNXVVJXVVZGRVJFSkNTMkl5YUhWSlJXaG9ZbTFPZGxreWMzTkpSVEZGVFZOTmQwbFJXVXBMYjFwSmFIWmpUa0ZSYTBKR2FGSnhZVWRHZFZreU9XcGhNRUpzWlVkR2RHTkhlR3hNYlRsNVducEJaVVozTUhsT1ZFRXlUV3BWZVUxNlJYbE5lbXhoUm5jd2VVNTZRVEpOVkZWNVRYcEZlVTE2YkdGTlNVZFdUVkZ6ZDBOUldVUldVVkZIUlhkS1ZsVjZSVlJOUWtWSFFURlZSVU5CZDB0Uk1rWnpZVmRhZG1OdE5YQlpWRVZUVFVKQlIwRXhWVVZDZDNkS1ZUSkdNV015Um5OaFdGSjJUVkl3ZDBkM1dVUldVVkZMUkVKU1JtVkhSblJqUjNoc1NVVTVlVm95Um5WaFdIQm9aRWRzZG1KcVJWcE5RbU5IUVRGVlJVRjNkMUZUYlRsdlltbENTVmxYTldwaU1rNXlURU5DVGxKRVJXcE5RMFZIUTFOeFIxTkpZak5FVVVWS1FWSlpWV0Z0YUdoaWJVNTJXVEowUVZwWWFHaGlXRUp6V2xNMWRtTnRZM2RuWjBkcFRVRXdSME5UY1VkVFNXSXpSRkZGUWtGUlZVRkJORWxDYW5kQmQyZG5SMHRCYjBsQ1oxRkRZMWh0ZGxnMk1FZEJOVWNyUkd3MGFWSnVPVlJUTDNkVVJqRkdWRWc1VW0xeVVESTVSelpZVTA5MVZrUkZaMGRhZDFWVVNra3ZUMnRTVEZCcUswcFZTM2t2YTAxWk0xbHROREZyTTBwU2NqaE9ja28zVldOcVpqTlVaVEpaTUhwdFVrMW1SMHRQTWxnM2NEQXhTV1E0Y2tkb2JtSnpWR3RYYW5ONlkyTnJha3RQVkdzM1JUUklXRTgzV0ZGdFZuWlNXbUZRY21wdVZsWnplalpoU1ZWdGJWVjVRbVZ0VlhoelVGRjRjV3RrTnpkNlVrdGxNVW9yWmsxaWNHSlRibUZHTWxNMVNEbEpOVWx3VVhVelpYSlRhazUzZFc1MWJVcEJMelZ6VGtGVFRWVm1LMXB5U3pWb2RIZFFabXh2Ym14V1FUbElSVkJ2Tms0MWRFcHpRMDFGV1RWeGExcEJXRVExTlZCVlltWTRTWGh5WkRNcmRERnBXRTVCWjAxa1dGQndPVTVxWm0xcmVtRklUM05TTlVWTU56aHZWbVowUzBnNFdFMW5jemxNSzFoWWFHTnRjQ3RUZFZOaVZWUXJiR0ZSUm01TFdsbzJOakZGUWpoVlZsRkhVR2h6U0dOMVdYbzNUUzhyUjBRM2JHdHRialYzTjJjMmFYcFpNRFZFY3pGMFpIUm9NMmhDSzBVeFpUQldPR0ZzTUN0SVdYaFlkRzFNTWpoUFluSjFjbHAwTlZaUFZEWXpObUZDVjJWaGF6TnRNV3gwSzBwTWFWUlhkMk5KV0hWeWFVcDNXRU5STjFjeVQyaEpjbXhsUW01ME5WbFNaRVl2Vm5kclFXWTFRbkEwTUVSTGNsbFRka0pVTDNnelVHRnlZbU5CY3pWeWRXRTBUV2w2ZEhwM2VrMURRWGRGUVVGaFQwSnVSRU5DYlZSQlNrSm5UbFpJVWsxRlFXcEJRVTFCYzBkQk1WVmtSSGRSUlVGM1NVWTBSRUpuUW1kT1ZraFNSVVZYVkVKWVoyYzVNMlF6WTNWYVdHaG9ZbGhDYzFwVE5YWmpiV1ZuUjFGWlNsbEpXa2xCV1dJMVYzZFJSMjlCZDAxRGFtczFUa1JGZWsxNmEzaE5SRU5IUzFkb01HUklRbnBQYVRoMldsaG9hR0pZUW5OYVV6VjJZMjFqZGxwdGFIQmphVGxSWTIxR2FtUkhiREJoVnpsMVdsaEpkazFVU1hwTlFqQkhRVEZWWkVSblVWZENRbE12ZG1vMVkwSklRa1ZTV0ZwVloxSlBVMnBXT0dWVWFqaDFObnBCVGtKbmEzRm9hMmxIT1hjd1FrRlJjMFpCUVU5RFFWbEZRV1pIYURCbWRqYzJRazE1VW5CcGJpODJiVEpPYms5QmQxbE9LMWRaVGxjMFduZFJTMUJ2YUN0cFFrWnFaMkl2WjFoYUwzZ3paRzVIY1RKU1ZXNVNTRXg1WW1OMmNVOTNRemgwTkN0TU1sRmhaVzUwZWk5NlUweG1Ra2xwU0ZBcmRuUmhkVlp2TkZscGNsVkxTVVpQTlU1clJHSlFVbmRGV0RaYWNHOTBkMUpGTW5BeldWQlBjVzFNYWxWd2RYRmxla3RTWm5WNlptWkZVMGxIUTFkbU5tSkJXbTlJT0c5MmVYcHJjRlZQZUZReWJHTktUREpaVVdkNFlVVkZLeTlOVDBWRWVHSjVMMGMxZEU1c1NGZFZNWEp0TWpsRVdrUTJhVlJ1T0VaSVRVOWlORVJCWlV4ek4yUmxWVUpMWlVGNGJVTk9NWGN3TjBsaVNHWlVXQ3M0ZUc5NlFtczRiVFJ5VVdGU1NUSkdZV05IWTA0dlV6UlBhMmxwYW14b2ExbHVSR1JpWWpaYWIwbENPVGxCVFVjdk1IUk5aMWRuYURVMVJrTk1PWGN5ZVhWaVJrUnpVaXN4ZVZwWE5YYzJlSFpXZFdKR2IzRXlja3RKV1U0MlFsUk5WRE0wT1U0clMxbEdVbFJpSzNCWU1EUlJSa1pEY1ZneFQzbDFVVVZLYWtwd1dtRjFURWxXVTIxVllWWjZSRmRrWVZKdGREQnlhMHhFTmxJNE5YUm9XVXB3VG5oTmNqUnZRWEp6ZVRWcGJEVk1NRXBXVFVWWVJ6RXhRMmhGZUZKRFNqZFljMmhyZEV4cWFpdEJPR3hrVlZKeVRFaFNWMWh2ZEhnMmJVNVdjRE1yVFc5cFEyaDROMUJtYmtkMlExQmhVSFpyVEZGeGFXVTRaRGh5YXpCbGFrNHpJbDE5Li5JU2JVQ3J5T29oQjB3U3RoSWdOVkhSaVNTLVBmcjh1dnRKb29ac3dSQlE0R3R0Vk4taG13c0VKQTNMcVE5Nmd3NkRWcHBfYkNsUy0yeDBZZWRvejJiT212REZLNmdrekhMdW83LXJVbHhfR0dZYUJNQ25qWjJNZnpZZmZLR3VzeGRqNHBYQzJlRHIyeHQyYlNJZG4wR3JnRnJxM21idFNXdmtvTTdRcVE5czZZQTZnSEI2RVJjcjVpREgteEhIZW0ydzNGRWNrWUpRODBiVVhxeVladS1MbGFYWnluNW11RW02MVVxeGFCMjdFeElkeGZJUnRIbGdPMUh3VldQYVZUa01hNzYwTXNwNmxzMDduQ0FKVnVrOFZ6VkFCbWg3M3FXZ3JEcC1UdU5DNWJiSzFSY3RXM1dWOXZteVE4MF84Z28xOE9ONjJZb2NLeGFWRWwxQzFzdGI2dW9oUE9kbU5CQUhxYzJtM2F6UlFxVU9rdkt0UHl5V3hlQkNoSVR6LWhqNmpCTS1ERDVZWERFdFVJd21OTDVnZXB1STdzZFZNemZtX2R4ZjcyM3Y4bEhFTjAyd1JXSUh3UldIWkFiMndpempsYVZJSEptUWJ5YXVyQi1BVUdvb0dNM2FGaC1YVkJLSFVIMVhwZldwRmtfS2thMmE1Vkw0bldrWG9VbXEyRw=='" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "recd_b64_jws = recd_signature['data']\n", "recd_b64_jws" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5. Base64 decode the encoded JWS\n", "\n", "note the signature is displayed with the parts labeled and separated with line breaks for easier viewing" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "header:\n", "eyJhbGciOiJSUzI1NiIsImtpZCI6ImJmYmUzZTVjMDQ3MDQ0NDU3NjU0ODExMzkyOGQ1ZjFlNGUzZjJlZWIiLCJrdHkiOiJSUyIsInNpZ1QiOiIyMDIwLTEwLTIzVDA0OjU0OjU2LjA0OCswMDowMCIsInNyQ21zIjpbeyJjb21tSWQiOnsiZGVzYyI6IlZlcmlmaWNhdGlvbiBTaWduYXR1cmUiLCJpZCI6InVybjpvaWQ6MS4yLjg0MC4xMDA2NS4xLjEyLjEuNSJ9LCJjb21tUXVhbHMiOlsiVmVyaWZpY2F0aW9uIG9mIG1lZGljYWwgcmVjb3JkIGludGVncml0eSJdfV0sInR5cCI6IkpXVCIsIng1YyI6WyJNSUlGVnpDQ0E3K2dBd0lCQWdJVUJuNDNGNE8xMTB6Vk5IUFV0Qm5uWGYzM0ZRd3dEUVlKS29aSWh2Y05BUUVMQlFBd2daVXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SSXdFQVlEVlFRSERBbFRZWFZ6WVd4cGRHOHhIVEFiQmdOVkJBb01GRVY0WVcxd2JHVWdUM0puWVc1cGVtRjBhVzl1TVJrd0Z3WURWUVFEREJCS2IyaHVJRWhoYm1Odlkyc3NJRTFFTVNNd0lRWUpLb1pJaHZjTkFRa0JGaFJxYUdGdVkyOWphMEJsZUdGdGNHeGxMbTl5WnpBZUZ3MHlOVEEyTWpVeU16RXlNemxhRncweU56QTJNVFV5TXpFeU16bGFNSUdWTVFzd0NRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNBd0tRMkZzYVdadmNtNXBZVEVTTUJBR0ExVUVCd3dKVTJGMWMyRnNhWFJ2TVIwd0d3WURWUVFLREJSRmVHRnRjR3hsSUU5eVoyRnVhWHBoZEdsdmJqRVpNQmNHQTFVRUF3d1FTbTlvYmlCSVlXNWpiMk5yTENCTlJERWpNQ0VHQ1NxR1NJYjNEUUVKQVJZVWFtaGhibU52WTJ0QVpYaGhiWEJzWlM1dmNtY3dnZ0dpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCandBd2dnR0tBb0lCZ1FDY1htdlg2MEdBNUcrRGw0aVJuOVRTL3dURjFGVEg5Um1yUDI5RzZYU091VkRFZ0dad1VUSkkvT2tSTFBqK0pVS3kva01ZM1ltNDFrM0pScjhOcko3VWNqZjNUZTJZMHptUk1mR0tPMlg3cDAxSWQ4ckdobmJzVGtXanN6Y2NraktPVGs3RTRIWE83WFFtVnZSWmFQcmpuVlZzejZhSVVtbVV5QmVtVXhzUFF4cWtkNzd6UktlMUorZk1icGJTbmFGMlM1SDlJNUlwUXUzZXJTak53dW51bUpBLzVzTkFTTVVmK1pySzVodHdQZmxvbmxWQTlIRVBvNk41dEpzQ01FWTVxa1pBWEQ1NVBVYmY4SXhyZDMrdDFpWE5BZ01kWFBwOU5qZm1remFIT3NSNUVMNzhvVmZ0S0g4WE1nczlMK1hYaGNtcCtTdVNiVVQrbGFRRm5LWlo2NjFFQjhVVlFHUGhzSGN1WXo3TS8rR0Q3bGttbjV3N2c2aXpZMDVEczF0ZHRoM2hCK0UxZTBWOGFsMCtIWXhYdG1MMjhPYnJ1clp0NVZPVDYzNmFCV2VhazNtMWx0K0pMaVRXd2NJWHVyaUp3WENRN1cyT2hJcmxlQm50NVlSZEYvVndrQWY1QnA0MERLcllTdkJUL3gzUGFyYmNBczVydWE0TWl6dHp3ek1DQXdFQUFhT0JuRENCbVRBSkJnTlZIUk1FQWpBQU1Bc0dBMVVkRHdRRUF3SUY0REJnQmdOVkhSRUVXVEJYZ2c5M2QzY3VaWGhoYlhCc1pTNXZjbWVnR1FZSllJWklBWWI1V3dRR29Bd01Dams1TkRFek16a3hNRENHS1doMGRIQnpPaTh2WlhoaGJYQnNaUzV2Y21jdlptaHBjaTlRY21GamRHbDBhVzl1WlhJdk1USXpNQjBHQTFVZERnUVdCQlMvdmo1Y0JIQkVSWFpVZ1JPU2pWOGVUajh1NnpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVlFQWZHaDBmdjc2Qk15UnBpbi82bTJObk9Bd1lOK1dZTlc0WndRS1BvaCtpQkZqZ2IvZ1haL3gzZG5HcTJSVW5SSEx5YmN2cU93Qzh0NCtMMlFhZW50ei96U0xmQklpSFArdnRhdVZvNFlpclVLSUZPNU5rRGJQUndFWDZacG90d1JFMnAzWVBPcW1MalVwdXFlektSZnV6ZmZFU0lHQ1dmNmJBWm9IOG92eXprcFVPeFQybGNKTDJZUWd4YUVFKy9NT0VEeGJ5L0c1dE5sSFdVMXJtMjlEWkQ2aVRuOEZITU9iNERBZUxzN2RlVUJLZUF4bUNOMXcwN0liSGZUWCs4eG96Qms4bTRyUWFSSTJGYWNHY04vUzRPa2lpamxoa1luRGRiYjZab0lCOTlBTUcvMHRNZ1dnaDU1RkNMOXcyeXViRkRzUisxeVpXNXc2eHZWdWJGb3EycktJWU42QlRNVDM0OU4rS1lGUlRiK3BYMDRRRkZDcVgxT3l1UUVKakpwWmF1TElWU21VYVZ6RFdkYVJtdDBya0xENlI4NXRoWUpwTnhNcjRvQXJzeTVpbDVMMEpWTUVYRzExQ2hFeFJDSjdYc2hrdExqaitBOGxkVVJyTEhSV1hvdHg2bU5WcDMrTW9pQ2h4N1Bmbkd2Q1BhUHZrTFFxaWU4ZDhyazBlak4zIl19\n", "\n", "payload:\n", "\n", "\n", "signature:\n", "ISbUCryOohB0wSthIgNVHRiSS-Pfr8uvtJooZswRBQ4GttVN-hmwsEJA3LqQ96gw6DVpp_bClS-2x0Yedoz2bOmvDFK6gkzHLuo7-rUlx_GGYaBMCnjZ2MfzYffKGusxdj4pXC2eDr2xt2bSIdn0GrgFrq3mbtSWvkoM7QqQ9s6YA6gHB6ERcr5iDH-xHHem2w3FEckYJQ80bUXqyYZu-LlaXZyn5muEm61UqxaB27ExIdxfIRtHlgO1HwVWPaVTkMa760Msp6ls07nCAJVuk8VzVABmh73qWgrDp-TuNC5bbK1RctW3WV9vmyQ80_8go18ON62YocKxaVEl1C1stb6uohPOdmNBAHqc2m3azRQqUOkvKtPyyWxeBChITz-hj6jBM-DD5YXDEtUIwmNL5gepuI7sdVMzfm_dxf723v8lHEN02wRWIHwRWHZAb2wizjlaVIHJmQbyaurB-AUGooGM3aFh-XVBKHUH1XpfWpFk_Kka2a5VL4nWkXoUmq2G\n", "\n" ] } ], "source": [ "labels = ['header', 'payload', 'signature']\n", "recd_jws = b64decode(recd_b64_jws.encode()).decode()\n", "for i,j in enumerate(recd_jws.split('.')):\n", " print(f'{labels[i]}:')\n", " print(f'{j}')\n", " print()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6. reattach the payload - the base64 encoded Bundle or QR - into the JWS payload element. \n", "\n", "note the signature is displayed with the parts labeled and separated with line breaks for easier viewing" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "header:\n", "eyJhbGciOiJSUzI1NiIsImtpZCI6ImJmYmUzZTVjMDQ3MDQ0NDU3NjU0ODExMzkyOGQ1ZjFlNGUzZjJlZWIiLCJrdHkiOiJSUyIsInNpZ1QiOiIyMDIwLTEwLTIzVDA0OjU0OjU2LjA0OCswMDowMCIsInNyQ21zIjpbeyJjb21tSWQiOnsiZGVzYyI6IlZlcmlmaWNhdGlvbiBTaWduYXR1cmUiLCJpZCI6InVybjpvaWQ6MS4yLjg0MC4xMDA2NS4xLjEyLjEuNSJ9LCJjb21tUXVhbHMiOlsiVmVyaWZpY2F0aW9uIG9mIG1lZGljYWwgcmVjb3JkIGludGVncml0eSJdfV0sInR5cCI6IkpXVCIsIng1YyI6WyJNSUlGVnpDQ0E3K2dBd0lCQWdJVUJuNDNGNE8xMTB6Vk5IUFV0Qm5uWGYzM0ZRd3dEUVlKS29aSWh2Y05BUUVMQlFBd2daVXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SSXdFQVlEVlFRSERBbFRZWFZ6WVd4cGRHOHhIVEFiQmdOVkJBb01GRVY0WVcxd2JHVWdUM0puWVc1cGVtRjBhVzl1TVJrd0Z3WURWUVFEREJCS2IyaHVJRWhoYm1Odlkyc3NJRTFFTVNNd0lRWUpLb1pJaHZjTkFRa0JGaFJxYUdGdVkyOWphMEJsZUdGdGNHeGxMbTl5WnpBZUZ3MHlOVEEyTWpVeU16RXlNemxhRncweU56QTJNVFV5TXpFeU16bGFNSUdWTVFzd0NRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNBd0tRMkZzYVdadmNtNXBZVEVTTUJBR0ExVUVCd3dKVTJGMWMyRnNhWFJ2TVIwd0d3WURWUVFLREJSRmVHRnRjR3hsSUU5eVoyRnVhWHBoZEdsdmJqRVpNQmNHQTFVRUF3d1FTbTlvYmlCSVlXNWpiMk5yTENCTlJERWpNQ0VHQ1NxR1NJYjNEUUVKQVJZVWFtaGhibU52WTJ0QVpYaGhiWEJzWlM1dmNtY3dnZ0dpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCandBd2dnR0tBb0lCZ1FDY1htdlg2MEdBNUcrRGw0aVJuOVRTL3dURjFGVEg5Um1yUDI5RzZYU091VkRFZ0dad1VUSkkvT2tSTFBqK0pVS3kva01ZM1ltNDFrM0pScjhOcko3VWNqZjNUZTJZMHptUk1mR0tPMlg3cDAxSWQ4ckdobmJzVGtXanN6Y2NraktPVGs3RTRIWE83WFFtVnZSWmFQcmpuVlZzejZhSVVtbVV5QmVtVXhzUFF4cWtkNzd6UktlMUorZk1icGJTbmFGMlM1SDlJNUlwUXUzZXJTak53dW51bUpBLzVzTkFTTVVmK1pySzVodHdQZmxvbmxWQTlIRVBvNk41dEpzQ01FWTVxa1pBWEQ1NVBVYmY4SXhyZDMrdDFpWE5BZ01kWFBwOU5qZm1remFIT3NSNUVMNzhvVmZ0S0g4WE1nczlMK1hYaGNtcCtTdVNiVVQrbGFRRm5LWlo2NjFFQjhVVlFHUGhzSGN1WXo3TS8rR0Q3bGttbjV3N2c2aXpZMDVEczF0ZHRoM2hCK0UxZTBWOGFsMCtIWXhYdG1MMjhPYnJ1clp0NVZPVDYzNmFCV2VhazNtMWx0K0pMaVRXd2NJWHVyaUp3WENRN1cyT2hJcmxlQm50NVlSZEYvVndrQWY1QnA0MERLcllTdkJUL3gzUGFyYmNBczVydWE0TWl6dHp3ek1DQXdFQUFhT0JuRENCbVRBSkJnTlZIUk1FQWpBQU1Bc0dBMVVkRHdRRUF3SUY0REJnQmdOVkhSRUVXVEJYZ2c5M2QzY3VaWGhoYlhCc1pTNXZjbWVnR1FZSllJWklBWWI1V3dRR29Bd01Dams1TkRFek16a3hNRENHS1doMGRIQnpPaTh2WlhoaGJYQnNaUzV2Y21jdlptaHBjaTlRY21GamRHbDBhVzl1WlhJdk1USXpNQjBHQTFVZERnUVdCQlMvdmo1Y0JIQkVSWFpVZ1JPU2pWOGVUajh1NnpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVlFQWZHaDBmdjc2Qk15UnBpbi82bTJObk9Bd1lOK1dZTlc0WndRS1BvaCtpQkZqZ2IvZ1haL3gzZG5HcTJSVW5SSEx5YmN2cU93Qzh0NCtMMlFhZW50ei96U0xmQklpSFArdnRhdVZvNFlpclVLSUZPNU5rRGJQUndFWDZacG90d1JFMnAzWVBPcW1MalVwdXFlektSZnV6ZmZFU0lHQ1dmNmJBWm9IOG92eXprcFVPeFQybGNKTDJZUWd4YUVFKy9NT0VEeGJ5L0c1dE5sSFdVMXJtMjlEWkQ2aVRuOEZITU9iNERBZUxzN2RlVUJLZUF4bUNOMXcwN0liSGZUWCs4eG96Qms4bTRyUWFSSTJGYWNHY04vUzRPa2lpamxoa1luRGRiYjZab0lCOTlBTUcvMHRNZ1dnaDU1RkNMOXcyeXViRkRzUisxeVpXNXc2eHZWdWJGb3EycktJWU42QlRNVDM0OU4rS1lGUlRiK3BYMDRRRkZDcVgxT3l1UUVKakpwWmF1TElWU21VYVZ6RFdkYVJtdDBya0xENlI4NXRoWUpwTnhNcjRvQXJzeTVpbDVMMEpWTUVYRzExQ2hFeFJDSjdYc2hrdExqaitBOGxkVVJyTEhSV1hvdHg2bU5WcDMrTW9pQ2h4N1Bmbkd2Q1BhUHZrTFFxaWU4ZDhyazBlak4zIl19\n", "\n", "payload:\n", "eyJlbnRyeSI6W3siZnVsbFVybCI6InVybjp1dWlkOjE3YTgwYThkLTRjZjEtNGRlYi1hMWZkLTJkYjExMzBlNWY3NiIsInJlc291cmNlIjp7ImF0dGVzdGVyIjpbeyJtb2RlIjoibGVnYWwiLCJwYXJ0eSI6eyJkaXNwbGF5IjoiRXhhbXBsZSBQcmFjdGl0aW9uZXIiLCJyZWZlcmVuY2UiOiJ1cm46dXVpZDowODIwYzE2ZC05MWRlLTRkZmEtYTNhNi1mMTQwYTUxNmE5YmMifSwidGltZSI6IjIwMjEtMTAtMjVUMjA6MTY6MjktMDc6MDAifV0sImF1dGhvciI6W3siZGlzcGxheSI6IkV4YW1wbGUgUHJhY3RpdGlvbmVyIiwicmVmZXJlbmNlIjoidXJuOnV1aWQ6MDgyMGMxNmQtOTFkZS00ZGZhLWEzYTYtZjE0MGE1MTZhOWJjIn1dLCJkYXRlIjoiMjAyMS0xMC0yNVQyMDoxNjoyOS0wNzowMCIsImVuY291bnRlciI6eyJkaXNwbGF5IjoiRXhhbXBsZSBFbmNvdW50ZXIiLCJyZWZlcmVuY2UiOiJ1cm46dXVpZDo1Y2U1YzgzYS0wMDBmLTQ3ZDItOTQxYy0wMzkzNThjYzkxMTIifSwiaWQiOiIxN2E4MGE4ZC00Y2YxLTRkZWItYTFmZC0yZGIxMTMwZTVmNzYiLCJyZXNvdXJjZVR5cGUiOiJDb21wb3NpdGlvbiIsInNlY3Rpb24iOlt7ImVudHJ5IjpbeyJyZWZlcmVuY2UiOiJ1cm46dXVpZDowMTRhNjhlYy1kNjkxLTQ5ZTAtYjk4MC05MWIwZDkyNGU1NzAifV0sInRpdGxlIjoiQWN0aXZlIENvbmRpdGlvbiAxIn1dLCJzdGF0dXMiOiJmaW5hbCIsInN1YmplY3QiOnsiZGlzcGxheSI6IkV4YW1wbGUgUGF0aWVudCIsInJlZmVyZW5jZSI6InVybjp1dWlkOjk3MGFmNmM5LTViYmQtNDA2Ny1iNmMxLWQ5YjJjODIzYWVjZSJ9LCJ0ZXh0Ijp7ImRpdiI6IjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI-PGEgbmFtZT1cIkNvbXBvc2l0aW9uXzE3YTgwYThkLTRjZjEtNGRlYi1hMWZkLTJkYjExMzBlNWY3NlwiPiA8L2E-PGgzPk1lZGljYWwgUmVjb3JkcyBEb2N1bWVudDwvaDM-PHA-VGhpcyBkb2N1bWVudCwgdGl0bGVkIFwiQWN0aXZlIENvbmRpdGlvbnMsXCIgd2FzIGNyZWF0ZWQgb24gT2N0b2JlciAyNSwgMjAyMSwgYnkgRHIuIEpvaG4gSGFuY29jaywgd2hvIGFsc28gbGVnYWxseSBhdHRlc3RlZCB0byBpdHMgYWNjdXJhY3kgb24gdGhlIHNhbWUgZGF0ZS4gSXQgc3VtbWFyaXplcyB0aGUgYWN0aXZlIG1lZGljYWwgY29uZGl0aW9ucyBmb3IgYSBwYXRpZW50IGJhc2VkIG9uIGFuIGVtZXJnZW5jeSBlbmNvdW50ZXIgb24gT2N0b2JlciAyNSwgMjAyMS4gVGhlIGRvY3VtZW50IGluY2x1ZGVzIG9uZSBzZWN0aW9uIGRldGFpbGluZyBhbiBhY3RpdmUgY29uZGl0aW9uOiBUeXBlIDIgRGlhYmV0ZXMgTWVsbGl0dXMuPC9wPjwvZGl2PiIsInN0YXR1cyI6ImdlbmVyYXRlZCJ9LCJ0aXRsZSI6IkFjdGl2ZSBDb25kaXRpb25zIiwidHlwZSI6eyJjb2RpbmciOlt7ImNvZGUiOiIxMTUwMy0wIiwic3lzdGVtIjoiaHR0cDovL2xvaW5jLm9yZyJ9XSwidGV4dCI6Ik1lZGljYWwgcmVjb3JkcyJ9fX0seyJmdWxsVXJsIjoidXJuOnV1aWQ6MDgyMGMxNmQtOTFkZS00ZGZhLWEzYTYtZjE0MGE1MTZhOWJjIiwicmVzb3VyY2UiOnsiaWQiOiIwODIwYzE2ZC05MWRlLTRkZmEtYTNhNi1mMTQwYTUxNmE5YmMiLCJpZGVudGlmaWVyIjpbeyJzeXN0ZW0iOiJodHRwOi8vaGw3Lm9yZy9maGlyL3NpZC91cy1ucGkiLCJ2YWx1ZSI6Ijk5NDEzMzkxMDAifV0sIm1ldGEiOnsibGFzdFVwZGF0ZWQiOiIyMDEzLTA1LTA1VDE2OjEzOjAzWiJ9LCJuYW1lIjpbeyJmYW1pbHkiOiJIYW5jb2NrIiwiZ2l2ZW4iOlsiSm9obiJdfV0sInJlc291cmNlVHlwZSI6IlByYWN0aXRpb25lciIsInRleHQiOnsiZGl2IjoiPGRpdiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj48YSBuYW1lPVwiUHJhY3RpdGlvbmVyXzA4MjBjMTZkLTkxZGUtNGRmYS1hM2E2LWYxNDBhNTE2YTliY1wiPiA8L2E-PGgzPlByYWN0aXRpb25lciBJbmZvcm1hdGlvbjwvaDM-PHA-RHIuIEpvaG4gSGFuY29jayBpcyBhIGhlYWx0aGNhcmUgcHJvdmlkZXIgd2l0aCBOYXRpb25hbCBQcm92aWRlciBJZGVudGlmaWVyIChOUEkpIDk5NDEzMzkxMDAuIEhlIGF1dGhvcmVkIGFuZCBhdHRlc3RlZCB0byB0aGUgbWVkaWNhbCByZWNvcmRzIGRvY3VtZW50LjwvcD48L2Rpdj4iLCJzdGF0dXMiOiJnZW5lcmF0ZWQifX19LHsiZnVsbFVybCI6InVybjp1dWlkOjk3MGFmNmM5LTViYmQtNDA2Ny1iNmMxLWQ5YjJjODIzYWVjZSIsInJlc291cmNlIjp7ImFjdGl2ZSI6dHJ1ZSwiZ2VuZGVyIjoibWFsZSIsImlkIjoiOTcwYWY2YzktNWJiZC00MDY3LWI2YzEtZDliMmM4MjNhZWNlIiwiaWRlbnRpZmllciI6W3sic3lzdGVtIjoiaHR0cDovL2V4YW1wbGUub3JnL2NkZXgvcGF5ZXIvbWVtYmVyLWlkcyIsInR5cGUiOnsiY29kaW5nIjpbeyJjb2RlIjoiTUIiLCJzeXN0ZW0iOiJodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL3YyLTAyMDMifV19LCJ2YWx1ZSI6Ik1lbWJlcjEyMyJ9XSwibmFtZSI6W3siZmFtaWx5IjoiUGF0aWVudCIsImdpdmVuIjpbIkNERVggRXhhbXBsZSJdLCJ0ZXh0IjoiQ0RFWCBFeGFtcGxlIFBhdGllbnQifV0sInJlc291cmNlVHlwZSI6IlBhdGllbnQiLCJ0ZXh0Ijp7ImRpdiI6IjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI-PGEgbmFtZT1cIlBhdGllbnRfOTcwYWY2YzktNWJiZC00MDY3LWI2YzEtZDliMmM4MjNhZWNlXCI-IDwvYT48aDM-UGF0aWVudCBJbmZvcm1hdGlvbjwvaDM-PHA-Q0RFWCBFeGFtcGxlIFBhdGllbnQsIGEgbWFsZSwgaXMgaWRlbnRpZmllZCBieSBtZW1iZXIgSUQgTWVtYmVyMTIzIGluIHRoZSBwYXllciBzeXN0ZW0gaHR0cDovL2V4YW1wbGUub3JnL2NkZXgvcGF5ZXIvbWVtYmVyLWlkcy4gSGUgaXMgdGhlIHN1YmplY3Qgb2YgdGhpcyBtZWRpY2FsIHJlY29yZHMgZG9jdW1lbnQuIFRoZSBwYXRpZW50IHNhaWQsIFwiSSBmZWVsIGdyZWF0IVwiPC9wPjwvZGl2PiIsInN0YXR1cyI6ImdlbmVyYXRlZCJ9fX0seyJmdWxsVXJsIjoidXJuOnV1aWQ6MDE0YTY4ZWMtZDY5MS00OWUwLWI5ODAtOTFiMGQ5MjRlNTcwIiwicmVzb3VyY2UiOnsiYXNzZXJ0ZXIiOnsicmVmZXJlbmNlIjoidXJuOnV1aWQ6MDgyMGMxNmQtOTFkZS00ZGZhLWEzYTYtZjE0MGE1MTZhOWJjIn0sImNhdGVnb3J5IjpbeyJjb2RpbmciOlt7ImNvZGUiOiJwcm9ibGVtLWxpc3QtaXRlbSIsImRpc3BsYXkiOiJQcm9ibGVtIExpc3QgSXRlbSIsInN5c3RlbSI6Imh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vY29uZGl0aW9uLWNhdGVnb3J5In1dLCJ0ZXh0IjoiUHJvYmxlbSBMaXN0IEl0ZW0ifV0sImNsaW5pY2FsU3RhdHVzIjp7ImNvZGluZyI6W3siY29kZSI6ImFjdGl2ZSIsInN5c3RlbSI6Imh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vY29uZGl0aW9uLWNsaW5pY2FsIn1dfSwiY29kZSI6eyJjb2RpbmciOlt7ImNvZGUiOiI0NDA1NDAwNiIsImRpc3BsYXkiOiJUeXBlIDIgRGlhYmV0ZXMgTWVsbGl0dXMiLCJzeXN0ZW0iOiJodHRwOi8vc25vbWVkLmluZm8vc2N0In1dfSwiaWQiOiIwMTRhNjhlYy1kNjkxLTQ5ZTAtYjk4MC05MWIwZDkyNGU1NzAiLCJpZGVudGlmaWVyIjpbeyJzeXN0ZW0iOiJ1cm46b2lkOjEuMy42LjEuNC4xLjIyODEyLjQuMTExLjAuNC4xLjIuMSIsInZhbHVlIjoiMSJ9XSwib25zZXREYXRlVGltZSI6IjIwMDYiLCJyZXNvdXJjZVR5cGUiOiJDb25kaXRpb24iLCJzdWJqZWN0Ijp7InJlZmVyZW5jZSI6InVybjp1dWlkOjk3MGFmNmM5LTViYmQtNDA2Ny1iNmMxLWQ5YjJjODIzYWVjZSJ9LCJ0ZXh0Ijp7ImRpdiI6IjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI-PGEgbmFtZT1cIkNvbmRpdGlvbl8wMTRhNjhlYy1kNjkxLTQ5ZTAtYjk4MC05MWIwZDkyNGU1NzBcIj4gPC9hPjxoMz5BY3RpdmUgQ29uZGl0aW9uPC9oMz48cD5UaGUgcGF0aWVudCBoYXMgYW4gYWN0aXZlIGRpYWdub3NpcyBvZiBUeXBlIDIgRGlhYmV0ZXMgTWVsbGl0dXMgKFNOT01FRCBDVDogNDQwNTQwMDYpLCBmaXJzdCBpZGVudGlmaWVkIGluIDIwMDYuIFRoaXMgY29uZGl0aW9uIHdhcyBkb2N1bWVudGVkIGJ5IERyLiBKb2huIEhhbmNvY2sgYW5kIGlzIGxpc3RlZCBhcyBhIHByb2JsZW0gb24gdGhlIHBhdGllbnTigJlzIHByb2JsZW0gbGlzdC48L3A-PC9kaXY-Iiwic3RhdHVzIjoiZ2VuZXJhdGVkIn19fSx7ImZ1bGxVcmwiOiJ1cm46dXVpZDo1Y2U1YzgzYS0wMDBmLTQ3ZDItOTQxYy0wMzkzNThjYzkxMTIiLCJyZXNvdXJjZSI6eyJjbGFzcyI6eyJjb2RlIjoiRU1FUiIsInN5c3RlbSI6Imh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vdjMtQWN0Q29kZSJ9LCJpZCI6IjVjZTVjODNhLTAwMGYtNDdkMi05NDFjLTAzOTM1OGNjOTExMiIsInBhcnRpY2lwYW50IjpbeyJpbmRpdmlkdWFsIjp7ImRpc3BsYXkiOiJKb2huIEhhbmNvY2siLCJyZWZlcmVuY2UiOiJ1cm46dXVpZDowODIwYzE2ZC05MWRlLTRkZmEtYTNhNi1mMTQwYTUxNmE5YmMifX1dLCJwZXJpb2QiOnsiZW5kIjoiMjAyMS0xMC0yNVQyMDoxNjoyOS0wNzowMCIsInN0YXJ0IjoiMjAyMS0xMC0yNVQyMDoxMDoyOS0wNzowMCJ9LCJyZXNvdXJjZVR5cGUiOiJFbmNvdW50ZXIiLCJzZXJ2aWNlUHJvdmlkZXIiOnsiZGlzcGxheSI6IkNERVggRXhhbXBsZSBPcmdhbml6YXRpb24iLCJyZWZlcmVuY2UiOiJ1cm46dXVpZDplMzdmMDA0Yi1kYzEwLTQyMmItYjgzMy1jZGFhMTBhMDU1YTMifSwic3RhdHVzIjoiZmluaXNoZWQiLCJzdWJqZWN0Ijp7ImRpc3BsYXkiOiJDREVYIEV4YW1wbGUgUGF0aWVudCIsInJlZmVyZW5jZSI6InVybjp1dWlkOjk3MGFmNmM5LTViYmQtNDA2Ny1iNmMxLWQ5YjJjODIzYWVjZSJ9LCJ0ZXh0Ijp7ImRpdiI6IjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI-PGEgbmFtZT1cIkVuY291bnRlcl81Y2U1YzgzYS0wMDBmLTQ3ZDItOTQxYy0wMzkzNThjYzkxMTJcIj4gPC9hPjxoMz5FbmNvdW50ZXIgRGV0YWlsczwvaDM-PHA-QW4gZW1lcmdlbmN5IGVuY291bnRlciBvY2N1cnJlZCBvbiBPY3RvYmVyIDI1LCAyMDIxLCBmcm9tIDg6MTAgUE0gdG8gODoxNiBQTSwgaW52b2x2aW5nIENERVggRXhhbXBsZSBQYXRpZW50IGFuZCBhdHRlbmRlZCBieSBEci4gSm9obiBIYW5jb2NrIGF0IENERVggRXhhbXBsZSBPcmdhbml6YXRpb24uIFRoZSBlbmNvdW50ZXIgdHlwZSBpcyB1bnNwZWNpZmllZCAoU05PTUVEIENUOiAyNjE2NjUwMDYpLjwvcD48L2Rpdj4iLCJzdGF0dXMiOiJnZW5lcmF0ZWQifSwidHlwZSI6W3siY29kaW5nIjpbeyJjb2RlIjoiMjYxNjY1MDA2IiwiZGlzcGxheSI6IlVua25vd24gKHF1YWxpZmllciB2YWx1ZSkiLCJzeXN0ZW0iOiJodHRwOi8vc25vbWVkLmluZm8vc2N0In1dLCJ0ZXh0IjoiVW5rbm93biAocXVhbGlmaWVyIHZhbHVlKSJ9XX19LHsiZnVsbFVybCI6InVybjp1dWlkOmUzN2YwMDRiLWRjMTAtNDIyYi1iODMzLWNkYWExMGEwNTVhMyIsInJlc291cmNlIjp7ImFjdGl2ZSI6dHJ1ZSwiYWRkcmVzcyI6W3siY2l0eSI6IkJvc3RvbiIsImNvdW50cnkiOiJVU0EiLCJsaW5lIjpbIjEgQ0RFWCBMYW5lIl0sInBvc3RhbENvZGUiOiIwMTAwMiIsInN0YXRlIjoiTUEifV0sImlkIjoiZTM3ZjAwNGItZGMxMC00MjJiLWI4MzMtY2RhYTEwYTA1NWEzIiwiaWRlbnRpZmllciI6W3sic3lzdGVtIjoiaHR0cDovL2hsNy5vcmcvZmhpci9zaWQvdXMtbnBpIiwidmFsdWUiOiIxMjM0NTY3ODkzIn1dLCJuYW1lIjoiQ0RFWCBFeGFtcGxlIE9yZ2FuaXphdGlvbiIsInJlc291cmNlVHlwZSI6Ik9yZ2FuaXphdGlvbiIsInRlbGVjb20iOlt7InN5c3RlbSI6InBob25lIiwidmFsdWUiOiIoKzEpIDU1NS01NTUtNTU1NSJ9LHsic3lzdGVtIjoiZW1haWwiLCJ2YWx1ZSI6ImN1c3RvbWVyLXNlcnZpY2VAZXhhbXBsZS5vcmcifV0sInRleHQiOnsiZGl2IjoiPGRpdiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj48YSBuYW1lPVwiT3JnYW5pemF0aW9uX2UzN2YwMDRiLWRjMTAtNDIyYi1iODMzLWNkYWExMGEwNTVhM1wiPiA8L2E-PGgzPk9yZ2FuaXphdGlvbiBJbmZvcm1hdGlvbjwvaDM-PHA-Q0RFWCBFeGFtcGxlIE9yZ2FuaXphdGlvbiwgbG9jYXRlZCBhdCAxIENERVggTGFuZSwgQm9zdG9uLCBNQSAwMTAwMiwgVVNBLCBpcyB0aGUgc2VydmljZSBwcm92aWRlciBmb3IgdGhlIGRvY3VtZW50ZWQgZW5jb3VudGVyLiBDb250YWN0IGRldGFpbHMgaW5jbHVkZSBwaG9uZTogKCsxKSA1NTUtNTU1LTU1NTUgYW5kIGVtYWlsOiBjdXN0b21lci1zZXJ2aWNlQGV4YW1wbGUub3JnLiBUaGUgb3JnYW5pemF0aW9uJ3MgTlBJIGlzIDEyMzQ1Njc4OTMuPC9wPjwvZGl2PiIsInN0YXR1cyI6ImdlbmVyYXRlZCJ9fX1dLCJpZGVudGlmaWVyIjp7InN5c3RlbSI6InVybjppZXRmOnJmYzozOTg2IiwidmFsdWUiOiJ1cm46dXVpZDpjMTczNTM1ZS0xMzVlLTQ4ZTMtYWI2NC0zOGJhY2M2OGRiYTgifSwicmVzb3VyY2VUeXBlIjoiQnVuZGxlIiwidGltZXN0YW1wIjoiMjAyMS0xMC0yNVQyMDoxNjoyOS0wNzowMCIsInR5cGUiOiJkb2N1bWVudCJ9\n", "\n", "signature:\n", "ISbUCryOohB0wSthIgNVHRiSS-Pfr8uvtJooZswRBQ4GttVN-hmwsEJA3LqQ96gw6DVpp_bClS-2x0Yedoz2bOmvDFK6gkzHLuo7-rUlx_GGYaBMCnjZ2MfzYffKGusxdj4pXC2eDr2xt2bSIdn0GrgFrq3mbtSWvkoM7QqQ9s6YA6gHB6ERcr5iDH-xHHem2w3FEckYJQ80bUXqyYZu-LlaXZyn5muEm61UqxaB27ExIdxfIRtHlgO1HwVWPaVTkMa760Msp6ls07nCAJVuk8VzVABmh73qWgrDp-TuNC5bbK1RctW3WV9vmyQ80_8go18ON62YocKxaVEl1C1stb6uohPOdmNBAHqc2m3azRQqUOkvKtPyyWxeBChITz-hj6jBM-DD5YXDEtUIwmNL5gepuI7sdVMzfm_dxf723v8lHEN02wRWIHwRWHZAb2wizjlaVIHJmQbyaurB-AUGooGM3aFh-XVBKHUH1XpfWpFk_Kka2a5VL4nWkXoUmq2G\n", "\n", "False\n" ] } ], "source": [ "split_sig = recd_jws.split('.')\n", "split_sig[1] = recd_b64_canonical_obj\n", "recd_jws = '.'.join(split_sig)\n", "for i,j in enumerate(recd_jws.split('.')):\n", " print(f'{labels[i]}:')\n", " print(f'{j}')\n", " print()\n", "print(recd_b64_canonical_obj == j)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7. Obtain public Key from the first certificate in JWS header `\"x5c\"` key\n", "\n", "- base64 decode the key value\n", "- Verify Issuer, Validity Dates, Subject,and KeyUsage of certificate ( with the source ) !Never trust the header contents without signature verification.\n", "- Get the “Subject Public Key Info” from the cert to verify the signature" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'alg': 'RS256',\n", " 'kid': 'bfbe3e5c0470444576548113928d5f1e4e3f2eeb',\n", " 'kty': 'RS',\n", " 'sigT': '2020-10-23T04:54:56.048+00:00',\n", " 'srCms': [{'commId': {'desc': 'Verification Signature',\n", " 'id': 'urn:oid:1.2.840.10065.1.12.1.5'},\n", " 'commQuals': ['Verification of medical record integrity']}],\n", " 'typ': 'JWT',\n", " 'x5c': ['MIIFVzCCA7+gAwIBAgIUBn43F4O110zVNHPUtBnnXf33FQwwDQYJKoZIhvcNAQELBQAwgZUxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRIwEAYDVQQHDAlTYXVzYWxpdG8xHTAbBgNVBAoMFEV4YW1wbGUgT3JnYW5pemF0aW9uMRkwFwYDVQQDDBBKb2huIEhhbmNvY2ssIE1EMSMwIQYJKoZIhvcNAQkBFhRqaGFuY29ja0BleGFtcGxlLm9yZzAeFw0yNTA2MjUyMzEyMzlaFw0yNzA2MTUyMzEyMzlaMIGVMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTESMBAGA1UEBwwJU2F1c2FsaXRvMR0wGwYDVQQKDBRFeGFtcGxlIE9yZ2FuaXphdGlvbjEZMBcGA1UEAwwQSm9obiBIYW5jb2NrLCBNRDEjMCEGCSqGSIb3DQEJARYUamhhbmNvY2tAZXhhbXBsZS5vcmcwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCcXmvX60GA5G+Dl4iRn9TS/wTF1FTH9RmrP29G6XSOuVDEgGZwUTJI/OkRLPj+JUKy/kMY3Ym41k3JRr8NrJ7Ucjf3Te2Y0zmRMfGKO2X7p01Id8rGhnbsTkWjszcckjKOTk7E4HXO7XQmVvRZaPrjnVVsz6aIUmmUyBemUxsPQxqkd77zRKe1J+fMbpbSnaF2S5H9I5IpQu3erSjNwunumJA/5sNASMUf+ZrK5htwPflonlVA9HEPo6N5tJsCMEY5qkZAXD55PUbf8Ixrd3+t1iXNAgMdXPp9NjfmkzaHOsR5EL78oVftKH8XMgs9L+XXhcmp+SuSbUT+laQFnKZZ661EB8UVQGPhsHcuYz7M/+GD7lkmn5w7g6izY05Ds1tdth3hB+E1e0V8al0+HYxXtmL28ObrurZt5VOT636aBWeak3m1lt+JLiTWwcIXuriJwXCQ7W2OhIrleBnt5YRdF/VwkAf5Bp40DKrYSvBT/x3ParbcAs5rua4MiztzwzMCAwEAAaOBnDCBmTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIF4DBgBgNVHREEWTBXgg93d3cuZXhhbXBsZS5vcmegGQYJYIZIAYb5WwQGoAwMCjk5NDEzMzkxMDCGKWh0dHBzOi8vZXhhbXBsZS5vcmcvZmhpci9QcmFjdGl0aW9uZXIvMTIzMB0GA1UdDgQWBBS/vj5cBHBERXZUgROSjV8eTj8u6zANBgkqhkiG9w0BAQsFAAOCAYEAfGh0fv76BMyRpin/6m2NnOAwYN+WYNW4ZwQKPoh+iBFjgb/gXZ/x3dnGq2RUnRHLybcvqOwC8t4+L2Qaentz/zSLfBIiHP+vtauVo4YirUKIFO5NkDbPRwEX6ZpotwRE2p3YPOqmLjUpuqezKRfuzffESIGCWf6bAZoH8ovyzkpUOxT2lcJL2YQgxaEE+/MOEDxby/G5tNlHWU1rm29DZD6iTn8FHMOb4DAeLs7deUBKeAxmCN1w07IbHfTX+8xozBk8m4rQaRI2FacGcN/S4OkiijlhkYnDdbb6ZoIB99AMG/0tMgWgh55FCL9w2yubFDsR+1yZW5w6xvVubFoq2rKIYN6BTMT349N+KYFRTb+pX04QFFCqX1OyuQEJjJpZauLIVSmUaVzDWdaRmt0rkLD6R85thYJpNxMr4oArsy5il5L0JVMEXG11ChExRCJ7XshktLjj+A8ldURrLHRWXotx6mNVp3+MoiChx7PfnGvCPaPvkLQqie8d8rk0ejN3']}" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "recd_header = jws.get_unverified_header(recd_jws) \n", "recd_header" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 8. Inspect the x509 certificate for the\n", "\n", "- Issuer\n", "- Subject\n", "- Key Usage\n", "- Validaty dates\n", "- SAN\n", "\n", "Define the location of the Document Signing Certificate for comparison to verify \n", "\n", " - See the Jupyter file [Create_Cert.ipynb]() for how to generate your own self-signed certificate." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Source certificate for comparison is at ~/example_org_cert\n", "Certificate:\n", " Data:\n", " Version: 3 (0x2)\n", " Serial Number:\n", " 06:7e:37:17:83:b5:d7:4c:d5:34:73:d4:b4:19:e7:5d:fd:f7:15:0c\n", " Signature Algorithm: sha256WithRSAEncryption\n", " Issuer: C=US, ST=California, L=Sausalito, O=Example Organization, CN=John Hancock, MD, emailAddress=jhancock@example.org\n", " Validity\n", " Not Before: Jun 25 23:12:39 2025 GMT\n", " Not After : Jun 15 23:12:39 2027 GMT\n", " Subject: C=US, ST=California, L=Sausalito, O=Example Organization, CN=John Hancock, MD, emailAddress=jhancock@example.org\n", " Subject Public Key Info:\n", " Public Key Algorithm: rsaEncryption\n", " Public-Key: (3072 bit)\n", " Modulus:\n", " 00:9c:5e:6b:d7:eb:41:80:e4:6f:83:97:88:91:9f:\n", " d4:d2:ff:04:c5:d4:54:c7:f5:19:ab:3f:6f:46:e9:\n", " 74:8e:b9:50:c4:80:66:70:51:32:48:fc:e9:11:2c:\n", " f8:fe:25:42:b2:fe:43:18:dd:89:b8:d6:4d:c9:46:\n", " bf:0d:ac:9e:d4:72:37:f7:4d:ed:98:d3:39:91:31:\n", " f1:8a:3b:65:fb:a7:4d:48:77:ca:c6:86:76:ec:4e:\n", " 45:a3:b3:37:1c:92:32:8e:4e:4e:c4:e0:75:ce:ed:\n", " 74:26:56:f4:59:68:fa:e3:9d:55:6c:cf:a6:88:52:\n", " 69:94:c8:17:a6:53:1b:0f:43:1a:a4:77:be:f3:44:\n", " a7:b5:27:e7:cc:6e:96:d2:9d:a1:76:4b:91:fd:23:\n", " 92:29:42:ed:de:ad:28:cd:c2:e9:ee:98:90:3f:e6:\n", " c3:40:48:c5:1f:f9:9a:ca:e6:1b:70:3d:f9:68:9e:\n", " 55:40:f4:71:0f:a3:a3:79:b4:9b:02:30:46:39:aa:\n", " 46:40:5c:3e:79:3d:46:df:f0:8c:6b:77:7f:ad:d6:\n", " 25:cd:02:03:1d:5c:fa:7d:36:37:e6:93:36:87:3a:\n", " c4:79:10:be:fc:a1:57:ed:28:7f:17:32:0b:3d:2f:\n", " e5:d7:85:c9:a9:f9:2b:92:6d:44:fe:95:a4:05:9c:\n", " a6:59:eb:ad:44:07:c5:15:40:63:e1:b0:77:2e:63:\n", " 3e:cc:ff:e1:83:ee:59:26:9f:9c:3b:83:a8:b3:63:\n", " 4e:43:b3:5b:5d:b6:1d:e1:07:e1:35:7b:45:7c:6a:\n", " 5d:3e:1d:8c:57:b6:62:f6:f0:e6:eb:ba:b6:6d:e5:\n", " 53:93:eb:7e:9a:05:67:9a:93:79:b5:96:df:89:2e:\n", " 24:d6:c1:c2:17:ba:b8:89:c1:70:90:ed:6d:8e:84:\n", " 8a:e5:78:19:ed:e5:84:5d:17:f5:70:90:07:f9:06:\n", " 9e:34:0c:aa:d8:4a:f0:53:ff:1d:cf:6a:b6:dc:02:\n", " ce:6b:b9:ae:0c:8b:3b:73:c3:33\n", " Exponent: 65537 (0x10001)\n", " X509v3 extensions:\n", " X509v3 Basic Constraints: \n", " CA:FALSE\n", " X509v3 Key Usage: \n", " Digital Signature, Non Repudiation, Key Encipherment\n", " X509v3 Subject Alternative Name: \n", " DNS:www.example.org, othername: 2.16.840.1.113883.4.6:9941339100, URI:https://example.org/fhir/Practitioner/123\n", " X509v3 Subject Key Identifier: \n", " BF:BE:3E:5C:04:70:44:45:76:54:81:13:92:8D:5F:1E:4E:3F:2E:EB\n", " Signature Algorithm: sha256WithRSAEncryption\n", " Signature Value:\n", " 7c:68:74:7e:fe:fa:04:cc:91:a6:29:ff:ea:6d:8d:9c:e0:30:\n", " 60:df:96:60:d5:b8:67:04:0a:3e:88:7e:88:11:63:81:bf:e0:\n", " 5d:9f:f1:dd:d9:c6:ab:64:54:9d:11:cb:c9:b7:2f:a8:ec:02:\n", " f2:de:3e:2f:64:1a:7a:7b:73:ff:34:8b:7c:12:22:1c:ff:af:\n", " b5:ab:95:a3:86:22:ad:42:88:14:ee:4d:90:36:cf:47:01:17:\n", " e9:9a:68:b7:04:44:da:9d:d8:3c:ea:a6:2e:35:29:ba:a7:b3:\n", " 29:17:ee:cd:f7:c4:48:81:82:59:fe:9b:01:9a:07:f2:8b:f2:\n", " ce:4a:54:3b:14:f6:95:c2:4b:d9:84:20:c5:a1:04:fb:f3:0e:\n", " 10:3c:5b:cb:f1:b9:b4:d9:47:59:4d:6b:9b:6f:43:64:3e:a2:\n", " 4e:7f:05:1c:c3:9b:e0:30:1e:2e:ce:dd:79:40:4a:78:0c:66:\n", " 08:dd:70:d3:b2:1b:1d:f4:d7:fb:cc:68:cc:19:3c:9b:8a:d0:\n", " 69:12:36:15:a7:06:70:df:d2:e0:e9:22:8a:39:61:91:89:c3:\n", " 75:b6:fa:66:82:01:f7:d0:0c:1b:fd:2d:32:05:a0:87:9e:45:\n", " 08:bf:70:db:2b:9b:14:3b:11:fb:5c:99:5b:9c:3a:c6:f5:6e:\n", " 6c:5a:2a:da:b2:88:60:de:81:4c:c4:f7:e3:d3:7e:29:81:51:\n", " 4d:bf:a9:5f:4e:10:14:50:aa:5f:53:b2:b9:01:09:8c:9a:59:\n", " 6a:e2:c8:55:29:94:69:5c:c3:59:d6:91:9a:dd:2b:90:b0:fa:\n", " 47:ce:6d:85:82:69:37:13:2b:e2:80:2b:b3:2e:62:97:92:f4:\n", " 25:53:04:5c:6d:75:0a:11:31:44:22:7b:5e:c8:64:b4:b8:e3:\n", " f8:0f:25:75:44:6b:2c:74:56:5e:8b:71:ea:63:55:a7:7f:8c:\n", " a2:20:a1:c7:b3:df:9c:6b:c2:3d:a3:ef:90:b4:2a:89:ef:1d:\n", " f2:b9:34:7a:33:77\n", "-----BEGIN CERTIFICATE-----\n", "MIIFVzCCA7+gAwIBAgIUBn43F4O110zVNHPUtBnnXf33FQwwDQYJKoZIhvcNAQEL\n", "BQAwgZUxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRIwEAYDVQQH\n", "DAlTYXVzYWxpdG8xHTAbBgNVBAoMFEV4YW1wbGUgT3JnYW5pemF0aW9uMRkwFwYD\n", "VQQDDBBKb2huIEhhbmNvY2ssIE1EMSMwIQYJKoZIhvcNAQkBFhRqaGFuY29ja0Bl\n", "eGFtcGxlLm9yZzAeFw0yNTA2MjUyMzEyMzlaFw0yNzA2MTUyMzEyMzlaMIGVMQsw\n", "CQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTESMBAGA1UEBwwJU2F1c2Fs\n", "aXRvMR0wGwYDVQQKDBRFeGFtcGxlIE9yZ2FuaXphdGlvbjEZMBcGA1UEAwwQSm9o\n", "biBIYW5jb2NrLCBNRDEjMCEGCSqGSIb3DQEJARYUamhhbmNvY2tAZXhhbXBsZS5v\n", "cmcwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCcXmvX60GA5G+Dl4iR\n", "n9TS/wTF1FTH9RmrP29G6XSOuVDEgGZwUTJI/OkRLPj+JUKy/kMY3Ym41k3JRr8N\n", "rJ7Ucjf3Te2Y0zmRMfGKO2X7p01Id8rGhnbsTkWjszcckjKOTk7E4HXO7XQmVvRZ\n", "aPrjnVVsz6aIUmmUyBemUxsPQxqkd77zRKe1J+fMbpbSnaF2S5H9I5IpQu3erSjN\n", "wunumJA/5sNASMUf+ZrK5htwPflonlVA9HEPo6N5tJsCMEY5qkZAXD55PUbf8Ixr\n", "d3+t1iXNAgMdXPp9NjfmkzaHOsR5EL78oVftKH8XMgs9L+XXhcmp+SuSbUT+laQF\n", "nKZZ661EB8UVQGPhsHcuYz7M/+GD7lkmn5w7g6izY05Ds1tdth3hB+E1e0V8al0+\n", "HYxXtmL28ObrurZt5VOT636aBWeak3m1lt+JLiTWwcIXuriJwXCQ7W2OhIrleBnt\n", "5YRdF/VwkAf5Bp40DKrYSvBT/x3ParbcAs5rua4MiztzwzMCAwEAAaOBnDCBmTAJ\n", "BgNVHRMEAjAAMAsGA1UdDwQEAwIF4DBgBgNVHREEWTBXgg93d3cuZXhhbXBsZS5v\n", "cmegGQYJYIZIAYb5WwQGoAwMCjk5NDEzMzkxMDCGKWh0dHBzOi8vZXhhbXBsZS5v\n", "cmcvZmhpci9QcmFjdGl0aW9uZXIvMTIzMB0GA1UdDgQWBBS/vj5cBHBERXZUgROS\n", "jV8eTj8u6zANBgkqhkiG9w0BAQsFAAOCAYEAfGh0fv76BMyRpin/6m2NnOAwYN+W\n", "YNW4ZwQKPoh+iBFjgb/gXZ/x3dnGq2RUnRHLybcvqOwC8t4+L2Qaentz/zSLfBIi\n", "HP+vtauVo4YirUKIFO5NkDbPRwEX6ZpotwRE2p3YPOqmLjUpuqezKRfuzffESIGC\n", "Wf6bAZoH8ovyzkpUOxT2lcJL2YQgxaEE+/MOEDxby/G5tNlHWU1rm29DZD6iTn8F\n", "HMOb4DAeLs7deUBKeAxmCN1w07IbHfTX+8xozBk8m4rQaRI2FacGcN/S4Okiijlh\n", "kYnDdbb6ZoIB99AMG/0tMgWgh55FCL9w2yubFDsR+1yZW5w6xvVubFoq2rKIYN6B\n", "TMT349N+KYFRTb+pX04QFFCqX1OyuQEJjJpZauLIVSmUaVzDWdaRmt0rkLD6R85t\n", "hYJpNxMr4oArsy5il5L0JVMEXG11ChExRCJ7XshktLjj+A8ldURrLHRWXotx6mNV\n", "p3+MoiChx7PfnGvCPaPvkLQqie8d8rk0ejN3\n", "-----END CERTIFICATE-----\n" ] } ], "source": [ "recd_cert = b64decode(recd_header['x5c'][0])\n", "with open('recd_cert.der', 'wb') as f:\n", " f.write(recd_cert)\n", "certificate_path = Path('example_org_cert') # update this to your folder\n", "print(f'Source certificate for comparison is at ~/{certificate_path}')\n", "!openssl x509 -in recd_cert.der -inform DER -text" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 9. Verify Signature using the public key or the X.509 Certificate\n", "\n", "Alternatively:\n", "1. visit https://jwt.io.\n", "1. At the top of the page, select \"RS256\" for the algorithm.\n", "1. Paste the JWS value printed below into the “Encoded” field.\n", "1. The plaintext JWT will be displayed in the “Decoded:Payload” field.\n", "1. The X509 Cert above will appear in the \"Verify Signature\" box.\n", "1. If verified, a “Signature Verified” message will appear in the bottom left hand corner." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'eyJhbGciOiJSUzI1NiIsImtpZCI6ImJmYmUzZTVjMDQ3MDQ0NDU3NjU0ODExMzkyOGQ1ZjFlNGUzZjJlZWIiLCJrdHkiOiJSUyIsInNpZ1QiOiIyMDIwLTEwLTIzVDA0OjU0OjU2LjA0OCswMDowMCIsInNyQ21zIjpbeyJjb21tSWQiOnsiZGVzYyI6IlZlcmlmaWNhdGlvbiBTaWduYXR1cmUiLCJpZCI6InVybjpvaWQ6MS4yLjg0MC4xMDA2NS4xLjEyLjEuNSJ9LCJjb21tUXVhbHMiOlsiVmVyaWZpY2F0aW9uIG9mIG1lZGljYWwgcmVjb3JkIGludGVncml0eSJdfV0sInR5cCI6IkpXVCIsIng1YyI6WyJNSUlGVnpDQ0E3K2dBd0lCQWdJVUJuNDNGNE8xMTB6Vk5IUFV0Qm5uWGYzM0ZRd3dEUVlKS29aSWh2Y05BUUVMQlFBd2daVXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SSXdFQVlEVlFRSERBbFRZWFZ6WVd4cGRHOHhIVEFiQmdOVkJBb01GRVY0WVcxd2JHVWdUM0puWVc1cGVtRjBhVzl1TVJrd0Z3WURWUVFEREJCS2IyaHVJRWhoYm1Odlkyc3NJRTFFTVNNd0lRWUpLb1pJaHZjTkFRa0JGaFJxYUdGdVkyOWphMEJsZUdGdGNHeGxMbTl5WnpBZUZ3MHlOVEEyTWpVeU16RXlNemxhRncweU56QTJNVFV5TXpFeU16bGFNSUdWTVFzd0NRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNBd0tRMkZzYVdadmNtNXBZVEVTTUJBR0ExVUVCd3dKVTJGMWMyRnNhWFJ2TVIwd0d3WURWUVFLREJSRmVHRnRjR3hsSUU5eVoyRnVhWHBoZEdsdmJqRVpNQmNHQTFVRUF3d1FTbTlvYmlCSVlXNWpiMk5yTENCTlJERWpNQ0VHQ1NxR1NJYjNEUUVKQVJZVWFtaGhibU52WTJ0QVpYaGhiWEJzWlM1dmNtY3dnZ0dpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCandBd2dnR0tBb0lCZ1FDY1htdlg2MEdBNUcrRGw0aVJuOVRTL3dURjFGVEg5Um1yUDI5RzZYU091VkRFZ0dad1VUSkkvT2tSTFBqK0pVS3kva01ZM1ltNDFrM0pScjhOcko3VWNqZjNUZTJZMHptUk1mR0tPMlg3cDAxSWQ4ckdobmJzVGtXanN6Y2NraktPVGs3RTRIWE83WFFtVnZSWmFQcmpuVlZzejZhSVVtbVV5QmVtVXhzUFF4cWtkNzd6UktlMUorZk1icGJTbmFGMlM1SDlJNUlwUXUzZXJTak53dW51bUpBLzVzTkFTTVVmK1pySzVodHdQZmxvbmxWQTlIRVBvNk41dEpzQ01FWTVxa1pBWEQ1NVBVYmY4SXhyZDMrdDFpWE5BZ01kWFBwOU5qZm1remFIT3NSNUVMNzhvVmZ0S0g4WE1nczlMK1hYaGNtcCtTdVNiVVQrbGFRRm5LWlo2NjFFQjhVVlFHUGhzSGN1WXo3TS8rR0Q3bGttbjV3N2c2aXpZMDVEczF0ZHRoM2hCK0UxZTBWOGFsMCtIWXhYdG1MMjhPYnJ1clp0NVZPVDYzNmFCV2VhazNtMWx0K0pMaVRXd2NJWHVyaUp3WENRN1cyT2hJcmxlQm50NVlSZEYvVndrQWY1QnA0MERLcllTdkJUL3gzUGFyYmNBczVydWE0TWl6dHp3ek1DQXdFQUFhT0JuRENCbVRBSkJnTlZIUk1FQWpBQU1Bc0dBMVVkRHdRRUF3SUY0REJnQmdOVkhSRUVXVEJYZ2c5M2QzY3VaWGhoYlhCc1pTNXZjbWVnR1FZSllJWklBWWI1V3dRR29Bd01Dams1TkRFek16a3hNRENHS1doMGRIQnpPaTh2WlhoaGJYQnNaUzV2Y21jdlptaHBjaTlRY21GamRHbDBhVzl1WlhJdk1USXpNQjBHQTFVZERnUVdCQlMvdmo1Y0JIQkVSWFpVZ1JPU2pWOGVUajh1NnpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVlFQWZHaDBmdjc2Qk15UnBpbi82bTJObk9Bd1lOK1dZTlc0WndRS1BvaCtpQkZqZ2IvZ1haL3gzZG5HcTJSVW5SSEx5YmN2cU93Qzh0NCtMMlFhZW50ei96U0xmQklpSFArdnRhdVZvNFlpclVLSUZPNU5rRGJQUndFWDZacG90d1JFMnAzWVBPcW1MalVwdXFlektSZnV6ZmZFU0lHQ1dmNmJBWm9IOG92eXprcFVPeFQybGNKTDJZUWd4YUVFKy9NT0VEeGJ5L0c1dE5sSFdVMXJtMjlEWkQ2aVRuOEZITU9iNERBZUxzN2RlVUJLZUF4bUNOMXcwN0liSGZUWCs4eG96Qms4bTRyUWFSSTJGYWNHY04vUzRPa2lpamxoa1luRGRiYjZab0lCOTlBTUcvMHRNZ1dnaDU1RkNMOXcyeXViRkRzUisxeVpXNXc2eHZWdWJGb3EycktJWU42QlRNVDM0OU4rS1lGUlRiK3BYMDRRRkZDcVgxT3l1UUVKakpwWmF1TElWU21VYVZ6RFdkYVJtdDBya0xENlI4NXRoWUpwTnhNcjRvQXJzeTVpbDVMMEpWTUVYRzExQ2hFeFJDSjdYc2hrdExqaitBOGxkVVJyTEhSV1hvdHg2bU5WcDMrTW9pQ2h4N1Bmbkd2Q1BhUHZrTFFxaWU4ZDhyazBlak4zIl19.eyJlbnRyeSI6W3siZnVsbFVybCI6InVybjp1dWlkOjE3YTgwYThkLTRjZjEtNGRlYi1hMWZkLTJkYjExMzBlNWY3NiIsInJlc291cmNlIjp7ImF0dGVzdGVyIjpbeyJtb2RlIjoibGVnYWwiLCJwYXJ0eSI6eyJkaXNwbGF5IjoiRXhhbXBsZSBQcmFjdGl0aW9uZXIiLCJyZWZlcmVuY2UiOiJ1cm46dXVpZDowODIwYzE2ZC05MWRlLTRkZmEtYTNhNi1mMTQwYTUxNmE5YmMifSwidGltZSI6IjIwMjEtMTAtMjVUMjA6MTY6MjktMDc6MDAifV0sImF1dGhvciI6W3siZGlzcGxheSI6IkV4YW1wbGUgUHJhY3RpdGlvbmVyIiwicmVmZXJlbmNlIjoidXJuOnV1aWQ6MDgyMGMxNmQtOTFkZS00ZGZhLWEzYTYtZjE0MGE1MTZhOWJjIn1dLCJkYXRlIjoiMjAyMS0xMC0yNVQyMDoxNjoyOS0wNzowMCIsImVuY291bnRlciI6eyJkaXNwbGF5IjoiRXhhbXBsZSBFbmNvdW50ZXIiLCJyZWZlcmVuY2UiOiJ1cm46dXVpZDo1Y2U1YzgzYS0wMDBmLTQ3ZDItOTQxYy0wMzkzNThjYzkxMTIifSwiaWQiOiIxN2E4MGE4ZC00Y2YxLTRkZWItYTFmZC0yZGIxMTMwZTVmNzYiLCJyZXNvdXJjZVR5cGUiOiJDb21wb3NpdGlvbiIsInNlY3Rpb24iOlt7ImVudHJ5IjpbeyJyZWZlcmVuY2UiOiJ1cm46dXVpZDowMTRhNjhlYy1kNjkxLTQ5ZTAtYjk4MC05MWIwZDkyNGU1NzAifV0sInRpdGxlIjoiQWN0aXZlIENvbmRpdGlvbiAxIn1dLCJzdGF0dXMiOiJmaW5hbCIsInN1YmplY3QiOnsiZGlzcGxheSI6IkV4YW1wbGUgUGF0aWVudCIsInJlZmVyZW5jZSI6InVybjp1dWlkOjk3MGFmNmM5LTViYmQtNDA2Ny1iNmMxLWQ5YjJjODIzYWVjZSJ9LCJ0ZXh0Ijp7ImRpdiI6IjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI-PGEgbmFtZT1cIkNvbXBvc2l0aW9uXzE3YTgwYThkLTRjZjEtNGRlYi1hMWZkLTJkYjExMzBlNWY3NlwiPiA8L2E-PGgzPk1lZGljYWwgUmVjb3JkcyBEb2N1bWVudDwvaDM-PHA-VGhpcyBkb2N1bWVudCwgdGl0bGVkIFwiQWN0aXZlIENvbmRpdGlvbnMsXCIgd2FzIGNyZWF0ZWQgb24gT2N0b2JlciAyNSwgMjAyMSwgYnkgRHIuIEpvaG4gSGFuY29jaywgd2hvIGFsc28gbGVnYWxseSBhdHRlc3RlZCB0byBpdHMgYWNjdXJhY3kgb24gdGhlIHNhbWUgZGF0ZS4gSXQgc3VtbWFyaXplcyB0aGUgYWN0aXZlIG1lZGljYWwgY29uZGl0aW9ucyBmb3IgYSBwYXRpZW50IGJhc2VkIG9uIGFuIGVtZXJnZW5jeSBlbmNvdW50ZXIgb24gT2N0b2JlciAyNSwgMjAyMS4gVGhlIGRvY3VtZW50IGluY2x1ZGVzIG9uZSBzZWN0aW9uIGRldGFpbGluZyBhbiBhY3RpdmUgY29uZGl0aW9uOiBUeXBlIDIgRGlhYmV0ZXMgTWVsbGl0dXMuPC9wPjwvZGl2PiIsInN0YXR1cyI6ImdlbmVyYXRlZCJ9LCJ0aXRsZSI6IkFjdGl2ZSBDb25kaXRpb25zIiwidHlwZSI6eyJjb2RpbmciOlt7ImNvZGUiOiIxMTUwMy0wIiwic3lzdGVtIjoiaHR0cDovL2xvaW5jLm9yZyJ9XSwidGV4dCI6Ik1lZGljYWwgcmVjb3JkcyJ9fX0seyJmdWxsVXJsIjoidXJuOnV1aWQ6MDgyMGMxNmQtOTFkZS00ZGZhLWEzYTYtZjE0MGE1MTZhOWJjIiwicmVzb3VyY2UiOnsiaWQiOiIwODIwYzE2ZC05MWRlLTRkZmEtYTNhNi1mMTQwYTUxNmE5YmMiLCJpZGVudGlmaWVyIjpbeyJzeXN0ZW0iOiJodHRwOi8vaGw3Lm9yZy9maGlyL3NpZC91cy1ucGkiLCJ2YWx1ZSI6Ijk5NDEzMzkxMDAifV0sIm1ldGEiOnsibGFzdFVwZGF0ZWQiOiIyMDEzLTA1LTA1VDE2OjEzOjAzWiJ9LCJuYW1lIjpbeyJmYW1pbHkiOiJIYW5jb2NrIiwiZ2l2ZW4iOlsiSm9obiJdfV0sInJlc291cmNlVHlwZSI6IlByYWN0aXRpb25lciIsInRleHQiOnsiZGl2IjoiPGRpdiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj48YSBuYW1lPVwiUHJhY3RpdGlvbmVyXzA4MjBjMTZkLTkxZGUtNGRmYS1hM2E2LWYxNDBhNTE2YTliY1wiPiA8L2E-PGgzPlByYWN0aXRpb25lciBJbmZvcm1hdGlvbjwvaDM-PHA-RHIuIEpvaG4gSGFuY29jayBpcyBhIGhlYWx0aGNhcmUgcHJvdmlkZXIgd2l0aCBOYXRpb25hbCBQcm92aWRlciBJZGVudGlmaWVyIChOUEkpIDk5NDEzMzkxMDAuIEhlIGF1dGhvcmVkIGFuZCBhdHRlc3RlZCB0byB0aGUgbWVkaWNhbCByZWNvcmRzIGRvY3VtZW50LjwvcD48L2Rpdj4iLCJzdGF0dXMiOiJnZW5lcmF0ZWQifX19LHsiZnVsbFVybCI6InVybjp1dWlkOjk3MGFmNmM5LTViYmQtNDA2Ny1iNmMxLWQ5YjJjODIzYWVjZSIsInJlc291cmNlIjp7ImFjdGl2ZSI6dHJ1ZSwiZ2VuZGVyIjoibWFsZSIsImlkIjoiOTcwYWY2YzktNWJiZC00MDY3LWI2YzEtZDliMmM4MjNhZWNlIiwiaWRlbnRpZmllciI6W3sic3lzdGVtIjoiaHR0cDovL2V4YW1wbGUub3JnL2NkZXgvcGF5ZXIvbWVtYmVyLWlkcyIsInR5cGUiOnsiY29kaW5nIjpbeyJjb2RlIjoiTUIiLCJzeXN0ZW0iOiJodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL3YyLTAyMDMifV19LCJ2YWx1ZSI6Ik1lbWJlcjEyMyJ9XSwibmFtZSI6W3siZmFtaWx5IjoiUGF0aWVudCIsImdpdmVuIjpbIkNERVggRXhhbXBsZSJdLCJ0ZXh0IjoiQ0RFWCBFeGFtcGxlIFBhdGllbnQifV0sInJlc291cmNlVHlwZSI6IlBhdGllbnQiLCJ0ZXh0Ijp7ImRpdiI6IjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI-PGEgbmFtZT1cIlBhdGllbnRfOTcwYWY2YzktNWJiZC00MDY3LWI2YzEtZDliMmM4MjNhZWNlXCI-IDwvYT48aDM-UGF0aWVudCBJbmZvcm1hdGlvbjwvaDM-PHA-Q0RFWCBFeGFtcGxlIFBhdGllbnQsIGEgbWFsZSwgaXMgaWRlbnRpZmllZCBieSBtZW1iZXIgSUQgTWVtYmVyMTIzIGluIHRoZSBwYXllciBzeXN0ZW0gaHR0cDovL2V4YW1wbGUub3JnL2NkZXgvcGF5ZXIvbWVtYmVyLWlkcy4gSGUgaXMgdGhlIHN1YmplY3Qgb2YgdGhpcyBtZWRpY2FsIHJlY29yZHMgZG9jdW1lbnQuIFRoZSBwYXRpZW50IHNhaWQsIFwiSSBmZWVsIGdyZWF0IVwiPC9wPjwvZGl2PiIsInN0YXR1cyI6ImdlbmVyYXRlZCJ9fX0seyJmdWxsVXJsIjoidXJuOnV1aWQ6MDE0YTY4ZWMtZDY5MS00OWUwLWI5ODAtOTFiMGQ5MjRlNTcwIiwicmVzb3VyY2UiOnsiYXNzZXJ0ZXIiOnsicmVmZXJlbmNlIjoidXJuOnV1aWQ6MDgyMGMxNmQtOTFkZS00ZGZhLWEzYTYtZjE0MGE1MTZhOWJjIn0sImNhdGVnb3J5IjpbeyJjb2RpbmciOlt7ImNvZGUiOiJwcm9ibGVtLWxpc3QtaXRlbSIsImRpc3BsYXkiOiJQcm9ibGVtIExpc3QgSXRlbSIsInN5c3RlbSI6Imh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vY29uZGl0aW9uLWNhdGVnb3J5In1dLCJ0ZXh0IjoiUHJvYmxlbSBMaXN0IEl0ZW0ifV0sImNsaW5pY2FsU3RhdHVzIjp7ImNvZGluZyI6W3siY29kZSI6ImFjdGl2ZSIsInN5c3RlbSI6Imh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vY29uZGl0aW9uLWNsaW5pY2FsIn1dfSwiY29kZSI6eyJjb2RpbmciOlt7ImNvZGUiOiI0NDA1NDAwNiIsImRpc3BsYXkiOiJUeXBlIDIgRGlhYmV0ZXMgTWVsbGl0dXMiLCJzeXN0ZW0iOiJodHRwOi8vc25vbWVkLmluZm8vc2N0In1dfSwiaWQiOiIwMTRhNjhlYy1kNjkxLTQ5ZTAtYjk4MC05MWIwZDkyNGU1NzAiLCJpZGVudGlmaWVyIjpbeyJzeXN0ZW0iOiJ1cm46b2lkOjEuMy42LjEuNC4xLjIyODEyLjQuMTExLjAuNC4xLjIuMSIsInZhbHVlIjoiMSJ9XSwib25zZXREYXRlVGltZSI6IjIwMDYiLCJyZXNvdXJjZVR5cGUiOiJDb25kaXRpb24iLCJzdWJqZWN0Ijp7InJlZmVyZW5jZSI6InVybjp1dWlkOjk3MGFmNmM5LTViYmQtNDA2Ny1iNmMxLWQ5YjJjODIzYWVjZSJ9LCJ0ZXh0Ijp7ImRpdiI6IjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI-PGEgbmFtZT1cIkNvbmRpdGlvbl8wMTRhNjhlYy1kNjkxLTQ5ZTAtYjk4MC05MWIwZDkyNGU1NzBcIj4gPC9hPjxoMz5BY3RpdmUgQ29uZGl0aW9uPC9oMz48cD5UaGUgcGF0aWVudCBoYXMgYW4gYWN0aXZlIGRpYWdub3NpcyBvZiBUeXBlIDIgRGlhYmV0ZXMgTWVsbGl0dXMgKFNOT01FRCBDVDogNDQwNTQwMDYpLCBmaXJzdCBpZGVudGlmaWVkIGluIDIwMDYuIFRoaXMgY29uZGl0aW9uIHdhcyBkb2N1bWVudGVkIGJ5IERyLiBKb2huIEhhbmNvY2sgYW5kIGlzIGxpc3RlZCBhcyBhIHByb2JsZW0gb24gdGhlIHBhdGllbnTigJlzIHByb2JsZW0gbGlzdC48L3A-PC9kaXY-Iiwic3RhdHVzIjoiZ2VuZXJhdGVkIn19fSx7ImZ1bGxVcmwiOiJ1cm46dXVpZDo1Y2U1YzgzYS0wMDBmLTQ3ZDItOTQxYy0wMzkzNThjYzkxMTIiLCJyZXNvdXJjZSI6eyJjbGFzcyI6eyJjb2RlIjoiRU1FUiIsInN5c3RlbSI6Imh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vdjMtQWN0Q29kZSJ9LCJpZCI6IjVjZTVjODNhLTAwMGYtNDdkMi05NDFjLTAzOTM1OGNjOTExMiIsInBhcnRpY2lwYW50IjpbeyJpbmRpdmlkdWFsIjp7ImRpc3BsYXkiOiJKb2huIEhhbmNvY2siLCJyZWZlcmVuY2UiOiJ1cm46dXVpZDowODIwYzE2ZC05MWRlLTRkZmEtYTNhNi1mMTQwYTUxNmE5YmMifX1dLCJwZXJpb2QiOnsiZW5kIjoiMjAyMS0xMC0yNVQyMDoxNjoyOS0wNzowMCIsInN0YXJ0IjoiMjAyMS0xMC0yNVQyMDoxMDoyOS0wNzowMCJ9LCJyZXNvdXJjZVR5cGUiOiJFbmNvdW50ZXIiLCJzZXJ2aWNlUHJvdmlkZXIiOnsiZGlzcGxheSI6IkNERVggRXhhbXBsZSBPcmdhbml6YXRpb24iLCJyZWZlcmVuY2UiOiJ1cm46dXVpZDplMzdmMDA0Yi1kYzEwLTQyMmItYjgzMy1jZGFhMTBhMDU1YTMifSwic3RhdHVzIjoiZmluaXNoZWQiLCJzdWJqZWN0Ijp7ImRpc3BsYXkiOiJDREVYIEV4YW1wbGUgUGF0aWVudCIsInJlZmVyZW5jZSI6InVybjp1dWlkOjk3MGFmNmM5LTViYmQtNDA2Ny1iNmMxLWQ5YjJjODIzYWVjZSJ9LCJ0ZXh0Ijp7ImRpdiI6IjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI-PGEgbmFtZT1cIkVuY291bnRlcl81Y2U1YzgzYS0wMDBmLTQ3ZDItOTQxYy0wMzkzNThjYzkxMTJcIj4gPC9hPjxoMz5FbmNvdW50ZXIgRGV0YWlsczwvaDM-PHA-QW4gZW1lcmdlbmN5IGVuY291bnRlciBvY2N1cnJlZCBvbiBPY3RvYmVyIDI1LCAyMDIxLCBmcm9tIDg6MTAgUE0gdG8gODoxNiBQTSwgaW52b2x2aW5nIENERVggRXhhbXBsZSBQYXRpZW50IGFuZCBhdHRlbmRlZCBieSBEci4gSm9obiBIYW5jb2NrIGF0IENERVggRXhhbXBsZSBPcmdhbml6YXRpb24uIFRoZSBlbmNvdW50ZXIgdHlwZSBpcyB1bnNwZWNpZmllZCAoU05PTUVEIENUOiAyNjE2NjUwMDYpLjwvcD48L2Rpdj4iLCJzdGF0dXMiOiJnZW5lcmF0ZWQifSwidHlwZSI6W3siY29kaW5nIjpbeyJjb2RlIjoiMjYxNjY1MDA2IiwiZGlzcGxheSI6IlVua25vd24gKHF1YWxpZmllciB2YWx1ZSkiLCJzeXN0ZW0iOiJodHRwOi8vc25vbWVkLmluZm8vc2N0In1dLCJ0ZXh0IjoiVW5rbm93biAocXVhbGlmaWVyIHZhbHVlKSJ9XX19LHsiZnVsbFVybCI6InVybjp1dWlkOmUzN2YwMDRiLWRjMTAtNDIyYi1iODMzLWNkYWExMGEwNTVhMyIsInJlc291cmNlIjp7ImFjdGl2ZSI6dHJ1ZSwiYWRkcmVzcyI6W3siY2l0eSI6IkJvc3RvbiIsImNvdW50cnkiOiJVU0EiLCJsaW5lIjpbIjEgQ0RFWCBMYW5lIl0sInBvc3RhbENvZGUiOiIwMTAwMiIsInN0YXRlIjoiTUEifV0sImlkIjoiZTM3ZjAwNGItZGMxMC00MjJiLWI4MzMtY2RhYTEwYTA1NWEzIiwiaWRlbnRpZmllciI6W3sic3lzdGVtIjoiaHR0cDovL2hsNy5vcmcvZmhpci9zaWQvdXMtbnBpIiwidmFsdWUiOiIxMjM0NTY3ODkzIn1dLCJuYW1lIjoiQ0RFWCBFeGFtcGxlIE9yZ2FuaXphdGlvbiIsInJlc291cmNlVHlwZSI6Ik9yZ2FuaXphdGlvbiIsInRlbGVjb20iOlt7InN5c3RlbSI6InBob25lIiwidmFsdWUiOiIoKzEpIDU1NS01NTUtNTU1NSJ9LHsic3lzdGVtIjoiZW1haWwiLCJ2YWx1ZSI6ImN1c3RvbWVyLXNlcnZpY2VAZXhhbXBsZS5vcmcifV0sInRleHQiOnsiZGl2IjoiPGRpdiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj48YSBuYW1lPVwiT3JnYW5pemF0aW9uX2UzN2YwMDRiLWRjMTAtNDIyYi1iODMzLWNkYWExMGEwNTVhM1wiPiA8L2E-PGgzPk9yZ2FuaXphdGlvbiBJbmZvcm1hdGlvbjwvaDM-PHA-Q0RFWCBFeGFtcGxlIE9yZ2FuaXphdGlvbiwgbG9jYXRlZCBhdCAxIENERVggTGFuZSwgQm9zdG9uLCBNQSAwMTAwMiwgVVNBLCBpcyB0aGUgc2VydmljZSBwcm92aWRlciBmb3IgdGhlIGRvY3VtZW50ZWQgZW5jb3VudGVyLiBDb250YWN0IGRldGFpbHMgaW5jbHVkZSBwaG9uZTogKCsxKSA1NTUtNTU1LTU1NTUgYW5kIGVtYWlsOiBjdXN0b21lci1zZXJ2aWNlQGV4YW1wbGUub3JnLiBUaGUgb3JnYW5pemF0aW9uJ3MgTlBJIGlzIDEyMzQ1Njc4OTMuPC9wPjwvZGl2PiIsInN0YXR1cyI6ImdlbmVyYXRlZCJ9fX1dLCJpZGVudGlmaWVyIjp7InN5c3RlbSI6InVybjppZXRmOnJmYzozOTg2IiwidmFsdWUiOiJ1cm46dXVpZDpjMTczNTM1ZS0xMzVlLTQ4ZTMtYWI2NC0zOGJhY2M2OGRiYTgifSwicmVzb3VyY2VUeXBlIjoiQnVuZGxlIiwidGltZXN0YW1wIjoiMjAyMS0xMC0yNVQyMDoxNjoyOS0wNzowMCIsInR5cGUiOiJkb2N1bWVudCJ9.ISbUCryOohB0wSthIgNVHRiSS-Pfr8uvtJooZswRBQ4GttVN-hmwsEJA3LqQ96gw6DVpp_bClS-2x0Yedoz2bOmvDFK6gkzHLuo7-rUlx_GGYaBMCnjZ2MfzYffKGusxdj4pXC2eDr2xt2bSIdn0GrgFrq3mbtSWvkoM7QqQ9s6YA6gHB6ERcr5iDH-xHHem2w3FEckYJQ80bUXqyYZu-LlaXZyn5muEm61UqxaB27ExIdxfIRtHlgO1HwVWPaVTkMa760Msp6ls07nCAJVuk8VzVABmh73qWgrDp-TuNC5bbK1RctW3WV9vmyQ80_8go18ON62YocKxaVEl1C1stb6uohPOdmNBAHqc2m3azRQqUOkvKtPyyWxeBChITz-hj6jBM-DD5YXDEtUIwmNL5gepuI7sdVMzfm_dxf723v8lHEN02wRWIHwRWHZAb2wizjlaVIHJmQbyaurB-AUGooGM3aFh-XVBKHUH1XpfWpFk_Kka2a5VL4nWkXoUmq2G'" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "recd_jws" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "...fetching payload from /Users/ehaas/Documents/FHIR/davinci-ecdx/output/Parameters-cdex-parameters-example2.json ....\n", "\n", "# # ### \n", "# # ###### ##### # ###### # ###### ##### ### \n", "# # # # # # # # # # # ### \n", "# # ##### # # # ##### # ##### # # # \n", " # # # ##### # # # # # # \n", " # # # # # # # # # # # ### \n", " # ###### # # # # # ###### ##### ### \n", " \n" ] } ], "source": [ "!openssl x509 -in recd_cert.der -inform DER -pubkey -noout > recd-public-key.pem\n", "with open('recd-public-key.pem') as f:\n", " pem_public = f.read()\n", "if local_file == False:\n", " print(f'...fetching payload from {url}/{bundle_id} ....')\n", "else:\n", " print(f'...fetching payload from {path} ....')\n", "\n", "print()\n", "try:\n", " verify = jws.verify(recd_jws, pem_public , algorithms=['RS256'])\n", " print('# # ### ')\n", " print('# # ###### ##### # ###### # ###### ##### ### ')\n", " print('# # # # # # # # # # # ### ')\n", " print('# # ##### # # # ##### # ##### # # # ')\n", " print(' # # # ##### # # # # # # ')\n", " print(' # # # # # # # # # # # ### ')\n", " print(' # ###### # # # # # ###### ##### ### ')\n", " print(' ')\n", "\n", "except Exception as e:\n", " print('# # #### ##### # # ###### ##### # ###### # ###### ##### ### # ')\n", " print('## # # # # # # # # # # # # # # # # # ')\n", " print('# # # # # # # # ##### # # # ##### # ##### # # ##### # ')\n", " print('# # # # # # # # # ##### # # # # # # # # ')\n", " print('# ## # # # # # # # # # # # # # # ### # ')\n", " print('# # #### # ## ###### # # # # # ###### ##### # ## ')\n", " print(' ')\n", " print(f\"not verified: {e}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "fhir_builds", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.12" } }, "nbformat": 4, "nbformat_minor": 4 }