CINXE.COM
Signal >> Documentation
<!DOCTYPE html><html lang="en"><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description" content=""><meta name="author" content=""><link rel="alternate" type="application/rss+xml" title="RSS Feed" href="/blog/rss.xml" /><meta property="og:title" content="Documentation" /><meta property="og:site_name" content="Signal Messenger" /><meta property="og:type" content="website" /><meta property="og:description" content="Specifications and software libraries for developers." /><meta property="og:url" content="https://signal.org/docs/" /><meta property="og:image" content="https://signal.org/assets/images/og/og-image.png" /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="630" /><meta name="twitter:site" content="@signalapp"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:creator" content="@signalapp"><meta name="twitter:url" content="https://signal.org/docs/"><meta name="twitter:title" content="Documentation"><meta name="twitter:description" content="Specifications and software libraries for developers."><title>Signal >> Documentation</title><link rel="me" href="https://mastodon.world/@signalapp"><link rel="apple-touch-icon" sizes="180x180" href="/assets/images/favicon/apple-touch-icon.png"><link rel="icon" type="image/svg+xml" href="/assets/images/favicon/favicon.svg"><link rel="icon" type="image/png" sizes="32x32" href="/assets/images/favicon/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/assets/images/favicon/favicon-16x16.png"><link rel="manifest" href="/assets/images/favicon/site.webmanifest"><link rel="mask-icon" href="/assets/images/favicon/safari-pinned-tab.svg" color="#3b45fd"><meta name="msapplication-TileColor" content="#e3e8fe"><meta name="msapplication-config" content="/assets/images/favicon/browserconfig.xml"><meta name="theme-color" content="#e3e8fe"><link rel="preload" href="/assets/fonts/inter/Inter-Regular.woff2" as="font" crossorigin="anonymous"><link rel="preload" href="/assets/fonts/inter/Inter-ExtraBold.woff2" as="font" crossorigin="anonymous"><link type="text/css" rel="stylesheet" href="/assets/stylesheets/vendor/bulma-0.8.0.min.css"><link type="text/css" rel="stylesheet" href="/assets/stylesheets/ultramarine.css"><body id="signal" class="index has-navbar-fixed-top"><nav class="navbar signal-navbar is-fixed-top" role="navigation" aria-label="main navigation"><div class="container"><div class="navbar-brand"> <a href="/#signal"> <img class="signal-logo" src="/assets/images/header/logo.png"/> </a> <a role="button" class="navbar-burger burger" aria-label="menu" aria-expanded="false" data-target="signalNavbar"> <span aria-hidden="true"></span> <span aria-hidden="true"></span> <span aria-hidden="true"></span> </a></div><div id="signalNavbar" class="navbar-menu"><div class="navbar-end"> <a class="navbar-item get-signal" href="/download/">Get Signal</a> <a class="navbar-item" href="https://support.signal.org">Help</a> <a class="navbar-item" href="/blog/">Blog</a> <a class="navbar-item" href="/docs/">Developers</a> <a class="navbar-item" href="/workworkwork/">Careers</a> <a class="navbar-item" href="/donate/">Donate</a></div></div></div></nav><header class="section documentation"><div class="container"><div class="columns is-desktop is-vcentered"><div class="column is-half"><h1>Technical information</h1><p class="body1"> Specifications and software libraries for developers</div><div class="column is-half"> <img src="/assets/images/header/header-developers.png"/></div></div></div></header><section class="section docs"><div class="container"><div class="columns"><div class="column is-6"><h2>Specifications</h2><p class="body1"> Encryption in messaging environments integrates many ideas which often need to be composed separately in different applications. We make an effort to break out ideas into independent specifications so that they can be integrated as appropriate for different projects.</div></div><div class="columns"><div class="column is-6"><p class="body2 semibold"> <a href="/docs/specifications/xeddsa/">XEdDSA and VXEdDSA</a><p class="body2 spec"> This document describes how to create and verify EdDSA-compatible signatures using public key and private key formats initially defined for the X25519 and X448 elliptic curve Diffie-Hellman functions. This document also describes "VXEdDSA" which extends XEdDSA to make it a verifiable random function, or VRF.<p class="body2 semibold"> <a href="/docs/specifications/x3dh/">X3DH</a><p class="body2 spec"> This document describes the "X3DH" (or "Extended Triple Diffie-Hellman") key agreement protocol. X3DH establishes a shared secret key between two parties who mutually authenticate each other based on public keys. X3DH provides forward secrecy and cryptographic deniability.<p class="body2 semibold"> <a href="/docs/specifications/pqxdh/">PQXDH</a><p class="body2 spec"> This document describes the "PQXDH" (or "Post-Quantum Extended Diffie-Hellman") key agreement protocol. PQXDH establishes a shared secret key between two parties who mutually authenticate each other based on public keys. PQXDH provides post-quantum forward secrecy and a form of cryptographic deniability but still relies on the hardness of the discrete log problem for mutual authentication in this revision of the protocol.</div><div class="column is-6"><p class="body2 semibold"> <a href="/docs/specifications/doubleratchet/">Double Ratchet</a><p class="body2 spec"> This document describes the Double Ratchet algorithm, which is used by two parties to exchange encrypted messages based on a shared secret key. The parties derive new keys for every Double Ratchet message so that earlier keys cannot be calculated from later ones. The parties also send Diffie-Hellman public values attached to their messages. The results of Diffie-Hellman calculations are mixed into the derived keys so that later keys cannot be calculated from earlier ones. These properties give some protection to earlier or later encrypted messages in case of a compromise of a party's keys.<p class="body2 semibold"> <a href="/docs/specifications/sesame/">Sesame</a><p class="body2 spec"> This document describes the Sesame algorithm for managing message encryption sessions in an asynchronous and multi-device setting.</div></div></div></section><section class="section docs"><div class="container"><div class="columns"><div class="column"><h2>Software libraries</h2><ul><li><a href="https://github.com/signalapp/libsignal">Signal Protocol library</a></ul></div></div></div></section><footer class="footer"><div class="container"><div class="columns"><div class="column is-two-fifths is-hidden-mobile"> <span class="copyright">© 2013–2025 Signal, a 501c3 nonprofit.</span><br /> "Signal", Signal logos, and other trademarks are trademarks or registered trademarks of Signal Technology Foundation in the United States and other countries (<a href="/brand/">more info here</a>). <br /> <br /> For media inquiries, contact <a href="/cdn-cgi/l/email-protection#ea9a988f9999aa99838d848b86c485988d"><span class="__cf_email__" data-cfemail="daaaa8bfa9a99aa9b3bdb4bbb6f4b5a8bd">[email protected]</span></a></div><div class="column"> <strong>Organization</strong><ul><li> <a href="/donate/">Donate</a><li> <a href="/workworkwork/">Careers</a><li> <a href="/blog/">Blog</a><li> <a href="/brand/">Brand Assets</a><li> <a href="/legal/">Terms & Privacy Policy</a></ul></div><div class="column"> <strong>Download</strong><ul><li> <a href="/download/android/">Android</a><li> <a href="/download/ios/">iPhone & iPad</a><li> <a href="/download/windows/">Windows</a><li> <a href="/download/macos/">Mac</a><li> <a href="/download/linux/">Linux</a></ul></div><div class="column"> <strong>Social</strong><ul><li> <a href="https://bsky.app/profile/signal.org" target="_blank">Bluesky</a><li> <a href="https://github.com/signalapp" target="_blank">GitHub</a><li> <a href="https://www.instagram.com/signal_app/" target="_blank">Instagram</a><li> <a href="https://mastodon.world/@signalapp" target="_blank">Mastodon</a><li> <a href="https://x.com/signalapp" target="_blank">X</a></ul></div><div class="column"> <strong>Help</strong><ul><li> <a href="https://support.signal.org">Support Center</a><li> <a href="https://community.signalusers.org/">Community</a></ul></div><div class="column is-two-fifths is-hidden-tablet"> <span class="copyright">© 2013–2025 Signal, a 501c3 nonprofit.</span><br /> "Signal", Signal logos, and other trademarks are trademarks or registered trademarks of Signal Technology Foundation in the United States and other countries (<a href="/brand/">more info here</a>). <br /> <br /> For media inquiries, contact <a href="/cdn-cgi/l/email-protection#d9a9abbcaaaa99aab0beb7b8b5f7b6abbe"><span class="__cf_email__" data-cfemail="83f3f1e6f0f0c3f0eae4ede2efadecf1e4">[email protected]</span></a></div></div></div></footer><script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script type="text/javascript" src="/assets/javascripts/vendor/jquery-3.7.1.min.js"></script> <script type="text/javascript" src="/assets/javascripts/vendor/lottie-player-2.0.3.min.js"></script> <script type="text/javascript"> document.addEventListener('DOMContentLoaded', () => { var userAgent = navigator.userAgent.toLowerCase(); var isIOS = ( userAgent.indexOf('iphone') !== -1 || userAgent.indexOf('ipad') !== -1 || userAgent.indexOf('ipod') !== -1 ); var isAndroid = userAgent.indexOf('android') !== -1; var $downloadSignal = $('.get-signal'); if (isIOS || isAndroid) { var url = isIOS ? 'https://apps.apple.com/us/app/signal-private-messenger/id874139669' : 'https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms'; $downloadSignal.prop('href', url); $downloadSignal.html('<span>Get Signal</span> <i class="icon icon-external-link-alt"></i>'); } const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger')); if ($navbarBurgers.length > 0) { $navbarBurgers.forEach((el) => { el.addEventListener('click', () => { const target = el.dataset.target; const $target = document.getElementById(target); el.classList.toggle('is-active'); $target.classList.toggle('is-active'); }); }); } }); </script>