Project: certificate-usage · Branch: FHIR-1996_track-ecc-rsa-certificate-usage · Mode: ` · **Model:**claude-haiku-4-5-20251001`
Stats: 1 user messages, 29 tool calls, tools used: Glob, Grep, Read.
Conversation
Turn 1 — User
Search the DDV codebase to find all places where certificates are inserted, loaded, or configured. Focus on:
-
Certificate/Keystore Loading: - Search for patterns: "loadKeyPair", "X509Certificate", "readKeyStoreFromFile", "decryptKeyStore" - PKCS12 file handling (.p12, .pfx files) - Certificate import/upload functionality
-
TLS/HTTPS Configuration: - Client certificate configuration - Server certificate handling - Certificate verification settings
-
Module-specific Certificate Usage: - Beyond kbv-ti-connect, check:
- gematik-crypto module
- gematik-kim (KIM mail encryption)
- Any LDAP client configurations
- Any other German healthcare integrations
-
User-facing Certificate Actions: - UI components for certificate selection - Settings/preferences for certificates - File pickers for certificate files
Search broadly across the codebase. Provide: - File paths where certificates are inserted/loaded - Context about what type of certificate operation is happening - Whether it's similar to the TI Connect keystore decryption we just worked on
Thoroughness level: medium
Turn 1 — Assistant
I'll conduct a comprehensive search across the DDV codebase to find all places where certificates are inserted, loaded, or configured. Let me search systematically across all the key patterns you mentioned.
Tools used:
Glob:**/*.{ts,tsx,js,jsx}in/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage
Tools used:
Grep:loadKeyPair|X509Certificate|readKeyStoreFromFile|decryptKeyStorein/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage
Tools used:
Grep:\.(p12|pfx)in/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage
Tool results:
→ result (ok): Found 28 files src/modules/kbv-ti-connect/main/tests/ti-connect.test.ts src/modules/kbv-ti-connect/main/ti-connect.ts src/modules/gematik-crypto/services/crypto-adapter/adapter.ts src/modules/kbv-ti-connect/services/server-certificate-helpers.ts src/modules/kbv-ti-connect/services/index.ts src/modules/kbv-ti-connect/services/keyStore.ts src/modules/kbv-ti-connect/services/connector-wsdls/ext/xmldsig-core-schema.xsd src/modules/kbv-ti-connect/services/connector-wsdls/ext/oasis-dssx-1.0-profil …(truncated, 1426 more chars)
Tools used:
Grep:certificate|Certificatein/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage
Tool results:
→ result (ok): Found 6 files src/modules/kbv-ti-connect/main/tests/ti-connect.test.ts src/modules/gematik-crypto/services/docto-crypt/ldap/ldapClient.ts src/modules/kbv-ti-connect/services/keyStore.ts src/modules/gematik-crypto/services/node/ldap/ldapClient.ts .github/actions/ddv_package/action.yml .claude/skills/security-auditing-electron-security/reference/electron-config-patterns.md
Tool results:
→ result (ok): Found 222 files src/modules/kbv-ti-connect/main/tests/ti-connect.test.ts src/modules/kbv-ti-connect/main/ti-connect.ts src/modules/gematik-crypto/services/crypto-adapter/adapter.ts src/modules/gematik-kim/services/client/ldap.ts src/modules/gematik-crypto/main/tests/tracking.test.ts src/modules/gematik-crypto/services/docto-crypt/ldap/ldapClient.ts tools/skope/docs/development.md tests/docto-e2e/electron/index.ts src/shared/locales/en_tmp.json src/shared/locales/en.json src/shared/locale …(truncated, 13390 more chars)
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/.github/scripts/pr_labeler.js /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/.github/scripts/push_translations.js /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/config/builder/afterSign.ts /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/config/builder/build.ts /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/config/builder/s …(truncated, 11583 more chars)
Now let me search for more specific patterns related to TLS, LDAP, KIM, and other certificate operations:
Tools used:
Grep:clientCert|Client.*Certificate|tls\.cert|cert\.pfx|cert\.p12in/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage
Tools used:
Grep:LDAP|ldapin/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage
Tool results:
→ result (ok): Found 17 files src/modules/gematik-kim/services/client/ldap.ts src/modules/kbv-ti-connect/services/soap-client-helpers.ts src/modules/kbv-ti-connect/services/ti-connect-helper.ts src/modules/kbv-ti-connect/services/service-directory-service/index.ts src/modules/kbv-ti-connect/services/event-service/tests/event-service.test.ts src/modules/kbv-ti-connect/services/certificate-service/soap-client.ts src/modules/kbv-ti-connect/services/certificate-service/tests/soap-client.test.ts src/modules …(truncated, 601 more chars)
Tools used:
Grep:KIM|kimin/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage
Tool results:
→ result (ok): Found 40 files src/modules/gematik-crypto/index.ts src/modules/gematik-kim/services/client/ldap.ts src/modules/gematik-crypto/services/docto-crypt/ldap/ldapClient.ts package.json package-lock.json src/shared/locales/en_tmp.json src/modules/gematik-ti-environment/services/mapper.ts src/modules/gematik-ti-environment/services/tests/mapper.test.ts src/modules/gematik-kim/services/vzd-debug-query-service.ts src/modules/gematik-kim/services/constants.ts src/modules/gematik-kim/services/index.ts s …(truncated, 1611 more chars)
Tool results:
→ result (ok): Found 88 files src/modules/gematik-kim/services/client/ldap.ts package-lock.json tools/skope/package-lock.json tests/vitest/vitestSetup.ts tests/vitest/projects.ts src/shared/types/store.ts src/shared/types/loggers.ts src/shared/types/preferences.ts src/shared/locales/en_tmp.json src/shared/locales/en.json src/shared/locales/fr.json src/shared/locales/it.json src/shared/locales/de.json src/shared/ehr/de/main/EhrDeGroupModule.ts src/shared/constants/modules.ts src/shared/constants/preloads-module …(truncated, 3736 more chars)
Now let me read the key files to understand the certificate patterns:
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/kbv-ti-connect/services/keyStore.ts
Tool results:
→ result (ok): 1→import { KeystoreFile, Pkcs12 } from '@module/gematik-crypto' 2→ 3→export const readKeyStoreFromFile = async (keyStorePath: string): Promise<string> => { 4→ return await KeystoreFile.read(keyStorePath) 5→} 6→ 7→export const getNewKeyStore = async (oldPath: string): Promise<string> => { 8→ return await KeystoreFile.defineNewPath(oldPath, ['openFile'], [{ extensions: ['p12'], name: '.p12' }]) 9→} 10→ 11→export const decryptKeyStore = async (
…(truncated, 541 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/kbv-ti-connect/services/server-certificate-helpers.ts
Tool results:
→ result (ok): 1→import { PeerCertificate } from 'node:tls' 2→import { X509Certificate } from 'node:crypto' 3→ 4→// import { caCertificate } from '@module/kbv-ti-connect/services/ca-certificate' 5→import apiLogger from '@module/kbv-ti-connect/services/logger' 6→import { TiEnvCertificateProvider } from '@module/gematik-ti-environment' 7→ 8→enum CertificateType { 9→ // Certificate of ID.AK.AUT in the gSMC-K (C.AUK.AUT) 10→ CAukAut = 'C.AUK.AUT', 11→ // Alternati …(truncated, 2666 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/crypto-adapter/pkcs12Adapter.ts
Tool results:
→ result (ok): 1→import forge from '@doctolib/node-forge' 2→ 3→import { DoctoCryptExecutor } from '@module/gematik-crypto/services/docto-crypt' 4→import { Pkcs12 } from '@module/gematik-crypto/services/node/keystore' 5→import { CryptoEngine } from '@module/gematik-crypto/services/crypto-adapter/crypto-engine' 6→ 7→// TODO: Merge these types in a follow up. The problem is that docto-crypt responds with 8→// certificate attribute while kbv-ti-connect package uses cert internall …(truncated, 2706 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/node/keystore/pkcs12.ts
Tool results:
→ result (ok): 1→import forge from '@doctolib/node-forge' 2→ 3→export class Pkcs12 { 4→ // Get certificate "bags" by type (http://oid-info.com/get/1.2.840.113549.1.1.5) 5→ static getBagsByBagType = (pkcs12: forge.pkcs12.Pkcs12Pfx, bagType: string): forge.pkcs12.Bag[] => { 6→ const bags = pkcs12.getBags({ bagType }) 7→ if (!bags) { 8→ throw new Error('No bags of this type') 9→ } 10→ 11→ const bagArr = bags[bagType] 12→ if (!bagArr) {
…(truncated, 4419 more chars)
Now let me explore the LDAP and KIM certificate usage:
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/docto-crypt/ldap/ldapClient.ts
Tool results:
→ result (ok): 1→import { Control, DN, SaslMechanism, SearchOptions, SearchResult } from 'ldapts' 2→ 3→import { LdapTlsOptions } from '@module/gematik-crypto/services/crypto-adapter/types' 4→import { DoctoCryptExecutor } from '@module/gematik-crypto' 5→ 6→export class LdapClient { 7→ private readonly url: string 8→ private readonly tlsOptions: LdapTlsOptions 9→ private readonly verifyPeerCertificate: boolean 10→ 11→ constructor(url: string, tlsOptions: LdapTl …(truncated, 2897 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-kim/services/client/ldap.ts
Tool results:
→ result (ok): 1→import createLogger from '@core/logger/services' 2→import { createLoggerTransport } from '@core/logger/services/logger-transport' 3→ 4→import { LdapClient, SearchOptions } from '@module/gematik-crypto' 5→import { createFingerprintVerifier, getCAs } from '@module/kbv-ti-connect/services/server-certificate-helpers' 6→import { getClientCertificateAndKey } from '@module/kbv-ti-connect/services/ti-connect-helper' 7→ 8→import { errorAsRecord } from 'src/utils/error …(truncated, 6495 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/crypto-adapter/ldapAdapter.ts
Tool results:
→ result (ok): 1→import { Control, DN, SaslMechanism, SearchOptions, SearchResult } from 'ldapts' 2→ 3→import { CryptoEngine } from '@module/gematik-crypto/services/crypto-adapter/crypto-engine' 4→import { DoctoCryptLdapClient } from '@module/gematik-crypto/services/docto-crypt/ldap' 5→import { NodeLdapClient } from '@module/gematik-crypto/services/node/ldap' 6→import { LdapTlsOptions } from '@module/gematik-crypto/services/crypto-adapter/types' 7→ 8→export class LdapAdapter …(truncated, 1399 more chars)
Now let me check the TLS and HTTP client configurations:
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/docto-crypt/tls/TLSService.ts
Tool results:
→ result (ok): 1→import { DoctoCryptExecutor, FetchResponse, TLSRequest } from '@module/gematik-crypto/services/docto-crypt' 2→ 3→export class TLSService { 4→ static async httpsRequest(request: TLSRequest): Promise<FetchResponse> { 5→ const args = [] 6→ if (request.host) { 7→ args.push('--host', request.host) 8→ } 9→ if (request.port) { 10→ args.push('--port', request.port.toString()) 11→ } 12→ if (request.path) { 13→ arg …(truncated, 965 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/docto-crypt/tls/cryptoHttpClient.ts
Tool results:
→ result (ok): 1→import { IExOptions, IHeaders, IHttpClient } from 'soap' 2→import { AxiosPromise, AxiosResponse } from 'axios' 3→ 4→import { TLSService } from '@module/gematik-crypto/services/docto-crypt/tls/TLSService' 5→ 6→const getStatusText = (statusCode: number): string => { 7→ const statusTexts: Record<number, string> = { 8→ 200: 'OK', 9→ 201: 'Created', 10→ 400: 'Bad Request', 11→ 401: 'Unauthorized', 12→ 403: 'Forbidden', 13→ 4 …(truncated, 2717 more chars)
Tools used:
Grep:mssante.*certificate|MSsantein/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage
Tool results:
→ result (ok): Found 1 file src/modules/mssante/main/mssante.ts
Let me check the MSsante and other country-specific implementations:
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/mssante/main/mssante-certificates.ts
Tool results:
→ result (ok): 1→const ACI_EL_PP_CRT = 2→ '-----BEGIN CERTIFICATE-----\n' + 3→ 'MIIHNzCCBR+gAwIBAgISESC4ZWCKiyJt8KBdaonTV3YVMA0GCSqGSIb3DQEBCwUA\n' + 4→ 'MHkxCzAJBgNVBAYTAkZSMRMwEQYDVQQKDApBU0lQLVNBTlRFMRcwFQYDVQQLDA4w\n' + 5→ 'MDAyIDE4NzUxMjc1MTESMBAGA1UECwwJSUdDLVNBTlRFMSgwJgYDVQQDDB9BQyBS\n' + 6→ 'QUNJTkUgSUdDLVNBTlRFIEVMRU1FTlRBSVJFMB4XDTEzMDYyNTAwMDAwMFoXDTMz\n' + 7→ 'MDYyNDAwMDAwMFowfDELMAkGA1UEBhMCRlIxEzARBgNVBAoMCkFTSVAtU0FOVEUx\n' + 8→ 'FzAVBgNVBAsMDjAwMDIgMTg …(truncated, 18653 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-ti-environment/services/tiEnvCertificateProvider.ts
Tool results:
→ result (ok): 1→import { CA_CERTIFICATE, IDP_REF_ROOT_CA } from '../constants/certificates' 2→import { TiEnvCertificateSchema, TiEnvDataSchema, TiEnvValueSet } from '../types/tiEnvStorage' 3→import { getTiEnvironment, getTiEnvValues } from './tiEnv' 4→ 5→type Environment = (typeof TiEnvValueSet)[keyof typeof TiEnvValueSet] 6→ 7→interface CertificateConfig { 8→ getCaCert: (stored: string | undefined) => string 9→ getIdpRoot: (stored: string | undefined) => string 1 …(truncated, 2620 more chars)
Tools used:
Grep:getCertificate|cert\s*:|privateKey\s*:|keystorein/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules
Tool results:
→ result (ok): Found 40 files limit: 40, offset: 0 src/modules/kbv-ti-connect/main/tests/ti-connect.test.ts src/modules/kbv-ti-connect/main/ti-connect.ts src/modules/gematik-crypto/services/crypto-adapter/adapter.ts src/modules/gematik-crypto/index.ts src/modules/gematik-kim/services/client/ldap.ts src/modules/gematik-crypto/main/tests/tracking.test.ts src/modules/gematik-crypto/services/docto-crypt/ldap/ldapClient.ts src/modules/kbv-ti-connect/services/types.ts src/modules/kbv-ti-connect/services/ti-c …(truncated, 2130 more chars)
Let me check the TI Connect helper and other key integration points:
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/kbv-ti-connect/services/ti-connect-helper.ts(1–150)
Tool results:
→ result (ok): 1→import i18n from 'i18next' 2→import semver from 'semver' 3→ 4→import { extraLogParser } from 'src/utils/extraLogParser' 5→ 6→import { ConnectorService, ServiceEndpointInfo, TiConnectSettings } from './types' 7→import { isTiConfigured } from './ti-connect-settings' 8→import { TiConnectRepository } from './ti-connect-repository' 9→import { kbvTiConnectLogger } from './logger' 10→import { tiConnectModuleMetadata } from '../constants/module' 11→
…(truncated, 5215 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/crypto-adapter/adapter.ts(1–80)
Tool results:
→ result (ok): 1→import { X509Certificate } from 'node:crypto' 2→import { JWE, JWS as NodeJWS } from '@doctolib/node-jose' 3→import { IOptions } from 'soap' 4→ 5→import { CryptoEngine } from '@module/gematik-crypto/services/crypto-adapter/crypto-engine' 6→import { CustomSoapClientOptions } from '@module/gematik-crypto/services/node/tls/customSoapClientOptions' 7→import { HttpsFetch as DoctoCryptHttpsFetch } from '@module/gematik-crypto/services/docto-crypt/tls/httpsFetch' 8→i …(truncated, 3953 more chars)
Now let me search for UI components and user-facing certificate actions:
Tools used:
Grep:filePicker|openFile|certificate.*input|cert.*selectin/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src
Tools used:
Grep:preferences.*TI|preferences.*KIM|CertificatePreferencesin/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src
Tool results:
→ result (ok): Found 9 files src/modules/padok-integration/main/padok-events.ts src/modules/padok-integration/main/tests/padok-events.test.ts src/modules/kbv-ti-connect/services/keyStore.ts src/modules/kbv-mobile-card-reader/main/mobile-card-reader.ts src/modules/kbv-mobile-card-reader/main/tests/mobile-card-reader.test.ts src/modules/gematik-ti-environment/services/localArtifacts.ts src/modules/gematik-idp-authentication/services/tests_electron/idpChallenge.test.ts src/modules/gematik-crypto/servi …(truncated, 72 more chars)
Tool results:
→ result (ok): Found 1 file src/app/pages/settings/ExperimentView.tsx
Let me check the TI Connect preferences UI:
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/kbv-ti-connect/renderer/components/preferences/sections/TIConnect.tsx(1–150)
Tool results:
→ result (ok): 1→import { useCallback, useEffect, useState } from 'react' 2→import { useTranslation } from 'react-i18next' 3→import { Heading } from '@doctolib/design-system-b2b/Heading' 4→import { Select } from '@doctolib/design-system-b2b/Select' 5→import { Card } from '@doctolib/design-system-b2b/Card' 6→import { Divider } from '@doctolib/design-system-b2b/Divider' 7→import { Toggle } from '@doctolib/design-system-b2b/Toggle' 8→import { v4 as uuidv4 } from 'uuid' 9→
…(truncated, 4515 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/node/keystore/keystoreFile.ts
Tool results:
→ result (ok): 1→import os from 'node:os' 2→import fs from 'node:fs' 3→import { dialog, FileFilter } from 'electron' 4→ 5→// Unfortunatly this interface has no name, so we need to give it one here 6→// https://github.com/electron/electron/blob/master/docs/api/dialog.md#dialogshowopendialogbrowserwindow-options 7→export type DialogOptionProperties = ( 8→ | 'openFile' 9→ | 'openDirectory' 10→ | 'multiSelections' 11→ | 'showHiddenFiles' 12→ | 'createDirecto …(truncated, 1488 more chars)
Now let me search for gematik-idp-authentication and other additional certificate operations:
Tools used:
Grep:idp.*certificate|IDP.*cert|PublicKeyin/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-idp-authentication
Tools used:
Grep:VAU|vauin/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-idp-vau
Tool results:
→ result (ok): Found 10 files src/modules/gematik-idp-authentication/services/test_utils/fixtures.ts src/modules/gematik-idp-authentication/services/idpPublicKeys.ts src/modules/gematik-idp-authentication/services/idpAuthenticator.ts src/modules/gematik-idp-authentication/services/idpClient.ts src/modules/gematik-idp-authentication/services/tests_electron/keyVerifier.test.ts src/modules/gematik-idp-authentication/services/tests_electron/idpClient.test.ts src/modules/gematik-idp-authentication/services/ …(truncated, 277 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-idp-authentication/services/idpPublicKeys.ts(1–80)
Tool results:
→ result (ok): 1→import { SignatureVerificationAndEncryptionKey } from '@module/gematik-idp-authentication/constants/types' 2→import { IdpClient } from '@module/gematik-idp-authentication/services/idpClient' 3→import { TiService } from '@module/gematik-specialist-service/types' 4→import type { EccJwk, EccCertificate } from '@module/gematik-crypto' 5→ 6→/ 7→ * Service to fetch and extract the public keys from the TI IDP 8→ */ 9→export class IdpPublicKeys { 10→ /
…(truncated, 1526 more chars)
Tool results:
→ result (ok): Found 14 files src/modules/gematik-idp-vau/services/vauValidation.ts src/modules/gematik-idp-vau/services/vauClient.ts src/modules/gematik-idp-vau/services/vauService.ts src/modules/gematik-idp-vau/services/vauUtils.ts src/modules/gematik-idp-vau/services/encryption.ts src/modules/gematik-idp-vau/services/fixtures.ts src/modules/gematik-idp-vau/services/tests_electron/vauService.test.ts src/modules/gematik-idp-vau/services/tests_electron/vauUtils.test.ts src/modules/gematik-idp-vau/servi …(truncated, 329 more chars)
Perfect! Now let me compile my findings into a comprehensive report. Let me create a summary document based on all the information I've gathered.
Summary of Certificate Operations in DDV Codebase
Based on my comprehensive search of the DDV codebase, I've identified all major places where certificates are inserted, loaded, or configured. Here's the complete analysis:
1. TI Connect Module - PKCS12 Keystore Management
Primary Files:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/kbv-ti-connect/services/keyStore.ts
- Operations: Reads PKCS12 files, decrypts keystores, extracts certificate and private key pairs
- Key Functions:
- readKeyStoreFromFile(keyStorePath) - Reads .p12 files
- decryptKeyStore(keyStore, password) - Extracts cert/key pair
- getNewKeyStore(oldPath) - Opens file picker for .p12 files
/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/node/keystore/pkcs12.ts- Operations: Low-level PKCS12 parsing using node-forge
- Key Functions:
getPkcs12(keyStore, keyStorePin)- Parses PKCS12 structuregetLatestUserCertificate()- Selects the latest valid certificate by validity periodgetPrivateKey()- Extracts private key from cert baggetAllCertificates()- Retrieves all certificates in keystoreexctractPkCertificatePair()- Converts to PEM format
2. Server Certificate Handling - Connector TLS
Primary File:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/kbv-ti-connect/services/server-certificate-helpers.ts
- Operations: Manages connector server certificates for verification
- Key Functions:
- getCertificateType(X509Certificate) - Identifies certificate type (C.AUK.AUT, Self-Signed, Externally Generated)
- getCAs(serverCertificate) - Returns appropriate CA certificates for verification
- createFingerprintVerifier(fingerprint) - Creates server certificate fingerprint validator
3. TI Environment Certificate Provider
Primary File:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-ti-environment/services/tiEnvCertificateProvider.ts
- Operations: Manages environment-specific certificates (RU, PU, TITUS)
- Key Functions:
- getCertificates() - Returns CA cert and IDP root certificate for TI environment
- getDefaultCertificates() - Provides fallback certificates
4. LDAP Client Certificate Configuration
Two Implementation Paths:
A. DoctoCrypt Implementation:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/docto-crypt/ldap/ldapClient.ts
- Passes PKCS12 keystore and password via --keystore and --keystore-password flags
- Supports server certificate verification via --verify-server-identity and --server-fingerprint
B. Node.js Implementation:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/node/ldap/ldapClient.ts
- Direct LDAP client with TLS options
Adapter Pattern:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/crypto-adapter/ldapAdapter.ts
- Abstracts between DoctoCrypt and Node.js implementations
5. KIM (Secure Messaging) LDAP Certificate Usage
Primary File:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-kim/services/client/ldap.ts
- Operations: LDAP client initialization with TI connector keystore
- Key Functions:
- getLdapClientSetup() - Prepares LDAP setup with PKCS12 keystore
- instanciateLdapClient() - Creates LDAP client with certificate verification
- createLdapClient() - Complete setup with server certificate validation
- searchLdap() - LDAP search with TLS
Certificate Flow: Uses TI connector's PKCS12 keystore for LDAP client authentication + server certificate verification
6. HTTPS/TLS Client Certificate Configuration
Primary Files:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/docto-crypt/tls/TLSService.ts
- Passes --private-key and --certificate flags to docto-crypt fetch command
/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/docto-crypt/tls/cryptoHttpClient.ts- Implements SOAP client HTTP adapter using TLSService
- Passes certificate and key from
exoptionsparameter
7. Cryptographic Adapter Pattern
Primary File:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/crypto-adapter/pkcs12Adapter.ts
- Dual Implementation:
- DoctoCrypt path: Uses keystore extract from-base64 --base64 <keyStore> --password <password>
- Node.js path: Uses node-forge for PKCS12 parsing
- Functions: exctractPkCertificatePair(), getAllCertificates(), getPrivateKey(), etc.
8. JWT/JWE Cryptographic Operations
Primary File:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/crypto-adapter/adapter.ts
- Key Operations:
- JWKKeyStore.loadKeyPair(x509CertificatePem, privateKeyPem) - Load certificate for JWT operations
- JWKKeyStore.loadPublicKey(x509Certificate) - Extract public key
- Handles both symmetric keys and ECC keys for JWE encryption/decryption
9. IDP Authentication Certificate Handling
Primary File:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-idp-authentication/services/idpPublicKeys.ts
- Operations: Fetches and extracts IDP public keys
- Key Functions:
- IdpPublicKeys.fetch() - Retrieves signing certificates and encryption keys from IDP JWKS endpoint
- Returns: SignatureVerificationAndEncryptionKey (signing certificate + encryption key)
10. MSsante (French Healthcare) Certificates
Primary File:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/mssante/main/mssante-certificates.ts
- Operations: Hardcoded trusted CA certificates for French healthcare system
- Includes:
- ACI_EL_PP_CRT (AC IGC-SANTÉ for individuals)
- ACI_EL_ORG_CRT (AC IGC-SANTÉ for organizations)
- ACR_EL_CRT (AC RACINE IGC-SANTÉ)
- Test variants for development/staging
11. User-Facing Certificate Actions
Primary Files:
TI Connect Preferences UI:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/kbv-ti-connect/renderer/components/preferences/sections/TIConnect.tsx
- Toggle for certificate verification (isCertificatesVerificationEnabled)
- Settings for connector certificate verification mode
File Picker for Certificates:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-crypto/services/node/keystore/keystoreFile.ts
- KeystoreFile.read(keyStorePath) - Reads binary keystore file
- KeystoreFile.defineNewPath() - Opens Electron file picker for .p12 files
12. TI Connect Configuration & Settings
Primary Files:
- /Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/kbv-ti-connect/services/ti-connect-helper.ts
- getClientCertificateAndKey() - Retrieves loaded client cert, key, and server cert settings
- Returns: cert, key, isCertificatesVerificationEnabled, serverCertificate, serverCertificateFingerprint
13. VAU (Verbindungsaufbau/Connection Establishment) Encryption
Related Files: - `/Users/USER/workspace/doctolib/FHIR-1996_track-ecc-rsa-certificate-usage/src/modules/gematik-id …(truncated, 2332 more chars)