feat: (core) Photo and Friend binding documents #794

Description

@coodos

Summary

Implement secondary trust signals:

  • Photo binding (Veriff-only) signed/attested by Remote CA
  • Friend attestation bindings with mandatory countersign by the subject

Photo binding (Veriff-only)

  • Created only during Veriff flows
  • Remote CA signs attestation tying face evidence reference/hash to subject eName
  • Stored in encrypted binding-doc sector

Friend binding

  • Subject requests friend signature from share ePassport modal
  • Friend signs assertion tying claimed detail(s) to subject eName
  • Subject countersigns for validity

Mermaid — photo binding creation

sequenceDiagram
participant Veriff
participant App
participant CA as Remote CA
participant Vault as eVault
Veriff -->> App: Face evidence ref or hash
App ->> CA: Request PHOTO binding attestation (eName, evidenceRef)
CA -->> App: PhotoBindingDoc (CA-signed)
App ->> Vault: Store PhotoBindingDoc
Loading

Mermaid — friend binding sequence

sequenceDiagram
actor Subject
actor Friend
participant AppS as Subject App
participant AppF as Friend App
participant VaultS as Subject eVault
participant VaultF as Friend eVault
Subject ->> AppS: Create friend-binding request
AppS -->> Friend: Share request link or payload
Friend ->> AppF: Open request
AppF ->> VaultF: Sign FRIEND binding doc
VaultF -->> AppF: FriendBindingDoc
AppF -->> Subject: Send FriendBindingDoc
Subject ->> AppS: Review friend binding
AppS ->> VaultS: Counter-sign FriendBindingDoc
VaultS -->> AppS: CountersignedFriendBindingDoc
AppS ->> VaultS: Store CountersignedFriendBindingDoc
Loading

Acceptance criteria

  • Photo binding documents are created only via Veriff flows.
  • Remote CA signs/attests photo binding tying evidence to subject eName.
  • Users can request friend signatures via share ePassport modal.
  • Friend binding documents must be countersigned by the subject to be valid.
  • Non-countersigned friend bindings are ignored by verification and UI trust scoring.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
     blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    
    Skip to content

    feat: (core) Photo and Friend binding documents #794

    Description

    @coodos

    Summary

    Implement secondary trust signals:

    • Photo binding (Veriff-only) signed/attested by Remote CA
    • Friend attestation bindings with mandatory countersign by the subject

    Photo binding (Veriff-only)

    • Created only during Veriff flows
    • Remote CA signs attestation tying face evidence reference/hash to subject eName
    • Stored in encrypted binding-doc sector

    Friend binding

    • Subject requests friend signature from share ePassport modal
    • Friend signs assertion tying claimed detail(s) to subject eName
    • Subject countersigns for validity

    Mermaid — photo binding creation

    sequenceDiagram
    participant Veriff
    participant App
    participant CA as Remote CA
    participant Vault as eVault
    Veriff -->> App: Face evidence ref or hash
    App ->> CA: Request PHOTO binding attestation (eName, evidenceRef)
    CA -->> App: PhotoBindingDoc (CA-signed)
    App ->> Vault: Store PhotoBindingDoc
    
    Loading

    Mermaid — friend binding sequence

    sequenceDiagram
    actor Subject
    actor Friend
    participant AppS as Subject App
    participant AppF as Friend App
    participant VaultS as Subject eVault
    participant VaultF as Friend eVault
    Subject ->> AppS: Create friend-binding request
    AppS -->> Friend: Share request link or payload
    Friend ->> AppF: Open request
    AppF ->> VaultF: Sign FRIEND binding doc
    VaultF -->> AppF: FriendBindingDoc
    AppF -->> Subject: Send FriendBindingDoc
    Subject ->> AppS: Review friend binding
    AppS ->> VaultS: Counter-sign FriendBindingDoc
    VaultS -->> AppS: CountersignedFriendBindingDoc
    AppS ->> VaultS: Store CountersignedFriendBindingDoc
    
    Loading

    Acceptance criteria

    • Photo binding documents are created only via Veriff flows.
    • Remote CA signs/attests photo binding tying evidence to subject eName.
    • Users can request friend signatures via share ePassport modal.
    • Friend binding documents must be countersigned by the subject to be valid.
    • Non-countersigned friend bindings are ignored by verification and UI trust scoring.

    Metadata

    Metadata

    Assignees

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
      Skip to content

      feat: (core) Photo and Friend binding documents #794

      Description

      @coodos

      Summary

      Implement secondary trust signals:

      • Photo binding (Veriff-only) signed/attested by Remote CA
      • Friend attestation bindings with mandatory countersign by the subject

      Photo binding (Veriff-only)

      • Created only during Veriff flows
      • Remote CA signs attestation tying face evidence reference/hash to subject eName
      • Stored in encrypted binding-doc sector

      Friend binding

      • Subject requests friend signature from share ePassport modal
      • Friend signs assertion tying claimed detail(s) to subject eName
      • Subject countersigns for validity

      Mermaid — photo binding creation

      sequenceDiagram
      participant Veriff
      participant App
      participant CA as Remote CA
      participant Vault as eVault
      Veriff -->> App: Face evidence ref or hash
      App ->> CA: Request PHOTO binding attestation (eName, evidenceRef)
      CA -->> App: PhotoBindingDoc (CA-signed)
      App ->> Vault: Store PhotoBindingDoc
      
      Loading

      Mermaid — friend binding sequence

      sequenceDiagram
      actor Subject
      actor Friend
      participant AppS as Subject App
      participant AppF as Friend App
      participant VaultS as Subject eVault
      participant VaultF as Friend eVault
      Subject ->> AppS: Create friend-binding request
      AppS -->> Friend: Share request link or payload
      Friend ->> AppF: Open request
      AppF ->> VaultF: Sign FRIEND binding doc
      VaultF -->> AppF: FriendBindingDoc
      AppF -->> Subject: Send FriendBindingDoc
      Subject ->> AppS: Review friend binding
      AppS ->> VaultS: Counter-sign FriendBindingDoc
      VaultS -->> AppS: CountersignedFriendBindingDoc
      AppS ->> VaultS: Store CountersignedFriendBindingDoc
      
      Loading

      Acceptance criteria

      • Photo binding documents are created only via Veriff flows.
      • Remote CA signs/attests photo binding tying evidence to subject eName.
      • Users can request friend signatures via share ePassport modal.
      • Friend binding documents must be countersigned by the subject to be valid.
      • Non-countersigned friend bindings are ignored by verification and UI trust scoring.

      Metadata

      Metadata

      Assignees

      Labels

      No labels
      No labels

      Type

      No type

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
        Skip to content

        feat: (core) Photo and Friend binding documents #794

        Description

        @coodos

        Summary

        Implement secondary trust signals:

        • Photo binding (Veriff-only) signed/attested by Remote CA
        • Friend attestation bindings with mandatory countersign by the subject

        Photo binding (Veriff-only)

        • Created only during Veriff flows
        • Remote CA signs attestation tying face evidence reference/hash to subject eName
        • Stored in encrypted binding-doc sector

        Friend binding

        • Subject requests friend signature from share ePassport modal
        • Friend signs assertion tying claimed detail(s) to subject eName
        • Subject countersigns for validity

        Mermaid — photo binding creation

        sequenceDiagram
        participant Veriff
        participant App
        participant CA as Remote CA
        participant Vault as eVault
        Veriff -->> App: Face evidence ref or hash
        App ->> CA: Request PHOTO binding attestation (eName, evidenceRef)
        CA -->> App: PhotoBindingDoc (CA-signed)
        App ->> Vault: Store PhotoBindingDoc
        
        Loading

        Mermaid — friend binding sequence

        sequenceDiagram
        actor Subject
        actor Friend
        participant AppS as Subject App
        participant AppF as Friend App
        participant VaultS as Subject eVault
        participant VaultF as Friend eVault
        Subject ->> AppS: Create friend-binding request
        AppS -->> Friend: Share request link or payload
        Friend ->> AppF: Open request
        AppF ->> VaultF: Sign FRIEND binding doc
        VaultF -->> AppF: FriendBindingDoc
        AppF -->> Subject: Send FriendBindingDoc
        Subject ->> AppS: Review friend binding
        AppS ->> VaultS: Counter-sign FriendBindingDoc
        VaultS -->> AppS: CountersignedFriendBindingDoc
        AppS ->> VaultS: Store CountersignedFriendBindingDoc
        
        Loading

        Acceptance criteria

        • Photo binding documents are created only via Veriff flows.
        • Remote CA signs/attests photo binding tying evidence to subject eName.
        • Users can request friend signatures via share ePassport modal.
        • Friend binding documents must be countersigned by the subject to be valid.
        • Non-countersigned friend bindings are ignored by verification and UI trust scoring.

        Metadata

        Metadata

        Assignees

        Labels

        No labels
        No labels

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
          Skip to content

          feat: (core) Photo and Friend binding documents #794

          Description

          @coodos

          Summary

          Implement secondary trust signals:

          • Photo binding (Veriff-only) signed/attested by Remote CA
          • Friend attestation bindings with mandatory countersign by the subject

          Photo binding (Veriff-only)

          • Created only during Veriff flows
          • Remote CA signs attestation tying face evidence reference/hash to subject eName
          • Stored in encrypted binding-doc sector

          Friend binding

          • Subject requests friend signature from share ePassport modal
          • Friend signs assertion tying claimed detail(s) to subject eName
          • Subject countersigns for validity

          Mermaid — photo binding creation

          sequenceDiagram
          participant Veriff
          participant App
          participant CA as Remote CA
          participant Vault as eVault
          Veriff -->> App: Face evidence ref or hash
          App ->> CA: Request PHOTO binding attestation (eName, evidenceRef)
          CA -->> App: PhotoBindingDoc (CA-signed)
          App ->> Vault: Store PhotoBindingDoc
          
          Loading

          Mermaid — friend binding sequence

          sequenceDiagram
          actor Subject
          actor Friend
          participant AppS as Subject App
          participant AppF as Friend App
          participant VaultS as Subject eVault
          participant VaultF as Friend eVault
          Subject ->> AppS: Create friend-binding request
          AppS -->> Friend: Share request link or payload
          Friend ->> AppF: Open request
          AppF ->> VaultF: Sign FRIEND binding doc
          VaultF -->> AppF: FriendBindingDoc
          AppF -->> Subject: Send FriendBindingDoc
          Subject ->> AppS: Review friend binding
          AppS ->> VaultS: Counter-sign FriendBindingDoc
          VaultS -->> AppS: CountersignedFriendBindingDoc
          AppS ->> VaultS: Store CountersignedFriendBindingDoc
          
          Loading

          Acceptance criteria

          • Photo binding documents are created only via Veriff flows.
          • Remote CA signs/attests photo binding tying evidence to subject eName.
          • Users can request friend signatures via share ePassport modal.
          • Friend binding documents must be countersigned by the subject to be valid.
          • Non-countersigned friend bindings are ignored by verification and UI trust scoring.

          Metadata

          Metadata

          Assignees

          Labels

          No labels
          No labels

          Type

          No type

          Projects

          No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
            Skip to content

            feat: (core) Photo and Friend binding documents #794

            Description

            @coodos

            Summary

            Implement secondary trust signals:

            • Photo binding (Veriff-only) signed/attested by Remote CA
            • Friend attestation bindings with mandatory countersign by the subject

            Photo binding (Veriff-only)

            • Created only during Veriff flows
            • Remote CA signs attestation tying face evidence reference/hash to subject eName
            • Stored in encrypted binding-doc sector

            Friend binding

            • Subject requests friend signature from share ePassport modal
            • Friend signs assertion tying claimed detail(s) to subject eName
            • Subject countersigns for validity

            Mermaid — photo binding creation

            sequenceDiagram
            participant Veriff
            participant App
            participant CA as Remote CA
            participant Vault as eVault
            Veriff -->> App: Face evidence ref or hash
            App ->> CA: Request PHOTO binding attestation (eName, evidenceRef)
            CA -->> App: PhotoBindingDoc (CA-signed)
            App ->> Vault: Store PhotoBindingDoc
            
            Loading

            Mermaid — friend binding sequence

            sequenceDiagram
            actor Subject
            actor Friend
            participant AppS as Subject App
            participant AppF as Friend App
            participant VaultS as Subject eVault
            participant VaultF as Friend eVault
            Subject ->> AppS: Create friend-binding request
            AppS -->> Friend: Share request link or payload
            Friend ->> AppF: Open request
            AppF ->> VaultF: Sign FRIEND binding doc
            VaultF -->> AppF: FriendBindingDoc
            AppF -->> Subject: Send FriendBindingDoc
            Subject ->> AppS: Review friend binding
            AppS ->> VaultS: Counter-sign FriendBindingDoc
            VaultS -->> AppS: CountersignedFriendBindingDoc
            AppS ->> VaultS: Store CountersignedFriendBindingDoc
            
            Loading

            Acceptance criteria

            • Photo binding documents are created only via Veriff flows.
            • Remote CA signs/attests photo binding tying evidence to subject eName.
            • Users can request friend signatures via share ePassport modal.
            • Friend binding documents must be countersigned by the subject to be valid.
            • Non-countersigned friend bindings are ignored by verification and UI trust scoring.

            Metadata

            Metadata

            Assignees

            Labels

            No labels
            No labels

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              feat: (core) Photo and Friend binding documents #794

              Description

              @coodos

              Summary

              Implement secondary trust signals:

              • Photo binding (Veriff-only) signed/attested by Remote CA
              • Friend attestation bindings with mandatory countersign by the subject

              Photo binding (Veriff-only)

              • Created only during Veriff flows
              • Remote CA signs attestation tying face evidence reference/hash to subject eName
              • Stored in encrypted binding-doc sector

              Friend binding

              • Subject requests friend signature from share ePassport modal
              • Friend signs assertion tying claimed detail(s) to subject eName
              • Subject countersigns for validity

              Mermaid — photo binding creation

              sequenceDiagram
              participant Veriff
              participant App
              participant CA as Remote CA
              participant Vault as eVault
              Veriff -->> App: Face evidence ref or hash
              App ->> CA: Request PHOTO binding attestation (eName, evidenceRef)
              CA -->> App: PhotoBindingDoc (CA-signed)
              App ->> Vault: Store PhotoBindingDoc
              
              Loading

              Mermaid — friend binding sequence

              sequenceDiagram
              actor Subject
              actor Friend
              participant AppS as Subject App
              participant AppF as Friend App
              participant VaultS as Subject eVault
              participant VaultF as Friend eVault
              Subject ->> AppS: Create friend-binding request
              AppS -->> Friend: Share request link or payload
              Friend ->> AppF: Open request
              AppF ->> VaultF: Sign FRIEND binding doc
              VaultF -->> AppF: FriendBindingDoc
              AppF -->> Subject: Send FriendBindingDoc
              Subject ->> AppS: Review friend binding
              AppS ->> VaultS: Counter-sign FriendBindingDoc
              VaultS -->> AppS: CountersignedFriendBindingDoc
              AppS ->> VaultS: Store CountersignedFriendBindingDoc
              
              Loading

              Acceptance criteria

              • Photo binding documents are created only via Veriff flows.
              • Remote CA signs/attests photo binding tying evidence to subject eName.
              • Users can request friend signatures via share ePassport modal.
              • Friend binding documents must be countersigned by the subject to be valid.
              • Non-countersigned friend bindings are ignored by verification and UI trust scoring.

              Metadata

              Metadata

              Assignees

              Labels

              No labels
              No labels

              Type

              No type

              Projects

              No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                Skip to content

                feat: (core) Photo and Friend binding documents #794

                Description

                @coodos

                Summary

                Implement secondary trust signals:

                • Photo binding (Veriff-only) signed/attested by Remote CA
                • Friend attestation bindings with mandatory countersign by the subject

                Photo binding (Veriff-only)

                • Created only during Veriff flows
                • Remote CA signs attestation tying face evidence reference/hash to subject eName
                • Stored in encrypted binding-doc sector

                Friend binding

                • Subject requests friend signature from share ePassport modal
                • Friend signs assertion tying claimed detail(s) to subject eName
                • Subject countersigns for validity

                Mermaid — photo binding creation

                sequenceDiagram
                participant Veriff
                participant App
                participant CA as Remote CA
                participant Vault as eVault
                Veriff -->> App: Face evidence ref or hash
                App ->> CA: Request PHOTO binding attestation (eName, evidenceRef)
                CA -->> App: PhotoBindingDoc (CA-signed)
                App ->> Vault: Store PhotoBindingDoc
                
                Loading

                Mermaid — friend binding sequence

                sequenceDiagram
                actor Subject
                actor Friend
                participant AppS as Subject App
                participant AppF as Friend App
                participant VaultS as Subject eVault
                participant VaultF as Friend eVault
                Subject ->> AppS: Create friend-binding request
                AppS -->> Friend: Share request link or payload
                Friend ->> AppF: Open request
                AppF ->> VaultF: Sign FRIEND binding doc
                VaultF -->> AppF: FriendBindingDoc
                AppF -->> Subject: Send FriendBindingDoc
                Subject ->> AppS: Review friend binding
                AppS ->> VaultS: Counter-sign FriendBindingDoc
                VaultS -->> AppS: CountersignedFriendBindingDoc
                AppS ->> VaultS: Store CountersignedFriendBindingDoc
                
                Loading

                Acceptance criteria

                • Photo binding documents are created only via Veriff flows.
                • Remote CA signs/attests photo binding tying evidence to subject eName.
                • Users can request friend signatures via share ePassport modal.
                • Friend binding documents must be countersigned by the subject to be valid.
                • Non-countersigned friend bindings are ignored by verification and UI trust scoring.

                Metadata

                Metadata

                Assignees

                Labels

                No labels
                No labels

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions