{"templateId":"markdown","versions":[{"version":"v1.39","label":"v1.39 STS","link":"/products/custody/deployment/integrate-kms/on-premise-hsm/securosys-primus","default":true,"active":true,"folderId":"c15a2701"},{"version":"v1.38","label":"v1.38 STS","link":"/products/custody/v1.38/deployment/integrate-kms/on-premise-hsm/securosys-primus","default":false,"active":false,"folderId":"c15a2701"},{"version":"v1.34","label":"v1.34 LTS","link":"/products/custody/v1.34/deployment/integrate-kms/on-premise-hsm/securosys-primus","default":false,"active":false,"folderId":"c15a2701"},{"version":"v1.26","label":"v1.26 LTS","link":"/products/custody/v1.26/deployment/integrate-kms/on-premise-hsm/securosys-primus","default":false,"active":false,"folderId":"c15a2701"},{"version":"v1.19","label":"v1.19 LTS","link":"/products/custody/v1.19/deployment/integrate-kms/on-premise-hsm/securosys-primus","default":false,"active":false,"folderId":"c15a2701"},{"version":"v1.15","label":"v1.15 LTS","link":"/products/custody/v1.15/deployment/integrate-kms/on-premise-hsm/securosys-primus","default":false,"active":false,"folderId":"c15a2701"}],"sharedDataIds":{"sidebar":"sidebar-products/custody/@v1.15/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"Securosys Primus HSM integration guide","description":"User guides, API reference, and support resources.","siteUrl":"https://docs.ripple.com","lang":"en-US","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"securosys-primus-hsm-integration-guide","__idx":0},"children":["Securosys Primus HSM integration guide"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This guide provides complete instructions for integrating Securosys Primus HSM with ","Ripple Custody",". The Securosys Primus HSM is a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["FIPS 140-2 Level 3"]}," certified hardware security module that generates, manages, and protects cryptographic keys. Securosys is currently pursuing ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["FIPS 140-3 Level 3"]}," certification."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"success"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Note:"]}," Securosys and Ripple have a partnership that allows customers to access either Securosys Primus HSMs or CloudHSMs under the Ripple contract. Interested customers should contact their customer partner success director for more information."]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Before you begin:"]}," This guide assumes you have completed ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/custody/deployment/install/helm-chart-installation"},"children":["Installation environment setup"]}," and are ready to configure your HSM for use with ","Ripple Custody","."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"overview","__idx":1},"children":["Overview"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"supported-hardware","__idx":2},"children":["Supported hardware"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ","Ripple Custody"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["primus"]}," KMS provider connects through the Securosys PKCS#11 library (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["libprimusP11.so"]},") and relies on Securosys vendor extensions (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["C_DeriveKeyPair"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["C_LoadPersistentExternalObject"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["C_GetPersistentExternalObjectData"]},") with per-curve wrapped master key blobs."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Requirement"},"children":["Requirement"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Detail"},"children":["Detail"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Supported models"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Primus HSM X-Series and E-Series, and the Securosys CloudHSM service. All share one firmware line that exposes the required extensions."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Certification"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["FIPS 140-2 Level 3, Common Criteria EAL4+."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"how-ripple-custody-uses-securosys-primus-hsm","__idx":3},"children":["How ","Ripple Custody"," uses Securosys Primus HSM"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Key-generation flow"]},":"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["During account creation, the vault requests key generation from the HSM."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The HSM creates three master keys, one for each elliptic curve."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The HSM encrypts the private key using its master key via PKCS#11."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Ripple Custody"," stores the encrypted private key (PKCS#11 blob) in its database."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["During signing operations, the HSM performs all private key operations internally."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Unencrypted (plaintext) private keys never leave the HSM."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"deployment-architecture","__idx":4},"children":["Deployment architecture"]},{"$$mdtype":"Tag","name":"Diagram","attributes":{"data-language":"mermaid","diagramType":"mermaid","diagramSource":"flowchart TB\n    subgraph compute[\"Compute\"]\n        direction LR\n        notary[\"Notary + KMS Connect\"]\n        vault[\"Vault + KMS Connect\"]\n    end\n\n    subgraph hsm[\"Securosys Primus HSM HA Group\"]\n        direction LR\n        p1[\"Partition #1\"]\n        p2[\"Partition #2\"]\n        p1 <--> p2\n    end\n\n    notary -->|mTLS port 2410| hsm\n    vault -->|mTLS port 2410| hsm\n","diagramHtml":"<svg id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" class=\"flowchart\" style=\"max-width: 461.15625px;\" viewBox=\"0 0 461.15625 442\" role=\"graphics-document document\" aria-roledescription=\"flowchart-v2\"><style>#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b{font-family:\"Redocly Mermaid Sans\",\"Redocly Mermaid CJK\",sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .error-icon{fill:#552222;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .error-text{fill:#552222;stroke:#552222;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .edge-thickness-normal{stroke-width:1px;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .edge-thickness-thick{stroke-width:3.5px;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .edge-pattern-solid{stroke-dasharray:0;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .edge-pattern-dashed{stroke-dasharray:3;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .edge-pattern-dotted{stroke-dasharray:2;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .marker{fill:#333333;stroke:#333333;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .marker.cross{stroke:#333333;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b svg{font-family:\"Redocly Mermaid Sans\",\"Redocly Mermaid CJK\",sans-serif;font-size:16px;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b p{margin:0;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .label{font-family:\"Redocly Mermaid Sans\",\"Redocly Mermaid CJK\",sans-serif;color:#333;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .cluster-label text{fill:#333;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .cluster-label span{color:#333;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .cluster-label span p{background-color:transparent;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .label text,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b span{fill:#333;color:#333;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .node rect,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .node circle,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .node ellipse,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .node polygon,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .rough-node .label text,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .node .label text,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .image-shape .label,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .icon-shape .label{text-anchor:middle;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .rough-node .label,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .node .label,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .image-shape .label,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .icon-shape .label{text-align:center;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .node.clickable{cursor:pointer;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .arrowheadPath{fill:#333333;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .edgePath .path{stroke:#333333;stroke-width:1px;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .flowchart-link{stroke:#333333;fill:none;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .cluster text{fill:#333;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .cluster span{color:#333;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"Redocly Mermaid Sans\",\"Redocly Mermaid CJK\",sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b rect.text{fill:none;stroke-width:0;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .icon-shape,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .icon-shape p,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .icon-shape .label rect,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b .node .neo-node{stroke:#9370DB;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b [data-look=\"neo\"].node rect,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b [data-look=\"neo\"].cluster rect,#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b [data-look=\"neo\"].node polygon{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b [data-look=\"neo\"].swimlane.cluster rect{filter:none;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b [data-look=\"neo\"].node path{stroke:#9370DB;stroke-width:1px;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b [data-look=\"neo\"].node .outer-path{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b [data-look=\"neo\"].node .neo-line path{stroke:#9370DB;filter:none;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b [data-look=\"neo\"].node circle{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b [data-look=\"neo\"].node circle .state-start{fill:#000000;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b [data-look=\"neo\"].icon-shape .icon{fill:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b [data-look=\"neo\"].icon-shape .icon-neo path{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b :root{--mermaid-font-family:\"Redocly Mermaid Sans\",\"Redocly Mermaid CJK\",sans-serif;}#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b :root{--mermaid-font-family:\"Redocly Mermaid Sans\",\"Redocly Mermaid CJK\",sans-serif;}</style><g><marker id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-pointEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 0 L 10 5 L 0 10 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-pointStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"4.5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 5 L 10 10 L 10 0 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-pointEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"11.5\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"10.5\" markerHeight=\"14\" orient=\"auto\"><path d=\"M 0 0 L 11.5 7 L 0 14 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-pointStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"1\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11.5\" markerHeight=\"14\" orient=\"auto\"><polygon points=\"0,7 11.5,14 11.5,0\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></polygon></marker><marker id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-circleEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"11\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-circleStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-1\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-circleEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refY=\"5\" refX=\"12.25\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-circleStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-2\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-crossEnd\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"12\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-crossStart\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"-1\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-crossEnd-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"17.7\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5;\"></path></marker><marker id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-crossStart-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"-3.5\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5; stroke-dasharray: 1, 0;\"></path></marker><g class=\"root\"><g class=\"clusters\"></g><g class=\"edgePaths\"><path d=\"M178.721,236L175.916,242.167C173.111,248.333,167.501,260.667,168.594,272.452C169.688,284.238,177.485,295.476,181.383,301.095L185.282,306.714\" id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b-L_notary_hsm_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_notary_hsm_0\" data-points=\"W3sieCI6MTc4LjcyMTMzNjkyMDUyOTgsInkiOjIzNn0seyJ4IjoxNjEuODkwNjI1LCJ5IjoyNzN9LHsieCI6MTg3LjU2MTcxMDg1ODU4NTg1LCJ5IjozMTB9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-pointEnd)\"></path><path d=\"M282.435,236L285.24,242.167C288.045,248.333,293.655,260.667,292.562,272.452C291.469,284.238,283.672,295.476,279.773,301.095L275.875,306.714\" id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b-L_vault_hsm_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_vault_hsm_0\" data-points=\"W3sieCI6MjgyLjQzNDkxMzA3OTQ3MDIsInkiOjIzNn0seyJ4IjoyOTkuMjY1NjI1LCJ5IjoyNzN9LHsieCI6MjczLjU5NDUzOTE0MTQxNDE1LCJ5IjozMTB9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-pointEnd)\"></path></g><g class=\"edgeLabels\"><g class=\"edgeLabel\" transform=\"translate(163.14051, 274.80147)\"><g class=\"label\" data-id=\"L_notary_hsm_0\" transform=\"translate(-58.6875, -12)\"><foreignObject width=\"117.375\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"><p>mTLS port 2410</p></span></div></foreignObject></g></g><g class=\"edgeLabel\" transform=\"translate(298.01574, 274.80147)\"><g class=\"label\" data-id=\"L_vault_hsm_0\" transform=\"translate(-58.6875, -12)\"><foreignObject width=\"117.375\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"><p>mTLS port 2410</p></span></div></foreignObject></g></g></g><g class=\"nodes\"><g class=\"root\" transform=\"translate(0, 302)\"><g class=\"clusters\"><g class=\"cluster\" id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b-hsm\" data-look=\"classic\"><rect style=\"\" x=\"8\" y=\"8\" width=\"445.15625\" height=\"124\"></rect><g class=\"cluster-label\" transform=\"translate(106.734375, 8)\"><foreignObject width=\"247.6875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5;\"><span class=\"nodeLabel\"><p>Securosys Primus HSM HA Group</p></span></div></foreignObject></g></g></g><g class=\"edgePaths\"><path d=\"M197.078,70L202.661,70C208.245,70,219.411,70,230.578,70C241.745,70,252.911,70,258.495,70L264.078,70\" id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b-L_p1_p2_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_p1_p2_0\" data-points=\"W3sieCI6MTkzLjA3ODEyNSwieSI6NzB9LHsieCI6MjMwLjU3ODEyNSwieSI6NzB9LHsieCI6MjY4LjA3ODEyNSwieSI6NzB9XQ==\" data-look=\"classic\" marker-start=\"url(#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-pointStart)\" marker-end=\"url(#diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b_flowchart-v2-pointEnd)\"></path></g><g class=\"edgeLabels\"><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_p1_p2_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g></g><g class=\"nodes\"><g class=\"node default\" id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b-flowchart-p1-2\" data-look=\"classic\" transform=\"translate(119.2890625, 70)\"><rect class=\"basic label-container\" style=\"\" x=\"-73.7890625\" y=\"-27\" width=\"147.578125\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-43.7890625, -12)\"><rect></rect><foreignObject width=\"87.578125\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Partition #1</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b-flowchart-p2-3\" data-look=\"classic\" transform=\"translate(341.8671875, 70)\"><rect class=\"basic label-container\" style=\"\" x=\"-73.7890625\" y=\"-27\" width=\"147.578125\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-43.7890625, -12)\"><rect></rect><foreignObject width=\"87.578125\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Partition #2</p></span></div></foreignObject></g></g></g></g><g class=\"root\" transform=\"translate(71.4921875, 0)\"><g class=\"clusters\"><g class=\"cluster\" id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b-compute\" data-look=\"classic\"><rect style=\"\" x=\"8\" y=\"8\" width=\"302.171875\" height=\"228\"></rect><g class=\"cluster-label\" transform=\"translate(124.640625, 8)\"><foreignObject width=\"68.890625\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5;\"><span class=\"nodeLabel\"><p>Compute</p></span></div></foreignObject></g></g></g><g class=\"edgePaths\"></g><g class=\"edgeLabels\"></g><g class=\"nodes\"><g class=\"node default\" id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b-flowchart-notary-0\" data-look=\"classic\" transform=\"translate(159.0859375, 70)\"><rect class=\"basic label-container\" style=\"\" x=\"-113.5859375\" y=\"-27\" width=\"227.171875\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-83.5859375, -12)\"><rect></rect><foreignObject width=\"167.171875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Notary + KMS Connect</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b-flowchart-vault-1\" data-look=\"classic\" transform=\"translate(159.0859375, 174)\"><rect class=\"basic label-container\" style=\"\" x=\"-106.9609375\" y=\"-27\" width=\"213.921875\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-76.9609375, -12)\"><rect></rect><foreignObject width=\"153.921875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Vault + KMS Connect</p></span></div></foreignObject></g></g></g></g></g></g></g><defs><filter id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b-drop-shadow\" height=\"130%\" width=\"130%\"><feDropShadow dx=\"4\" dy=\"4\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#000000\"></feDropShadow></filter></defs><defs><filter id=\"diagram-0b5cba40dce3f6004fe6d4849e5c67b1352970f677bc351814db42d56334e34b-drop-shadow-small\" height=\"150%\" width=\"150%\"><feDropShadow dx=\"2\" dy=\"2\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#000000\"></feDropShadow></filter></defs></svg>","diagramHtmlDark":"<svg id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" class=\"flowchart\" style=\"max-width: 461.15625px;\" viewBox=\"0 0 461.15625 442\" role=\"graphics-document document\" aria-roledescription=\"flowchart-v2\"><style>#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886{font-family:\"Redocly Mermaid Sans\",\"Redocly Mermaid CJK\",sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .error-icon{fill:#a44141;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .error-text{fill:#ddd;stroke:#ddd;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .edge-thickness-normal{stroke-width:1px;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .edge-thickness-thick{stroke-width:3.5px;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .edge-pattern-solid{stroke-dasharray:0;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .edge-pattern-dashed{stroke-dasharray:3;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .edge-pattern-dotted{stroke-dasharray:2;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .marker{fill:lightgrey;stroke:lightgrey;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .marker.cross{stroke:lightgrey;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 svg{font-family:\"Redocly Mermaid Sans\",\"Redocly Mermaid CJK\",sans-serif;font-size:16px;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 p{margin:0;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .label{font-family:\"Redocly Mermaid Sans\",\"Redocly Mermaid CJK\",sans-serif;color:#ccc;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .cluster-label text{fill:#F9FFFE;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .cluster-label span{color:#F9FFFE;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .cluster-label span p{background-color:transparent;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .label text,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 span{fill:#ccc;color:#ccc;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .node rect,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .node circle,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .node ellipse,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .node polygon,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .rough-node .label text,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .node .label text,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .image-shape .label,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .icon-shape .label{text-anchor:middle;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .rough-node .label,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .node .label,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .image-shape .label,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .icon-shape .label{text-align:center;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .node.clickable{cursor:pointer;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .arrowheadPath{fill:lightgrey;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .edgePath .path{stroke:lightgrey;stroke-width:1px;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .flowchart-link{stroke:lightgrey;fill:none;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .cluster text{fill:#F9FFFE;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .cluster span{color:#F9FFFE;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"Redocly Mermaid Sans\",\"Redocly Mermaid CJK\",sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 rect.text{fill:none;stroke-width:0;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .icon-shape,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .icon-shape p,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .icon-shape .label rect,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .image-shape .label rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 .node .neo-node{stroke:#ccc;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 [data-look=\"neo\"].node rect,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 [data-look=\"neo\"].cluster rect,#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 [data-look=\"neo\"].node polygon{stroke:url(#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 [data-look=\"neo\"].swimlane.cluster rect{filter:none;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 [data-look=\"neo\"].node path{stroke:url(#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-gradient);stroke-width:1px;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 [data-look=\"neo\"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 [data-look=\"neo\"].node .neo-line path{stroke:#ccc;filter:none;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 [data-look=\"neo\"].node circle{stroke:url(#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 [data-look=\"neo\"].node circle .state-start{fill:#000000;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 [data-look=\"neo\"].icon-shape .icon{fill:url(#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 [data-look=\"neo\"].icon-shape .icon-neo path{stroke:url(#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 :root{--mermaid-font-family:\"Redocly Mermaid Sans\",\"Redocly Mermaid CJK\",sans-serif;}#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886 :root{--mermaid-font-family:\"Redocly Mermaid Sans\",\"Redocly Mermaid CJK\",sans-serif;}</style><g><marker id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-pointEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 0 L 10 5 L 0 10 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-pointStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"4.5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 5 L 10 10 L 10 0 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-pointEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"11.5\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"10.5\" markerHeight=\"14\" orient=\"auto\"><path d=\"M 0 0 L 11.5 7 L 0 14 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-pointStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"1\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11.5\" markerHeight=\"14\" orient=\"auto\"><polygon points=\"0,7 11.5,14 11.5,0\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></polygon></marker><marker id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-circleEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"11\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-circleStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-1\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-circleEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refY=\"5\" refX=\"12.25\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-circleStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-2\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-crossEnd\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"12\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-crossStart\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"-1\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-crossEnd-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"17.7\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5;\"></path></marker><marker id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-crossStart-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"-3.5\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5; stroke-dasharray: 1, 0;\"></path></marker><g class=\"root\"><g class=\"clusters\"></g><g class=\"edgePaths\"><path d=\"M178.721,236L175.916,242.167C173.111,248.333,167.501,260.667,168.594,272.452C169.688,284.238,177.485,295.476,181.383,301.095L185.282,306.714\" id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-L_notary_hsm_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_notary_hsm_0\" data-points=\"W3sieCI6MTc4LjcyMTMzNjkyMDUyOTgsInkiOjIzNn0seyJ4IjoxNjEuODkwNjI1LCJ5IjoyNzN9LHsieCI6MTg3LjU2MTcxMDg1ODU4NTg1LCJ5IjozMTB9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-pointEnd)\"></path><path d=\"M282.435,236L285.24,242.167C288.045,248.333,293.655,260.667,292.562,272.452C291.469,284.238,283.672,295.476,279.773,301.095L275.875,306.714\" id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-L_vault_hsm_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_vault_hsm_0\" data-points=\"W3sieCI6MjgyLjQzNDkxMzA3OTQ3MDIsInkiOjIzNn0seyJ4IjoyOTkuMjY1NjI1LCJ5IjoyNzN9LHsieCI6MjczLjU5NDUzOTE0MTQxNDE1LCJ5IjozMTB9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-pointEnd)\"></path></g><g class=\"edgeLabels\"><g class=\"edgeLabel\" transform=\"translate(163.14051, 274.80147)\"><g class=\"label\" data-id=\"L_notary_hsm_0\" transform=\"translate(-58.6875, -12)\"><foreignObject width=\"117.375\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"><p>mTLS port 2410</p></span></div></foreignObject></g></g><g class=\"edgeLabel\" transform=\"translate(298.01574, 274.80147)\"><g class=\"label\" data-id=\"L_vault_hsm_0\" transform=\"translate(-58.6875, -12)\"><foreignObject width=\"117.375\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"><p>mTLS port 2410</p></span></div></foreignObject></g></g></g><g class=\"nodes\"><g class=\"root\" transform=\"translate(0, 302)\"><g class=\"clusters\"><g class=\"cluster\" id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-hsm\" data-look=\"classic\"><rect style=\"\" x=\"8\" y=\"8\" width=\"445.15625\" height=\"124\"></rect><g class=\"cluster-label\" transform=\"translate(106.734375, 8)\"><foreignObject width=\"247.6875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5;\"><span class=\"nodeLabel\"><p>Securosys Primus HSM HA Group</p></span></div></foreignObject></g></g></g><g class=\"edgePaths\"><path d=\"M197.078,70L202.661,70C208.245,70,219.411,70,230.578,70C241.745,70,252.911,70,258.495,70L264.078,70\" id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-L_p1_p2_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_p1_p2_0\" data-points=\"W3sieCI6MTkzLjA3ODEyNSwieSI6NzB9LHsieCI6MjMwLjU3ODEyNSwieSI6NzB9LHsieCI6MjY4LjA3ODEyNSwieSI6NzB9XQ==\" data-look=\"classic\" marker-start=\"url(#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-pointStart)\" marker-end=\"url(#diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886_flowchart-v2-pointEnd)\"></path></g><g class=\"edgeLabels\"><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_p1_p2_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g></g><g class=\"nodes\"><g class=\"node default\" id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-flowchart-p1-2\" data-look=\"classic\" transform=\"translate(119.2890625, 70)\"><rect class=\"basic label-container\" style=\"\" x=\"-73.7890625\" y=\"-27\" width=\"147.578125\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-43.7890625, -12)\"><rect></rect><foreignObject width=\"87.578125\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Partition #1</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-flowchart-p2-3\" data-look=\"classic\" transform=\"translate(341.8671875, 70)\"><rect class=\"basic label-container\" style=\"\" x=\"-73.7890625\" y=\"-27\" width=\"147.578125\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-43.7890625, -12)\"><rect></rect><foreignObject width=\"87.578125\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Partition #2</p></span></div></foreignObject></g></g></g></g><g class=\"root\" transform=\"translate(71.4921875, 0)\"><g class=\"clusters\"><g class=\"cluster\" id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-compute\" data-look=\"classic\"><rect style=\"\" x=\"8\" y=\"8\" width=\"302.171875\" height=\"228\"></rect><g class=\"cluster-label\" transform=\"translate(124.640625, 8)\"><foreignObject width=\"68.890625\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5;\"><span class=\"nodeLabel\"><p>Compute</p></span></div></foreignObject></g></g></g><g class=\"edgePaths\"></g><g class=\"edgeLabels\"></g><g class=\"nodes\"><g class=\"node default\" id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-flowchart-notary-0\" data-look=\"classic\" transform=\"translate(159.0859375, 70)\"><rect class=\"basic label-container\" style=\"\" x=\"-113.5859375\" y=\"-27\" width=\"227.171875\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-83.5859375, -12)\"><rect></rect><foreignObject width=\"167.171875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Notary + KMS Connect</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-flowchart-vault-1\" data-look=\"classic\" transform=\"translate(159.0859375, 174)\"><rect class=\"basic label-container\" style=\"\" x=\"-106.9609375\" y=\"-27\" width=\"213.921875\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-76.9609375, -12)\"><rect></rect><foreignObject width=\"153.921875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Vault + KMS Connect</p></span></div></foreignObject></g></g></g></g></g></g></g><defs><filter id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-drop-shadow\" height=\"130%\" width=\"130%\"><feDropShadow dx=\"4\" dy=\"4\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#FFFFFF\"></feDropShadow></filter></defs><defs><filter id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-drop-shadow-small\" height=\"150%\" width=\"150%\"><feDropShadow dx=\"2\" dy=\"2\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#FFFFFF\"></feDropShadow></filter></defs><linearGradient id=\"diagram-0d5f43dc888cac4b3a11e5f84546291c0fcbfaf7d690cb5c089c602f5c8e7886-gradient\" gradientUnits=\"objectBoundingBox\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"><stop offset=\"0%\" stop-color=\"#cccccc\" stop-opacity=\"1\"></stop><stop offset=\"100%\" stop-color=\"hsl(180, 0%, 18.3529411765%)\" stop-opacity=\"1\"></stop></linearGradient></svg>"},"children":["flowchart TB\n    subgraph compute[\"Compute\"]\n        direction LR\n        notary[\"Notary + KMS Connect\"]\n        vault[\"Vault + KMS Connect\"]\n    end\n\n    subgraph hsm[\"Securosys Primus HSM HA Group\"]\n        direction LR\n        p1[\"Partition #1\"]\n        p2[\"Partition #2\"]\n        p1 <--> p2\n    end\n\n    notary -->|mTLS port 2410| hsm\n    vault -->|mTLS port 2410| hsm\n"]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"prerequisites","__idx":5},"children":["Prerequisites"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"hardware-and-software-requirements","__idx":6},"children":["Hardware and software requirements"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Before starting, ensure you have:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["From Securosys HSMs"]},":"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Securosys Primus HSM appliance deployed."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["HSM initialized with admin credentials."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Network connectivity on port ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["2410"]}," (typical)."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["From your infrastructure"]},":"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Linux client machine for HSM administration."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Securosys Primus PKCS#11 API Provider client software downloaded and installed."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Network access from the chosen compute infrastructure to the HSM."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Firewall rules allowing bidirectional traffic from Kubernetes nodes to HSM."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["From Ripple"]},":"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Ripple Custody"," Helm charts (version 1.30+)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Access to the Ripple container registry (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["metaco.azurecr.io"]},")"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"key-derivation-scheme","__idx":7},"children":["Key derivation scheme"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The vault automatically detects the HSM capabilities at startup and selects the appropriate derivation scheme. For Securosys Primus HSM, use only SLIP10."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Scheme"},"children":["Scheme"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Supported Curves"},"children":["Supported Curves"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Supported Blockchains"},"children":["Supported Blockchains"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Firmware Required"},"children":["Firmware Required"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["SLIP10"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["secp256k1, Ed25519"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["All blockchains (Bitcoin, Ethereum, XRPL, Solana, Algorand, etc.)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["v2.11.0+"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"documentation-references-securosys","__idx":8},"children":["Documentation references (Securosys)"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.securosys.com/pkcs/Installation/primus_hsm_settings"},"children":["Primus HSM Configuration"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.securosys.com/pkcs/Installation/pkcs11_provider_installation"},"children":["PKCS#11 API Provider Installation"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.securosys.com/pkcs/Installation/pkcs11_provider_configuration/"},"children":["PKCS#11 API Provider Configuration"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.securosys.com/pkcs/Installation/permanent_secret_management/"},"children":["Permanent Secret Fetching"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.securosys.com/cloudhsm/Architecture/cluster_synchronization/"},"children":["Cluster Synchronization"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.securosys.com/cloudhsm/Architecture/backups/"},"children":["Backups"]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"hsm-initialization","__idx":9},"children":["HSM initialization"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This section covers the vendor-specific setup required to prepare your Securosys Primus HSM for use with ","Ripple Custody",". Detailed step-by-step commands are available in the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.securosys.com/pkcs/Installation/primus_hsm_settings"},"children":["Securosys Primus HSM documentation"]},"."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Customer responsibility"]},": Your infrastructure team performs HSM initialization. You must configure the HSM with the settings described below before proceeding to ","Ripple Custody"," configuration."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-1-deploy-and-initialize-securosys-primus-hsm-appliance","__idx":10},"children":["Step 1: Deploy and initialize Securosys Primus HSM appliance"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Complete the following using Securosys Primus documentation:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Physical deployment"]},": Rack, power, and network-connect the Securosys Primus HSM appliance"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Initial setup"]},": Complete the Initial Wizard as described in ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://support.securosys.com/external/knowledge-base/article/63"},"children":["Chapter 3 of the Primus HSM User Guide"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Firmware verification"]},": For the most robust support (including SLIP10), and compliance (including FIPS/CC considerations), firmware ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["2.11+"]}," or ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["3.1+"]}," (for X2/E2-series hardware) is recommended."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-2-configure-the-hsm","__idx":11},"children":["Step 2: Configure the HSM"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Follow the steps in ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.securosys.com/pkcs/Installation/primus_hsm_settings"},"children":["Primus HSM Configuration"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Primus PKCS#11 API Provider has two main configuration files:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"em","attributes":{},"children":["/etc/primus/primus.cfg"]}," contains public settings, such as connectivity details (hostname, port) and partition names."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"em","attributes":{},"children":["/etc/primus/.secrets.cfg"]}," contains secret values, such as the permanent secret used to authenticate to the HSM."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Here is a template ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["primus.cfg"]}," configuration file:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"cpp","header":{"controls":{"copy":{}}},"source":"#-----------------------------\n# Primus PKCS#11 configuration\n#-----------------------------\nversion = \"1.0\";\n/* This example configuration template contains 1 slot:                    */\n/* hsm0: standalone hsm with one partition (slot id 0)                     */\n/*--- GLOBAL CONFIGURATION SECTION ----------------------------------------*/\nprimus:\n{\n  wait_delay = 250; /* in ms*/\n  wait_max_tries = 5;\n  connect_on_init = true;\n  /*--- HSM CONFIGURATION SECTION -----------------------------------------*/\n  hsms:\n  {\n     /*--- HSM0, e.g. standalone hsm with one partition, slot id 0 */\n     hsm0:\n     {\n        host = \"grimsel.securosys.ch\";\n        port = \"2410\";\n        priority = 0; /* Optional priority. Default 0, which is highest priority */\n        slots:\n        {\n           slot0:\n           {\n              client_id = \"Client_ID0\"; /* Client-supplied, determined by us */\n              user_name = \"PRIMUSDEV390\"; /* partition/slot name */\n              id = 0;\n           }; /* end slot0 */\n        }; /* end slots */\n     }; /* end hsm0 */\n  }; /* end hsms */\n  /*--- LOG CONFIGURATION SECTION -----------------------------------------*/\n  log:\n  {\n/*    file = \"/tmp/primus.log\";    /* optional for unix, logs to LOCAL1 syslog */\n/*    file = \"%PUBLIC%\\Securosys\\Primus P11\\primus.log\";  /* for windows */\n    write_log_file      = true;     /* write to log-file */\n    write_syslog        = true;     /* write to syslog */\n    trace_linenumber    = false;    /* true or false */\n    trace_timestamp     = true;     /* true or false */\n    trace_function      = true;     /* true or false */\n    trace_inout         = false;    /* true or false */\n    trace_pid           = true;     /* true or false */\n    trace_filename      = false;    /* true or false */\n    trace_mask          = 0x00;\n    trace_level         = 4;        /* 0-7 log level details */\n  }; /* end log */\n}; /* end primus */\n","lang":"cpp"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Here is a template ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":[".secrets.cfg"]}," configuration file:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"cpp","header":{"controls":{"copy":{}}},"source":"version = \"1.0\";\nprimus :\n{\n  users :\n  {\n    user0 :\n    {\n      name = \"PRIMUSDEV390\"; /* partition name */\n      secret = \"<hex_secret>\";\n    };\n  };\n};\n","lang":"cpp"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-3-fetch-permanent-secret","__idx":12},"children":["Step 3: Fetch permanent secret"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To authenticate to Securosys Primus HSMs, you must generate a ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["permanent secret"]}," in addition to the PIN. Use the Securosys-provided ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ppin"]}," tool with a temporary setup secret:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"$ ppin -a -e HSM_USERNAME <SETUP_PASSWORD> <PIN>\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Note that this requires write access to ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["/etc/primus/.secrets.cfg"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.securosys.com/pkcs/Installation/permanent_secret_management/"},"children":["Permanent Secret Fetching"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-4-configure-high-availability-ha-groups","__idx":13},"children":["Step 4: Configure high availability (HA) groups"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["HA groups provide redundancy by synchronizing keys across multiple HSM partitions. If one HSM fails, the other continues to provide cryptographic services."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can run Securosys Primus HSMs in a partition-synced cluster for HA. This configuration makes the partition keys available on each instance and allows you to clone them for backup."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.securosys.com/primus-hsm/Concepts/ha_cloning"},"children":["Primus HSM - High Availability Cloning"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-5-configure-network-access-and-mtls","__idx":14},"children":["Step 5: Configure network access and mTLS"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Network ACL"]},": Add the IP range for your PKCS#11 client(s) to the HSM's network ACL, using ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["network add"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-6-verify-hsm-connectivity","__idx":15},"children":["Step 6: Verify HSM connectivity"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Before proceeding to ","Ripple Custody"," configuration, verify:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Network connectivity"]},": Port 2410 is reachable from PKCS#11 client application"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PKCS#11 connectivity"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ppin --test"]}," tests connectivity to your defined HSMs and partitions (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.securosys.com/pkcs/Tutorials/ppin_tool#connection-test"},"children":["Connection Test"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Authentication"]},": Can login to partitions with configured PIN and permanent secret fetched in Step 3."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Cryptographic operations"]},": Basic operations execute without errors"]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"success"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Checkpoint:"]}," If ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ppin --test"]}," shows your HSMs, and you can successfully login to partitions, your Securosys Primus HSM is properly configured and ready for ","Ripple Custody"," integration."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"ripple-custody-configuration","__idx":16},"children":["Ripple Custody"," configuration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Now that your Securosys Primus HSM is initialized, configure ","Ripple Custody"," to use it for the notary and vault components."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-1-gather-the-configuration-information","__idx":17},"children":["Step 1: Gather the configuration information"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Make sure you have the necessary configuration information:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PIN code"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Permanent secret"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HSM hostname"]}," (one or more)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HSM port"]}," (typically ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["2410"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Partition name"]}," (only one partition name, as this partition is to be cloned to the other HSMs as part of HA configuration)"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-2-configure-notary-with-securosys-primus-hsm","__idx":18},"children":["Step 2: Configure notary with Securosys Primus HSM"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following is an example ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["production.yaml"]}," file for a Kubernetes environment using the simplified configuration Custodian Chart."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You need to:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Declare the HSMS list, and their network address and relative priorities."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Declare the partition name."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["(If you are an existing Kubernetes Secret user), declare before installation."]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"# production.yaml\n\nnotary:\n  install: true\n  bridge:\n    endpoint: \"https://foo.bar\"\n  kms:\n    kind: \"primus\"\n    existingSecret: \"primus-secret\"\n    primus:\n      hsms:\n        - host: \"grimsel.securosys.ch\"\n          port: 2410\n          priority: 0\n      haGroup:\n        - member: \"PRIMUSDEV390\"\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Security best practice:"]}," Do NOT store the partition PIN directly in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["production.yaml"]},". Use Kubernetes Secrets or an external secrets manager (HashiCorp Vault, Conjur) to inject the PIN at runtime."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-3-configure-vault-with-securosys-primus-hsm","__idx":19},"children":["Step 3: Configure vault with Securosys Primus HSM"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Configure the vault component to use Securosys Primus HSM for key encryption. As with the notary, you need to:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Declare the HSMS list, and their network address and relative priorities."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Declare the partition name."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["(If you are an existing Kubernetes Secret user), declare before installation."]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"# production.yaml\n\nvault:\n  install: true\n  http:\n    endpoint: \"https://foo.bar\"\n  kms:\n    kind: \"primus\"\n    existingSecret: \"primus-secret\"\n    primus:\n      hsms:\n        - host: \"grimsel.securosys.ch\"\n          port: 2410\n          priority: 0\n      haGroup:\n        - member: \"PRIMUSDEV390\"\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Using Kubernetes Secrets for vault PIN"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# Create secret for Vault PIN (same partition as Notary)\nkubectl create secret generic primus-secret \\\n  --namespace custody-vault \\\n  --from-literal=pin='partition-password'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"verification-and-testing","__idx":20},"children":["Verification and testing"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After configuring your Helm values, do the following to verify the integration."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verify that the application starts successfully with no errors and no crashes during init."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Check the KMS log messages."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["With Securosys Primus HSM, the startup log should look somewhat like the following:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"log","header":{"controls":{"copy":{}}},"source":"{\"date\":1769688916.132,\"time\":\"2026-01-29 12:15:16.132\",\"app\":\"kms-server[1:1]\",\"level_int\":\"6\",\"function\":\"loadConfig()\",\"message\":\"Log configuration - Tracing: 'Parameters'\"}\n{\"date\":1769688916.403,\"time\":\"2026-01-29 12:15:16.403\",\"app\":\"kms-server[1:1]\",\"level_int\":\"5\",\"function\":\"C_Initialize()\",\"message\":\"rv: CKR_OK\"}\n{\"date\":1769688916.403,\"time\":\"2026-01-29 12:15:16.403\",\"app\":\"kms-server[1:1]\",\"level_int\":\"5\",\"function\":\"C_GetSlotList()\",\"message\":\"rv: CKR_OK\"}\n{\"date\":1769688916.403,\"time\":\"2026-01-29 12:15:16.403\",\"app\":\"kms-server[1:1]\",\"level_int\":\"5\",\"function\":\"C_GetSlotList()\",\"message\":\"rv: CKR_OK\"}\n{\"date\":1769688916.439,\"time\":\"2026-01-29 12:15:16.439\",\"app\":\"kms-server[1:1]\",\"level_int\":\"5\",\"function\":\"C_GetTokenInfo()\",\"message\":\"rv: CKR_OK\"}\n{\"date\":1769688916.439,\"time\":\"2026-01-29 12:15:16.439\",\"app\":\"kms-server[1:1]\",\"level_int\":\"5\",\"function\":\"C_OpenSession()\",\"message\":\"rv: CKR_OK\"}\n{\"date\":1769688916.471,\"time\":\"2026-01-29 12:15:16.471\",\"app\":\"kms-server[1:1]\",\"level_int\":\"5\",\"function\":\"C_Login()\",\"message\":\"rv: CKR_OK\"}\n","lang":"log"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"troubleshooting","__idx":21},"children":["Troubleshooting"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.securosys.com/pkcs/Tutorials/troubleshooting/"},"children":["PKCS#11 Troubleshooting"]},"."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"production-best-practices","__idx":22},"children":["Production best practices"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["See ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/custody/deployment/integrate-kms/production-best-practices"},"children":["Production best practices"]}]}," for detailed instructions that apply to all KMS platforms."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For production-ready Securosys Primus HSM deployments, implement the following patterns."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"securosys-primus-hsm-specific-considerations","__idx":23},"children":["Securosys Primus HSM-specific considerations"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Practice"},"children":["Practice"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Securosys Primus HSM Implementation"},"children":["Securosys Primus HSM Implementation"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["High Availability"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Configure Securosys Primus HA groups with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["hagroup createGroup"]}," and add multiple HSM members"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Namespace Segmentation"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["One partition per application (","Ripple Custody",") per environment (to ensure the partition master keys differ between environments)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Backup"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["partition backup"]}," command, store backups securely, test quarterly"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HA Sync"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Regularly verify HA group synchronization with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["hagroup synchronize"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Securosys Primus HSM HA group configuration"]},":"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["hagroup createGroup"]}," to create HA groups for notary and vault partitions"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Configure ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["HAOnly = 1"]}," in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Chrystoki.conf"]}," to ensure operations only use HA groups"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VirtualTokenActiveRecovery = activeEnhanced"]}," for automatic failover -->"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"next-steps","__idx":24},"children":["Next steps"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After successfully integrating Securosys Primus HSM with ","Ripple Custody",":"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Backup HSM keys"]},": Implement backup procedures for SKS master keys."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Back up SMK to a secondary Securosys Primus HSM"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Store backup HSM in secure, off-site location"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Document recovery procedures"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Production hardening"]},":"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enable HSM audit logging"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Configure HSM monitoring and alerting"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Implement HSM access controls (role-based access)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Schedule regular HSM firmware updates"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Disaster recovery planning"]},":"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Document HSM replacement procedures"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Test HA failover scenarios"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create runbooks for common HSM issues"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Establish HSM vendor support contacts"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Security audit"]},":"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Review HSM policies and partition configurations"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verify network ACLs are restrictive"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Test backup and recovery procedures"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Review ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/custody/deployment/integrate-kms/production-best-practices"},"children":["Production best practices"]}]}," for namespace segmentation, HA patterns, and monitoring"]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"success"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Congratulations!"]}," You have successfully integrated Securosys Primus HSM with ","Ripple Custody",". Your notary and vault components are now protected by FIPS 140-2 Level 3 certified hardware security."]}]}]},"headings":[{"value":"Securosys Primus HSM integration guide","id":"securosys-primus-hsm-integration-guide","depth":1},{"value":"Overview","id":"overview","depth":2},{"value":"Supported hardware","id":"supported-hardware","depth":3},{"value":"How Ripple Custody uses Securosys Primus HSM","id":"how-ripple-custody-uses-securosys-primus-hsm","depth":3},{"value":"Deployment architecture","id":"deployment-architecture","depth":3},{"value":"Prerequisites","id":"prerequisites","depth":2},{"value":"Hardware and software requirements","id":"hardware-and-software-requirements","depth":3},{"value":"Key derivation scheme","id":"key-derivation-scheme","depth":3},{"value":"Documentation references (Securosys)","id":"documentation-references-securosys","depth":3},{"value":"HSM initialization","id":"hsm-initialization","depth":2},{"value":"Step 1: Deploy and initialize Securosys Primus HSM appliance","id":"step-1-deploy-and-initialize-securosys-primus-hsm-appliance","depth":3},{"value":"Step 2: Configure the HSM","id":"step-2-configure-the-hsm","depth":3},{"value":"Step 3: Fetch permanent secret","id":"step-3-fetch-permanent-secret","depth":3},{"value":"Step 4: Configure high availability (HA) groups","id":"step-4-configure-high-availability-ha-groups","depth":3},{"value":"Step 5: Configure network access and mTLS","id":"step-5-configure-network-access-and-mtls","depth":3},{"value":"Step 6: Verify HSM connectivity","id":"step-6-verify-hsm-connectivity","depth":3},{"value":"Ripple Custody configuration","id":"ripple-custody-configuration","depth":2},{"value":"Step 1: Gather the configuration information","id":"step-1-gather-the-configuration-information","depth":3},{"value":"Step 2: Configure notary with Securosys Primus HSM","id":"step-2-configure-notary-with-securosys-primus-hsm","depth":3},{"value":"Step 3: Configure vault with Securosys Primus HSM","id":"step-3-configure-vault-with-securosys-primus-hsm","depth":3},{"value":"Verification and testing","id":"verification-and-testing","depth":2},{"value":"Troubleshooting","id":"troubleshooting","depth":2},{"value":"Production best practices","id":"production-best-practices","depth":2},{"value":"Securosys Primus HSM-specific considerations","id":"securosys-primus-hsm-specific-considerations","depth":3},{"value":"Next steps","id":"next-steps","depth":2}],"frontmatter":{"seo":{"title":"Securosys Primus HSM integration guide"}},"lastModified":"2026-08-04T20:25:11.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/products/custody/deployment/integrate-kms/on-premise-hsm/securosys-primus","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}