Guia de Implementação da SES GO - Segurança
0.0.2 - draft Brazil flag

Guia de Implementação da SES GO - Segurança - Local Development build (v0.0.2) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions

Algoritmo

📌 Algoritmo para atualização da Provenance

Entrada

  1. Uma instância de Bundle contendo:
    • n entradas correspondentes às instâncias assinadas (informação em saúde assinada).
    • Uma entrada contendo a instância de Provenance associada, que:
      • Registra a assinatura digital no elemento Provenance.signature.
      • Referencia as n instâncias assinadas por meio de n entradas correspondentes em Provenance.target.
      • Cada referência em Provenance.target usa o UUID da instância referenciada no formato urn:uuid:[uuid], o mesmo valor empregado pela entrada fullUrl do Bundle para a instância em questão.
      • O elemento Provenance.entity está vazio na entrada e será preenchido durante o processamento para armazenar o mapeamento entre os UUIDs empregados no Bundle e os novos identificadores gerados pelo repositório local.
  2. Um repositório local, possivelmente um servidor FHIR, onde:
    • As instâncias assinadas extraídas do Bundle serão armazenadas e receberão novos identificadores internos.
    • A instância de Provenance também será armazenada, mas com seu elemento Provenance.entity atualizado para conter o mapeamento entre os UUIDs utilizados no Bundle e os novos identificadores gerados pelo repositório local, a partir dos quais essas instâncias poderão ser recuperadas.

Exemplo de entrada

{
    "resourceType": "Bundle",
    "type": "collection",
    "entry": [
        {
            "fullUrl": "urn:uuid:550e8400-e29b-41d4-a716-446655440003",
            "resource": {
                "resourceType": "Patient",
                "name": [
                    {
                        "text": "João Silva"
                    }
                ]
            }
        },
        {
            "fullUrl": "urn:uuid:123e4567-e89b-12d3-a456-426614174000",
            "resource": {
                "resourceType": "Observation",
                "status": "final",
                "code": {
                    "text": "Pressão Arterial"
                },
                "subject": {
                    "reference": "urn:uuid:550e8400-e29b-41d4-a716-446655440003"
                }
            }
        },
        {
            "fullUrl": "urn:uuid:abcdef12-3456-7890-abcd-ef1234567890",
            "resource": {
                "resourceType": "Provenance",
                "recorded": "2025-01-20T12:30:45-03:00",
                "agent": [
                    {
                        "who": {
                            "display": "Dr. José da Silva"
                        }
                    }
                ],
                "target": [
                    {
                        "reference": "urn:uuid:550e8400-e29b-41d4-a716-446655440003"
                    },
                    {
                        "reference": "urn:uuid:123e4567-e89b-12d3-a456-426614174000"
                    }
                ],
                "signature": [
                    {
                        "who": {
                            "display": "Dr. José da Silva"
                        },
                        "data": "YXNzaW5hdHVyYQ=="
                    }
                ]
            }
        }
    ]
}

Provenance (detalhes)

  • Provenance.signature:
    • Contém a assinatura digital do conjunto de instâncias assinadas.
    • A assinatura é definida em conformidade com as orientações gerais do padrão FHIR para assinaturas digitais.
    • Faz uso de JWS (JSON Web Signature), um formato padronizado para assinaturas digitais baseado em JSON, garantindo a integridade e autenticidade dos dados assinados.
    • Os detalhes acerca de como produzir a assinatura são fornecidos em documento próprio.
  • Provenance.target:
    • Contém n entradas, cada uma referenciando uma instância assinada.
    • Cada referência usa o UUID da instância no formato urn:uuid:[uuid], garantindo que a Provenance aponte corretamente para os recursos dentro do Bundle.
  • Provenance.entity:
    • Está vazio na entrada e será preenchido durante o processamento.
    • Após a extração e armazenamento das instâncias no repositório local, Provenance.entity será atualizado para conter o mapeamento entre os UUIDs do Bundle e os novos identificadores gerados pelo repositório local.

Saída do algoritmo

Instância de Provenance atualizada

{
    "resourceType": "Provenance",
    "recorded": "2025-01-20T12:30:45-03:00",
    "agent": [
        {
            "who": {
                "display": "Dr. José da Silva"
            }
        }
    ],
    "target": [
        {
            "reference": "urn:uuid:550e8400-e29b-41d4-a716-446655440003"
        },
        {
            "reference": "urn:uuid:123e4567-e89b-12d3-a456-426614174000"
        }
    ],
    "entity": [
        {
            "role": "derivation",
            "what": {
                "reference": "urn:uuid:550e8400-e29b-41d4-a716-446655440003"
            }
        },
        {
            "role": "derivation",
            "what": {
                "reference": "urn:uuid:123e4567-e89b-12d3-a456-426614174000"
            }
        }
    ],
    "signature": [
        {
            "who": {
                "display": "Dr. José da Silva"
            },
            "data": "YXNzaW5hdHVyYQ=="
        }
    ]
}

Algoritmo para conversão da entrada na saída

Inicialização

  1. Receber o Bundle de entrada, contendo:
    • As instâncias assinadas.
    • A instância de Provenance associada.
  2. Criar uma estrutura de mapeamento vazia para armazenar a relação entre:
    • O UUID original (Provenance.target[x].reference).
    • O novo identificador gerado pelo repositório local.

Extração e armazenamento das instâncias

  1. Para cada entrada em Provenance.target[x]:
    • Obter o identificador original (target[x].reference).
    • Localizar a instância correspondente no Bundle (procurando por fullUrl == target[x].reference).
    • Armazenar a instância no repositório local, onde um novo identificador será gerado.
    • Registrar o mapeamento entre Provenance.target[x].reference (UUID original) e o novo identificador gerado.

Atualização das referências nas instâncias e na Provenance

  1. Atualizar as referências apenas nas instâncias referenciadas por Provenance.target[x]:
    • Para cada UUID original presente em Provenance.target[x].reference:
      • Obter a instância correspondente no Bundle.
      • Percorrer os campos da instância que contêm referências (.reference).
      • Se a referência corresponder a um UUID original presente no mapeamento, substituí-la pelo novo identificador gerado.
  2. Criar uma cópia da instância de Provenance para atualização.

  3. Atualizar as referências dentro da Provenance:
    • Para cada entrada em Provenance.target[x]:
      • Substituir Provenance.target[x].reference pelo novo identificador correspondente.
    • Para cada entrada em Provenance.entity[x]:
      • Substituir Provenance.entity[x].what.reference pelo novo identificador correspondente.
      • Definir Provenance.entity[x].role como derivation, indicando que a instância foi derivada da original.

Validação e saída

  1. Verificar se todas as referências foram atualizadas corretamente.
  2. Retornar a instância de Provenance atualizada com os novos identificadores locais.