CINXE.COM

Privacy Pass

<!DOCTYPE html><html lang="en-us" dir="ltr"> <head><script async src="https://ot.www.cloudflare.com/public/vendor/onetrust/scripttemplates/otSDKStub.js" data-document-language="true" type="text/javascript" data-domain-script="b1e05d49-f072-4bae-9116-bdb78af15448"></script><meta name="HandheldFriendly" content="True"><meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="baidu-site-verification" content="KeThzeyMOr"><meta name="baidu-site-verification" content="code-NIlrS7gNhx"><meta charset="UTF-8"><meta name="description" content="Get the latest news on how products at Cloudflare are built, technologies used, and join the teams helping to build a better Internet."><title>Privacy Pass</title><meta name="title" content="Privacy Pass"><meta name="msvalidate.01" content="CF295E1604697F9CAD18B5A232E871F6"><meta class="swiftype" name="language" data-type="string" content="en"><script src="/static/z/i.js" type="text/javascript" referrerpolicy="origin"></script><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="apple-touch-icon" sizes="180x180" href="/images/favicon-32x32.png"><link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-32x32.png"><link rel="mask-icon" href="/images/favicon-32x32.png" color="#f78100"><link rel="stylesheet" href="/themes/ashes.min.css"><link rel="sitemap" href="/sitemap.xml"><meta name="msapplication-TileColor" content="#da532c"><meta name="theme-color" content="#ffffff"><link rel="canonical" href="https://blog.cloudflare.com/tag/privacy-pass/"><link rel="alternate" type="application/rss+xml" title="Cloudflare Privacy Pass RSS Feed" href="/tag/privacy-pass/rss"><link rel="alternate" hreflang="en-us" href="https://blog.cloudflare.com/tag/privacy-pass/"><link rel="alternate" hreflang="de-de" href="https://blog.cloudflare.com/de-de/tag/privacy-pass/"><link rel="alternate" hreflang="es-es" href="https://blog.cloudflare.com/es-es/tag/privacy-pass/"><link rel="alternate" hreflang="fr-fr" href="https://blog.cloudflare.com/fr-fr/tag/privacy-pass/"><link rel="alternate" hreflang="ja-jp" href="https://blog.cloudflare.com/ja-jp/tag/privacy-pass/"><link rel="alternate" hreflang="zh-tw" href="https://blog.cloudflare.com/zh-tw/tag/privacy-pass/"><link rel="alternate" hreflang="zh-cn" href="https://blog.cloudflare.com/zh-cn/tag/privacy-pass/"><!-- General Meta Tags --><meta property="article:publisher" content="https://www.facebook.com/cloudflare"><!-- Facebook Meta Tags --><meta property="og:site_name" content="The Cloudflare Blog"><meta property="og:type" content="website"><meta property="og:title" content="The Cloudflare Blog: Privacy Pass"><meta property="og:description" content="Collection of Cloudflare blog posts tagged 'Privacy Pass'"><meta property="og:url" content="https://blog.cloudflare.com/tag/privacy-pass/"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="628"><!-- Twitter/X Meta Tags --><meta name="twitter:title" content="The Cloudflare Blog: Privacy Pass"><meta name="twitter:description" content="Collection of Cloudflare blog posts tagged 'Privacy Pass'"><meta name="twitter:url" content="https://blog.cloudflare.com/tag/privacy-pass/"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:site" content="@cloudflare"><meta property="og:image"><meta name="twitter:image"><link rel="stylesheet" href="/_astro/index.Bpd2cWaZ.css"></head><style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event("astro:only"));})();;(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var d=(i,o,a)=>g(i,typeof o!="symbol"?o+"":o,a);{let i={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[l,e]=t;return l in i?i[l](e):void 0},a=t=>t.map(o),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([l,e])=>[l,o(e)]));class y extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let c=this.querySelectorAll("astro-slot"),n={},h=this.querySelectorAll("template[data-astro-template]");for(let r of h){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("data-astro-template")||"default"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("name")||"default"]=r.innerHTML)}let p;try{p=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(r){let s=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(s+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${s}`,this.getAttribute("props"),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),c=this.getAttribute("client");if(Astro[c]===void 0){window.addEventListener(`astro:${c}`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute("renderer-url"),[h,{default:p}]=await Promise.all([import(this.getAttribute("component-url")),n?import(n):()=>()=>{}]),u=this.getAttribute("component-export")||"default";if(!u.includes("."))this.Component=h[u];else{this.Component=h;for(let f of u.split("."))this.Component=this.Component[f]}return this.hydrator=p,this.hydrate},e,this)}catch(n){console.error(`[astro-island] Error hydrating ${this.getAttribute("component-url")}`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",y)}})();</script><astro-island uid="Zxjr34" component-url="/_astro/GoogleAnalytics.DSjxwi8U.js" component-export="GoogleAnalytics" renderer-url="/_astro/client.DLO1yDVm.js" props="{&quot;title&quot;:[0,&quot;Privacy Pass&quot;],&quot;canonical&quot;:[0,&quot;https://blog.cloudflare.com/tag/privacy-pass&quot;],&quot;info&quot;:[0],&quot;tagInfo&quot;:[0,{&quot;id&quot;:[0,&quot;3ZtL0yV0R4ScAreV1dTfIY&quot;],&quot;slug&quot;:[0,&quot;privacy-pass&quot;],&quot;url&quot;:[0,&quot;https://blog.cloudflare.com/privacy-pass&quot;],&quot;name&quot;:[0,&quot;Privacy Pass&quot;],&quot;visibility&quot;:[0,&quot;public&quot;],&quot;feature_image&quot;:[0,&quot;&quot;]}],&quot;authorInfo&quot;:[0],&quot;translatedPosts&quot;:[1,[]]}" ssr client="only" opts="{&quot;name&quot;:&quot;GoogleAnalytics&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island><script>(()=>{var l=(n,t)=>{let i=async()=>{await(await n())()},e=typeof t.value=="object"?t.value:void 0,s={timeout:e==null?void 0:e.timeout};"requestIdleCallback"in window?window.requestIdleCallback(i,s):setTimeout(i,s.timeout||200)};(self.Astro||(self.Astro={})).idle=l;window.dispatchEvent(new Event("astro:idle"));})();</script><astro-island uid="DLSDj" prefix="r8" component-url="/_astro/Navigation.CSu6dGvY.js" component-export="Navigation" renderer-url="/_astro/client.DLO1yDVm.js" props="{&quot;title&quot;:[0,&quot;The Cloudflare Blog&quot;],&quot;logo&quot;:[0,&quot;//images.ctfassets.net/zkvhlag99gkb/69RwBidpiEHCDZ9rFVVk7T/092507edbed698420b89658e5a6d5105/CF_logo_stacked_blktype.png&quot;],&quot;pagesStore&quot;:[0,{&quot;page&quot;:[0,&quot;Tag&quot;],&quot;slug&quot;:[0,&quot;privacy-pass&quot;],&quot;translationsAvailable&quot;:[1,[[0,&quot;de-de&quot;],[0,&quot;es-es&quot;],[0,&quot;fr-fr&quot;],[0,&quot;ja-jp&quot;],[0,&quot;zh-tw&quot;],[0,&quot;zh-cn&quot;]]],&quot;navData&quot;:[1,[[0,{&quot;metadata&quot;:[0,{&quot;tags&quot;:[1,[]],&quot;concepts&quot;:[1,[]]}],&quot;sys&quot;:[0,{&quot;space&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Space&quot;],&quot;id&quot;:[0,&quot;zkvhlag99gkb&quot;]}]}],&quot;id&quot;:[0,&quot;J61Eszqn98amrYHq4IhTx&quot;],&quot;type&quot;:[0,&quot;Entry&quot;],&quot;createdAt&quot;:[0,&quot;2024-10-09T19:43:46.068Z&quot;],&quot;updatedAt&quot;:[0,&quot;2025-02-24T08:02:58.555Z&quot;],&quot;environment&quot;:[0,{&quot;sys&quot;:[0,{&quot;id&quot;:[0,&quot;master&quot;],&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Environment&quot;]}]}],&quot;publishedVersion&quot;:[0,67],&quot;revision&quot;:[0,29],&quot;contentType&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;ContentType&quot;],&quot;id&quot;:[0,&quot;blogTag&quot;]}]}],&quot;locale&quot;:[0,&quot;en-US&quot;]}],&quot;fields&quot;:[0,{&quot;entryTitle&quot;:[0,&quot;Zero Trust&quot;],&quot;name&quot;:[0,&quot;Zero Trust&quot;],&quot;slug&quot;:[0,&quot;zero-trust&quot;],&quot;featured&quot;:[0,true]}]}],[0,{&quot;metadata&quot;:[0,{&quot;tags&quot;:[1,[]],&quot;concepts&quot;:[1,[]]}],&quot;sys&quot;:[0,{&quot;space&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Space&quot;],&quot;id&quot;:[0,&quot;zkvhlag99gkb&quot;]}]}],&quot;id&quot;:[0,&quot;5kZtWqjqa7aOUoZr8NFGwI&quot;],&quot;type&quot;:[0,&quot;Entry&quot;],&quot;createdAt&quot;:[0,&quot;2024-10-09T19:43:26.040Z&quot;],&quot;updatedAt&quot;:[0,&quot;2025-02-18T05:02:47.858Z&quot;],&quot;environment&quot;:[0,{&quot;sys&quot;:[0,{&quot;id&quot;:[0,&quot;master&quot;],&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Environment&quot;]}]}],&quot;publishedVersion&quot;:[0,106],&quot;revision&quot;:[0,33],&quot;contentType&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;ContentType&quot;],&quot;id&quot;:[0,&quot;blogTag&quot;]}]}],&quot;locale&quot;:[0,&quot;en-US&quot;]}],&quot;fields&quot;:[0,{&quot;entryTitle&quot;:[0,&quot;Cloudflare Radar&quot;],&quot;name&quot;:[0,&quot;Radar&quot;],&quot;slug&quot;:[0,&quot;cloudflare-radar&quot;],&quot;featured&quot;:[0,true]}]}],[0,{&quot;metadata&quot;:[0,{&quot;tags&quot;:[1,[]],&quot;concepts&quot;:[1,[]]}],&quot;sys&quot;:[0,{&quot;space&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Space&quot;],&quot;id&quot;:[0,&quot;zkvhlag99gkb&quot;]}]}],&quot;id&quot;:[0,&quot;6Mp7ouACN2rT3YjL1xaXJx&quot;],&quot;type&quot;:[0,&quot;Entry&quot;],&quot;createdAt&quot;:[0,&quot;2024-10-09T19:42:46.231Z&quot;],&quot;updatedAt&quot;:[0,&quot;2025-02-18T05:02:46.749Z&quot;],&quot;environment&quot;:[0,{&quot;sys&quot;:[0,{&quot;id&quot;:[0,&quot;master&quot;],&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Environment&quot;]}]}],&quot;publishedVersion&quot;:[0,66],&quot;revision&quot;:[0,23],&quot;contentType&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;ContentType&quot;],&quot;id&quot;:[0,&quot;blogTag&quot;]}]}],&quot;locale&quot;:[0,&quot;en-US&quot;]}],&quot;fields&quot;:[0,{&quot;entryTitle&quot;:[0,&quot;Security&quot;],&quot;name&quot;:[0,&quot;Security&quot;],&quot;slug&quot;:[0,&quot;security&quot;],&quot;featured&quot;:[0,true]}]}],[0,{&quot;metadata&quot;:[0,{&quot;tags&quot;:[1,[]],&quot;concepts&quot;:[1,[]]}],&quot;sys&quot;:[0,{&quot;space&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Space&quot;],&quot;id&quot;:[0,&quot;zkvhlag99gkb&quot;]}]}],&quot;id&quot;:[0,&quot;6Foe3R8of95cWVnQwe5Toi&quot;],&quot;type&quot;:[0,&quot;Entry&quot;],&quot;createdAt&quot;:[0,&quot;2024-10-09T22:44:28.803Z&quot;],&quot;updatedAt&quot;:[0,&quot;2025-02-10T05:02:55.192Z&quot;],&quot;environment&quot;:[0,{&quot;sys&quot;:[0,{&quot;id&quot;:[0,&quot;master&quot;],&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Environment&quot;]}]}],&quot;publishedVersion&quot;:[0,62],&quot;revision&quot;:[0,23],&quot;contentType&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;ContentType&quot;],&quot;id&quot;:[0,&quot;blogTag&quot;]}]}],&quot;locale&quot;:[0,&quot;en-US&quot;]}],&quot;fields&quot;:[0,{&quot;entryTitle&quot;:[0,&quot;AI&quot;],&quot;name&quot;:[0,&quot;AI&quot;],&quot;slug&quot;:[0,&quot;ai&quot;],&quot;featured&quot;:[0,true]}]}],[0,{&quot;metadata&quot;:[0,{&quot;tags&quot;:[1,[]],&quot;concepts&quot;:[1,[]]}],&quot;sys&quot;:[0,{&quot;space&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Space&quot;],&quot;id&quot;:[0,&quot;zkvhlag99gkb&quot;]}]}],&quot;id&quot;:[0,&quot;6QktrXeEFcl4e2dZUTZVGl&quot;],&quot;type&quot;:[0,&quot;Entry&quot;],&quot;createdAt&quot;:[0,&quot;2024-10-09T19:43:20.198Z&quot;],&quot;updatedAt&quot;:[0,&quot;2025-02-04T17:23:05.518Z&quot;],&quot;environment&quot;:[0,{&quot;sys&quot;:[0,{&quot;id&quot;:[0,&quot;master&quot;],&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Environment&quot;]}]}],&quot;publishedVersion&quot;:[0,57],&quot;revision&quot;:[0,24],&quot;contentType&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;ContentType&quot;],&quot;id&quot;:[0,&quot;blogTag&quot;]}]}],&quot;locale&quot;:[0,&quot;en-US&quot;]}],&quot;fields&quot;:[0,{&quot;entryTitle&quot;:[0,&quot;Product News&quot;],&quot;name&quot;:[0,&quot;Product News&quot;],&quot;slug&quot;:[0,&quot;product-news&quot;],&quot;featured&quot;:[0,true]}]}],[0,{&quot;metadata&quot;:[0,{&quot;tags&quot;:[1,[]],&quot;concepts&quot;:[1,[]]}],&quot;sys&quot;:[0,{&quot;space&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Space&quot;],&quot;id&quot;:[0,&quot;zkvhlag99gkb&quot;]}]}],&quot;id&quot;:[0,&quot;4HIPcb68qM0e26fIxyfzwQ&quot;],&quot;type&quot;:[0,&quot;Entry&quot;],&quot;createdAt&quot;:[0,&quot;2024-10-09T19:43:21.536Z&quot;],&quot;updatedAt&quot;:[0,&quot;2025-02-04T17:19:33.689Z&quot;],&quot;environment&quot;:[0,{&quot;sys&quot;:[0,{&quot;id&quot;:[0,&quot;master&quot;],&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Environment&quot;]}]}],&quot;publishedVersion&quot;:[0,59],&quot;revision&quot;:[0,26],&quot;contentType&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;ContentType&quot;],&quot;id&quot;:[0,&quot;blogTag&quot;]}]}],&quot;locale&quot;:[0,&quot;en-US&quot;]}],&quot;fields&quot;:[0,{&quot;entryTitle&quot;:[0,&quot;Developers&quot;],&quot;name&quot;:[0,&quot;Developers&quot;],&quot;slug&quot;:[0,&quot;developers&quot;],&quot;featured&quot;:[0,true]}]}],[0,{&quot;metadata&quot;:[0,{&quot;tags&quot;:[1,[]],&quot;concepts&quot;:[1,[]]}],&quot;sys&quot;:[0,{&quot;space&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Space&quot;],&quot;id&quot;:[0,&quot;zkvhlag99gkb&quot;]}]}],&quot;id&quot;:[0,&quot;48r7QV00gLMWOIcM1CSDRy&quot;],&quot;type&quot;:[0,&quot;Entry&quot;],&quot;createdAt&quot;:[0,&quot;2024-10-09T19:54:22.790Z&quot;],&quot;updatedAt&quot;:[0,&quot;2025-02-04T17:17:33.067Z&quot;],&quot;environment&quot;:[0,{&quot;sys&quot;:[0,{&quot;id&quot;:[0,&quot;master&quot;],&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Environment&quot;]}]}],&quot;publishedVersion&quot;:[0,59],&quot;revision&quot;:[0,26],&quot;contentType&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;ContentType&quot;],&quot;id&quot;:[0,&quot;blogTag&quot;]}]}],&quot;locale&quot;:[0,&quot;en-US&quot;]}],&quot;fields&quot;:[0,{&quot;entryTitle&quot;:[0,&quot;Speed &amp; Reliability&quot;],&quot;name&quot;:[0,&quot;Speed &amp; Reliability&quot;],&quot;slug&quot;:[0,&quot;speed-and-reliability&quot;],&quot;featured&quot;:[0,true]}]}],[0,{&quot;metadata&quot;:[0,{&quot;tags&quot;:[1,[]],&quot;concepts&quot;:[1,[]]}],&quot;sys&quot;:[0,{&quot;space&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Space&quot;],&quot;id&quot;:[0,&quot;zkvhlag99gkb&quot;]}]}],&quot;id&quot;:[0,&quot;V86khSc459Yi1AhTlvtY7&quot;],&quot;type&quot;:[0,&quot;Entry&quot;],&quot;createdAt&quot;:[0,&quot;2024-10-09T19:46:53.657Z&quot;],&quot;updatedAt&quot;:[0,&quot;2025-02-04T17:12:59.473Z&quot;],&quot;environment&quot;:[0,{&quot;sys&quot;:[0,{&quot;id&quot;:[0,&quot;master&quot;],&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Environment&quot;]}]}],&quot;publishedVersion&quot;:[0,57],&quot;revision&quot;:[0,21],&quot;contentType&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;ContentType&quot;],&quot;id&quot;:[0,&quot;blogTag&quot;]}]}],&quot;locale&quot;:[0,&quot;en-US&quot;]}],&quot;fields&quot;:[0,{&quot;entryTitle&quot;:[0,&quot;Partners&quot;],&quot;name&quot;:[0,&quot;Partners&quot;],&quot;slug&quot;:[0,&quot;partners&quot;],&quot;featured&quot;:[0,true]}]}],[0,{&quot;metadata&quot;:[0,{&quot;tags&quot;:[1,[]],&quot;concepts&quot;:[1,[]]}],&quot;sys&quot;:[0,{&quot;space&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Space&quot;],&quot;id&quot;:[0,&quot;zkvhlag99gkb&quot;]}]}],&quot;id&quot;:[0,&quot;4g8tPriKOAUwdUT4jNPebe&quot;],&quot;type&quot;:[0,&quot;Entry&quot;],&quot;createdAt&quot;:[0,&quot;2024-10-09T19:46:40.927Z&quot;],&quot;updatedAt&quot;:[0,&quot;2025-02-04T17:11:28.566Z&quot;],&quot;environment&quot;:[0,{&quot;sys&quot;:[0,{&quot;id&quot;:[0,&quot;master&quot;],&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Environment&quot;]}]}],&quot;publishedVersion&quot;:[0,55],&quot;revision&quot;:[0,24],&quot;contentType&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;ContentType&quot;],&quot;id&quot;:[0,&quot;blogTag&quot;]}]}],&quot;locale&quot;:[0,&quot;en-US&quot;]}],&quot;fields&quot;:[0,{&quot;entryTitle&quot;:[0,&quot;Life at Cloudflare&quot;],&quot;name&quot;:[0,&quot;Life at Cloudflare&quot;],&quot;slug&quot;:[0,&quot;life-at-cloudflare&quot;],&quot;featured&quot;:[0,true]}]}],[0,{&quot;metadata&quot;:[0,{&quot;tags&quot;:[1,[]],&quot;concepts&quot;:[1,[]]}],&quot;sys&quot;:[0,{&quot;space&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Space&quot;],&quot;id&quot;:[0,&quot;zkvhlag99gkb&quot;]}]}],&quot;id&quot;:[0,&quot;16yk8DVbNNifxov5cWvAov&quot;],&quot;type&quot;:[0,&quot;Entry&quot;],&quot;createdAt&quot;:[0,&quot;2024-10-09T19:56:23.848Z&quot;],&quot;updatedAt&quot;:[0,&quot;2025-01-29T05:03:35.958Z&quot;],&quot;environment&quot;:[0,{&quot;sys&quot;:[0,{&quot;id&quot;:[0,&quot;master&quot;],&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;Environment&quot;]}]}],&quot;publishedVersion&quot;:[0,63],&quot;revision&quot;:[0,28],&quot;contentType&quot;:[0,{&quot;sys&quot;:[0,{&quot;type&quot;:[0,&quot;Link&quot;],&quot;linkType&quot;:[0,&quot;ContentType&quot;],&quot;id&quot;:[0,&quot;blogTag&quot;]}]}],&quot;locale&quot;:[0,&quot;en-US&quot;]}],&quot;fields&quot;:[0,{&quot;entryTitle&quot;:[0,&quot;Policy &amp; Legal&quot;],&quot;name&quot;:[0,&quot;Policy &amp; Legal&quot;],&quot;slug&quot;:[0,&quot;policy&quot;],&quot;featured&quot;:[0,true]}]}]]]}],&quot;locale&quot;:[0,&quot;en-us&quot;],&quot;translations&quot;:[0,{&quot;posts.by&quot;:[0,&quot;By&quot;],&quot;footer.gdpr&quot;:[0,&quot;GDPR&quot;],&quot;lang_blurb1&quot;:[0,&quot;This post is also available in {lang1}.&quot;],&quot;lang_blurb2&quot;:[0,&quot;This post is also available in {lang1} and {lang2}.&quot;],&quot;lang_blurb3&quot;:[0,&quot;This post is also available in {lang1}, {lang2} and {lang3}.&quot;],&quot;footer.press&quot;:[0,&quot;Press&quot;],&quot;header.title&quot;:[0,&quot;The Cloudflare Blog&quot;],&quot;search.clear&quot;:[0,&quot;Clear&quot;],&quot;search.filter&quot;:[0,&quot;Filter&quot;],&quot;search.source&quot;:[0,&quot;Source&quot;],&quot;footer.careers&quot;:[0,&quot;Careers&quot;],&quot;footer.company&quot;:[0,&quot;Company&quot;],&quot;footer.support&quot;:[0,&quot;Support&quot;],&quot;footer.the_net&quot;:[0,&quot;theNet&quot;],&quot;search.filters&quot;:[0,&quot;Filters&quot;],&quot;footer.our_team&quot;:[0,&quot;Our team&quot;],&quot;footer.webinars&quot;:[0,&quot;Webinars&quot;],&quot;page.more_posts&quot;:[0,&quot;More posts&quot;],&quot;posts.time_read&quot;:[0,&quot;{time} min read&quot;],&quot;search.language&quot;:[0,&quot;Language&quot;],&quot;footer.community&quot;:[0,&quot;Community&quot;],&quot;footer.resources&quot;:[0,&quot;Resources&quot;],&quot;footer.solutions&quot;:[0,&quot;Solutions&quot;],&quot;footer.trademark&quot;:[0,&quot;Trademark&quot;],&quot;header.subscribe&quot;:[0,&quot;Subscribe&quot;],&quot;footer.compliance&quot;:[0,&quot;Compliance&quot;],&quot;footer.free_plans&quot;:[0,&quot;Free plans&quot;],&quot;footer.impact_ESG&quot;:[0,&quot;Impact/ESG&quot;],&quot;posts.follow_on_X&quot;:[0,&quot;Follow on X&quot;],&quot;footer.help_center&quot;:[0,&quot;Help center&quot;],&quot;footer.network_map&quot;:[0,&quot;Network Map&quot;],&quot;header.please_wait&quot;:[0,&quot;Please Wait&quot;],&quot;page.related_posts&quot;:[0,&quot;Related posts&quot;],&quot;search.result_stat&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt; for &lt;strong&gt;{search_keyword}&lt;/strong&gt;&quot;],&quot;footer.case_studies&quot;:[0,&quot;Case Studies&quot;],&quot;footer.connect_2024&quot;:[0,&quot;Connect 2024&quot;],&quot;footer.terms_of_use&quot;:[0,&quot;Terms of Use&quot;],&quot;footer.white_papers&quot;:[0,&quot;White Papers&quot;],&quot;footer.cloudflare_tv&quot;:[0,&quot;Cloudflare TV&quot;],&quot;footer.community_hub&quot;:[0,&quot;Community Hub&quot;],&quot;footer.compare_plans&quot;:[0,&quot;Compare plans&quot;],&quot;footer.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.email_address&quot;:[0,&quot;Email Address&quot;],&quot;page.error.not_found&quot;:[0,&quot;Page not found&quot;],&quot;footer.developer_docs&quot;:[0,&quot;Developer docs&quot;],&quot;footer.privacy_policy&quot;:[0,&quot;Privacy Policy&quot;],&quot;footer.request_a_demo&quot;:[0,&quot;Request a demo&quot;],&quot;page.continue_reading&quot;:[0,&quot;Continue reading&quot;],&quot;footer.analysts_report&quot;:[0,&quot;Analyst reports&quot;],&quot;footer.for_enterprises&quot;:[0,&quot;For enterprises&quot;],&quot;footer.getting_started&quot;:[0,&quot;Getting Started&quot;],&quot;footer.learning_center&quot;:[0,&quot;Learning Center&quot;],&quot;footer.project_galileo&quot;:[0,&quot;Project Galileo&quot;],&quot;pagination.newer_posts&quot;:[0,&quot;Newer Posts&quot;],&quot;pagination.older_posts&quot;:[0,&quot;Older Posts&quot;],&quot;posts.social_buttons.x&quot;:[0,&quot;Discuss on X&quot;],&quot;search.icon_aria_label&quot;:[0,&quot;Search&quot;],&quot;search.source_location&quot;:[0,&quot;Source/Location&quot;],&quot;footer.about_cloudflare&quot;:[0,&quot;About Cloudflare&quot;],&quot;footer.athenian_project&quot;:[0,&quot;Athenian Project&quot;],&quot;footer.become_a_partner&quot;:[0,&quot;Become a partner&quot;],&quot;footer.cloudflare_radar&quot;:[0,&quot;Cloudflare Radar&quot;],&quot;footer.network_services&quot;:[0,&quot;Network services&quot;],&quot;footer.trust_and_safety&quot;:[0,&quot;Trust &amp; Safety&quot;],&quot;header.get_started_free&quot;:[0,&quot;Get Started Free&quot;],&quot;page.search.placeholder&quot;:[0,&quot;Search Cloudflare&quot;],&quot;footer.cloudflare_status&quot;:[0,&quot;Cloudflare Status&quot;],&quot;footer.cookie_preference&quot;:[0,&quot;Cookie Preferences&quot;],&quot;header.valid_email_error&quot;:[0,&quot;Must be valid email.&quot;],&quot;search.result_stat_empty&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt;&quot;],&quot;footer.connectivity_cloud&quot;:[0,&quot;Connectivity cloud&quot;],&quot;footer.developer_services&quot;:[0,&quot;Developer services&quot;],&quot;footer.investor_relations&quot;:[0,&quot;Investor relations&quot;],&quot;page.not_found.error_code&quot;:[0,&quot;Error Code: 404&quot;],&quot;search.autocomplete_title&quot;:[0,&quot;Insert a query. Press enter to send&quot;],&quot;footer.logos_and_press_kit&quot;:[0,&quot;Logos &amp; press kit&quot;],&quot;footer.application_services&quot;:[0,&quot;Application services&quot;],&quot;footer.get_a_recommendation&quot;:[0,&quot;Get a recommendation&quot;],&quot;posts.social_buttons.reddit&quot;:[0,&quot;Discuss on Reddit&quot;],&quot;footer.sse_and_sase_services&quot;:[0,&quot;SSE and SASE services&quot;],&quot;page.not_found.outdated_link&quot;:[0,&quot;You may have used an outdated link, or you may have typed the address incorrectly.&quot;],&quot;footer.report_security_issues&quot;:[0,&quot;Report Security Issues&quot;],&quot;page.error.error_message_page&quot;:[0,&quot;Sorry, we can&#39;t find the page you are looking for.&quot;],&quot;header.subscribe_notifications&quot;:[0,&quot;Subscribe to receive notifications of new posts:&quot;],&quot;footer.cloudflare_for_campaigns&quot;:[0,&quot;Cloudflare for Campaigns&quot;],&quot;header.subscription_confimation&quot;:[0,&quot;Subscription confirmed. Thank you for subscribing!&quot;],&quot;posts.social_buttons.hackernews&quot;:[0,&quot;Discuss on Hacker News&quot;],&quot;footer.diversity_equity_inclusion&quot;:[0,&quot;Diversity, equity &amp; inclusion&quot;],&quot;footer.critical_infrastructure_defense_project&quot;:[0,&quot;Critical Infrastructure Defense Project&quot;]}]}" ssr client="idle" opts="{&quot;name&quot;:&quot;NavigationComponent&quot;,&quot;value&quot;:true}" await-children><header class="flex flex-row flex-wrap justify-between items-flex-end mw8 center mv3 pl3 pr1"><div class="w-100 flex items-flex-end justify-between justify-start-l"><div class="w-100 tr flex justify-end"><div class="flex justify-between items-center"><span class="dn di-l pr1"><a href="https://dash.cloudflare.com/sign-up" class="f1 blue1 dn di-l b no-underline underline-hover" target="_blank" rel="noreferrer">Get Started Free</a></span><span class="f1 gray4 dn di-l pr1">|</span><span class="dn di-l"><a target="_blank" href="https://www.cloudflare.com/plans/enterprise/contact/" class="f1 gray4 no-underline underline-hover pr1" rel="noreferrer">Contact Sales</a></span><span class="f1 gray4 dn di-l pr1">|</span><div class="relative flex cf-dropdown"><div class="flex items-center" dir="ltr"><button type="button" class="f1 gray4 no-underline language-picker js-language-picker" style="background:transparent;border:none;padding:0"><span class="language-picker__globe-icon"></span><span class="language-picker__caret-icon ph1">▼</span></button></div></div></div></div></div><div class="w-100 w-50-l flex items-end nb5 nb1-l"><a href="/" class="header-logo mr4 dn db-l"><img class="header-logo" src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/69RwBidpiEHCDZ9rFVVk7T/092507edbed698420b89658e5a6d5105/CF_logo_stacked_blktype.png" alt="The Cloudflare Blog" width="170" height="57"/></a><h2 class="mt0 mb1 dn di-l"><a href="/" class="fw5 f5 gray3 no-underline"><span class="dn di-l">The Cloudflare Blog</span></a></h2></div><div class="w-100 w-50-l dn db-l"><div class="w-100 tr mkto-sub-message"><p class="f2">Subscribe to receive notifications of new posts:</p></div><div class="w-100 tr"><div class="marketo-form-container"><form id="mktoForm_1653"><div class="top-subscribe-form-container"><div class="top-subscribe-form-field"><input placeholder="Email Address" class="top-subscribe-form-input" name="email" type="email" title="Must be valid email."/></div><button class="top-subscribe-form-button" type="button">Subscribe</button></div></form></div></div></div></header><nav dir="ltr" class="bb b--black-10 db dn-l w-100 ph3 "><div class=" flex justify-between items-center" style="height:44px"><a href="/search/"><img class="h-6 w-6" src="/images/magnifier.svg" alt="magnifier icon"/></a><button type="button" style="background:transparent;border:none"><img src="/images/hamburger.svg" alt="hamburger menu"/></button></div><div class="js-mobile-nav-container dn"><div class="flex flex-column flex-wrap bg-gray9 o-95 absolute w-90 ph3 z-1"><div class="pv3 ph2 tl"><a href="/tag/zero-trust/" class="no-underline gray1 f4 fw7">Zero Trust</a></div><div class="pv3 ph2 tl"><a href="/tag/cloudflare-radar/" class="no-underline gray1 f4 fw7">Radar</a></div><div class="pv3 ph2 tl"><a href="/tag/security/" class="no-underline gray1 f4 fw7">Security</a></div><div class="pv3 ph2 tl"><a href="/tag/ai/" class="no-underline gray1 f4 fw7">AI</a></div><div class="pv3 ph2 tl"><a href="/tag/product-news/" class="no-underline gray1 f4 fw7">Product News</a></div><div class="pv3 ph2 tl"><a href="/tag/developers/" class="no-underline gray1 f4 fw7">Developers</a></div><div class="pv3 ph2 tl"><a href="/tag/speed-and-reliability/" class="no-underline gray1 f4 fw7">Speed &amp; Reliability</a></div><div class="pv3 ph2 tl"><a href="/tag/partners/" class="no-underline gray1 f4 fw7">Partners</a></div><div class="pv3 ph2 tl"><a href="/tag/life-at-cloudflare/" class="no-underline gray1 f4 fw7">Life at Cloudflare</a></div><div class="pv3 ph2 tl"><a href="/tag/policy/" class="no-underline gray1 f4 fw7">Policy &amp; Legal</a></div></div></div></nav><nav id="nav" class="w-100 bb-0 bb-l b--black-10 z-1"><div id="desktop-nav-items-container" class="flex flex-wrap justify-between items-center mw8 center mv3 mv0-l"><div data-tag="zero-trust" class="nav-item nav-item-desktop ml3 mr2 dn db-l pv3"><a href="/tag/zero-trust/" class="no-underline gray1 f2 fw5 pv3">Zero Trust</a></div><div data-tag="cloudflare-radar" class="nav-item nav-item-desktop ml3 mr2 dn db-l pv3"><a href="/tag/cloudflare-radar/" class="no-underline gray1 f2 fw5 pv3">Radar</a></div><div data-tag="security" class="nav-item nav-item-desktop ml3 mr2 dn db-l pv3"><a href="/tag/security/" class="no-underline gray1 f2 fw5 pv3">Security</a></div><div data-tag="ai" class="nav-item nav-item-desktop ml3 mr2 dn db-l pv3"><a href="/tag/ai/" class="no-underline gray1 f2 fw5 pv3">AI</a></div><div data-tag="product-news" class="nav-item nav-item-desktop ml3 mr2 dn db-l pv3"><a href="/tag/product-news/" class="no-underline gray1 f2 fw5 pv3">Product News</a></div><div data-tag="developers" class="nav-item nav-item-desktop ml3 mr2 dn db-l pv3"><a href="/tag/developers/" class="no-underline gray1 f2 fw5 pv3">Developers</a></div><div data-tag="speed-and-reliability" class="nav-item nav-item-desktop ml3 mr2 dn db-l pv3"><a href="/tag/speed-and-reliability/" class="no-underline gray1 f2 fw5 pv3">Speed &amp; Reliability</a></div><div data-tag="partners" class="nav-item nav-item-desktop ml3 mr2 dn db-l pv3"><a href="/tag/partners/" class="no-underline gray1 f2 fw5 pv3">Partners</a></div><div data-tag="life-at-cloudflare" class="nav-item nav-item-desktop ml3 mr2 dn db-l pv3"><a href="/tag/life-at-cloudflare/" class="no-underline gray1 f2 fw5 pv3">Life at Cloudflare</a></div><div data-tag="policy" class="nav-item nav-item-desktop ml3 mr2 dn db-l pv3"><a href="/tag/policy/" class="no-underline gray1 f2 fw5 pv3">Policy &amp; Legal</a></div><div class="nav-item ml2 mr3 dn db-l pv3" data-tag="search icon"><a href="/search/"><img id="search-icon" class="h-6 w-6" src="/images/magnifier.svg" alt="magnifier icon"/></a></div></div></nav><!--astro:end--></astro-island> <script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event("astro:load"));})();</script> <div class="flex flex-row flex-wrap mw8 center bb b--gray8 ph3"> <h1 class="site-title f7 fw4 mt4 mb3 mv4-l">Privacy Pass</h1> </div> <main id="site-main" class="flex flex-row flex-wrap mw8 center pt0 pt3-l mt4-l"> <astro-island uid="4GBCd" prefix="r0" component-url="/_astro/PostCard.CG32ktie.js" component-export="PostCard" renderer-url="/_astro/client.DLO1yDVm.js" props="{&quot;currentPage&quot;:[0,1],&quot;isFeaturedImageFirstPost&quot;:[0,true],&quot;post&quot;:[0,{&quot;id&quot;:[0,&quot;47vZ5BZfqt5cU38XabKyUA&quot;],&quot;title&quot;:[0,&quot;Privacy Pass: upgrading to the latest protocol version&quot;],&quot;slug&quot;:[0,&quot;privacy-pass-standard&quot;],&quot;excerpt&quot;:[0,&quot;In this post, we explore the latest changes to Privacy Pass protocol. We are also excited to introduce a public implementation of the latest IETF draft of the Privacy Pass protocol — including a set of open-source templates that can be used to implement Privacy Pass Origins, Issuers, and Attesters&quot;],&quot;featured&quot;:[0,false],&quot;html&quot;:[0,&quot;&lt;p&gt;&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2LZJxp89GI8PxGwGSPRQJL/9cfe61e756369dcad6cb78f5ad89ec1f/image9.png\&quot; alt=\&quot;Privacy Pass: Upgrading to the latest protocol version\&quot; class=\&quot;kg-image\&quot; width=\&quot;1800\&quot; height=\&quot;1013\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;enabling-anonymous-access-to-the-web-with-privacy-preserving-cryptography\&quot;&gt;Enabling anonymous access to the web with privacy-preserving cryptography&lt;/h2&gt;\n &lt;a href=\&quot;#enabling-anonymous-access-to-the-web-with-privacy-preserving-cryptography\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;The challenge of telling humans and bots apart is almost as old as the web itself. From online ticket vendors to dating apps, to ecommerce and finance — there are many legitimate reasons why you&amp;#39;d want to know if it&amp;#39;s a person or a machine knocking on the front door of your website.&lt;/p&gt;&lt;p&gt;Unfortunately, the tools for the web have traditionally been clunky and sometimes involved a bad user experience. None more so than the CAPTCHA — an irksome solution that humanity wastes a &lt;a href=\&quot;/introducing-cryptographic-attestation-of-personhood/\&quot;&gt;staggering&lt;/a&gt; amount of time on. A more subtle but intrusive approach is IP tracking, which uses IP addresses to identify and take action on suspicious traffic, but that too can come with &lt;a href=\&quot;/consequences-of-ip-blocking/\&quot;&gt;unforeseen consequences&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;And yet, the problem of distinguishing legitimate human requests from automated bots remains as vital as ever. This is why for years Cloudflare has invested in the Privacy Pass protocol — a novel approach to establishing a user’s identity by relying on cryptography, rather than crude puzzles — all while providing a streamlined, privacy-preserving, and often frictionless experience to end users.&lt;/p&gt;&lt;p&gt;Cloudflare began &lt;a href=\&quot;/cloudflare-supports-privacy-pass/\&quot;&gt;supporting Privacy Pass&lt;/a&gt; in 2017, with the release of browser extensions for Chrome and Firefox. Web admins with their sites on Cloudflare would have Privacy Pass enabled in the Cloudflare Dash; users who installed the extension in their browsers would see fewer CAPTCHAs on websites they visited that had Privacy Pass enabled.&lt;/p&gt;&lt;p&gt;Since then, Cloudflare &lt;a href=\&quot;/end-cloudflare-captcha/\&quot;&gt;stopped issuing CAPTCHAs&lt;/a&gt;, and Privacy Pass has come a long way. Apple uses a version of Privacy Pass for its &lt;a href=\&quot;https://developer.apple.com/news/?id=huqjyh7k\&quot;&gt;Private Access Tokens&lt;/a&gt; system which works in tandem with a device’s secure enclave to attest to a user’s humanity. And Cloudflare uses Privacy Pass as an important signal in our Web Application Firewall and Bot Management products — which means millions of websites natively offer Privacy Pass.&lt;/p&gt;&lt;p&gt;In this post, we explore the latest changes to Privacy Pass protocol. We are also excited to introduce a public implementation of the latest IETF draft of the &lt;a href=\&quot;https://www.ietf.org/archive/id/draft-ietf-privacypass-protocol-16.html\&quot;&gt;Privacy Pass protocol&lt;/a&gt; — including a &lt;a href=\&quot;https://github.com/cloudflare?q=pp-&amp;type=all&amp;language=&amp;sort=#org-repositories\&quot;&gt;set of open-source templates&lt;/a&gt; that can be used to implement Privacy Pass &lt;a href=\&quot;https://github.com/cloudflare/pp-origin\&quot;&gt;&lt;i&gt;Origins&lt;/i&gt;&lt;/a&gt;&lt;i&gt;,&lt;/i&gt; &lt;a href=\&quot;https://github.com/cloudflare/pp-issuer\&quot;&gt;&lt;i&gt;Issuers&lt;/i&gt;&lt;/a&gt;, and &lt;a href=\&quot;https://github.com/cloudflare/pp-attester\&quot;&gt;&lt;i&gt;Attesters&lt;/i&gt;&lt;/a&gt;. These are based on Cloudflare Workers, and are the easiest way to get started with a new deployment of Privacy Pass.&lt;/p&gt;&lt;p&gt;To complement the updated implementations, we are releasing a new version of our Privacy Pass browser extensions (&lt;a href=\&quot;https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/\&quot;&gt;Firefox&lt;/a&gt;, &lt;a href=\&quot;https://chromewebstore.google.com/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi\&quot;&gt;Chrome&lt;/a&gt;), which are rolling out with the name: &lt;i&gt;Silk - Privacy Pass Client&lt;/i&gt;. Users of these extensions can expect to see fewer bot-checks around the web, and will be contributing to research about privacy preserving signals via a set of trusted attesters, which can be configured in the extension’s settings panel.&lt;/p&gt;&lt;p&gt;Finally, we will discuss how Privacy Pass can be used for an array of scenarios beyond differentiating bot from human traffic.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Notice to our users&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;If you use the Privacy Pass API that controls Privacy Pass configuration on Cloudflare, you can remove these calls. This API is no longer needed since Privacy Pass is now included by default in our Challenge Platform. Out of an abundance of caution for our customers, we are doing a &lt;a href=\&quot;https://developers.cloudflare.com/fundamentals/api/reference/deprecations/\&quot;&gt;four-month deprecation notice&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If you have the Privacy Pass extension installed, it should automatically update to &lt;i&gt;Silk - Privacy Pass Client&lt;/i&gt; (&lt;a href=\&quot;https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/\&quot;&gt;Firefox&lt;/a&gt;, &lt;a href=\&quot;https://chromewebstore.google.com/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi\&quot;&gt;Chrome&lt;/a&gt;) over the next few days. We have renamed it to keep the distinction clear between the protocol itself and a client of the protocol.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;brief-history\&quot;&gt;Brief history&lt;/h2&gt;\n &lt;a href=\&quot;#brief-history\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;In the last decade, we&amp;#39;ve seen the &lt;a href=\&quot;/next-generation-privacy-protocols/\&quot;&gt;rise of protocols&lt;/a&gt; with privacy at their core, including &lt;a href=\&quot;/building-privacy-into-internet-standards-and-how-to-make-your-app-more-private-today/\&quot;&gt;Oblivious HTTP (OHTTP)&lt;/a&gt;, &lt;a href=\&quot;/deep-dive-privacy-preserving-measurement/\&quot;&gt;Distributed aggregation protocol (DAP)&lt;/a&gt;, and &lt;a href=\&quot;/unlocking-quic-proxying-potential/\&quot;&gt;MASQUE&lt;/a&gt;. These protocols improve privacy when browsing and interacting with services online. By protecting users&amp;#39; privacy, these protocols also ask origins and website owners to revise their expectations around the data they can glean from user traffic. This might lead them to reconsider existing assumptions and mitigations around suspicious traffic, such as &lt;a href=\&quot;/consequences-of-ip-blocking/\&quot;&gt;IP filtering&lt;/a&gt;, which often has unintended consequences.&lt;/p&gt;&lt;p&gt;In 2017, Cloudflare announced &lt;a href=\&quot;/cloudflare-supports-privacy-pass/\&quot;&gt;support for Privacy Pass&lt;/a&gt;. At launch, this meant improving content accessibility for web users who would see a lot of interstitial pages (such as &lt;a href=\&quot;https://www.cloudflare.com/learning/bots/how-captchas-work/\&quot;&gt;CAPTCHAs&lt;/a&gt;) when browsing websites protected by Cloudflare. Privacy Pass tokens provide a signal about the user’s capabilities to website owners while protecting their privacy by ensuring each token redemption is unlinkable to its issuance context. Since then, the technology has turned into a &lt;a href=\&quot;https://datatracker.ietf.org/wg/privacypass/documents/\&quot;&gt;fully fledged protocol&lt;/a&gt; used by millions thanks to academic and industry effort. The existing browser extension accounts for hundreds of thousands of downloads. During the same time, Cloudflare has dramatically evolved the way it allows customers to challenge their visitors, being &lt;a href=\&quot;/end-cloudflare-captcha/\&quot;&gt;more flexible about the signals&lt;/a&gt; it receives, and &lt;a href=\&quot;/turnstile-ga/\&quot;&gt;moving away from CAPTCHA&lt;/a&gt; as a binary legitimacy signal.&lt;/p&gt;&lt;p&gt;Deployments of this research have led to a broadening of use cases, opening the door to different kinds of attestation. An attestation is a cryptographically-signed data point supporting facts. This can include a signed token indicating that the user has successfully solved a CAPTCHA, having a user’s hardware attest it’s untampered, or a piece of data that an attester can verify against another data source.&lt;/p&gt;&lt;p&gt;For example, in 2022, Apple hardware devices began to offer Privacy Pass tokens to websites who wanted to reduce how often they show CAPTCHAs, by using the hardware itself as an attestation factor. Before showing images of buses and fire hydrants to users, CAPTCHA providers can request a &lt;a href=\&quot;https://developer.apple.com/news/?id=huqjyh7k\&quot;&gt;Private Access Token&lt;/a&gt; (PAT). This native support does not require installing extensions, or any user action to benefit from a smoother and more private web browsing experience.&lt;/p&gt;&lt;p&gt;Below is a brief overview of changes to the protocol we participated in:&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3YImfph78oDPj3kgEcyvV6/37bcd89ffcfff8b636b00c8e931f3218/image8.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1808\&quot; height=\&quot;631\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;The timeline presents cryptographic changes, community inputs, and industry collaborations. These changes helped shape better standards for the web, such as VOPRF (&lt;a href=\&quot;https://www.rfc-editor.org/rfc/rfc9497\&quot;&gt;RFC 9497&lt;/a&gt;), or RSA Blind Signatures (&lt;a href=\&quot;https://www.rfc-editor.org/rfc/rfc9474\&quot;&gt;RFC 9474&lt;/a&gt;). In the next sections, we dive in the Privacy Pass protocol to understand its ins and outs.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;anonymous-credentials-in-real-life\&quot;&gt;Anonymous credentials in real life&lt;/h2&gt;\n &lt;a href=\&quot;#anonymous-credentials-in-real-life\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Before explaining the protocol in more depth, let&amp;#39;s use an analogy. You are at a music festival. You bought your ticket online with a student discount. When you arrive at the gates, an agent scans your ticket, checks your student status, and gives you a yellow wristband and two drink tickets.&lt;/p&gt;&lt;p&gt;During the festival, you go in and out by showing your wristband. When a friend asks you to grab a drink, you pay with your tickets. One for your drink and one for your friend. You give your tickets to the bartender, they check the tickets, and give you a drink. The characteristics that make this interaction private is that the drinks tickets cannot be traced back to you or your payment method, but they can be verified as having been unused and valid for purchase of a drink.&lt;/p&gt;&lt;p&gt;In the web use case, the Internet is a festival. When you arrive at the gates of a website, an agent scans your request, and gives you a session cookie as well as two Privacy Pass tokens. They could have given you just one token, or more than two, but in our example ‘two tokens’ is the given website’s policy. You can use these tokens to attest your humanity, to authenticate on certain websites, or even to confirm the legitimacy of your hardware.&lt;/p&gt;&lt;p&gt;Now, you might wonder if this is a technique we have been using for years, why do we need fancy cryptography and standardization efforts? Well, unlike at a real-world music festival where most people don’t carry around photocopiers, on the Internet it is pretty easy to copy tokens. For instance, how do we stop people using a token twice? We could put a unique number on each token, and check it is not spent twice, but that would allow the gate attendant to tell the bartender which numbers were linked to which person. So, we need cryptography.&lt;/p&gt;&lt;p&gt;When another website presents a challenge to you, you provide your Privacy Pass token and are then allowed to view a gallery of beautiful cat pictures. The difference with the festival is this challenge might be interactive, which would be similar to the bartender giving you a numbered ticket which would have to be signed by the agent before getting a drink. The website owner can verify that the token is valid but has no way of tracing or connecting the user back to the action that provided them with the Privacy Pass tokens. With Privacy Pass terminology, you are a Client, the website is an Origin, the agent is an Attester, and the bar an Issuer. The next section goes through these in more detail.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;privacy-pass-protocol\&quot;&gt;Privacy Pass protocol&lt;/h2&gt;\n &lt;a href=\&quot;#privacy-pass-protocol\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Privacy Pass specifies an extensible protocol for creating and redeeming anonymous and transferable tokens. In fact, Apple has their own implementation with Private Access Tokens (PAT), and later we will describe another implementation with the Silk browser extension. Given PAT was the first to implement the IETF defined protocol, Privacy Pass is sometimes referred to as PAT in the literature.&lt;/p&gt;&lt;p&gt;The protocol is generic, and defines four components:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Client: Web user agent with a Privacy Pass enabled browser. This could be your &lt;a href=\&quot;/eliminating-captchas-on-iphones-and-macs-using-new-standard/\&quot;&gt;Apple device with PAT&lt;/a&gt;, or your web browser with &lt;a href=\&quot;https://github.com/cloudflare/pp-browser-extension\&quot;&gt;the Silk extension installed&lt;/a&gt;. Typically, this is the actor who is requesting content and is asked to share some attribute of themselves.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Origin: Serves content requested by the Client. The Origin trusts one or more Issuers, and presents Privacy Pass challenges to the Client. For instance, Cloudflare Managed Challenge is a Privacy Pass origin serving two Privacy Pass challenges: one for Apple PAT Issuer, one for Cloudflare Research Issuer.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Issuer: Signs Privacy Pass tokens upon request from a trusted party, either an Attester or a Client depending on the deployment model. Different Issuers have their own set of trusted parties, depending on the security level they are looking for, as well as their privacy considerations. An Issuer validating device integrity should use different methods that vouch for this attribute to acknowledge the diversity of Client configurations.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Attester: Verifies an attribute of the Client and when satisfied requests a signed Privacy Pass token from the Issuer to pass back to the Client. Before vouching for the Client, an Attester may ask the Client to complete a specific task. This task could be a CAPTCHA, a location check, or age verification or some other check that will result in a single binary result. The Privacy Pass token will then share this one-bit of information in an unlinkable manner.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;They interact as illustrated below.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7tX1xRQv6Ltif1NRj2fCOa/eeb412fa39d73e2232f4b062d95cd708/Frame-699-1-.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1492\&quot; height=\&quot;780\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;Let&amp;#39;s dive into what&amp;#39;s really happening with an example. The User wants to access an Origin, say store.example.com. This website has suffered attacks or abuse in the past, and the site is using Privacy Pass to help avoid these going forward. To that end, the Origin returns &lt;a href=\&quot;https://www.rfc-editor.org/rfc/rfc9110#field.www-authenticate\&quot;&gt;an authentication request&lt;/a&gt; to the Client: &lt;code&gt;WWW-Authenticate: PrivateToken challenge=&amp;quot;A==&amp;quot;,token-key=&amp;quot;B==&amp;quot;&lt;/code&gt;. In this way, the Origin signals that it accepts tokens from the Issuer with public key “B==” to satisfy the challenge. That Issuer in turn trusts reputable Attesters to vouch for the Client not being an attacker by means of the presence of a cookie, CAPTCHA, Turnstile, or &lt;a href=\&quot;/introducing-cryptographic-attestation-of-personhood/\&quot;&gt;CAP challenge&lt;/a&gt; for example. For accessibility reasons for our example, let us say that the Client likely prefers the Turnstile method. The User’s browser prompts them to solve a Turnstile challenge. On success, it contacts the Issuer “B==” with that solution, and then replays the initial requests to store.example.com, this time sending along the token header &lt;code&gt;Authorization: PrivateToken token=&amp;quot;C==&amp;quot;&lt;/code&gt;, which the Origin accepts and returns your desired content to the Client. And that’s it.&lt;/p&gt;&lt;p&gt;We’ve described the Privacy Pass authentication protocol. While Basic authentication (&lt;a href=\&quot;https://www.rfc-editor.org/rfc/rfc7617\&quot;&gt;RFC 7671&lt;/a&gt;) asks you for a username and a password, the PrivateToken authentication scheme allows the browser to be more flexible on the type of check, while retaining privacy. The Origin store.example.com does not know your attestation method, they just know you are reputable according to the token issuer. In the same spirit, the Issuer &amp;quot;B==&amp;quot; does not see your IP, nor the website you are visiting. This separation between issuance and redemption, also referred to as unlinkability, is what &lt;a href=\&quot;https://www.ietf.org/archive/id/draft-ietf-privacypass-architecture-16.html\&quot;&gt;makes Privacy Pass private&lt;/a&gt;.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;demo-time\&quot;&gt;Demo time&lt;/h2&gt;\n &lt;a href=\&quot;#demo-time\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;To put the above in practice, let’s see how the protocol works with Silk, a browser extension providing Privacy Pass support. First, download the relevant &lt;a href=\&quot;https://chromewebstore.google.com/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi\&quot;&gt;Chrome&lt;/a&gt; or &lt;a href=\&quot;https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/\&quot;&gt;Firefox&lt;/a&gt; extension.&lt;/p&gt;&lt;p&gt;Then, head to &lt;a href=\&quot;https://demo-pat.research.cloudflare.com/login\&quot;&gt;https://demo-pat.research.cloudflare.com/login&lt;/a&gt;. The page returns a 401 Privacy Pass Token not presented. In fact, the origin expects you to perform a PrivateToken authentication. If you don’t have the extension installed, the flow stops here. If you have the extension installed, the extension is going to orchestrate the flow required to get you a token requested by the Origin.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2ZPDrhytZNVoB81Q7RILu5/7c115c9ed069aa09694373ec1adcc4d0/image10.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1596\&quot; height=\&quot;1105\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;With the extension installed, you are directed to a new tab &lt;a href=\&quot;https://pp-attester-turnstile.research.cloudflare.com/challenge\&quot;&gt;https://pp-attester-turnstile.research.cloudflare.com/challenge&lt;/a&gt;. This is a page provided by an Attester able to deliver you a token signed by the Issuer request by the Origin. In this case, the Attester checks you’re able to solve a Turnstile challenge.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7fmDWo3548oMK8jgZ7V0Kd/94ee9ab9bc1df6fee6e6a76dc4fb3e02/image2.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1596\&quot; height=\&quot;1105\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;You click, and that’s it. The Turnstile challenge solution is sent to the Attester, which upon validation, sends back a token from the requested Issuer. This page appears for a very short time, as once the extension has the token, the challenge page is no longer needed.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3KROIlp9njiXlfceDzRU7W/d1e306da3012c949e3fa5b80934f83a4/image11.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1596\&quot; height=\&quot;1105\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;The extension, now having a token requested by the Origin, sends your initial request for a second time, with an Authorization header containing a valid Issuer PrivateToken. Upon validation, the Origin allows you in with a 200 Privacy Pass Token valid!&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3qOSkMc5wIqS50CuNNNoZY/b36b88ba01ffa1c5f4d78727e602062f/image3.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1596\&quot; height=\&quot;1105\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;If you want to check behind the scenes, you can right-click on the extension logo and go to the preference/options page. It contains a list of attesters trusted by the extension, one per line. You can add your own attestation method (API described below). This allows the Client to decide on their preferred attestation methods.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/78BCHYQuOBC2aFlnPshu83/c6ee6b54d1d24b6f92f34577267a1146/image7.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1596\&quot; height=\&quot;1105\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;privacy-pass-protocol-extended\&quot;&gt;Privacy Pass protocol — extended&lt;/h2&gt;\n &lt;a href=\&quot;#privacy-pass-protocol-extended\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;The Privacy Pass protocol is new and not a standard yet, which implies that it’s not uniformly supported on all platforms. To improve flexibility beyond the existing standard proposal, we are introducing two mechanisms: an API for Attesters, and a replay API for web clients. The API for attesters allows developers to build new attestation methods, which only need to provide their URL to interface with the Silk browser extension. The replay API for web clients is a mechanism to enable websites to cooperate with the extension to make PrivateToken authentication work on browsers with Chrome user agents.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2TLz1CPx9OHczqLabCRmyc/c54b0b4bb637a97812c637ca0eebc78c/image12.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1999\&quot; height=\&quot;1119\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;Because more than one Attester may be supported on your machine, your Client needs to understand which Attester to use depending on the requested Issuer. As mentioned before, you as the Client do not communicate directly with the Issuer because you don’t necessarily know their relation with the attester, so you cannot retrieve its public key. To this end, the Attester API exposes all Issuers reachable by the said Attester via an endpoint: /v1/private-token-issuer-directory. This way, your client selects an appropriate Attester - one in relation with an Issuer that the Origin trusts, before triggering a validation.&lt;/p&gt;&lt;p&gt;In addition, we propose a replay API. Its goal is to allow clients to fetch a resource a second time if the first response presented a Privacy pass challenge. Some platforms do this automatically, like Silk on Firefox, but some don’t. That’s the case with the Silk Chrome extension for instance, which in its support of &lt;a href=\&quot;https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/manifest_version\&quot;&gt;manifest v3&lt;/a&gt; cannot block requests and only supports Basic authentication in the onAuthRequired extension event. The Privacy Pass Authentication scheme proposes the request to be sent once to get a challenge, and then a second time to get the actual resource. Between these requests to the Origin, the platform orchestrates the issuance of a token. To keep clients informed about the state of this process, we introduce a &lt;code&gt;private-token-client-replay: UUID header&lt;/code&gt; alongside WWW-Authenticate. Using a platform defined endpoint, this UUID informs web clients of the current state of authentication: pending, fulfilled, not-found.&lt;/p&gt;&lt;p&gt;To learn more about how you can use these today, and to deploy your own attestation method, read on.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;how-to-use-privacy-pass-today\&quot;&gt;How to use Privacy Pass today?&lt;/h2&gt;\n &lt;a href=\&quot;#how-to-use-privacy-pass-today\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;As seen in the section above, Privacy Pass is structured around four components: Origin, Client, Attester, Issuer. That’s why we created four repositories: &lt;a href=\&quot;https://github.com/cloudflare/pp-origin\&quot;&gt;cloudflare/pp-origin&lt;/a&gt;, &lt;a href=\&quot;https://github.com/cloudflare/pp-browser-extension\&quot;&gt;cloudflare/pp-browser-extension&lt;/a&gt;, &lt;a href=\&quot;https://github.com/cloudflare/pp-attester\&quot;&gt;cloudflare/pp-attester&lt;/a&gt;, &lt;a href=\&quot;https://github.com/cloudflare/pp-issuer\&quot;&gt;cloudflare/pp-issuer&lt;/a&gt;. In addition, the underlying cryptographic libraries are available &lt;a href=\&quot;https://github.com/cloudflare/privacypass-ts\&quot;&gt;cloudflare/privacypass-ts&lt;/a&gt;, &lt;a href=\&quot;https://github.com/cloudflare/blindrsa-ts\&quot;&gt;cloudflare/blindrsa-ts&lt;/a&gt;, and &lt;a href=\&quot;https://github.com/cloudflare/voprf-ts\&quot;&gt;cloudflare/voprf-ts&lt;/a&gt;. In this section, we dive into how to use each one of these depending on your use case.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Note: All examples below are designed in JavaScript and targeted at Cloudflare Workers. Privacy Pass is also implemented in &lt;a href=\&quot;https://github.com/ietf-wg-privacypass/base-drafts#existing-implementations\&quot;&gt;other languages&lt;/a&gt; and can be deployed with a configuration that suits your needs.&lt;/p&gt;&lt;/blockquote&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;as-an-origin-website-owners-service-providers\&quot;&gt;As an Origin - website owners, service providers&lt;/h3&gt;\n &lt;a href=\&quot;#as-an-origin-website-owners-service-providers\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;You are an online service that people critically rely upon (health or messaging for instance). You want to provide private payment options to users to maintain your users’ privacy. You only have one subscription tier at $10 per month. You have &lt;a href=\&quot;https://datatracker.ietf.org/doc/html/draft-davidson-pp-architecture-00#autoid-60\&quot;&gt;heard&lt;/a&gt; people are making privacy preserving apps, and want to use the latest version of Privacy Pass.&lt;/p&gt;&lt;p&gt;To access your service, users are required to prove they&amp;#39;ve paid for the service through a payment provider of their choosing (that you deem acceptable). This payment provider acknowledges the payment and requests a token for the user to access the service. As a sequence diagram, it looks as follows:&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3CDt5NsDY4c2DuYbggdleT/c2084b1b7cb141a8b528de78392833b3/image4.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1615\&quot; height=\&quot;903\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;To implement it in Workers, we rely on the &lt;a href=\&quot;https://www.npmjs.com/package/@cloudflare/privacypass-ts\&quot;&gt;&lt;code&gt;@cloudflare/privacypass-ts&lt;/code&gt;&lt;/a&gt; library, which can be installed by running:&lt;/p&gt;\n &lt;pre class=\&quot;language-bash\&quot;&gt;&lt;code class=\&quot;language-bash\&quot;&gt;npm i @cloudflare/privacypass-ts&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;This section is going to focus on the Origin work. We assume you have an Issuer up and running, which is described in a later section.&lt;/p&gt;&lt;p&gt;The Origin defines two flows:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;User redeeming token&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;User requesting a token issuance&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;\n &lt;pre class=\&quot;language-javascript\&quot;&gt;&lt;code class=\&quot;language-javascript\&quot;&gt;import { Client } from &amp;#039;@cloudflare/privacypass-ts&amp;#039;\n\nconst issuer = &amp;#039;static issuer key&amp;#039;\n\nconst handleRedemption =&amp;gt; (req) =&amp;gt; {\n const token = TokenResponse.parse(req.headers.get(&amp;#039;authorization&amp;#039;))\n const isValid = token.verify(issuer.publicKey)\n}\n\nconst handleIssuance = () =&amp;gt; {\n return new Response(&amp;#039;Please pay to access the service&amp;#039;, {\n status: 401,\n headers: { &amp;#039;www-authenticate&amp;#039;: &amp;#039;PrivateToken challenge=, token-key=, max-age=300&amp;#039; }\n })\n}\n\nconst handleAuth = (req) =&amp;gt; {\n const authorization = req.headers.get(&amp;#039;authorization&amp;#039;)\n if (authorization.startsWith(`PrivateToken token=`)) {\n return handleRedemption(req)\n }\n return handleIssuance(req)\n}\n\nexport default {\n fetch(req: Request) {\n return handleAuth(req)\n }\n}&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;From the user’s perspective, the overhead is minimal. Their client (possibly the Silk browser extension) receives a WWW-Authenticate header with the information required for a token issuance. Then, depending on their client configuration, they are taken to the payment provider of their choice to validate their access to the service.&lt;/p&gt;&lt;p&gt;With a successful response to the PrivateToken challenge a session is established, and the traditional web service flow continues.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;as-an-attester-captcha-providers-authentication-provider\&quot;&gt;As an Attester - CAPTCHA providers, authentication provider&lt;/h3&gt;\n &lt;a href=\&quot;#as-an-attester-captcha-providers-authentication-provider\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;You are the author of a new attestation method, such as &lt;a href=\&quot;/introducing-cryptographic-attestation-of-personhood/\&quot;&gt;CAP,&lt;/a&gt; a new CAPTCHA mechanism, or a new way to validate cookie consent. You know that website owners already use Privacy Pass to trigger such challenges on the user side, and an Issuer is willing to trust your method because it guarantees a high security level. In addition, because of the Privacy Pass protocol you never see which website your attestation is being used for.&lt;/p&gt;&lt;p&gt;So you decide to expose your attestation method as a Privacy Pass Attester. An Issuer with public key B== trusts you, and that&amp;#39;s the Issuer you are going to request a token from. You can check that with the Yes/No Attester below, whose code is on &lt;a href=\&quot;https://cloudflareworkers.com/#eedc5a7a6560c44b23a24cc1414b29d7:https://tutorial.cloudflareworkers.com/v1/challenge\&quot;&gt;Cloudflare Workers playground&lt;/a&gt;&lt;/p&gt;\n &lt;pre class=\&quot;language-javascript\&quot;&gt;&lt;code class=\&quot;language-javascript\&quot;&gt;const ISSUER_URL = &amp;#039;https://pp-issuer-public.research.cloudflare.com/token-request&amp;#039;\n\nconst b64ToU8 = (b) =&amp;gt; Uint8Array.from(atob(b), c =&amp;gt; c.charCodeAt(0))\n\nconst handleGetChallenge = (req) =&amp;gt; {\n return new Response(`\n &amp;lt;html&amp;gt;\n &amp;lt;head&amp;gt;\n &amp;lt;title&amp;gt;Challenge Response&amp;lt;/title&amp;gt;\n &amp;lt;/head&amp;gt;\n &amp;lt;body&amp;gt;\n \t&amp;lt;button onclick=&amp;quot;sendResponse(&amp;#039;Yes&amp;#039;)&amp;quot;&amp;gt;Yes&amp;lt;/button&amp;gt;\n\t\t&amp;lt;button onclick=&amp;quot;sendResponse(&amp;#039;No&amp;#039;)&amp;quot;&amp;gt;No&amp;lt;/button&amp;gt;\n\t&amp;lt;/body&amp;gt;\n\t&amp;lt;script&amp;gt;\n\tfunction sendResponse(choice) {\n\t\tfetch(location.href, { method: &amp;#039;POST&amp;#039;, headers: { &amp;#039;private-token-attester-data&amp;#039;: choice } })\n\t}\n\t&amp;lt;/script&amp;gt;\n\t&amp;lt;/html&amp;gt;\n\t`, { status: 401, headers: { &amp;#039;content-type&amp;#039;: &amp;#039;text/html&amp;#039; } })\n}\n\nconst handlePostChallenge = (req) =&amp;gt; {\n const choice = req.headers.get(&amp;#039;private-token-attester-data&amp;#039;)\n if (choice !== &amp;#039;Yes&amp;#039;) {\n return new Response(&amp;#039;Unauthorised&amp;#039;, { status: 401 })\n }\n\n // hardcoded token request\n // debug here https://pepe-debug.research.cloudflare.com/?challenge=PrivateToken%20challenge=%22AAIAHnR1dG9yaWFsLmNsb3VkZmxhcmV3b3JrZXJzLmNvbSBE-oWKIYqMcyfiMXOZpcopzGBiYRvnFRP3uKknYPv1RQAicGVwZS1kZWJ1Zy5yZXNlYXJjaC5jbG91ZGZsYXJlLmNvbQ==%22,token-key=%22MIIBUjA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAqEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgKiAwIBMAOCAQ8AMIIBCgKCAQEApqzusqnywE_3PZieStkf6_jwWF-nG6Es1nn5MRGoFSb3aXJFDTTIX8ljBSBZ0qujbhRDPx3ikWwziYiWtvEHSLqjeSWq-M892f9Dfkgpb3kpIfP8eBHPnhRKWo4BX_zk9IGT4H2Kd1vucIW1OmVY0Z_1tybKqYzHS299mvaQspkEcCo1UpFlMlT20JcxB2g2MRI9IZ87sgfdSu632J2OEr8XSfsppNcClU1D32iL_ETMJ8p9KlMoXI1MwTsI-8Kyblft66c7cnBKz3_z8ACdGtZ-HI4AghgW-m-yLpAiCrkCMnmIrVpldJ341yR6lq5uyPej7S8cvpvkScpXBSuyKwIDAQAB%22\n const body = b64ToU8(&amp;#039;AALoAYM+fDO53GVxBRuLbJhjFbwr0uZkl/m3NCNbiT6wal87GEuXuRw3iZUSZ3rSEqyHDhMlIqfyhAXHH8t8RP14ws3nQt1IBGE43Q9UinwglzrMY8e+k3Z9hQCEw7pBm/hVT/JNEPUKigBYSTN2IS59AUGHEB49fgZ0kA6ccu9BCdJBvIQcDyCcW5LCWCsNo57vYppIVzbV2r1R4v+zTk7IUDURTa4Mo7VYtg1krAWiFCoDxUOr+eTsc51bWqMtw2vKOyoM/20Wx2WJ0ox6JWdPvoBEsUVbENgBj11kB6/L9u2OW2APYyUR7dU9tGvExYkydXOfhRFJdKUypwKN70CiGw==&amp;#039;)\n // You can perform some check here to confirm the body is a valid token request\n\n console.log(&amp;#039;requesting token for tutorial.cloudflareworkers.com&amp;#039;)\n return fetch(ISSUER_URL, {\n method: &amp;#039;POST&amp;#039;,\n headers: { &amp;#039;content-type&amp;#039;: &amp;#039;application/private-token-request&amp;#039; },\n body: body,\n })\n}\n\nconst handleIssuerDirectory = async () =&amp;gt; {\n // These are fake issuers\n // Issuer data can be fetch at https://pp-issuer-public.research.cloudflare.com/.well-known/private-token-issuer-directory\n const TRUSTED_ISSUERS = {\n &amp;quot;issuer1&amp;quot;: { &amp;quot;token-keys&amp;quot;: [{ &amp;quot;token-type&amp;quot;: 2, &amp;quot;token-key&amp;quot;: &amp;quot;A==&amp;quot; }] },\n &amp;quot;issuer2&amp;quot;: { &amp;quot;token-keys&amp;quot;: [{ &amp;quot;token-type&amp;quot;: 2, &amp;quot;token-key&amp;quot;: &amp;quot;B==&amp;quot; }] },\n }\n return new Response(JSON.stringify(TRUSTED_ISSUERS), { headers: { &amp;quot;content-type&amp;quot;: &amp;quot;application/json&amp;quot; } })\n}\n\nconst handleRequest = (req) =&amp;gt; {\n const pathname = new URL(req.url).pathname\n console.log(pathname, req.url)\n if (pathname === &amp;#039;/v1/challenge&amp;#039;) {\n if (req.method === &amp;#039;POST&amp;#039;) {\n return handlePostChallenge(req)\n }\n return handleGetChallenge(req)\n }\n if (pathname === &amp;#039;/v1/private-token-issuer-directory&amp;#039;) {\n return handleIssuerDirectory()\n }\n return new Response(&amp;#039;Not found&amp;#039;, { status: 404 })\n}\n\naddEventListener(&amp;#039;fetch&amp;#039;, event =&amp;gt; {\n event.respondWith(handleRequest(event.request))\n})&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;The validation method above is simply checking if the user selected yes. Your method might be more complex, the wrapping stays the same.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5PnBuinoRKUpYjrBsHQbn/966c266e7de411503c5bf9a5dc9a184d/Screenshot-2024-01-04-at-10.30.04.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1356\&quot; height=\&quot;206\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;&lt;i&gt;Screenshot of the Yes/No Attester example&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Because users might have multiple Attesters configured for a given Issuer, we recommend your Attester implements one additional endpoint exposing the keys of the issuers you are in contact with. You can try this code on &lt;a href=\&quot;https://cloudflareworkers.com/#4eeeef2fa895e519addb3ae442ee351d:https://tutorial.cloudflareworkers.com/v1/private-token-issuer-directory\&quot;&gt;Cloudflare Workers playground&lt;/a&gt;.&lt;/p&gt;\n &lt;pre class=\&quot;language-javascript\&quot;&gt;&lt;code class=\&quot;language-javascript\&quot;&gt;const handleIssuerDirectory = () =&amp;gt; {\n const TRUSTED_ISSUERS = {\n &amp;quot;issuer1&amp;quot;: { &amp;quot;token-keys&amp;quot;: [{ &amp;quot;token-type&amp;quot;: 2, &amp;quot;token-key&amp;quot;: &amp;quot;A==&amp;quot; }] },\n &amp;quot;issuer2&amp;quot;: { &amp;quot;token-keys&amp;quot;: [{ &amp;quot;token-type&amp;quot;: 2, &amp;quot;token-key&amp;quot;: &amp;quot;B==&amp;quot; }] },\n }\n return new Response(JSON.stringify(TRUSTED_ISSUERS), { headers: { &amp;quot;content-type&amp;quot;: &amp;quot;application/json&amp;quot; } })\n}\n\nexport default {\n fetch(req: Request) {\n const pathname = new URL(req.url).pathname\n if (pathname === &amp;#039;/v1/private-token-issuer-directory&amp;#039;) {\n return handleIssuerDirectory()\n }\n }\n}&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;Et voilà. You have an Attester that can be used directly with the Silk browser extension (&lt;a href=\&quot;https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/\&quot;&gt;Firefox&lt;/a&gt;, &lt;a href=\&quot;https://chromewebstore.google.com/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi\&quot;&gt;Chrome&lt;/a&gt;). As you progress through your deployment, it can also be directly integrated into your applications.&lt;/p&gt;&lt;p&gt;If you would like to have a more advanced Attester and deployment pipeline, look at &lt;a href=\&quot;https://github.com/cloudflare/pp-attester\&quot;&gt;cloudflare/pp-attester&lt;/a&gt; template.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;as-an-issuer-foundation-consortium\&quot;&gt;As an Issuer - foundation, consortium&lt;/h3&gt;\n &lt;a href=\&quot;#as-an-issuer-foundation-consortium\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;We&amp;#39;ve mentioned the Issuer multiple times already. The role of an Issuer is to select a set of Attesters it wants to operate with, and communicate its public key to Origins. The whole cryptographic behavior of an Issuer is specified &lt;a href=\&quot;https://www.ietf.org/archive/id/draft-ietf-privacypass-protocol-16.html\&quot;&gt;by the IETF&lt;/a&gt; draft. In contrast to the Client and Attesters which have discretionary behavior, the Issuer is fully standardized. Their opportunity is to choose a signal that is strong enough for the Origin, while preserving privacy of Clients.&lt;/p&gt;&lt;p&gt;Cloudflare Research is operating a public Issuer for experimental purposes to use on &lt;a href=\&quot;https://pp-issuer-public.research.cloudflare.com\&quot;&gt;https://pp-issuer-public.research.cloudflare.com&lt;/a&gt;. It is the simplest solution to start experimenting with Privacy Pass today. Once it matures, you can consider joining a production Issuer, or deploying your own.&lt;/p&gt;&lt;p&gt;To deploy your own, you should:&lt;/p&gt;\n &lt;pre class=\&quot;language-bash\&quot;&gt;&lt;code class=\&quot;language-bash\&quot;&gt;git clone github.com/cloudflare/pp-issuer&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;Update wrangler.toml with your Cloudflare Workers account id and zone id. The open source Issuer API works as follows:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;/.well-known/private-token-issuer-directory returns the issuer configuration. Note it does not expose non-standard token-key-legacy&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;/token-request returns a token. This endpoint should be gated (by Cloudflare Access for instance) to only allow trusted attesters to call it&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;/admin/rotate to generate a new public key. This should only be accessible by your team, and be called prior to the issuer being available.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Then, &lt;code&gt;wrangler publish&lt;/code&gt;, and you&amp;#39;re good to onboard Attesters.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;development-of-silk-extension\&quot;&gt;Development of Silk extension&lt;/h2&gt;\n &lt;a href=\&quot;#development-of-silk-extension\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Just like the protocol, the browser technology on which Privacy Pass was proven viable has changed as well. For 5 years, the protocol got deployed along with a browser extension for Chrome and Firefox. In 2021, Chrome released a new version of extension configurations, usually referred to as &lt;a href=\&quot;https://developer.chrome.com/docs/extensions/mv3/intro/platform-vision/\&quot;&gt;Manifest version 3&lt;/a&gt; (MV3). Chrome also started enforcing this new configuration for all newly released extensions.&lt;/p&gt;&lt;p&gt;Privacy Pass &lt;i&gt;the extension&lt;/i&gt; is based on an agreed upon Privacy Pass &lt;a href=\&quot;https://datatracker.ietf.org/doc/draft-ietf-privacypass-auth-scheme/\&quot;&gt;&lt;i&gt;authentication protocol&lt;/i&gt;&lt;/a&gt;. Briefly looking at &lt;a href=\&quot;https://developer.chrome.com/docs/extensions/reference/webRequest/\&quot;&gt;Chrome’s API documentation&lt;/a&gt;, we should be able to use the onAuthRequired event. However, with PrivateToken authentication not yet being standard, there are no hooks provided by browsers for extensions to add logic to this event.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1iQsRopHuLfmHqjsppwImc/1a379a0cdd3de3e17de04811b1c08ac0/Screenshot-2024-01-04-at-10.32.44.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;2000\&quot; height=\&quot;932\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;&lt;i&gt;Image available under CC-BY-SA 4.0 provided by&lt;/i&gt; &lt;a href=\&quot;https://developer.chrome.com/docs/extensions/reference/webRequest/\&quot;&gt;&lt;i&gt;Google For Developers&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The approach we decided to use is to define a client side replay API. When a response comes with 401 WWW-Authenticate PrivateToken, the browser lets it through, but triggers the private token redemption flow. The original page is notified when a token has been retrieved, and replays the request. For this second request, the browser is able to attach an authorization token, and the request succeeds. This is an active replay performed by the client, rather than a transparent replay done by the platform. A specification is available on &lt;a href=\&quot;https://github.com/cloudflare/pp-browser-extension#chrome-support-via-client-replay-api\&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;We are looking forward to the standard progressing, and simplifying this part of the project. This should improve diversity in attestation methods. As we see in the next section, this is key to identifying new signals that can be leveraged by origins.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;a-standard-for-anonymous-credentials\&quot;&gt;A standard for anonymous credentials&lt;/h2&gt;\n &lt;a href=\&quot;#a-standard-for-anonymous-credentials\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;IP remains as a key identifier in the anti abuse system. At the same time, IP fingerprinting techniques have become a bigger concern and platforms have started to remove some of these ways of tracking users. To enable anti abuse systems to not rely on IP, while ensuring user privacy, Privacy Pass offers a reasonable alternative to deal with potentially abusive or suspicious traffic. The attestation methods vary and can be chosen as needed for a particular deployment. For example, Apple decided to back their attestation with hardware when using Privacy Pass as the authorization technology for iCloud Private Relay. Another example is Cloudflare Research which decided to deploy a Turnstile attester to signal a successful solve for Cloudflare’s challenge platform.&lt;/p&gt;&lt;p&gt;In all these deployments, Privacy Pass-like technology has allowed for specific bits of information to be shared. Instead of sharing your location, past traffic, and possibly your name and phone number simply by connecting to a website, your device is able to prove specific information to a third party in a privacy preserving manner. Which user information and attestation methods are sufficient to prevent abuse is an open question. We are looking to empower researchers with the release of this software to help in the quest for finding these answers. This could be via new experiments such as testing out new attestation methods, or fostering other privacy protocols by providing a framework for specific information sharing.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;future-recommendations\&quot;&gt;Future recommendations&lt;/h2&gt;\n &lt;a href=\&quot;#future-recommendations\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Just as we expect this latest version of Privacy Pass to lead to new applications and ideas we also expect further evolution of the standard and the clients that use it. Future development of Privacy Pass promises to cover topics like batch token issuance and rate limiting. From our work building and deploying this version of Privacy Pass we have encountered limitations that we expect to be resolved in the future as well.&lt;/p&gt;&lt;p&gt;The division of labor between Attesters and Issuers and the clear directions of trust relationships between the Origin and Issuer, and the Issuer and Attester make reasoning about the implications of a breach of trust clear. Issuers can trust more than one Attester, but since many current deployments of Privacy Pass do not identify the Attester that lead to issuance, a breach of trust in one Attester would render all tokens issued by any Issuer that trusts the Attester untrusted. This is because it would not be possible to tell which Attester was involved in the issuance process. Time will tell if this promotes a 1:1 correspondence between Attesters and Issuers.&lt;/p&gt;&lt;p&gt;The process of developing a browser extension supported by both Firefox and Chrome-based browsers can at times require quite baroque (and brittle) code paths. Privacy Pass the protocol seems a good fit for an extension of the &lt;a href=\&quot;https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/onAuthRequired\&quot;&gt;webRequest.onAuthRequired&lt;/a&gt; browser event. Just as Privacy Pass appears as an alternate authentication message in the WWW-Authenticate HTTP header, browsers could fire the onAuthRequired event for Private Token authentication too and include and allow request blocking support within the onAuthRequired event. This seems a natural evolution of the use of this event which currently is limited to the now rather long-in-the-tooth Basic authentication.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;conclusion\&quot;&gt;Conclusion&lt;/h2&gt;\n &lt;a href=\&quot;#conclusion\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Privacy Pass provides a solution to one of the longstanding challenges of the web: anonymous authentication. By leveraging cryptography, the protocol allows websites to get the information they need from users, and solely this information. It&amp;#39;s already used by millions to help distinguish human requests from automated bots in a manner that is privacy protective and often seamless. We are excited by the protocol’s broad and growing adoption, and by the novel use cases that are unlocked by this latest version.&lt;/p&gt;&lt;p&gt;Cloudflare’s Privacy Pass implementations are available on GitHub, and are compliant with the standard. We have open-sourced a &lt;a href=\&quot;https://github.com/cloudflare?q=pp-&amp;type=all&amp;language=&amp;sort=#org-repositories\&quot;&gt;set of templates&lt;/a&gt; that can be used to implement Privacy Pass &lt;a href=\&quot;https://github.com/cloudflare/pp-origin\&quot;&gt;&lt;i&gt;Origins&lt;/i&gt;&lt;/a&gt;&lt;i&gt;,&lt;/i&gt; &lt;a href=\&quot;https://github.com/cloudflare/pp-issuer\&quot;&gt;&lt;i&gt;Issuers&lt;/i&gt;&lt;/a&gt;, and &lt;a href=\&quot;https://github.com/cloudflare/pp-attester\&quot;&gt;&lt;i&gt;Attesters&lt;/i&gt;&lt;/a&gt;, which leverage Cloudflare Workers to get up and running quickly.&lt;/p&gt;&lt;p&gt;For those looking to try Privacy Pass out for themselves right away, download the &lt;i&gt;Silk - Privacy Pass Client&lt;/i&gt; browser extensions (&lt;a href=\&quot;https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/\&quot;&gt;Firefox&lt;/a&gt;, &lt;a href=\&quot;https://chromewebstore.google.com/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi\&quot;&gt;Chrome&lt;/a&gt;, &lt;a href=\&quot;https://github.com/cloudflare/pp-browser-extension\&quot;&gt;GitHub&lt;/a&gt;) and start browsing a web with fewer bot checks today.&lt;/p&gt;&quot;],&quot;published_at&quot;:[0,&quot;2024-01-04T16:07:22.000+00:00&quot;],&quot;updated_at&quot;:[0,&quot;2024-10-09T23:26:44.495Z&quot;],&quot;feature_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4wJwHdYhUiKvoSlAgSrFhG/cce2fbba90dbd93ef3cbc3e710e6f53b/privacy-pass-standard.png&quot;],&quot;tags&quot;:[1,[[0,{&quot;id&quot;:[0,&quot;1x7tpPmKIUCt19EDgM1Tsl&quot;],&quot;name&quot;:[0,&quot;Research&quot;],&quot;slug&quot;:[0,&quot;research&quot;]}],[0,{&quot;id&quot;:[0,&quot;3ZtL0yV0R4ScAreV1dTfIY&quot;],&quot;name&quot;:[0,&quot;Privacy Pass&quot;],&quot;slug&quot;:[0,&quot;privacy-pass&quot;]}],[0,{&quot;id&quot;:[0,&quot;kn8Lmy4luvCeAabblVvHH&quot;],&quot;name&quot;:[0,&quot;Firefox&quot;],&quot;slug&quot;:[0,&quot;firefox&quot;]}],[0,{&quot;id&quot;:[0,&quot;3skwJ34K0c3CEY1cNogR4n&quot;],&quot;name&quot;:[0,&quot;Chrome&quot;],&quot;slug&quot;:[0,&quot;chrome&quot;]}],[0,{&quot;id&quot;:[0,&quot;3BWeMuiOShelE7QM48sW9j&quot;],&quot;name&quot;:[0,&quot;Privacy&quot;],&quot;slug&quot;:[0,&quot;privacy&quot;]}]]],&quot;relatedTags&quot;:[0],&quot;authors&quot;:[1,[[0,{&quot;name&quot;:[0,&quot;Thibault Meunier&quot;],&quot;slug&quot;:[0,&quot;thibault&quot;],&quot;bio&quot;:[0,null],&quot;profile_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1CqrdcRymVgEs1zRfSE6Xr/b8182164b0a8435b162bdd1246b7e91f/thibault.png&quot;],&quot;location&quot;:[0,null],&quot;website&quot;:[0,null],&quot;twitter&quot;:[0,&quot;@thibmeu&quot;],&quot;facebook&quot;:[0,null]}],[0,{&quot;name&quot;:[0,&quot;Cefan Daniel Rubin&quot;],&quot;slug&quot;:[0,&quot;cdrubin&quot;],&quot;bio&quot;:[0,null],&quot;profile_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5EziMHboXmLjqS6FXaUODB/8f0daa841b1c260fae1be2a9d863457f/cdrubin.png&quot;],&quot;location&quot;:[0,null],&quot;website&quot;:[0,&quot;https://github.com/cdrubin&quot;],&quot;twitter&quot;:[0,null],&quot;facebook&quot;:[0,null]}],[0,{&quot;name&quot;:[0,&quot;Armando Faz-Hernández&quot;],&quot;slug&quot;:[0,&quot;armfazh&quot;],&quot;bio&quot;:[0,null],&quot;profile_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1KZECWa5TCEPjjcRmbx9iT/c62263899934ff326df2b6864e42b104/armfazh.png&quot;],&quot;location&quot;:[0,null],&quot;website&quot;:[0,&quot;https://research.cloudflare.com/people/armando-faz/&quot;],&quot;twitter&quot;:[0,&quot;@armfazh&quot;],&quot;facebook&quot;:[0,null]}]]],&quot;meta_description&quot;:[0,&quot;In this post, we explore the latest changes to Privacy Pass protocol. We are also excited to introduce a public implementation of the latest IETF draft of the Privacy Pass protocol — including a set of open-source templates that can be used to implement Privacy Pass Origins, Issuers, and Attesters.&quot;],&quot;primary_author&quot;:[0,{}],&quot;localeList&quot;:[0,{&quot;name&quot;:[0,&quot;Privacy Pass: upgrading to the latest protocol version Config&quot;],&quot;enUS&quot;:[0,&quot;English for Locale&quot;],&quot;zhCN&quot;:[0,&quot;Translated for Locale&quot;],&quot;zhHansCN&quot;:[0,&quot;No Page for Locale&quot;],&quot;zhTW&quot;:[0,&quot;Translated for Locale&quot;],&quot;frFR&quot;:[0,&quot;No Page for Locale&quot;],&quot;deDE&quot;:[0,&quot;No Page for Locale&quot;],&quot;itIT&quot;:[0,&quot;No Page for Locale&quot;],&quot;jaJP&quot;:[0,&quot;No Page for Locale&quot;],&quot;koKR&quot;:[0,&quot;No Page for Locale&quot;],&quot;ptBR&quot;:[0,&quot;No Page for Locale&quot;],&quot;esLA&quot;:[0,&quot;No Page for Locale&quot;],&quot;esES&quot;:[0,&quot;No Page for Locale&quot;],&quot;enAU&quot;:[0,&quot;No Page for Locale&quot;],&quot;enCA&quot;:[0,&quot;No Page for Locale&quot;],&quot;enIN&quot;:[0,&quot;No Page for Locale&quot;],&quot;enGB&quot;:[0,&quot;No Page for Locale&quot;],&quot;idID&quot;:[0,&quot;No Page for Locale&quot;],&quot;ruRU&quot;:[0,&quot;No Page for Locale&quot;],&quot;svSE&quot;:[0,&quot;No Page for Locale&quot;],&quot;viVN&quot;:[0,&quot;No Page for Locale&quot;],&quot;plPL&quot;:[0,&quot;No Page for Locale&quot;],&quot;arAR&quot;:[0,&quot;No Page for Locale&quot;],&quot;nlNL&quot;:[0,&quot;No Page for Locale&quot;],&quot;thTH&quot;:[0,&quot;No Page for Locale&quot;],&quot;trTR&quot;:[0,&quot;No Page for Locale&quot;],&quot;heIL&quot;:[0,&quot;No Page for Locale&quot;],&quot;lvLV&quot;:[0,&quot;No Page for Locale&quot;],&quot;etEE&quot;:[0,&quot;No Page for Locale&quot;],&quot;ltLT&quot;:[0,&quot;No Page for Locale&quot;]}],&quot;url&quot;:[0,&quot;https://blog.cloudflare.com/privacy-pass-standard&quot;],&quot;metadata&quot;:[0,{&quot;title&quot;:[0,&quot;Privacy Pass: upgrading to the latest protocol version&quot;],&quot;description&quot;:[0,&quot;In this post, we explore the latest changes to Privacy Pass protocol. We are also excited to introduce a public implementation of the latest IETF draft of the Privacy Pass protocol — including a set of open-source templates that can be used to implement Privacy Pass Origins, Issuers, and Attesters.&quot;],&quot;imgPreview&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/22RHi3sA2tR4yPZCvPKYLe/87cdf4737a0d11148e569ff370819e38/privacy-pass-standard-fxK0y1.png&quot;]}]}],&quot;translations&quot;:[0,{&quot;posts.by&quot;:[0,&quot;By&quot;],&quot;footer.gdpr&quot;:[0,&quot;GDPR&quot;],&quot;lang_blurb1&quot;:[0,&quot;This post is also available in {lang1}.&quot;],&quot;lang_blurb2&quot;:[0,&quot;This post is also available in {lang1} and {lang2}.&quot;],&quot;lang_blurb3&quot;:[0,&quot;This post is also available in {lang1}, {lang2} and {lang3}.&quot;],&quot;footer.press&quot;:[0,&quot;Press&quot;],&quot;header.title&quot;:[0,&quot;The Cloudflare Blog&quot;],&quot;search.clear&quot;:[0,&quot;Clear&quot;],&quot;search.filter&quot;:[0,&quot;Filter&quot;],&quot;search.source&quot;:[0,&quot;Source&quot;],&quot;footer.careers&quot;:[0,&quot;Careers&quot;],&quot;footer.company&quot;:[0,&quot;Company&quot;],&quot;footer.support&quot;:[0,&quot;Support&quot;],&quot;footer.the_net&quot;:[0,&quot;theNet&quot;],&quot;search.filters&quot;:[0,&quot;Filters&quot;],&quot;footer.our_team&quot;:[0,&quot;Our team&quot;],&quot;footer.webinars&quot;:[0,&quot;Webinars&quot;],&quot;page.more_posts&quot;:[0,&quot;More posts&quot;],&quot;posts.time_read&quot;:[0,&quot;{time} min read&quot;],&quot;search.language&quot;:[0,&quot;Language&quot;],&quot;footer.community&quot;:[0,&quot;Community&quot;],&quot;footer.resources&quot;:[0,&quot;Resources&quot;],&quot;footer.solutions&quot;:[0,&quot;Solutions&quot;],&quot;footer.trademark&quot;:[0,&quot;Trademark&quot;],&quot;header.subscribe&quot;:[0,&quot;Subscribe&quot;],&quot;footer.compliance&quot;:[0,&quot;Compliance&quot;],&quot;footer.free_plans&quot;:[0,&quot;Free plans&quot;],&quot;footer.impact_ESG&quot;:[0,&quot;Impact/ESG&quot;],&quot;posts.follow_on_X&quot;:[0,&quot;Follow on X&quot;],&quot;footer.help_center&quot;:[0,&quot;Help center&quot;],&quot;footer.network_map&quot;:[0,&quot;Network Map&quot;],&quot;header.please_wait&quot;:[0,&quot;Please Wait&quot;],&quot;page.related_posts&quot;:[0,&quot;Related posts&quot;],&quot;search.result_stat&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt; for &lt;strong&gt;{search_keyword}&lt;/strong&gt;&quot;],&quot;footer.case_studies&quot;:[0,&quot;Case Studies&quot;],&quot;footer.connect_2024&quot;:[0,&quot;Connect 2024&quot;],&quot;footer.terms_of_use&quot;:[0,&quot;Terms of Use&quot;],&quot;footer.white_papers&quot;:[0,&quot;White Papers&quot;],&quot;footer.cloudflare_tv&quot;:[0,&quot;Cloudflare TV&quot;],&quot;footer.community_hub&quot;:[0,&quot;Community Hub&quot;],&quot;footer.compare_plans&quot;:[0,&quot;Compare plans&quot;],&quot;footer.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.email_address&quot;:[0,&quot;Email Address&quot;],&quot;page.error.not_found&quot;:[0,&quot;Page not found&quot;],&quot;footer.developer_docs&quot;:[0,&quot;Developer docs&quot;],&quot;footer.privacy_policy&quot;:[0,&quot;Privacy Policy&quot;],&quot;footer.request_a_demo&quot;:[0,&quot;Request a demo&quot;],&quot;page.continue_reading&quot;:[0,&quot;Continue reading&quot;],&quot;footer.analysts_report&quot;:[0,&quot;Analyst reports&quot;],&quot;footer.for_enterprises&quot;:[0,&quot;For enterprises&quot;],&quot;footer.getting_started&quot;:[0,&quot;Getting Started&quot;],&quot;footer.learning_center&quot;:[0,&quot;Learning Center&quot;],&quot;footer.project_galileo&quot;:[0,&quot;Project Galileo&quot;],&quot;pagination.newer_posts&quot;:[0,&quot;Newer Posts&quot;],&quot;pagination.older_posts&quot;:[0,&quot;Older Posts&quot;],&quot;posts.social_buttons.x&quot;:[0,&quot;Discuss on X&quot;],&quot;search.icon_aria_label&quot;:[0,&quot;Search&quot;],&quot;search.source_location&quot;:[0,&quot;Source/Location&quot;],&quot;footer.about_cloudflare&quot;:[0,&quot;About Cloudflare&quot;],&quot;footer.athenian_project&quot;:[0,&quot;Athenian Project&quot;],&quot;footer.become_a_partner&quot;:[0,&quot;Become a partner&quot;],&quot;footer.cloudflare_radar&quot;:[0,&quot;Cloudflare Radar&quot;],&quot;footer.network_services&quot;:[0,&quot;Network services&quot;],&quot;footer.trust_and_safety&quot;:[0,&quot;Trust &amp; Safety&quot;],&quot;header.get_started_free&quot;:[0,&quot;Get Started Free&quot;],&quot;page.search.placeholder&quot;:[0,&quot;Search Cloudflare&quot;],&quot;footer.cloudflare_status&quot;:[0,&quot;Cloudflare Status&quot;],&quot;footer.cookie_preference&quot;:[0,&quot;Cookie Preferences&quot;],&quot;header.valid_email_error&quot;:[0,&quot;Must be valid email.&quot;],&quot;search.result_stat_empty&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt;&quot;],&quot;footer.connectivity_cloud&quot;:[0,&quot;Connectivity cloud&quot;],&quot;footer.developer_services&quot;:[0,&quot;Developer services&quot;],&quot;footer.investor_relations&quot;:[0,&quot;Investor relations&quot;],&quot;page.not_found.error_code&quot;:[0,&quot;Error Code: 404&quot;],&quot;search.autocomplete_title&quot;:[0,&quot;Insert a query. Press enter to send&quot;],&quot;footer.logos_and_press_kit&quot;:[0,&quot;Logos &amp; press kit&quot;],&quot;footer.application_services&quot;:[0,&quot;Application services&quot;],&quot;footer.get_a_recommendation&quot;:[0,&quot;Get a recommendation&quot;],&quot;posts.social_buttons.reddit&quot;:[0,&quot;Discuss on Reddit&quot;],&quot;footer.sse_and_sase_services&quot;:[0,&quot;SSE and SASE services&quot;],&quot;page.not_found.outdated_link&quot;:[0,&quot;You may have used an outdated link, or you may have typed the address incorrectly.&quot;],&quot;footer.report_security_issues&quot;:[0,&quot;Report Security Issues&quot;],&quot;page.error.error_message_page&quot;:[0,&quot;Sorry, we can&#39;t find the page you are looking for.&quot;],&quot;header.subscribe_notifications&quot;:[0,&quot;Subscribe to receive notifications of new posts:&quot;],&quot;footer.cloudflare_for_campaigns&quot;:[0,&quot;Cloudflare for Campaigns&quot;],&quot;header.subscription_confimation&quot;:[0,&quot;Subscription confirmed. Thank you for subscribing!&quot;],&quot;posts.social_buttons.hackernews&quot;:[0,&quot;Discuss on Hacker News&quot;],&quot;footer.diversity_equity_inclusion&quot;:[0,&quot;Diversity, equity &amp; inclusion&quot;],&quot;footer.critical_infrastructure_defense_project&quot;:[0,&quot;Critical Infrastructure Defense Project&quot;]}]}" ssr client="load" opts="{&quot;name&quot;:&quot;PostCard&quot;,&quot;value&quot;:true}" await-children><article class="w-100 featured-post flex flex-row flex-wrap mb4 items-center bb b--gray8 bn-l mt4 mt2-l mb4 ph3 bb b--gray8 bn-l"><div class="w-50-l"><a href="/privacy-pass-standard/" class="fw5 no-underline gray1" data-testid="post-title"><h2 class="fw5 mt2">Privacy Pass: upgrading to the latest protocol version</h2></a><p class="f3 fw5 gray5 my" data-testid="post-date">2024-01-04</p><p class="f4 fw3 lh-copy " data-testid="post-content">In this post, we explore the latest changes to Privacy Pass protocol. We are also excited to introduce a public implementation of the latest IETF draft of the Privacy Pass protocol — including a set of open-source templates that can be used to implement Privacy Pass Origins, Issuers, and Attesters<!-- -->...</p><a href="/privacy-pass-standard/" class="no-underline gray1 f4 lh-copy fw3 underline-hover" data-testid="post-continue-reading">Continue reading »</a><ul class="author-lists flex pl0"><li class="list flex items-center pr2 mb3"><a href="/author/thibault/" class="static-avatar pr1"><img class="author-profile-image br-100 mr2" src="https://blog.cloudflare.com/cdn-cgi/image/format=auto,dpr=3,width=64,height=64,gravity=face,fit=crop,zoom=0.5/https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1CqrdcRymVgEs1zRfSE6Xr/b8182164b0a8435b162bdd1246b7e91f/thibault.png" alt="Thibault Meunier" width="62" height="62"/></a><div class="author-name-tooltip"><a href="/author/thibault/" class="fw5 f4 no-underline black">Thibault Meunier</a></div></li><li class="list flex items-center pr2 mb3"><a href="/author/cdrubin/" class="static-avatar pr1"><img class="author-profile-image br-100 mr2" src="https://blog.cloudflare.com/cdn-cgi/image/format=auto,dpr=3,width=64,height=64,gravity=face,fit=crop,zoom=0.5/https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5EziMHboXmLjqS6FXaUODB/8f0daa841b1c260fae1be2a9d863457f/cdrubin.png" alt="Cefan Daniel Rubin" width="62" height="62"/></a><div class="author-name-tooltip"><a href="/author/cdrubin/" class="fw5 f4 no-underline black">Cefan Daniel Rubin</a></div></li><li class="list flex items-center pr2 mb3"><a href="/author/armfazh/" class="static-avatar pr1"><img class="author-profile-image br-100 mr2" src="https://blog.cloudflare.com/cdn-cgi/image/format=auto,dpr=3,width=64,height=64,gravity=face,fit=crop,zoom=0.5/https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1KZECWa5TCEPjjcRmbx9iT/c62263899934ff326df2b6864e42b104/armfazh.png" alt="Armando Faz-Hernández" width="62" height="62"/></a><div class="author-name-tooltip"><a href="/author/armfazh/" class="fw5 f4 no-underline black">Armando Faz-Hernández</a></div></li></ul></div><div class="w-50-l"><img class="dn di-l " src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4wJwHdYhUiKvoSlAgSrFhG/cce2fbba90dbd93ef3cbc3e710e6f53b/privacy-pass-standard.png" alt="Privacy Pass: upgrading to the latest protocol version"/></div></article><!--astro:end--></astro-island><astro-island uid="Z3mDX1" prefix="r1" component-url="/_astro/PostCard.CG32ktie.js" component-export="PostCard" renderer-url="/_astro/client.DLO1yDVm.js" props="{&quot;currentPage&quot;:[0,1],&quot;isFeaturedImageFirstPost&quot;:[0,false],&quot;post&quot;:[0,{&quot;id&quot;:[0,&quot;nnk7WdvORjw4nOJUFyE1z&quot;],&quot;title&quot;:[0,&quot;Privacy Pass v3: the new privacy bits&quot;],&quot;slug&quot;:[0,&quot;privacy-pass-v3&quot;],&quot;excerpt&quot;:[0,&quot;A new version of Privacy Pass for reducing the number of CAPTCHAs.&quot;],&quot;featured&quot;:[0,false],&quot;html&quot;:[0,&quot;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/115kIQcQAjoVFKaUFIy2hU/84df256d7d1a70332d79880d6aee8635/image1-32.png\&quot; alt=\&quot;privacy pass v3 logo\&quot; class=\&quot;kg-image\&quot; width=\&quot;1812\&quot; height=\&quot;1008\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;In November 2017, we &lt;a href=\&quot;/cloudflare-supports-privacy-pass/\&quot;&gt;released&lt;/a&gt; our implementation of a privacy preserving protocol to let users prove that they are humans without enabling tracking. When you install &lt;a href=\&quot;https://privacypass.github.io/\&quot;&gt;Privacy Pass’s browser extension&lt;/a&gt;, you get tokens when you solve a Cloudflare CAPTCHA which can be used to avoid needing to solve one again... The redeemed token is cryptographically unlinkable to the token originally provided by the server. That is why Privacy Pass is privacy preserving.&lt;/p&gt;&lt;p&gt;In October 2019, Privacy Pass reached another milestone. We released &lt;a href=\&quot;/supporting-the-latest-version-of-the-privacy-pass-protocol/\&quot;&gt;Privacy Pass Extension v2.0&lt;/a&gt; that includes a &lt;a href=\&quot;https://www.hcaptcha.com/privacy-pass\&quot;&gt;new service provider&lt;/a&gt; (hCaptcha) which provides a way to redeem a token not only with CAPTCHAs in the Cloudflare challenge pages but also hCaptcha CAPTCHAs in any website. When you encounter any hCaptcha CAPTCHA in any website, including the ones not behind Cloudflare, you can redeem a token to pass the CAPTCHA.&lt;/p&gt;&lt;p&gt;We believe Privacy Pass solves an important problem — balancing privacy and security for bot mitigation— but we think there’s more to be done in terms of both the &lt;a href=\&quot;https://github.com/privacypass/challenge-bypass-extension/tree/v3-rc\&quot;&gt;codebase&lt;/a&gt; and the protocol. We improved the codebase by redesigning how the service providers interact with the core extension. At the same time, we made progress on the standardization at IETF and improved the protocol by adding metadata which allows us to do more fabulous things with Privacy Pass.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;announcing-privacy-pass-extension-v3-0\&quot;&gt;Announcing Privacy Pass Extension v3.0&lt;/h2&gt;\n &lt;a href=\&quot;#announcing-privacy-pass-extension-v3-0\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;The current implementation of our extension is functional, but it is difficult to maintain two Privacy Pass service providers: Cloudflare and hCaptcha. So we decided to refactor the browser extension to improve its maintainability. We also used this opportunity to make following improvements:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Implement the extension using TypeScript instead of plain JavaScript.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Build the project using a module bundler instead of custom build scripts.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Refactor the code and define the API for the cryptographic primitive.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Treat provider-specific code as an encapsulated software module rather than a list of configuration properties.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;As a result of the improvements listed above, the extension will be less error-prone and each service provider will have more flexibility and can be integrated seamlessly with other providers.&lt;/p&gt;&lt;p&gt;In the new extension we use TypeScript instead of plain JavaScript because its syntax is a kind of extension to JavaScript, and we already use TypeScript in &lt;a href=\&quot;/bootstrapping-a-typescript-worker/\&quot;&gt;Workers&lt;/a&gt;. One of the things that makes TypeScript special is that it has features that are only available in modern programming languages, like &lt;a href=\&quot;https://en.wikipedia.org/wiki/Void_safety\&quot;&gt;null safety&lt;/a&gt;.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;support-for-future-service-providers\&quot;&gt;Support for Future Service Providers&lt;/h2&gt;\n &lt;a href=\&quot;#support-for-future-service-providers\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Another big improvement in v3.0 is that it is designed for modularity, meaning that it will be very easy to add a new potential service provider in the future. A new provider can use an API provided by us to implement their own request flow to use the Privacy Pass protocol and to handle the HTTP requests. By separating the provider-specific code from the core extension code using the API, the extension will be easier to update when there is a need for more service providers.&lt;/p&gt;&lt;p&gt;On a technical level, we allow each service provider to have its own &lt;a href=\&quot;https://developer.chrome.com/extensions/webRequest\&quot;&gt;WebRequest API&lt;/a&gt; event listeners instead of having central event listeners for all the providers. This allows providers to extend the browser extension&amp;#39;s functionality and implement any request handling logic they want.&lt;/p&gt;&lt;p&gt;Another major change that enables us to do this is that we moved away from configuration to programmable modularization.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;configuration-vs-modularization\&quot;&gt;Configuration vs Modularization&lt;/h2&gt;\n &lt;a href=\&quot;#configuration-vs-modularization\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;&lt;a href=\&quot;/supporting-the-latest-version-of-the-privacy-pass-protocol/\&quot;&gt;As mentioned in 2019&lt;/a&gt;, it would be impossible to expect different service providers to all abide by the same exact request flow, so we decided to use a JSON configuration file in v2.0 to define the request flow. The configuration allows the service providers to easily modify the extension characteristics without dealing too much with the core extension code. However, recently we figured out that we can improve it without using a configuration file, and using modules instead.&lt;/p&gt;&lt;p&gt;Using a configuration file limits the flexibility of the provider by the number of possible configurations. In addition, when the logic of each provider evolves and deviates from one another, the size of configuration will grow larger and larger which makes it hard to document and keep track of. So we decided to refactor how we determine the request flow from using a configuration file to using a module file written specifically for each service provider instead.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/34G52zSZ9ukkaa0h079EBV/287aaf7e3245f7fe1071ee0d4270a95f/image2-19.png\&quot; alt=\&quot;Configuration to modularization refactoring.\&quot; class=\&quot;kg-image\&quot; width=\&quot;1020\&quot; height=\&quot;493\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;By using a programmable module, the providers are not limited by the available fields in the configuration. In addition, the providers can use the available implementations of the necessary cryptographic primitives in any point of the request flow because we factored out the crypto bits into a separate module which can be used by any provider. In the future, if the cryptographic primitives ever change, the providers can update the code and use it any time.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;towards-standard-interoperability\&quot;&gt;Towards Standard Interoperability&lt;/h2&gt;\n &lt;a href=\&quot;#towards-standard-interoperability\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;The Privacy Pass protocol was first published at the &lt;a href=\&quot;https://www.petsymposium.org/2018/files/papers/issue3/popets-2018-0026.pdf\&quot;&gt;PoPETS&lt;/a&gt; symposium in 2018. As explained in this &lt;a href=\&quot;/privacy-pass-the-math/\&quot;&gt;previous post&lt;/a&gt;, the core of the Privacy Pass protocol is a secure way to generate tokens between server and client. To that end, the protocol requires evaluating a pseudorandom function that is oblivious and verifiable. The first property prevents the server from learning information about the client’s tokens, while the client learns nothing about the server’s private key. This is useful to protect the privacy of users. The token generation must also be verifiable in the sense that the client can attest to the fact that its token was minted using the server’s private key.&lt;/p&gt;&lt;p&gt;The original implementation of Privacy Pass has seen real-world use in our browser extension, helping to reduce CAPTCHAs for hundreds of thousands of people without compromising privacy. But to guarantee interoperability between services implementing Privacy Pass, what&amp;#39;s required is an accurate specification of the protocol and its operations. With this motivation, the Privacy Pass protocol was proposed as an Internet draft at the &lt;a href=\&quot;https://www.ietf.org/\&quot;&gt;Internet Engineering Task Force&lt;/a&gt; (IETF) — to know more about our participation at IETF &lt;a href=\&quot;/cloudflare-and-the-ietf\&quot;&gt;look at the post&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In March 2020, the protocol was presented at IETF-107 for the first time. The session was a &lt;a href=\&quot;https://www.ietf.org/how/bofs/\&quot;&gt;Birds-of-a-Feather&lt;/a&gt;, a place where the IETF community discusses the creation of new working groups that will write the actual standards. In the session, the working group’s charter is presented and proposes to develop a secure protocol for redeeming unforgeable tokens that attest to the validity of some attribute being held by a client. The charter was later approved, and three documents were integrated covering the protocol, the architecture, and an HTTP API for supporting Privacy Pass. The working group at IETF can be found at &lt;a href=\&quot;https://datatracker.ietf.org/wg/privacypass/about/\&quot;&gt;https://datatracker.ietf.org/wg/privacypass/&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Additionally, to its core functionality, the Privacy Pass protocol can be extended to improve its usability or to add new capabilities. For instance, adding a mechanism for public verifiability will allow a third party, someone who did not participate in the protocol, to verify the validity of tokens. Public verifiability can be implemented using a &lt;i&gt;blind-signature scheme&lt;/i&gt; — this is a special type of digital signatures firstly proposed by &lt;a href=\&quot;https://link.springer.com/chapter/10.1007/978-1-4757-0602-4_18\&quot;&gt;David Chaum&lt;/a&gt; in which signers can produce signatures on messages without learning the content of the message. A diversity of algorithms to implement blind-signatures exist; however, there is still work to be done to define a good candidate for public verifiability.&lt;/p&gt;&lt;p&gt;Another extension for Privacy Pass is the support for including metadata in the tokens. As this is a feature with high impact on the protocol, we devote a larger section to explain the benefits of supporting metadata in the face of hoarding attacks.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;future-work-metadata\&quot;&gt;Future work: metadata&lt;/h2&gt;\n &lt;a href=\&quot;#future-work-metadata\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;What is research without new challenges that arise? What does development look like if there are no other problems to solve? During the design and development of Privacy Pass (both as a service, as an idea, and as a protocol), a potential vector for abuse was noted, which will be referred to as a “hoarding” or “farming” attack. This attack consists of individual users or groups of users that can gather tokens over a long period of time and redeem them all at once with the aim of, for example, overwhelming a website and making the service unavailable for other users. In a more complex scenario, an attacker can build up a stock of tokens that they could then redistribute amongst other clients. This redistribution ability is possible as tokens are not linked to specific clients, which is a property of the Privacy Pass protocol.&lt;/p&gt;&lt;p&gt;There have been several proposed solutions to this attack. One can, for example, make the verification of tokens procedure very efficient, so attackers will need to hoard an even larger amount of tokens in order to overwhelm a service. But the problem is not only about making verification times faster, and, therefore, this does not completely solve the problem. Note that in Privacy Pass, a successful token redemption could be exchanged for a single-origin cookie. These cookies allow clients to avoid future challenges for a particular domain without using more tokens. In the case of a hoarding attack, an attacker could trade in their hoarded number of tokens for a number of cookies. An attacker can, then, mount a layer 7 DDoS attack with the “hoarded” cookies, which would render the service unavailable.&lt;/p&gt;&lt;p&gt;In the next sections, we will explore other different solutions to this attack.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;a-simple-solution-and-its-limitations-key-rotation\&quot;&gt;A simple solution and its limitations: key rotation&lt;/h3&gt;\n &lt;a href=\&quot;#a-simple-solution-and-its-limitations-key-rotation\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;What does “key rotation” mean in the context of Privacy Pass? In Privacy Pass, each token is attested by keys held by the service. These keys are further used to verify the honesty of a token presented by a client when trying to access a challenge-protected service. “Key rotation” means updating these keys with regard to a chosen epoch (meaning, for example, that every two weeks — the epoch —, the keys will be rotated). Regular key rotation, then, implies that tokens belong to these epochs and cannot be used outside them, which prevents stocks of tokens from being useful for longer than the epoch they belong to.&lt;/p&gt;&lt;p&gt;Keys, however, should not be rotated frequently as:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Rotating a key can lead to security implications&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Establishing trust in a frequently-rotating key service can be a challenging problem&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The unlinkability of the client when using tokens can be diminished&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Let’s explore these problems one by one now:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Rotating a key can lead to security implications&lt;/b&gt;, as past keys need to be deleted from secure storage locations and replaced with new ones. This process is prone to failure if done regularly, and can lead to potential key material leakage.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Establishing trust in a frequently-rotating key service&lt;/b&gt; can be a challenging problem, as keys will have to be verified by the needed parties each time they are regenerated. Keys need to be verified as it has to be attested that they belong to the entity one is trying to communicate with. If keys rotate too frequently, this verification procedure will have to happen frequently as well, so that an attacker will not be able to impersonate the honest entity with a “fake” public key.&lt;/p&gt;&lt;p&gt;&lt;b&gt;The unlinkability of the client when using tokens can be diminished&lt;/b&gt; as a savvy attacker (a malicious server, for example) could link token generation and token future-use. In the case of a malicious server, it can, for example, rotate their keys too often to violate unlinkability or could pick a separate public key for each client issuance. In these cases, this attack can be solved by the usage of public mechanisms to record which server’s public keys are used; but this requires further infrastructure and coordination between actors. Other cases are not easily solvable by this “public verification”: if keys are rotated every minute, for example, and a client was the only one to visit a “privacy pass protected” site in that minute, then, it&amp;#39;s not hard to infer (to “link”) that the token came only from this specific client.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;a-novel-solution-metadata\&quot;&gt;A novel solution: Metadata&lt;/h3&gt;\n &lt;a href=\&quot;#a-novel-solution-metadata\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;A novel solution to this “hoarding” problem that does not require key rotation or further optimization of verification times is the addition of metadata. This approach was introduced in the paper “&lt;a href=\&quot;https://eprint.iacr.org/2021/864.pdf\&quot;&gt;A Fast and Simple Partially Oblivious PRF, with Applications&lt;/a&gt;”, and it is called the “POPRF with metadata” construction. The idea is to add a metadata field to the token generation procedure in such a way that tokens are cryptographically linked to this added metadata. The added metadata can be, for example, a number that signals which epoch this token belongs to. The service, when presented with this token on verification, promptly checks that it corresponds to its internal epoch number (this epoch number can correspond to a period of time, a threshold of number of tokens issued, etc.). If it does not correspond, this token is expired and cannot be further used. Metadata, then, can be used to expire tokens without performing key rotations, thereby avoiding some issues outlined above.&lt;/p&gt;&lt;p&gt;Other kinds of metadata can be added to the Partially Oblivious PRF (PO-PRF) construction as well. Geographic location can be added, which signals that tokens can only be used in a specific region.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;the-limits-of-metadata\&quot;&gt;The limits of metadata&lt;/h3&gt;\n &lt;a href=\&quot;#the-limits-of-metadata\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Note, nevertheless, that the addition of this “metadata” should be carefully considered as adding, in the case of “time-metadata”, an explicit time bound signal will diminish the unlikability set of the tokens. If an explicit time-bound signal is added (for example, the specific time — year, month, day, hour, minute and seconds — in which this token was generated and the amount of time it is valid for), it will allow a malicious server to link generation and usage. The recommendation is to use “opaque metadata”: metadata that is public to both client and service but that only the service knows its precise meaning. A server, for example, can set a counter that gets increased after a period of time (for example, every two weeks). The server will add this counter as metadata rather than the period of time. The client, in this case, publicly knows what this counter is but does not know to which period it refers to.&lt;/p&gt;&lt;p&gt;Geographic location metadata should be coarse as well: it should refer to a large geographical area, such as a continent, or political and economic union rather than an explicit location.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;wrap-up\&quot;&gt;Wrap up&lt;/h2&gt;\n &lt;a href=\&quot;#wrap-up\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;The Privacy Pass protocol provides users with a secure way for redeeming tokens. At Cloudflare, we use the protocol to reduce the number of CAPTCHAs improving the user experience while browsing websites. A natural evolution of the protocol is expected, ranging from its standardization to innovating with new capabilities that help to prevent abuse of the service.&lt;/p&gt;&lt;p&gt;On the service side, we refactored the Privacy Pass browser extension aiming to improve the quality of the code, so bugs can be detected in earlier phases of the development. The code is available at the &lt;a href=\&quot;https://github.com/privacypass/challenge-bypass-extension/tree/v3-rc\&quot;&gt;challenge-bypass-extension&lt;/a&gt; repository, and we invite you to try the release candidate version.&lt;/p&gt;&lt;p&gt;An appealing extension for Privacy Pass is the inclusion of metadata as it provides a non-cumbersome way to solve hoarding attacks, while preserving the anonymity (in general, the privacy) of the protocol itself. &lt;a href=\&quot;https://eprint.iacr.org/2021/864.pdf\&quot;&gt;Our paper&lt;/a&gt; provides you more information about the technical details behind this idea.&lt;/p&gt;&lt;p&gt;The application of the Privacy Pass protocol in other use cases or to create other service providers requires a certain degree of compatibility. People wanting to implement Privacy Pass must be able to have a standard specification, so implementations can interoperate. The efforts along these lines are centered on the &lt;a href=\&quot;https://datatracker.ietf.org/wg/privacypass/about/\&quot;&gt;Privacy Pass working group&lt;/a&gt; at IETF, a space open for anyone to participate in delineating the future of the protocol. Feel free to be part of these efforts too.&lt;/p&gt;&lt;p&gt;We are continuously working on new ways of improving our services and helping the Internet be a better and a more secure place. You can join us on this effort and can reach us at &lt;a href=\&quot;https://research.cloudflare.com\&quot;&gt;research.cloudflare.com&lt;/a&gt;. See you next time.&lt;/p&gt;&quot;],&quot;published_at&quot;:[0,&quot;2021-10-12T13:59:19.000+01:00&quot;],&quot;updated_at&quot;:[0,&quot;2024-10-09T23:15:42.120Z&quot;],&quot;feature_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/73TY3K8DifXIxRpIz0wpXA/479f12bdecc30cdbb80a843cdd844ed0/privacy-pass-v3.png&quot;],&quot;tags&quot;:[1,[[0,{&quot;id&quot;:[0,&quot;1x7tpPmKIUCt19EDgM1Tsl&quot;],&quot;name&quot;:[0,&quot;Research&quot;],&quot;slug&quot;:[0,&quot;research&quot;]}],[0,{&quot;id&quot;:[0,&quot;6Mp7ouACN2rT3YjL1xaXJx&quot;],&quot;name&quot;:[0,&quot;Security&quot;],&quot;slug&quot;:[0,&quot;security&quot;]}],[0,{&quot;id&quot;:[0,&quot;3ZtL0yV0R4ScAreV1dTfIY&quot;],&quot;name&quot;:[0,&quot;Privacy Pass&quot;],&quot;slug&quot;:[0,&quot;privacy-pass&quot;]}],[0,{&quot;id&quot;:[0,&quot;11uq7RpwEtvy8Ic53C6cMR&quot;],&quot;name&quot;:[0,&quot;CAPTCHA&quot;],&quot;slug&quot;:[0,&quot;captcha&quot;]}]]],&quot;relatedTags&quot;:[0],&quot;authors&quot;:[1,[[0,{&quot;name&quot;:[0,&quot;Pop Chunhapanya&quot;],&quot;slug&quot;:[0,&quot;pop-chun&quot;],&quot;bio&quot;:[0,null],&quot;profile_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6K0jmiXQd3Xip6uGnAvQWE/e68fcde2d6960d531bb54c05fd0fc519/pop-chun.jpg&quot;],&quot;location&quot;:[0,null],&quot;website&quot;:[0,null],&quot;twitter&quot;:[0,null],&quot;facebook&quot;:[0,null]}],[0,{&quot;name&quot;:[0,&quot;Armando Faz-Hernández&quot;],&quot;slug&quot;:[0,&quot;armfazh&quot;],&quot;bio&quot;:[0,null],&quot;profile_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1KZECWa5TCEPjjcRmbx9iT/c62263899934ff326df2b6864e42b104/armfazh.png&quot;],&quot;location&quot;:[0,null],&quot;website&quot;:[0,&quot;https://research.cloudflare.com/people/armando-faz/&quot;],&quot;twitter&quot;:[0,&quot;@armfazh&quot;],&quot;facebook&quot;:[0,null]}],[0,{&quot;name&quot;:[0,&quot;Sofía Celi&quot;],&quot;slug&quot;:[0,&quot;sofia&quot;],&quot;bio&quot;:[0,&quot;Cryptography researcher and implementer at Cloudflare.&quot;],&quot;profile_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2waJR10lPQ4007cOdOJQ5P/b525f38d9cf9e9d7df248f7134f31add/sofia.jpg&quot;],&quot;location&quot;:[0,&quot;Lisbon&quot;],&quot;website&quot;:[0,&quot;http://claucece.github.io/&quot;],&quot;twitter&quot;:[0,&quot;@claucece&quot;],&quot;facebook&quot;:[0,null]}]]],&quot;meta_description&quot;:[0,&quot;A new version of Privacy Pass for reducing the number of CAPTCHAs.&quot;],&quot;primary_author&quot;:[0,{}],&quot;localeList&quot;:[0,{&quot;name&quot;:[0,&quot;Privacy Pass v3: the new privacy bits Config&quot;],&quot;enUS&quot;:[0,&quot;English for Locale&quot;],&quot;zhCN&quot;:[0,&quot;No Page for Locale&quot;],&quot;zhHansCN&quot;:[0,&quot;No Page for Locale&quot;],&quot;zhTW&quot;:[0,&quot;No Page for Locale&quot;],&quot;frFR&quot;:[0,&quot;No Page for Locale&quot;],&quot;deDE&quot;:[0,&quot;No Page for Locale&quot;],&quot;itIT&quot;:[0,&quot;No Page for Locale&quot;],&quot;jaJP&quot;:[0,&quot;No Page for Locale&quot;],&quot;koKR&quot;:[0,&quot;No Page for Locale&quot;],&quot;ptBR&quot;:[0,&quot;No Page for Locale&quot;],&quot;esLA&quot;:[0,&quot;No Page for Locale&quot;],&quot;esES&quot;:[0,&quot;No Page for Locale&quot;],&quot;enAU&quot;:[0,&quot;No Page for Locale&quot;],&quot;enCA&quot;:[0,&quot;No Page for Locale&quot;],&quot;enIN&quot;:[0,&quot;No Page for Locale&quot;],&quot;enGB&quot;:[0,&quot;No Page for Locale&quot;],&quot;idID&quot;:[0,&quot;No Page for Locale&quot;],&quot;ruRU&quot;:[0,&quot;No Page for Locale&quot;],&quot;svSE&quot;:[0,&quot;No Page for Locale&quot;],&quot;viVN&quot;:[0,&quot;No Page for Locale&quot;],&quot;plPL&quot;:[0,&quot;No Page for Locale&quot;],&quot;arAR&quot;:[0,&quot;No Page for Locale&quot;],&quot;nlNL&quot;:[0,&quot;No Page for Locale&quot;],&quot;thTH&quot;:[0,&quot;No Page for Locale&quot;],&quot;trTR&quot;:[0,&quot;No Page for Locale&quot;],&quot;heIL&quot;:[0,&quot;No Page for Locale&quot;],&quot;lvLV&quot;:[0,&quot;No Page for Locale&quot;],&quot;etEE&quot;:[0,&quot;No Page for Locale&quot;],&quot;ltLT&quot;:[0,&quot;No Page for Locale&quot;]}],&quot;url&quot;:[0,&quot;https://blog.cloudflare.com/privacy-pass-v3&quot;],&quot;metadata&quot;:[0,{&quot;title&quot;:[0,&quot;Privacy Pass v3: the new privacy bits&quot;],&quot;description&quot;:[0,&quot;A new version of Privacy Pass for reducing the number of CAPTCHAs.&quot;],&quot;imgPreview&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4H6QCTjjsMQeXf6B2hUCAc/1436601dd782130cef4e175c28445aec/privacy-pass-v3-43ibix.png&quot;]}]}],&quot;translations&quot;:[0,{&quot;posts.by&quot;:[0,&quot;By&quot;],&quot;footer.gdpr&quot;:[0,&quot;GDPR&quot;],&quot;lang_blurb1&quot;:[0,&quot;This post is also available in {lang1}.&quot;],&quot;lang_blurb2&quot;:[0,&quot;This post is also available in {lang1} and {lang2}.&quot;],&quot;lang_blurb3&quot;:[0,&quot;This post is also available in {lang1}, {lang2} and {lang3}.&quot;],&quot;footer.press&quot;:[0,&quot;Press&quot;],&quot;header.title&quot;:[0,&quot;The Cloudflare Blog&quot;],&quot;search.clear&quot;:[0,&quot;Clear&quot;],&quot;search.filter&quot;:[0,&quot;Filter&quot;],&quot;search.source&quot;:[0,&quot;Source&quot;],&quot;footer.careers&quot;:[0,&quot;Careers&quot;],&quot;footer.company&quot;:[0,&quot;Company&quot;],&quot;footer.support&quot;:[0,&quot;Support&quot;],&quot;footer.the_net&quot;:[0,&quot;theNet&quot;],&quot;search.filters&quot;:[0,&quot;Filters&quot;],&quot;footer.our_team&quot;:[0,&quot;Our team&quot;],&quot;footer.webinars&quot;:[0,&quot;Webinars&quot;],&quot;page.more_posts&quot;:[0,&quot;More posts&quot;],&quot;posts.time_read&quot;:[0,&quot;{time} min read&quot;],&quot;search.language&quot;:[0,&quot;Language&quot;],&quot;footer.community&quot;:[0,&quot;Community&quot;],&quot;footer.resources&quot;:[0,&quot;Resources&quot;],&quot;footer.solutions&quot;:[0,&quot;Solutions&quot;],&quot;footer.trademark&quot;:[0,&quot;Trademark&quot;],&quot;header.subscribe&quot;:[0,&quot;Subscribe&quot;],&quot;footer.compliance&quot;:[0,&quot;Compliance&quot;],&quot;footer.free_plans&quot;:[0,&quot;Free plans&quot;],&quot;footer.impact_ESG&quot;:[0,&quot;Impact/ESG&quot;],&quot;posts.follow_on_X&quot;:[0,&quot;Follow on X&quot;],&quot;footer.help_center&quot;:[0,&quot;Help center&quot;],&quot;footer.network_map&quot;:[0,&quot;Network Map&quot;],&quot;header.please_wait&quot;:[0,&quot;Please Wait&quot;],&quot;page.related_posts&quot;:[0,&quot;Related posts&quot;],&quot;search.result_stat&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt; for &lt;strong&gt;{search_keyword}&lt;/strong&gt;&quot;],&quot;footer.case_studies&quot;:[0,&quot;Case Studies&quot;],&quot;footer.connect_2024&quot;:[0,&quot;Connect 2024&quot;],&quot;footer.terms_of_use&quot;:[0,&quot;Terms of Use&quot;],&quot;footer.white_papers&quot;:[0,&quot;White Papers&quot;],&quot;footer.cloudflare_tv&quot;:[0,&quot;Cloudflare TV&quot;],&quot;footer.community_hub&quot;:[0,&quot;Community Hub&quot;],&quot;footer.compare_plans&quot;:[0,&quot;Compare plans&quot;],&quot;footer.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.email_address&quot;:[0,&quot;Email Address&quot;],&quot;page.error.not_found&quot;:[0,&quot;Page not found&quot;],&quot;footer.developer_docs&quot;:[0,&quot;Developer docs&quot;],&quot;footer.privacy_policy&quot;:[0,&quot;Privacy Policy&quot;],&quot;footer.request_a_demo&quot;:[0,&quot;Request a demo&quot;],&quot;page.continue_reading&quot;:[0,&quot;Continue reading&quot;],&quot;footer.analysts_report&quot;:[0,&quot;Analyst reports&quot;],&quot;footer.for_enterprises&quot;:[0,&quot;For enterprises&quot;],&quot;footer.getting_started&quot;:[0,&quot;Getting Started&quot;],&quot;footer.learning_center&quot;:[0,&quot;Learning Center&quot;],&quot;footer.project_galileo&quot;:[0,&quot;Project Galileo&quot;],&quot;pagination.newer_posts&quot;:[0,&quot;Newer Posts&quot;],&quot;pagination.older_posts&quot;:[0,&quot;Older Posts&quot;],&quot;posts.social_buttons.x&quot;:[0,&quot;Discuss on X&quot;],&quot;search.icon_aria_label&quot;:[0,&quot;Search&quot;],&quot;search.source_location&quot;:[0,&quot;Source/Location&quot;],&quot;footer.about_cloudflare&quot;:[0,&quot;About Cloudflare&quot;],&quot;footer.athenian_project&quot;:[0,&quot;Athenian Project&quot;],&quot;footer.become_a_partner&quot;:[0,&quot;Become a partner&quot;],&quot;footer.cloudflare_radar&quot;:[0,&quot;Cloudflare Radar&quot;],&quot;footer.network_services&quot;:[0,&quot;Network services&quot;],&quot;footer.trust_and_safety&quot;:[0,&quot;Trust &amp; Safety&quot;],&quot;header.get_started_free&quot;:[0,&quot;Get Started Free&quot;],&quot;page.search.placeholder&quot;:[0,&quot;Search Cloudflare&quot;],&quot;footer.cloudflare_status&quot;:[0,&quot;Cloudflare Status&quot;],&quot;footer.cookie_preference&quot;:[0,&quot;Cookie Preferences&quot;],&quot;header.valid_email_error&quot;:[0,&quot;Must be valid email.&quot;],&quot;search.result_stat_empty&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt;&quot;],&quot;footer.connectivity_cloud&quot;:[0,&quot;Connectivity cloud&quot;],&quot;footer.developer_services&quot;:[0,&quot;Developer services&quot;],&quot;footer.investor_relations&quot;:[0,&quot;Investor relations&quot;],&quot;page.not_found.error_code&quot;:[0,&quot;Error Code: 404&quot;],&quot;search.autocomplete_title&quot;:[0,&quot;Insert a query. Press enter to send&quot;],&quot;footer.logos_and_press_kit&quot;:[0,&quot;Logos &amp; press kit&quot;],&quot;footer.application_services&quot;:[0,&quot;Application services&quot;],&quot;footer.get_a_recommendation&quot;:[0,&quot;Get a recommendation&quot;],&quot;posts.social_buttons.reddit&quot;:[0,&quot;Discuss on Reddit&quot;],&quot;footer.sse_and_sase_services&quot;:[0,&quot;SSE and SASE services&quot;],&quot;page.not_found.outdated_link&quot;:[0,&quot;You may have used an outdated link, or you may have typed the address incorrectly.&quot;],&quot;footer.report_security_issues&quot;:[0,&quot;Report Security Issues&quot;],&quot;page.error.error_message_page&quot;:[0,&quot;Sorry, we can&#39;t find the page you are looking for.&quot;],&quot;header.subscribe_notifications&quot;:[0,&quot;Subscribe to receive notifications of new posts:&quot;],&quot;footer.cloudflare_for_campaigns&quot;:[0,&quot;Cloudflare for Campaigns&quot;],&quot;header.subscription_confimation&quot;:[0,&quot;Subscription confirmed. Thank you for subscribing!&quot;],&quot;posts.social_buttons.hackernews&quot;:[0,&quot;Discuss on Hacker News&quot;],&quot;footer.diversity_equity_inclusion&quot;:[0,&quot;Diversity, equity &amp; inclusion&quot;],&quot;footer.critical_infrastructure_defense_project&quot;:[0,&quot;Critical Infrastructure Defense Project&quot;]}]}" ssr client="load" opts="{&quot;name&quot;:&quot;PostCard&quot;,&quot;value&quot;:true}" await-children><article class="w-50-l mt4 mt2-l mb4 ph3 bb b--gray8 bn-l"><div class="w-100"><a href="/privacy-pass-v3/" class="fw5 no-underline gray1" data-testid="post-title"><h2 class="fw5 mt2">Privacy Pass v3: the new privacy bits</h2></a><p class="f3 fw5 gray5 my" data-testid="post-date">2021-10-12</p><div class=""><a href="/tag/research/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Research</a><a href="/tag/security/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Security</a><a href="/tag/privacy-pass/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Privacy Pass</a><a href="/tag/captcha/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">CAPTCHA</a></div><p class="f3 fw4 gray1 lh-copy " data-testid="post-content">A new version of Privacy Pass for reducing the number of CAPTCHAs.<!-- -->...</p><ul class="author-lists flex pl0"><li class="list flex items-center pr2 mb3"><a href="/author/pop-chun/" class="static-avatar pr1"><img class="author-profile-image br-100 mr2" src="https://blog.cloudflare.com/cdn-cgi/image/format=auto,dpr=3,width=64,height=64,gravity=face,fit=crop,zoom=0.5/https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6K0jmiXQd3Xip6uGnAvQWE/e68fcde2d6960d531bb54c05fd0fc519/pop-chun.jpg" alt="Pop Chunhapanya" width="62" height="62"/></a><div class="author-name-tooltip"><a href="/author/pop-chun/" class="fw4 f3 no-underline black">Pop Chunhapanya</a></div></li><li class="list flex items-center pr2 mb3"><a href="/author/armfazh/" class="static-avatar pr1"><img class="author-profile-image br-100 mr2" src="https://blog.cloudflare.com/cdn-cgi/image/format=auto,dpr=3,width=64,height=64,gravity=face,fit=crop,zoom=0.5/https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1KZECWa5TCEPjjcRmbx9iT/c62263899934ff326df2b6864e42b104/armfazh.png" alt="Armando Faz-Hernández" width="62" height="62"/></a><div class="author-name-tooltip"><a href="/author/armfazh/" class="fw4 f3 no-underline black">Armando Faz-Hernández</a></div></li><li class="list flex items-center pr2 mb3"><a href="/author/sofia/" class="static-avatar pr1"><img class="author-profile-image br-100 mr2" src="https://blog.cloudflare.com/cdn-cgi/image/format=auto,dpr=3,width=64,height=64,gravity=face,fit=crop,zoom=0.5/https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2waJR10lPQ4007cOdOJQ5P/b525f38d9cf9e9d7df248f7134f31add/sofia.jpg" alt="Sofía Celi" width="62" height="62"/></a><div class="author-name-tooltip"><a href="/author/sofia/" class="fw4 f3 no-underline black">Sofía Celi</a></div></li></ul></div></article><!--astro:end--></astro-island><astro-island uid="2iox63" prefix="r2" component-url="/_astro/PostCard.CG32ktie.js" component-export="PostCard" renderer-url="/_astro/client.DLO1yDVm.js" props="{&quot;currentPage&quot;:[0,1],&quot;isFeaturedImageFirstPost&quot;:[0,false],&quot;post&quot;:[0,{&quot;id&quot;:[0,&quot;3Zpj2uDmshq6ssT51N9alr&quot;],&quot;title&quot;:[0,&quot;Supporting the latest version of the Privacy Pass Protocol&quot;],&quot;slug&quot;:[0,&quot;supporting-the-latest-version-of-the-privacy-pass-protocol&quot;],&quot;excerpt&quot;:[0,&quot;At Cloudflare, we are committed to supporting and developing new privacy-preserving technologies that benefit all Internet users. In November 2017, we announced server-side support for the Privacy Pass protocol, a piece of work developed in collaboration with the academic community.&quot;],&quot;featured&quot;:[0,false],&quot;html&quot;:[0,&quot;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/445gSyr8pFihUh221BqGV5/0e704d8d2ecd834689eea53c04554be5/Privacy-Pass-_2x-2.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1600\&quot; height=\&quot;1017\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;At Cloudflare, we are committed to supporting and developing new privacy-preserving technologies that benefit all Internet users. In November 2017, we announced server-side support for the &lt;a href=\&quot;/cloudflare-supports-privacy-pass/\&quot;&gt;Privacy Pass protocol&lt;/a&gt;, a piece of work developed in &lt;a href=\&quot;https://petsymposium.org/2018/files/papers/issue3/popets-2018-0026.pdf\&quot;&gt;collaboration with the academic community&lt;/a&gt;. Privacy Pass, in a nutshell, allows clients to provide proof of trust &lt;a href=\&quot;https://privacypass.github.io/protocol/\&quot;&gt;without revealing where and when the trust was provided&lt;/a&gt;. The aim of the protocol is then to allow anyone to prove they are trusted by a server, without that server being able to track the user via the trust that was assigned.&lt;/p&gt;&lt;p&gt;On a technical level, Privacy Pass clients receive attestation tokens from a server, that can then be redeemed in the future. These tokens are provided when a server deems the client to be trusted; for example, after they have logged into a service or if they prove certain characteristics. The redeemed tokens are cryptographically unlinkable to the attestation originally provided by the server, and so they do not reveal anything about the client.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7LVQnmDxgw0kv43MipnEO5/ed93518b30730567d1780e22fa46e606/imageLikeEmbed--2-.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;721\&quot; height=\&quot;382\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/62mh0kvdwZSIUQhkLHmqLt/ea96c6a856a3b53c7ceb8a3b52c6dd3d/imageLikeEmbed--1-.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;721\&quot; height=\&quot;382\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;To use Privacy Pass, clients can install an &lt;a href=\&quot;https://github.com/privacypass/challenge-bypass-extension\&quot;&gt;open-source&lt;/a&gt; browser extension available in &lt;a href=\&quot;https://chrome.google.com/webstore/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi?hl=en\&quot;&gt;Chrome&lt;/a&gt; &amp;amp; &lt;a href=\&quot;https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/\&quot;&gt;Firefox&lt;/a&gt;. There have been over 150,000 individual downloads of Privacy Pass worldwide; approximately 130,000 in Chrome and more than 20,000 in Firefox. The extension is supported by Cloudflare to make websites more accessible for users. This complements previous work, including the launch of &lt;a href=\&quot;/cloudflare-onion-service/\&quot;&gt;Cloudflare onion services&lt;/a&gt; to help improve accessibility for users of the Tor Browser.&lt;/p&gt;&lt;p&gt;The initial release was almost two years ago, and it was followed up with a &lt;a href=\&quot;https://petsymposium.org/2018/files/papers/issue3/popets-2018-0026.pdf\&quot;&gt;research publication&lt;/a&gt; that was presented at the &lt;a href=\&quot;https://www.youtube.com/watch?v=9DsUi-UF2pM&amp;list=PLWSQygNuIsPd6YJmGV9kn1mP2A6-IBCoU&amp;index=10\&quot;&gt;Privacy Enhancing Technologies Symposium 2018&lt;/a&gt; (winning a Best Student Paper award). Since then, Cloudflare has been working with the wider community to build on the initial design and improve Privacy Pass. We’ll be talking about the work that we have done to develop the existing implementations, alongside the protocol itself.&lt;/p&gt;&lt;h1&gt;What’s new?&lt;/h1&gt;&lt;p&gt;&lt;b&gt;Support for Privacy Pass v2.0 browser extension:&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Easier configuration of workflow.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Integration with new service provider (hCaptcha).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Compliance with hash-to-curve draft.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Possible to rotate keys outside of extension release.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Available in &lt;a href=\&quot;https://chrome.google.com/webstore/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi?hl=en\&quot;&gt;Chrome&lt;/a&gt; and &lt;a href=\&quot;https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/\&quot;&gt;Firefox&lt;/a&gt; (works best with up-to-date browser versions).&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;Rolling out a new server backend using Cloudflare Workers platform:&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Cryptographic operations performed using internal V8 engine.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Provides public redemption API for Cloudflare Privacy Pass v2.0 tokens.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Available by making POST requests to &lt;a href=\&quot;https://privacypass.cloudflare.com/api/redeem\&quot;&gt;https://privacypass.cloudflare.com/api/redeem&lt;/a&gt;. See the documentation for &lt;a href=\&quot;https://privacypass.github.io/api-redeem\&quot;&gt;example usage&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Only compatible with extension v2.0 (check that you have updated!).&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;Standardization:&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Continued development of oblivious pseudorandom functions (OPRFs) &lt;a href=\&quot;https://datatracker.ietf.org/doc/draft-irtf-cfrg-voprf/\&quot;&gt;draft&lt;/a&gt; in prime-order groups with CFRG@IRTF.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=\&quot;https://github.com/alxdavids/draft-privacy-pass\&quot;&gt;New draft&lt;/a&gt; specifying Privacy Pass protocol.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1&gt;Extension v2.0&lt;/h1&gt;&lt;p&gt;In the time since the release, we’ve been working on a number of new features. Today we’re excited to announce support for version 2.0 of the extension, the first update since the original release. The extension continues to be available for &lt;a href=\&quot;https://chrome.google.com/webstore/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi?hl=en\&quot;&gt;Chrome&lt;/a&gt; and &lt;a href=\&quot;https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/\&quot;&gt;Firefox&lt;/a&gt;. You may need to download v2.0 manually from the store if you have auto-updates disabled in your browser.&lt;/p&gt;&lt;p&gt;The extension remains under active development and we still regard our support as in the beta phase. This will continue to be the case as the draft specification of the protocol continues to be written in collaboration with the wider community.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6WHnz7X5VULjd2rQPvSCYM/3fb47ca24f01788504fd4768813267fc/pasted-image-0-2.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1280\&quot; height=\&quot;800\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;new-integrations\&quot;&gt;New Integrations&lt;/h3&gt;\n &lt;a href=\&quot;#new-integrations\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;The client implementation uses the &lt;a href=\&quot;https://developer.chrome.com/extensions/webRequest\&quot;&gt;WebRequest API&lt;/a&gt; to look for certain types of HTTP requests. When these requests are spotted, they are rewritten to include some cryptographic data required for the Privacy Pass protocol. This allows Privacy Pass providers receiving this data to authorize access for the user.&lt;/p&gt;&lt;p&gt;For example, a user may receive Privacy Pass tokens for completing some server security checks. These tokens are stored by the browser extension, and any future request that needs similar security clearance can be modified to add a stored token as an extra HTTP header. The server can then check the client token and verify that the client has the correct authorization to proceed.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1EOFEhhNfe23pe6Beqsprx/f11bd08106711abf443dd53afd45f013/imageLikeEmbed--4-.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;546\&quot; height=\&quot;350\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;While Cloudflare supports a particular type of request flow, it would be impossible to expect different service providers to all abide by the same exact interaction characteristics. One of the major changes in the v2.0 extension has been a technical rewrite to instead use a central configuration file. The config is specified in the &lt;a href=\&quot;https://github.com/privacypass/challenge-bypass-extension/blob/master/src/ext/config.js\&quot;&gt;source code&lt;/a&gt; of the extension and allows easier modification of the browsing characteristics that initiate Privacy Pass actions. This makes adding new, completely different request flows possible by simply cloning and adapting the configuration for new providers.&lt;/p&gt;&lt;p&gt;To demonstrate that such integrations are now possible with other services beyond Cloudflare, a new version of the extension will soon be rolling out that is supported by the CAPTCHA provider &lt;a href=\&quot;https://www.hcaptcha.com/\&quot;&gt;hCaptcha&lt;/a&gt;. Users that solve ephemeral challenges provided by hCaptcha will receive privacy-preserving tokens that will be redeemable at other hCaptcha customer sites.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/66fIxiUIFsXF1mShWhpp9U/8e1e7cf73b844e2128b8766a8dde95dc/image-8-1.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;436\&quot; height=\&quot;116\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;&lt;i&gt;“hCaptcha is focused on user privacy, and supporting Privacy Pass is a natural extension of our work in this area. We look forward to working with Cloudflare and others to make this a common and widely adopted standard, and are currently exploring other applications. Implementing Privacy Pass into our globally distributed service was relatively straightforward, and we have enjoyed working with the Cloudflare team to improve the open source Chrome browser extension in order to deliver the best experience for our users.”&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;— &lt;b&gt;Eli-Shaoul Khedouri&lt;/b&gt;, founder of hCaptcha&lt;/p&gt;&lt;p&gt;This hCaptcha integration with the Privacy Pass browser extension acts as a proof-of-concept in establishing support for new services. Any new providers that would like to integrate with the Privacy Pass browser extension can do so simply by making a PR to the &lt;a href=\&quot;https://github.com/privacypass/challenge-bypass-extension/\&quot;&gt;open-source repository&lt;/a&gt;.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;improved-cryptographic-functionality\&quot;&gt;Improved cryptographic functionality&lt;/h2&gt;\n &lt;a href=\&quot;#improved-cryptographic-functionality\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;After the release of v1.0 of the extension, there were features that were still unimplemented. These included proper zero-knowledge proof validation for checking that the server was always using the same committed key. In v2.0 this functionality has been completed, verifiably preventing a malicious server from attempting to deanonymize users by using a different key for each request.&lt;/p&gt;&lt;p&gt;The cryptographic operations required for Privacy Pass are performed using &lt;a href=\&quot;/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/\&quot;&gt;elliptic curve cryptography&lt;/a&gt; (ECC). The extension currently uses the &lt;a href=\&quot;https://www.secg.org/SEC2-Ver-1.0.pdf\&quot;&gt;NIST P-256&lt;/a&gt; curve, for which we have included some optimisations. Firstly, this makes it possible to store elliptic curve points in compressed and uncompressed data formats. This means that browser storage can be reduced by 50%, and that server responses can be made smaller too.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6k9bRq8TswnyzrNdFxl0km/9db49e7d648d03b225077aecb6ee0fa0/imageLikeEmbed--5-.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;958\&quot; height=\&quot;406\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;Secondly, support has been added for hashing to the P-256 curve using the “Simplified Shallue-van de Woestijne-Ulas” (SSWU) method specified in an ongoing draft (&lt;a href=\&quot;https://tools.ietf.org/html/draft-irtf-cfrg-hash-to-curve-03\&quot;&gt;https://tools.ietf.org/html/draft-irtf-cfrg-hash-to-curve-03&lt;/a&gt;) for standardizing encodings for hashing to elliptic curves. The implementation is compliant with the specification of the “P256-SHA256-SSWU-” ciphersuite in this draft.&lt;/p&gt;&lt;p&gt;These changes have a dual advantage, firstly ensuring that the P-256 hash-to-curve specification is compliant with the draft specification. Secondly this ciphersuite removes the necessity for using probabilistic methods, such as &lt;a href=\&quot;https://tools.ietf.org/html/draft-irtf-cfrg-vrf-05#section-5.4.1.1\&quot;&gt;hash-and-increment&lt;/a&gt;. The hash-and-increment method has a non-negligible chance of failure, and the running time is highly dependent on the hidden client input. While it is not clear how to abuse timing attack vectors currently, using the SSWU method should reduce the potential for attacking the implementation, and learning the client input.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;key-rotation\&quot;&gt;Key rotation&lt;/h2&gt;\n &lt;a href=\&quot;#key-rotation\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;As we mentioned above, verifying that the server is always using the same key is an important part of ensuring the client’s privacy. This ensures that the server cannot segregate the user base and reduce client privacy by using different secret keys for each client that it interacts with. The server guarantees that it’s always using the same key by publishing a commitment to its public key somewhere that the client can access.&lt;/p&gt;&lt;p&gt;Every time the server issues Privacy Pass tokens to the client, it also produces a &lt;a href=\&quot;https://en.wikipedia.org/wiki/Zero-knowledge_proof\&quot;&gt;zero-knowledge proof&lt;/a&gt; that it has produced these tokens using the correct key.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4SUH19vNZ1MZ3G7hvTNN40/6717cc2c64b8fc3a69efb014d76411c8/imageLikeEmbed--6-.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;721\&quot; height=\&quot;382\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;Before the extension stores any tokens, it first verifies the proof against the commitments it knows. Previously, these commitments were stored directly in the source code of the extension. This meant that if the server wanted to rotate its key, then it required releasing a new version of the extension, which was unnecessarily difficult. The extension has been modified so that the commitments are stored in a &lt;a href=\&quot;https://github.com/privacypass/ec-commitments\&quot;&gt;trusted location&lt;/a&gt; that the client can access when it needs to verify the server response. Currently this location is a separate Privacy Pass &lt;a href=\&quot;https://github.com/privacypass/ec-commitments\&quot;&gt;GitHub repository&lt;/a&gt;. For those that are interested, we have provided a more detailed description of the new commitment format in Appendix A at the end of this post.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1ak9ZJ0QWKpWnQBAa4oOpe/59a1907df42318f2e63dbd889c80f839/imageLikeEmbed--7-.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;721\&quot; height=\&quot;382\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;h1&gt;Implementing server-side support in Workers&lt;/h1&gt;&lt;p&gt;So far we have focused on client-side updates. As part of supporting v2.0 of the extension, we are rolling out some major changes to the server-side support that Cloudflare uses. For version 1.0, we used a &lt;a href=\&quot;https://github.com/privacypass/challenge-bypass-server\&quot;&gt;Go implementation&lt;/a&gt; of the server. In v2.0 we are introducing a new server implementation that runs in the &lt;a href=\&quot;https://www.cloudflare.com/products/cloudflare-workers/\&quot;&gt;Cloudflare Workers&lt;/a&gt; platform. This server implementation is only compatible with v2.0 releases of Privacy Pass, so you may need to update your extension if you have auto-updates turned off in your browser.&lt;/p&gt;&lt;p&gt;Our server will run at &lt;a href=\&quot;https://privacypass.cloudflare.com\&quot;&gt;https://privacypass.cloudflare.com&lt;/a&gt;, and all Privacy Pass requests sent to the Cloudflare edge are handled by Worker scripts that run on this domain. Our implementation has been rewritten using Javascript, with cryptographic operations running in the &lt;a href=\&quot;https://v8.dev/\&quot;&gt;V8 engine&lt;/a&gt; that powers Cloudflare Workers. This means that we are able to run highly efficient and constant-time cryptographic operations. On top of this, we benefit from the enhanced performance provided by running our code in the Workers Platform, as close to the user as possible.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;webcrypto-support\&quot;&gt;WebCrypto support&lt;/h2&gt;\n &lt;a href=\&quot;#webcrypto-support\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Firstly, you may be asking, how do we manage to implement cryptographic operations in Cloudflare Workers? Currently, support for performing cryptographic operations is provided in the Workers platform via the &lt;a href=\&quot;https://developers.cloudflare.com/workers/reference/apis/web-crypto/\&quot;&gt;WebCrypto API&lt;/a&gt;. This API allows users to compute functionality such as cryptographic hashing, alongside more complicated operations like ECDSA signatures.&lt;/p&gt;&lt;p&gt;In the Privacy Pass protocol, as we’ll discuss a bit later, the main cryptographic operations are performed by a protocol known as a verifiable oblivious pseudorandom function (VOPRF). Such a protocol allows a client to learn function outputs computed by a server, without revealing to the server what their actual input was. The verifiable aspect means that the server must also prove (in a publicly verifiable way) that the evaluation they pass to the user is correct. Such a function is pseudorandom because the server output is indistinguishable from a random sequence of bytes.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2KJRvlrFMHsy9QlSofzWVs/b208b4b31a1169d2a3b60ffb396049a8/imageLikeEmbed--8-.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;721\&quot; height=\&quot;382\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;The VOPRF functionality requires a server to perform low-level ECC operations that are not currently exposed in the WebCrypto API. We balanced out the possible ways of getting around this requirement. First we trialled trying to use the WebCrypto API in a non-standard manner, using EC Diffie-Hellman key exchange as a method for performing the scalar multiplication that we needed. We also tried to implement all operations using pure JavaScript. Unfortunately both methods were unsatisfactory in the sense that they would either mean integrating with large external cryptographic libraries, or they would be far too slow to be used in a performant Internet setting.&lt;/p&gt;&lt;p&gt;In the end, we settled on a solution that adds functions necessary for Privacy Pass to the internal WebCrypto interface in the Cloudflare V8 Javascript engine. This algorithm mimics the sign/verify interface provided by signature algorithms like ECDSA. In short, we use the &lt;code&gt;sign()&lt;/code&gt; function to issue Privacy Pass tokens to the client. While &lt;code&gt;verify()&lt;/code&gt; can be used by the server to verify data that is redeemed by the client. These functions are implemented directly in the V8 layer and so they are much more performant and secure (running in constant-time, for example) than pure JS alternatives.&lt;/p&gt;&lt;p&gt;The Privacy Pass WebCrypto interface is not currently available for public usage. If it turns out there is enough interest in using this additional algorithm in the Workers platform, then we will consider making it public.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;applications\&quot;&gt;Applications&lt;/h3&gt;\n &lt;a href=\&quot;#applications\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;In recent times, VOPRFs have been shown to be a highly useful primitive in establishing many cryptographic tools. Aside from Privacy Pass, they are also essential for constructing password-authenticated key exchange protocols such as &lt;a href=\&quot;https://datatracker.ietf.org/doc/draft-krawczyk-cfrg-opaque/\&quot;&gt;OPAQUE&lt;/a&gt;. They have also been used in designs of &lt;a href=\&quot;https://eprint.iacr.org/2016/799\&quot;&gt;private set intersection&lt;/a&gt;, &lt;a href=\&quot;https://eprint.iacr.org/2014/650\&quot;&gt;password-protected secret-sharing&lt;/a&gt; protocols, and &lt;a href=\&quot;https://medium.com/least-authority/the-path-from-s4-to-privatestorage-ae9d4a10b2ae\&quot;&gt;privacy-preserving access-control&lt;/a&gt; for private data storage.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;public-redemption-api\&quot;&gt;Public redemption API&lt;/h2&gt;\n &lt;a href=\&quot;#public-redemption-api\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Writing the server in Cloudflare Workers means that we will be providing server-side support for Privacy Pass on a &lt;a href=\&quot;https://privacypass.cloudflare.com\&quot;&gt;public domain&lt;/a&gt;! While we only issue tokens to clients after we are sure that we can trust them, anyone will be able to redeem the tokens using our public redemption API at &lt;a href=\&quot;https://privacypass.cloudflare.com/api/redeem\&quot;&gt;https://privacypass.cloudflare.com/api/redeem&lt;/a&gt;. As we roll-out the server-side component worldwide, you will be able to interact with this API and verify Cloudflare Privacy Pass tokens &lt;a href=\&quot;https://privacypass.github.io/api-redeem\&quot;&gt;independently of the browser extension&lt;/a&gt;.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7zI9w6HIR8cXOr884kCw8m/601fe8c196b434ac50fdb12eaca63927/imageLikeEmbed--9-.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;828\&quot; height=\&quot;465\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;This means that any service can accept Privacy Pass tokens from a client that were issued by Cloudflare, and then verify them with the Cloudflare redemption API. Using the result provided by the API, external services can check whether Cloudflare has authorized the user in the past.&lt;/p&gt;&lt;p&gt;We think that this will benefit other service providers because they can use the attestation of authorization from Cloudflare in their own decision-making processes, without sacrificing the privacy of the client at any stage. We hope that this ecosystem can grow further, with potentially more services providing public redemption APIs of their own. With a more diverse set of issuers, these attestations will become more useful.&lt;/p&gt;&lt;p&gt;By running our server on a public domain, we are effectively a customer of the Cloudflare Workers product. This means that we are also able to make use of &lt;a href=\&quot;https://developers.cloudflare.com/workers/reference/storage/\&quot;&gt;Workers KV&lt;/a&gt; for protecting against malicious clients. In particular, servers must check that clients are not re-using tokens during the redemption phase. The performance of Workers KV in analyzing reads makes this an obvious choice for providing double-spend protection globally.&lt;/p&gt;&lt;p&gt;If you would like to use the public redemption API, we provide documentation for using it at &lt;a href=\&quot;https://privacypass.github.io/api-redeem\&quot;&gt;https://privacypass.github.io/api-redeem&lt;/a&gt;. We also provide some example requests and responses in Appendix B at the end of the post.&lt;/p&gt;&lt;h1&gt;Standardization &amp;amp; new applications&lt;/h1&gt;&lt;p&gt;In tandem with the recent engineering work that we have been doing on supporting Privacy Pass, we have been collaborating with the wider community in an attempt to standardize both the &lt;a href=\&quot;https://datatracker.ietf.org/doc/draft-irtf-cfrg-voprf/\&quot;&gt;underlying VOPRF functionality&lt;/a&gt;, and the &lt;a href=\&quot;https://github.com/alxdavids/draft-privacy-pass\&quot;&gt;protocol itself&lt;/a&gt;. While the process of standardization for oblivious pseudorandom functions (OPRFs) has been running for over a year, the recent efforts to standardize the Privacy Pass protocol have been driven by very recent applications that have come about in the last few months.&lt;/p&gt;&lt;p&gt;Standardizing protocols and functionality is an important way of providing interoperable, secure, and performant interfaces for running protocols on the Internet. This makes it easier for developers to write their own implementations of this complex functionality. The process also provides helpful peer reviews from experts in the community, which can lead to better surfacing of potential security risks that should be mitigated in any implementation. Other benefits include coming to a consensus on the most reliable, scalable and performant protocol designs for all possible applications.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;oblivious-pseudorandom-functions\&quot;&gt;Oblivious pseudorandom functions&lt;/h2&gt;\n &lt;a href=\&quot;#oblivious-pseudorandom-functions\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Oblivious pseudorandom functions (OPRFs) are a generalization of VOPRFs that do not require the server to prove that they have evaluated the functionality properly. Since July 2019, we have been collaborating &lt;a href=\&quot;https://datatracker.ietf.org/doc/draft-irtf-cfrg-voprf/\&quot;&gt;on a draft&lt;/a&gt; with the &lt;a href=\&quot;https://irtf.org/cfrg\&quot;&gt;Crypto Forum Research Group&lt;/a&gt; (CFRG) at the Internet Research Task Force (IRTF) to standardize an OPRF protocol that operates in prime-order groups. This is a generalisation of the setting that is provided by &lt;a href=\&quot;/tag/elliptic-curves/\&quot;&gt;elliptic curves&lt;/a&gt;. This is the same VOPRF construction that was &lt;a href=\&quot;/privacy-pass-the-math/\&quot;&gt;originally specified&lt;/a&gt; by the Privacy Pass protocol and is based heavily on the original protocol design from the &lt;a href=\&quot;https://eprint.iacr.org/2014/650.pdf\&quot;&gt;paper of Jarecki, Kiayias and Krawczyk&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;One of the recent changes that we&amp;#39;ve made in the draft is to increase the size of the key that we consider for performing OPRF operations on the server-side. Existing research suggests that it is possible to create specific queries that can lead to small amounts of the key being leaked. For keys that provide only 128 bits of security this can be a problem as leaking too many bits would reduce security &lt;a href=\&quot;https://www.keylength.com/en/4/\&quot;&gt;beyond currently accepted levels&lt;/a&gt;. To counter this, we have effectively increased the minimum key size to 192 bits. This prevents this leakage becoming an attack vector using any practical methods. We discuss these attacks in more detail later on when discussing our future plans for VOPRF development.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;recent-applications-and-standardizing-the-protocol\&quot;&gt;Recent applications and standardizing the protocol&lt;/h2&gt;\n &lt;a href=\&quot;#recent-applications-and-standardizing-the-protocol\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;The application that we demonstrated when originally supporting Privacy Pass was always intended as a proof-of-concept for the protocol. Over the past few months, a number of new possibilities have arisen in areas that go far beyond what was previously envisaged.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card kg-width-wide\&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/SceyvCGOJ7quMiDSyPxR5/9785c42a79cf313d05ef5eb5a113d2f2/imageLikeEmbed--10-.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;546\&quot; height=\&quot;350\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;For example, the &lt;a href=\&quot;https://github.com/WICG/trust-token-api\&quot;&gt;trust token API&lt;/a&gt;, developed by the &lt;a href=\&quot;https://wicg.io/\&quot;&gt;Web Incubator Community Group&lt;/a&gt;, has been proposed as an interface for using Privacy Pass. This applications allows third-party vendors to check that a user has received a trust attestation from a set of central issuers. This allows the vendor to make decisions about the honesty of a client without having to associate a behaviour profile with the identity of the user. The objective is to prevent against fraudulent activity from users who are not trusted by the central issuer set. Checking trust attestations with central issuers would be possible using similar redemption APIs to the one that &lt;a href=\&quot;https://privacypass.cloudflare.com\&quot;&gt;we have introduced&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;A &lt;a href=\&quot;https://engineering.fb.com/security/partially-blind-signatures/\&quot;&gt;separate piece of work from Facebook&lt;/a&gt; details a similar application for preventing fraudulent behavior that may also be compatible with the Privacy Pass protocol. Finally, other applications have arisen in the areas of providing access to &lt;a href=\&quot;https://medium.com/least-authority/the-path-from-s4-to-privatestorage-ae9d4a10b2ae\&quot;&gt;private storage&lt;/a&gt; and &lt;a href=\&quot;https://github.com/brave/brave-browser/wiki/Security-and-privacy-model-for-ad-confirmations\&quot;&gt;establishing security and privacy models in advertisement confirmations&lt;/a&gt;.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;a-new-draft\&quot;&gt;A new draft&lt;/h3&gt;\n &lt;a href=\&quot;#a-new-draft\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;With the applications above in mind, we have recently started collaborative work on a &lt;a href=\&quot;https://github.com/alxdavids/draft-privacy-pass\&quot;&gt;new IETF draft&lt;/a&gt; that specifically lays out the required functionality provided by the Privacy Pass protocol as a whole. Our aim is to develop, alongside wider industrial partners and the academic community, a functioning specification of the Privacy Pass protocol. We hope that by doing this we will be able to design a base-layer protocol, that can then be used as a cryptographic primitive in wider applications that require some form of lightweight authorization. Our plan is to present the first version of this draft at the upcoming &lt;a href=\&quot;https://www.ietf.org/how/meetings/106/\&quot;&gt;IETF 106 meeting&lt;/a&gt; in Singapore next month.&lt;/p&gt;&lt;p&gt;The draft is still in the early stages of development and we are actively looking for people who are interested in helping to shape the protocol specification. We would be grateful for any help that contributes to this process. See &lt;a href=\&quot;https://github.com/alxdavids/draft-privacy-pass\&quot;&gt;the GitHub repository&lt;/a&gt; for the current version of the document.&lt;/p&gt;&lt;h1&gt;Future avenues&lt;/h1&gt;&lt;p&gt;Finally, while we are actively working on a number of different pathways in the present, the future directions for the project are still open. We believe that there are many applications out there that we have not considered yet and we are excited to see where the protocol is used in the future. Here are some other ideas we have for novel applications and security properties that we think might be worth pursuing in future.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;publicly-verifiable-tokens\&quot;&gt;Publicly verifiable tokens&lt;/h2&gt;\n &lt;a href=\&quot;#publicly-verifiable-tokens\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;One of the disadvantages of using a VOPRF is that redemption tokens are only verifiable by the original issuing server. If we used an underlying primitive that allowed public verification of redemption tokens, then anyone could verify that the issuing server had issued the particular token. Such a protocol could be constructed on top of so-called blind signature schemes, such as &lt;a href=\&quot;https://en.wikipedia.org/wiki/Blind_signature#Blind_RSA_signatures\&quot;&gt;Blind RSA&lt;/a&gt;. Unfortunately, there are performance and security concerns arising from the usage of blind signature schemes in a browser environment. Existing schemes (especially RSA-based variants) require cryptographic computations that are much heavier than the construction used in our VOPRF protocol.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;post-quantum-voprf-alternatives\&quot;&gt;Post-quantum VOPRF alternatives&lt;/h2&gt;\n &lt;a href=\&quot;#post-quantum-voprf-alternatives\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;The only constructions of VOPRFs exist in pre-quantum settings, usually based on the hardness of well-known problems in group settings such as the &lt;a href=\&quot;https://en.wikipedia.org/wiki/Decisional_Diffie%E2%80%93Hellman_assumption\&quot;&gt;discrete-log assumption&lt;/a&gt;. No constructions of VOPRFs are known to provide security against adversaries that can run &lt;a href=\&quot;/the-quantum-menace/\&quot;&gt;quantum computational algorithms&lt;/a&gt;. This means that the Privacy Pass protocol is only believed to be secure against adversaries running  on classical hardware.&lt;/p&gt;&lt;p&gt;Recent developments suggest that quantum computing may arrive &lt;a href=\&quot;https://www.nature.com/articles/s41586-019-1666-5\&quot;&gt;sooner than previously thought&lt;/a&gt;. As such, we believe that investigating the possibility of &lt;a href=\&quot;/introducing-circl/\&quot;&gt;constructing practical post-quantum alternatives&lt;/a&gt; for our current cryptographic toolkit is a task of great importance for ourselves and the wider community. In this case, devising performant post-quantum alternatives for VOPRF constructions would be an important theoretical advancement. Eventually this would lead to a Privacy Pass protocol that still provides privacy-preserving authorization in a post-quantum world.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;voprf-security-and-larger-ciphersuites\&quot;&gt;VOPRF security and larger ciphersuites&lt;/h2&gt;\n &lt;a href=\&quot;#voprf-security-and-larger-ciphersuites\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;We mentioned previously that VOPRFs (or simply OPRFs) are susceptible to small amounts of possible leakage in the key. Here we will give a brief description of the actual attacks themselves, along with further details on our plans for implementing higher security ciphersuites to mitigate the leakage.&lt;/p&gt;&lt;p&gt;Specifically, malicious clients can interact with a VOPRF for creating something known as a &lt;a href=\&quot;https://eprint.iacr.org/2010/215.pdf\&quot;&gt;q-Strong-Diffie-Hellman&lt;/a&gt; (q-sDH) sample. Such samples are created in mathematical groups (usually in the elliptic curve setting). For any group there is a public element &lt;code&gt;g&lt;/code&gt; that is central to all &lt;a href=\&quot;https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange\&quot;&gt;Diffie-Hellman&lt;/a&gt; type operations, along with the server key &lt;code&gt;K&lt;/code&gt;, which is usually just interpreted as a randomly generated number from this group. A q-sDH sample takes the form:&lt;/p&gt;\n &lt;pre class=\&quot;language-bash\&quot;&gt;&lt;code class=\&quot;language-bash\&quot;&gt;( g, g^K, g^(K^2), … , g^(K^q) )&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;and asks the malicious adversary to create a pair of elements satisfying &lt;code&gt;(g^(1/(s+K)),s)&lt;/code&gt;. It is possible for a client in the VOPRF protocol to create a q-SDH sample by just submitting the result of the previous VOPRF evaluation back to the server.&lt;/p&gt;&lt;p&gt;While this problem is believed to be hard to break, there are a number of past works that show that the problem is somewhat easier than the size of the group suggests (for example, see &lt;a href=\&quot;https://eprint.iacr.org/2004/306\&quot;&gt;here&lt;/a&gt; and &lt;a href=\&quot;https://www.iacr.org/archive/eurocrypt2006/40040001/40040001.pdf\&quot;&gt;here&lt;/a&gt;). Concretely speaking, the bit security implied by the group can be reduced by up to log&lt;sub&gt;2&lt;/sub&gt;(q) bits. While this is not immediately fatal, even to groups that should provide 128 bits of security, it can lead to a loss of security that means that the setting is no longer future-proof. As a result, any group providing VOPRF functionality that is instantiated using an elliptic curve such as P-256 or Curve25519 provides weaker than advised security guarantees.&lt;/p&gt;&lt;p&gt;With this in mind, we have taken the recent decision to upgrade the ciphersuites that we recommend for OPRF usage to only those that provide &amp;gt; 128 bits of security, as standard. For example, Curve448 provides 192 bits of security. To launch an attack that reduced security to an amount lower than 128 bits would require making 2^(68) client OPRF queries. This is a significant barrier to entry for any attacker, and so we regard these ciphersuites as safe for instantiating the OPRF functionality.&lt;/p&gt;&lt;p&gt;In the near future, it will be necessary to upgrade the ciphersuites that are used in our support of the Privacy Pass browser extension to the recommendations made in the current VOPRF draft. In general, with a more iterative release process, we hope that the Privacy Pass implementation will be able to follow the current draft standard more closely as it evolves during the standardization process.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;get-in-touch\&quot;&gt;Get in touch!&lt;/h2&gt;\n &lt;a href=\&quot;#get-in-touch\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;You can now install v2.0 of the Privacy Pass extension in &lt;a href=\&quot;https://chrome.google.com/webstore/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi?hl=en\&quot;&gt;Chrome&lt;/a&gt; or &lt;a href=\&quot;https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/\&quot;&gt;Firefox&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you would like to help contribute to the development of this extension then you can do so on &lt;a href=\&quot;https://github.com/privacypass/challenge-bypass-extension\&quot;&gt;GitHub&lt;/a&gt;. Are you a service provider that would like to integrate server-side support for the extension? Then we would be very interested in &lt;a href=\&quot;mailto:privacy-pass-support@cloudflare.com\&quot;&gt;hearing from you!&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We will continue to work with the wider community in developing the standardization of the protocol; taking our motivation from the available applications that have been developed. We are always looking for new applications that can help to expand the Privacy Pass ecosystem beyond its current boundaries.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1eVrPb2t3hl5pVI97EtEu8/86eb63191b0cd299390f24162d51c54a/tales-from-the-crypto-team_2x--1-.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1600\&quot; height=\&quot;1188\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;h1&gt;Appendix&lt;/h1&gt;&lt;p&gt;Here are some extra details related to the topics that we covered above.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;a-commitment-format-for-key-rotations\&quot;&gt;A. Commitment format for key rotations&lt;/h2&gt;\n &lt;a href=\&quot;#a-commitment-format-for-key-rotations\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Key commitments are necessary for the server to prove that they’re acting honestly during the Privacy Pass protocol. The commitments that Privacy Pass uses for the v2.0 release have a slightly different format from the previous release.&lt;/p&gt;\n &lt;pre class=\&quot;language-json\&quot;&gt;&lt;code class=\&quot;language-json\&quot;&gt;&amp;quot;2.00&amp;quot;: {\n &amp;quot;H&amp;quot;: &amp;quot;BPivZ+bqrAZzBHZtROY72/E4UGVKAanNoHL1Oteg25oTPRUkrYeVcYGfkOr425NzWOTLRfmB8cgnlUfAeN2Ikmg=&amp;quot;,\n &amp;quot;expiry&amp;quot;: &amp;quot;2020-01-11T10:29:10.658286752Z&amp;quot;,\n &amp;quot;sig&amp;quot;: &amp;quot;MEUCIQDu9xeF1q89bQuIMtGm0g8KS2srOPv+4hHjMWNVzJ92kAIgYrDKNkg3GRs9Jq5bkE/4mM7/QZInAVvwmIyg6lQZGE0=&amp;quot;\n}&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;First, the version of the server key is &lt;code&gt;2.00&lt;/code&gt;, the server must inform the client which version it intends to use in the response to a client containing issued tokens. This is so that the client can always use the correct commitments when verifying the zero-knowledge proof that the server sends.&lt;/p&gt;&lt;p&gt;The value of the member &lt;code&gt;H&lt;/code&gt; is the public key commitment to the secret key used by the server. This is base64-encoded elliptic curve point of the form &lt;code&gt;H=kG&lt;/code&gt; where &lt;code&gt;G&lt;/code&gt; is the fixed generator of the curve, and &lt;code&gt;k&lt;/code&gt; is the secret key of the server. Since the discrete-log problem is believed to be hard to solve, deriving k from H is believed to be difficult. The value of the member &lt;code&gt;expiry&lt;/code&gt; is an expiry date for the commitment that is used. The value of the member &lt;code&gt;sig&lt;/code&gt; is an ECDSA signature evaluated using a long-term signing key associated with the server, and over the values of &lt;code&gt;H&lt;/code&gt; and &lt;code&gt;expiry&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;When a client retrieves the commitment, it checks that it hasn’t expired and that the signature verifies using the corresponding verification key that is embedded into the configuration of the extension. If these checks pass, it retrieves &lt;code&gt;H&lt;/code&gt; and verifies the issuance response sent by the server. Previous versions of these commitments did not include signatures, but these signatures will be validated from v2.0 onwards.&lt;/p&gt;&lt;p&gt;When a server wants to rotate the key, it simply generates a new key &lt;code&gt;k2&lt;/code&gt; and appends a new commitment to &lt;code&gt;k2&lt;/code&gt; with a new identifier such as &lt;code&gt;2.01&lt;/code&gt;. It can then use &lt;code&gt;k2&lt;/code&gt; as the secret for the VOPRF operations that it needs to compute.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h2 id=\&quot;b-example-redemption-api-request\&quot;&gt;B. Example Redemption API request&lt;/h2&gt;\n &lt;a href=\&quot;#b-example-redemption-api-request\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;The redemption API at is available over HTTPS by sending POST requests to &lt;a href=\&quot;https://privacypass.cloudflare.com/api/redeem\&quot;&gt;https://privacypass.cloudflare.com/api/redeem&lt;/a&gt;. Requests to this endpoint must specify Privacy Pass data using JSON-RPC 2.0 syntax in the body of the request. Let’s look at an example request:&lt;/p&gt;\n &lt;pre class=\&quot;language-json\&quot;&gt;&lt;code class=\&quot;language-json\&quot;&gt;{\n &amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;,\n &amp;quot;method&amp;quot;: &amp;quot;redeem&amp;quot;,\n &amp;quot;params&amp;quot;: {\n &amp;quot;data&amp;quot;: [\n &amp;quot;lB2ZEtHOK/2auhOySKoxqiHWXYaFlAIbuoHQnlFz57A=&amp;quot;,\n &amp;quot;EoSetsN0eVt6ztbLcqp4Gt634aV73SDPzezpku6ky5w=&amp;quot;,\n &amp;quot;eyJjdXJ2ZSI6InAyNTYiLCJoYXNoIjoic2hhMjU2IiwibWV0aG9kIjoic3d1In0=&amp;quot;\n ],\n &amp;quot;bindings&amp;quot;: [\n &amp;quot;string1&amp;quot;,\n &amp;quot;string2&amp;quot;\n ],\n &amp;quot;compressed&amp;quot;:&amp;quot;false&amp;quot;\n },\n &amp;quot;id&amp;quot;: 1\n}&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;In the above: &lt;code&gt;params.data[0]&lt;/code&gt; is the client input data used to generate a token in the issuance phase; &lt;code&gt;params.data[1]&lt;/code&gt; is the HMAC tag that the server uses to verify a redemption; and &lt;code&gt;params.data[2]&lt;/code&gt; is a stringified, base64-encoded JSON object that specifies the hash-to-curve parameters used by the client. For example, the last element in the array corresponds to the object:&lt;/p&gt;\n &lt;pre class=\&quot;language-json\&quot;&gt;&lt;code class=\&quot;language-json\&quot;&gt;{\n curve: &amp;quot;p256&amp;quot;,\n hash: &amp;quot;sha256&amp;quot;,\n method: &amp;quot;swu&amp;quot;,\n}&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;Which specifies that the client has used the curve P-256, with hash function SHA-256, and the SSWU method for hashing to curve. This allows the server to verify the transaction with the correct ciphersuite. The client must bind the redemption request to some fixed information, which it stores as multiple strings in the array &lt;code&gt;params.bindings&lt;/code&gt;. For example, it could send the Host header of the HTTP request, and the HTTP path that was used (this is what is used in the Privacy Pass browser extension). Finally, &lt;code&gt;params.compressed&lt;/code&gt; is an optional boolean value (defaulting to false) that indicates whether the HMAC tag was computed over compressed or uncompressed point encodings.&lt;/p&gt;&lt;p&gt;Currently the only supported ciphersuites are the example above, or the same except with &lt;code&gt;method&lt;/code&gt; equal to &lt;code&gt;increment&lt;/code&gt; for the hash-and-increment method of hashing to a curve. This is the original method used in v1.0 of Privacy Pass, and is supported for backwards-compatibility only. See the &lt;a href=\&quot;https://privacypass.github.io/api-redeem\&quot;&gt;provided documentation&lt;/a&gt; for more details.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;example-response\&quot;&gt;Example response&lt;/h3&gt;\n &lt;a href=\&quot;#example-response\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;If a request is sent to the redemption API and it is successfully verified, then the following response will be returned.&lt;/p&gt;\n &lt;pre class=\&quot;language-json\&quot;&gt;&lt;code class=\&quot;language-json\&quot;&gt;{\n &amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;,\n &amp;quot;result&amp;quot;: &amp;quot;success&amp;quot;,\n &amp;quot;id&amp;quot;: 1\n}&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;When an error occurs something similar to the following will be returned.&lt;/p&gt;\n &lt;pre class=\&quot;language-json\&quot;&gt;&lt;code class=\&quot;language-json\&quot;&gt;{\n &amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;,\n &amp;quot;error&amp;quot;: {\n &amp;quot;message&amp;quot;: &amp;lt;error-message&amp;gt;,\n &amp;quot;code&amp;quot;: &amp;lt;error-code&amp;gt;,\n },\n &amp;quot;id&amp;quot;: 1\n}&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;The error codes that we provide are specified as JSON-RPC 2.0 codes, we document the types of errors that we provide in the &lt;a href=\&quot;https://privacypass.github.io/api-redeem\&quot;&gt;API documentation&lt;/a&gt;.&lt;/p&gt;&quot;],&quot;published_at&quot;:[0,&quot;2019-10-28T13:00:00.000+00:00&quot;],&quot;updated_at&quot;:[0,&quot;2024-10-10T00:31:30.486Z&quot;],&quot;feature_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3wIHxkBv0vV2yhzR1vx7tQ/a074f76f500eae1604072cc93e2170e1/supporting-the-latest-version-of-the-privacy-pass-protocol.png&quot;],&quot;tags&quot;:[1,[[0,{&quot;id&quot;:[0,&quot;5grQBv96AL5Ck0c8I54a0f&quot;],&quot;name&quot;:[0,&quot;Crypto Week&quot;],&quot;slug&quot;:[0,&quot;crypto-week&quot;]}],[0,{&quot;id&quot;:[0,&quot;3ZtL0yV0R4ScAreV1dTfIY&quot;],&quot;name&quot;:[0,&quot;Privacy Pass&quot;],&quot;slug&quot;:[0,&quot;privacy-pass&quot;]}],[0,{&quot;id&quot;:[0,&quot;6Mp7ouACN2rT3YjL1xaXJx&quot;],&quot;name&quot;:[0,&quot;Security&quot;],&quot;slug&quot;:[0,&quot;security&quot;]}],[0,{&quot;id&quot;:[0,&quot;1x7tpPmKIUCt19EDgM1Tsl&quot;],&quot;name&quot;:[0,&quot;Research&quot;],&quot;slug&quot;:[0,&quot;research&quot;]}],[0,{&quot;id&quot;:[0,&quot;1QsJUMpv0QBSLiVZLLQJ3V&quot;],&quot;name&quot;:[0,&quot;Cryptography&quot;],&quot;slug&quot;:[0,&quot;cryptography&quot;]}]]],&quot;relatedTags&quot;:[0],&quot;authors&quot;:[1,[[0,{&quot;name&quot;:[0,&quot;Alex Davidson&quot;],&quot;slug&quot;:[0,&quot;alex-davidson&quot;],&quot;bio&quot;:[0,null],&quot;profile_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1m0ky2DnnbIO9nnFOvrHoH/cc78437164b23c2556e933cae0681534/alex-davidson.jpg&quot;],&quot;location&quot;:[0,null],&quot;website&quot;:[0,null],&quot;twitter&quot;:[0,null],&quot;facebook&quot;:[0,null]}]]],&quot;meta_description&quot;:[0,null],&quot;primary_author&quot;:[0,{}],&quot;localeList&quot;:[0,{&quot;name&quot;:[0,&quot;Supporting the latest version of the Privacy Pass Protocol Config&quot;],&quot;enUS&quot;:[0,&quot;English for Locale&quot;],&quot;zhCN&quot;:[0,&quot;Translated for Locale&quot;],&quot;zhHansCN&quot;:[0,&quot;No Page for Locale&quot;],&quot;zhTW&quot;:[0,&quot;No Page for Locale&quot;],&quot;frFR&quot;:[0,&quot;Translated for Locale&quot;],&quot;deDE&quot;:[0,&quot;Translated for Locale&quot;],&quot;itIT&quot;:[0,&quot;No Page for Locale&quot;],&quot;jaJP&quot;:[0,&quot;Translated for Locale&quot;],&quot;koKR&quot;:[0,&quot;No Page for Locale&quot;],&quot;ptBR&quot;:[0,&quot;No Page for Locale&quot;],&quot;esLA&quot;:[0,&quot;No Page for Locale&quot;],&quot;esES&quot;:[0,&quot;Translated for Locale&quot;],&quot;enAU&quot;:[0,&quot;No Page for Locale&quot;],&quot;enCA&quot;:[0,&quot;No Page for Locale&quot;],&quot;enIN&quot;:[0,&quot;No Page for Locale&quot;],&quot;enGB&quot;:[0,&quot;No Page for Locale&quot;],&quot;idID&quot;:[0,&quot;No Page for Locale&quot;],&quot;ruRU&quot;:[0,&quot;No Page for Locale&quot;],&quot;svSE&quot;:[0,&quot;No Page for Locale&quot;],&quot;viVN&quot;:[0,&quot;No Page for Locale&quot;],&quot;plPL&quot;:[0,&quot;No Page for Locale&quot;],&quot;arAR&quot;:[0,&quot;No Page for Locale&quot;],&quot;nlNL&quot;:[0,&quot;No Page for Locale&quot;],&quot;thTH&quot;:[0,&quot;No Page for Locale&quot;],&quot;trTR&quot;:[0,&quot;No Page for Locale&quot;],&quot;heIL&quot;:[0,&quot;No Page for Locale&quot;],&quot;lvLV&quot;:[0,&quot;No Page for Locale&quot;],&quot;etEE&quot;:[0,&quot;No Page for Locale&quot;],&quot;ltLT&quot;:[0,&quot;No Page for Locale&quot;]}],&quot;url&quot;:[0,&quot;https://blog.cloudflare.com/supporting-the-latest-version-of-the-privacy-pass-protocol&quot;],&quot;metadata&quot;:[0,{&quot;title&quot;:[0,&quot;Supporting the latest version of the Privacy Pass Protocol&quot;],&quot;description&quot;:[0,null],&quot;imgPreview&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1iBCJU8tdDk34MVoDapbq0/f5437deb59545d617f3dbd3e0fdc07b9/supporting-the-latest-version-of-the-privacy-pass-protocol-nXEe7z.png&quot;]}]}],&quot;translations&quot;:[0,{&quot;posts.by&quot;:[0,&quot;By&quot;],&quot;footer.gdpr&quot;:[0,&quot;GDPR&quot;],&quot;lang_blurb1&quot;:[0,&quot;This post is also available in {lang1}.&quot;],&quot;lang_blurb2&quot;:[0,&quot;This post is also available in {lang1} and {lang2}.&quot;],&quot;lang_blurb3&quot;:[0,&quot;This post is also available in {lang1}, {lang2} and {lang3}.&quot;],&quot;footer.press&quot;:[0,&quot;Press&quot;],&quot;header.title&quot;:[0,&quot;The Cloudflare Blog&quot;],&quot;search.clear&quot;:[0,&quot;Clear&quot;],&quot;search.filter&quot;:[0,&quot;Filter&quot;],&quot;search.source&quot;:[0,&quot;Source&quot;],&quot;footer.careers&quot;:[0,&quot;Careers&quot;],&quot;footer.company&quot;:[0,&quot;Company&quot;],&quot;footer.support&quot;:[0,&quot;Support&quot;],&quot;footer.the_net&quot;:[0,&quot;theNet&quot;],&quot;search.filters&quot;:[0,&quot;Filters&quot;],&quot;footer.our_team&quot;:[0,&quot;Our team&quot;],&quot;footer.webinars&quot;:[0,&quot;Webinars&quot;],&quot;page.more_posts&quot;:[0,&quot;More posts&quot;],&quot;posts.time_read&quot;:[0,&quot;{time} min read&quot;],&quot;search.language&quot;:[0,&quot;Language&quot;],&quot;footer.community&quot;:[0,&quot;Community&quot;],&quot;footer.resources&quot;:[0,&quot;Resources&quot;],&quot;footer.solutions&quot;:[0,&quot;Solutions&quot;],&quot;footer.trademark&quot;:[0,&quot;Trademark&quot;],&quot;header.subscribe&quot;:[0,&quot;Subscribe&quot;],&quot;footer.compliance&quot;:[0,&quot;Compliance&quot;],&quot;footer.free_plans&quot;:[0,&quot;Free plans&quot;],&quot;footer.impact_ESG&quot;:[0,&quot;Impact/ESG&quot;],&quot;posts.follow_on_X&quot;:[0,&quot;Follow on X&quot;],&quot;footer.help_center&quot;:[0,&quot;Help center&quot;],&quot;footer.network_map&quot;:[0,&quot;Network Map&quot;],&quot;header.please_wait&quot;:[0,&quot;Please Wait&quot;],&quot;page.related_posts&quot;:[0,&quot;Related posts&quot;],&quot;search.result_stat&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt; for &lt;strong&gt;{search_keyword}&lt;/strong&gt;&quot;],&quot;footer.case_studies&quot;:[0,&quot;Case Studies&quot;],&quot;footer.connect_2024&quot;:[0,&quot;Connect 2024&quot;],&quot;footer.terms_of_use&quot;:[0,&quot;Terms of Use&quot;],&quot;footer.white_papers&quot;:[0,&quot;White Papers&quot;],&quot;footer.cloudflare_tv&quot;:[0,&quot;Cloudflare TV&quot;],&quot;footer.community_hub&quot;:[0,&quot;Community Hub&quot;],&quot;footer.compare_plans&quot;:[0,&quot;Compare plans&quot;],&quot;footer.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.email_address&quot;:[0,&quot;Email Address&quot;],&quot;page.error.not_found&quot;:[0,&quot;Page not found&quot;],&quot;footer.developer_docs&quot;:[0,&quot;Developer docs&quot;],&quot;footer.privacy_policy&quot;:[0,&quot;Privacy Policy&quot;],&quot;footer.request_a_demo&quot;:[0,&quot;Request a demo&quot;],&quot;page.continue_reading&quot;:[0,&quot;Continue reading&quot;],&quot;footer.analysts_report&quot;:[0,&quot;Analyst reports&quot;],&quot;footer.for_enterprises&quot;:[0,&quot;For enterprises&quot;],&quot;footer.getting_started&quot;:[0,&quot;Getting Started&quot;],&quot;footer.learning_center&quot;:[0,&quot;Learning Center&quot;],&quot;footer.project_galileo&quot;:[0,&quot;Project Galileo&quot;],&quot;pagination.newer_posts&quot;:[0,&quot;Newer Posts&quot;],&quot;pagination.older_posts&quot;:[0,&quot;Older Posts&quot;],&quot;posts.social_buttons.x&quot;:[0,&quot;Discuss on X&quot;],&quot;search.icon_aria_label&quot;:[0,&quot;Search&quot;],&quot;search.source_location&quot;:[0,&quot;Source/Location&quot;],&quot;footer.about_cloudflare&quot;:[0,&quot;About Cloudflare&quot;],&quot;footer.athenian_project&quot;:[0,&quot;Athenian Project&quot;],&quot;footer.become_a_partner&quot;:[0,&quot;Become a partner&quot;],&quot;footer.cloudflare_radar&quot;:[0,&quot;Cloudflare Radar&quot;],&quot;footer.network_services&quot;:[0,&quot;Network services&quot;],&quot;footer.trust_and_safety&quot;:[0,&quot;Trust &amp; Safety&quot;],&quot;header.get_started_free&quot;:[0,&quot;Get Started Free&quot;],&quot;page.search.placeholder&quot;:[0,&quot;Search Cloudflare&quot;],&quot;footer.cloudflare_status&quot;:[0,&quot;Cloudflare Status&quot;],&quot;footer.cookie_preference&quot;:[0,&quot;Cookie Preferences&quot;],&quot;header.valid_email_error&quot;:[0,&quot;Must be valid email.&quot;],&quot;search.result_stat_empty&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt;&quot;],&quot;footer.connectivity_cloud&quot;:[0,&quot;Connectivity cloud&quot;],&quot;footer.developer_services&quot;:[0,&quot;Developer services&quot;],&quot;footer.investor_relations&quot;:[0,&quot;Investor relations&quot;],&quot;page.not_found.error_code&quot;:[0,&quot;Error Code: 404&quot;],&quot;search.autocomplete_title&quot;:[0,&quot;Insert a query. Press enter to send&quot;],&quot;footer.logos_and_press_kit&quot;:[0,&quot;Logos &amp; press kit&quot;],&quot;footer.application_services&quot;:[0,&quot;Application services&quot;],&quot;footer.get_a_recommendation&quot;:[0,&quot;Get a recommendation&quot;],&quot;posts.social_buttons.reddit&quot;:[0,&quot;Discuss on Reddit&quot;],&quot;footer.sse_and_sase_services&quot;:[0,&quot;SSE and SASE services&quot;],&quot;page.not_found.outdated_link&quot;:[0,&quot;You may have used an outdated link, or you may have typed the address incorrectly.&quot;],&quot;footer.report_security_issues&quot;:[0,&quot;Report Security Issues&quot;],&quot;page.error.error_message_page&quot;:[0,&quot;Sorry, we can&#39;t find the page you are looking for.&quot;],&quot;header.subscribe_notifications&quot;:[0,&quot;Subscribe to receive notifications of new posts:&quot;],&quot;footer.cloudflare_for_campaigns&quot;:[0,&quot;Cloudflare for Campaigns&quot;],&quot;header.subscription_confimation&quot;:[0,&quot;Subscription confirmed. Thank you for subscribing!&quot;],&quot;posts.social_buttons.hackernews&quot;:[0,&quot;Discuss on Hacker News&quot;],&quot;footer.diversity_equity_inclusion&quot;:[0,&quot;Diversity, equity &amp; inclusion&quot;],&quot;footer.critical_infrastructure_defense_project&quot;:[0,&quot;Critical Infrastructure Defense Project&quot;]}]}" ssr client="load" opts="{&quot;name&quot;:&quot;PostCard&quot;,&quot;value&quot;:true}" await-children><article class="w-50-l mt4 mt2-l mb4 ph3 bb b--gray8 bn-l"><div class="w-100"><a href="/supporting-the-latest-version-of-the-privacy-pass-protocol/" class="fw5 no-underline gray1" data-testid="post-title"><h2 class="fw5 mt2">Supporting the latest version of the Privacy Pass Protocol</h2></a><p class="f3 fw5 gray5 my" data-testid="post-date">2019-10-28</p><div class=""><a href="/tag/crypto-week/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Crypto Week</a><a href="/tag/privacy-pass/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Privacy Pass</a><a href="/tag/security/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Security</a><a href="/tag/research/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Research</a><a href="/tag/cryptography/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Cryptography</a></div><p class="f3 fw4 gray1 lh-copy " data-testid="post-content">At Cloudflare, we are committed to supporting and developing new privacy-preserving technologies that benefit all Internet users. In November 2017, we announced server-side support for the Privacy Pass protocol, a piece of work developed in collaboration with the academic community.<!-- -->...</p><ul class="author-lists flex pl0"><li class="list flex items-center pr2 mb3"><a href="/author/alex-davidson/" class="static-avatar pr1"><img class="author-profile-image br-100 mr2" src="https://blog.cloudflare.com/cdn-cgi/image/format=auto,dpr=3,width=64,height=64,gravity=face,fit=crop,zoom=0.5/https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1m0ky2DnnbIO9nnFOvrHoH/cc78437164b23c2556e933cae0681534/alex-davidson.jpg" alt="Alex Davidson" width="62" height="62"/></a><div class="author-name-tooltip"><a href="/author/alex-davidson/" class="fw4 f3 no-underline black">Alex Davidson</a></div></li></ul></div></article><!--astro:end--></astro-island><astro-island uid="Zlp8qe" prefix="r3" component-url="/_astro/PostCard.CG32ktie.js" component-export="PostCard" renderer-url="/_astro/client.DLO1yDVm.js" props="{&quot;currentPage&quot;:[0,1],&quot;isFeaturedImageFirstPost&quot;:[0,false],&quot;post&quot;:[0,{&quot;id&quot;:[0,&quot;7mmYqDqVbCUWqpT2wyf2OU&quot;],&quot;title&quot;:[0,&quot;Introducing the Cloudflare Onion Service&quot;],&quot;slug&quot;:[0,&quot;cloudflare-onion-service&quot;],&quot;excerpt&quot;:[0,&quot;Two years ago this week Cloudflare introduced Opportunistic Encryption, a feature that provided additional security and performance benefits to websites that had not yet moved to HTTPS.&quot;],&quot;featured&quot;:[0,false],&quot;html&quot;:[0,&quot;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7zrQosYw53kvfW2Q4aCLqB/c984e375c0d54f92bee94352c1e105fa/unnamed-1.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1049\&quot; height=\&quot;1020\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;b&gt;When&lt;/b&gt;: a cold San Francisco summer afternoon&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;b&gt;Where&lt;/b&gt;: Room &lt;a href=\&quot;https://httpstat.us/305\&quot;&gt;305&lt;/a&gt;, Cloudflare&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;b&gt;Who&lt;/b&gt;: 2 from Cloudflare + 9 from the Tor Project&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;What could go wrong?&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;bit-of-background\&quot;&gt;Bit of Background&lt;/h3&gt;\n &lt;a href=\&quot;#bit-of-background\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Two years ago this week Cloudflare introduced &lt;a href=\&quot;/opportunistic-encryption-bringing-http-2-to-the-unencrypted-web/\&quot;&gt;Opportunistic Encryption&lt;/a&gt;, a feature that provided additional security and performance benefits to websites that had not yet moved to HTTPS. Indeed, back in the old days some websites only used HTTP --- weird, right? “Opportunistic” here meant that the server advertised support for HTTP/2 via an &lt;a href=\&quot;https://tools.ietf.org/html/rfc7838\&quot;&gt;HTTP Alternative Service&lt;/a&gt; header in the hopes that any browser that recognized the protocol could take advantage of those benefits in subsequent requests to that domain.&lt;/p&gt;&lt;p&gt;Around the same time, CEO Matthew Prince &lt;a href=\&quot;/the-trouble-with-tor/\&quot;&gt;wrote&lt;/a&gt; about the importance and challenges of privacy on the Internet and tasked us to find a solution that provides &lt;b&gt;convenience&lt;/b&gt;, &lt;b&gt;security&lt;/b&gt;, and &lt;b&gt;anonymity&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;From neutralizing fingerprinting vectors and everyday browser trackers that &lt;a href=\&quot;https://www.eff.org/privacybadger\&quot;&gt;Privacy Badger&lt;/a&gt; feeds on, all the way to mitigating correlation attacks that only big actors are capable of, guaranteeing privacy is a complicated challenge. Fortunately, the &lt;a href=\&quot;https://www.torproject.org/\&quot;&gt;Tor Project&lt;/a&gt; addresses this extensive &lt;a href=\&quot;https://www.torproject.org/projects/torbrowser/design/#adversary\&quot;&gt;adversary model&lt;/a&gt; in Tor Browser.&lt;/p&gt;&lt;p&gt;However, the Internet is full of bad actors, and distinguishing legitimate traffic from malicious traffic, which is one of Cloudflare’s core features, becomes much more difficult when the traffic is anonymous. In particular, many features that make Tor a great tool for privacy also make it a tool for hiding the source of malicious traffic. That is why many resort to using CAPTCHA challenges to make it more expensive to be a bot on the Tor network. There is, however, a collateral damage associated with using CAPTCHA challenges to stop bots: humans eyes also have to deal with them.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/59vmBdRen9zTJnzUEwUOOL/54910c287d16f022e66afc2d8ff68d0e/Captcha-Example.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;300\&quot; height=\&quot;57\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;One way to minimize this is using privacy-preserving cryptographic signatures, aka blinded tokens, such as those that power &lt;a href=\&quot;/privacy-pass-the-math/\&quot;&gt;Privacy Pass&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The other way is to use onions.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3CENi6YjjPGrHKOsS7hfgE/3f07dbad9c56b377cb5bcfa7d8f40c36/Onion-Cloudflare.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1349\&quot; height=\&quot;618\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;here-come-the-onions\&quot;&gt;Here Come the Onions&lt;/h3&gt;\n &lt;a href=\&quot;#here-come-the-onions\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Today’s edition of the Crypto Week introduces an “opportunistic” solution to this problem, so that under suitable conditions, anyone using &lt;a href=\&quot;https://blog.torproject.org/new-release-tor-browser-80\&quot;&gt;Tor Browser 8.0&lt;/a&gt; will benefit from improved security and performance when visiting Cloudflare websites without having to face a CAPTCHA. At the same time, this feature enables more fine-grained rate-limiting to prevent malicious traffic, and since the mechanics of the idea described here are not specific to Cloudflare, anyone can &lt;a href=\&quot;https://github.com/mahrud/caddy-altonions\&quot;&gt;reuse this method&lt;/a&gt; on their own website.&lt;/p&gt;&lt;p&gt;Before we continue, if you need a refresher on what Tor is or why we are talking about onions, check out the &lt;a href=\&quot;https://www.torproject.org/about/overview.html.en\&quot;&gt;Tor Project&lt;/a&gt; website or our own blog post on the &lt;a href=\&quot;/welcome-hidden-resolver/\&quot;&gt;DNS resolver onion&lt;/a&gt; from June.&lt;/p&gt;&lt;p&gt;As Matthew mentioned in his blog post, one way to sift through Tor traffic is to use the &lt;a href=\&quot;https://www.torproject.org/docs/onion-services.html.en\&quot;&gt;onion service&lt;/a&gt; protocol. Onion services are Tor nodes that advertise their public key, encoded as an address with .onion &lt;a href=\&quot;https://www.cloudflare.com/learning/dns/top-level-domain/\&quot;&gt;TLD&lt;/a&gt;, and use “rendezvous points” to establish connections entirely within the Tor network:&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4YwoSQd9m6fwJ4INk44fsz/7aa81a4f71f35f9323ba4173e328d356/Tor-network-example-1.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1999\&quot; height=\&quot;575\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;While onion services are designed to provide anonymity for content providers, &lt;a href=\&quot;https://securedrop.org/directory/\&quot;&gt;media organizations&lt;/a&gt; use them to allow whistleblowers to communicate securely with them and &lt;a href=\&quot;https://www.facebook.com/notes/protect-the-graph/making-connections-to-facebook-more-secure/1526085754298237\&quot;&gt;Facebook&lt;/a&gt; uses one to tell Tor users from bots.&lt;/p&gt;&lt;p&gt;The technical reason why this works is that from an onion service’s point of view each individual Tor connection, or circuit, has a unique but ephemeral number associated to it, while from a normal server’s point of view all Tor requests made via one exit node share the same IP address. Using this circuit number, onion services can distinguish individual circuits and terminate those that seem to behave maliciously. To clarify, this does not mean that onion services can identify or track Tor users.&lt;/p&gt;&lt;p&gt;While bad actors can still establish a fresh circuit by repeating the rendezvous protocol, doing so involves a cryptographic key exchange that costs time and computation. Think of this like a cryptographic &lt;a href=\&quot;https://en.wikipedia.org/wiki/File:Dial_up_modem_noises.ogg\&quot;&gt;dial-up&lt;/a&gt; sequence. Spammers can dial our onion service over and over, but every time they have to repeat the key exchange.&lt;/p&gt;&lt;p&gt;Alternatively, finishing the rendezvous protocol can be thought of as a small proof of work required in order to use the Cloudflare Onion Service. This increases the cost of using our onion service for performing denial of service attacks.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;problem-solved-right\&quot;&gt;Problem solved, right?&lt;/h3&gt;\n &lt;a href=\&quot;#problem-solved-right\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Not quite. As discussed when we introduced the &lt;a href=\&quot;/welcome-hidden-resolver/\&quot;&gt;hidden resolver&lt;/a&gt;, the problem of ensuring that a seemingly random .onion address is correct is a barrier to usable security. In that case, our solution was to purchase an &lt;a href=\&quot;https://www.digicert.com/extended-validation-ssl.htm\&quot;&gt;Extended Validation&lt;/a&gt; (EV) certificate, which costs considerably more. Needless to say, this limits who can buy an HTTPS certificate for their onion service to a &lt;a href=\&quot;https://crt.sh/?Identity=%25.onion\&quot;&gt;privileged few&lt;/a&gt;.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1n6CTaL7LjM6pQGorlXIQ6/4ffd43906dcaa7fac54a098379d12171/Address-Bar.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;697\&quot; height=\&quot;23\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;Some people &lt;a href=\&quot;https://cabforum.org/pipermail/public/2017-November/012451.html\&quot;&gt;disagree&lt;/a&gt;. In particular, the &lt;a href=\&quot;https://blog.torproject.org/tors-fall-harvest-next-generation-onion-services\&quot;&gt;new generation&lt;/a&gt; of onion services resolves the weakness that Matthew pointed to as a possible reason why the CA/B Forum &lt;a href=\&quot;https://cabforum.org/2015/02/18/ballot-144-validation-rules-dot-onion-names/\&quot;&gt;only permits&lt;/a&gt; EV certificates for onion services. This could mean that getting Domain Validation (DV) certificates for onion services could be possible soon. We certainly hope that’s the case.&lt;/p&gt;&lt;p&gt;Still, DV certificates lack the organization name (e.g. “Cloudflare, Inc.”) that appears in the address bar, and cryptographically relevant numbers are nearly impossible to remember or distinguish for humans. This brings us back to the problem of usable security, so we came up with a different idea.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;looking-at-onion-addresses-differently\&quot;&gt;Looking at onion addresses differently&lt;/h3&gt;\n &lt;a href=\&quot;#looking-at-onion-addresses-differently\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Forget for a moment that we’re discussing anonymity. When you type “cloudflare.com” in a browser and press enter, your device first resolves that domain name into an IP address, then your browser asks the server for a certificate valid for “cloudflare.com” and attempts to establish an encrypted connection with the host. As long as the certificate is trusted by a certificate authority, there’s no reason to mind the IP address.&lt;/p&gt;&lt;p&gt;Roughly speaking, the idea here is to simply switch the IP address in the scenario above with an .onion address. As long as the certificate is valid, the .onion address itself need not be manually entered by a user or even be memorable. Indeed, the fact that the certificate was valid indicates that the .onion address was correct.&lt;/p&gt;&lt;p&gt;In particular, in the same way that a single IP address can serve millions of domains, a single .onion address should be able to serve any number of domains.&lt;/p&gt;&lt;p&gt;Except, &lt;a href=\&quot;https://www.cloudflare.com/learning/dns/what-is-dns/\&quot;&gt;DNS&lt;/a&gt; doesn’t work this way.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;how-does-it-work-then\&quot;&gt;How does it work then?&lt;/h3&gt;\n &lt;a href=\&quot;#how-does-it-work-then\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Just as with Opportunistic Encryption, we can point users to the Cloudflare Onion Service using &lt;a href=\&quot;https://tools.ietf.org/html/rfc7838\&quot;&gt;HTTP Alternative Services&lt;/a&gt;, a mechanism that allows servers to tell clients that the service they are accessing is available at another network location or over another protocol. For instance, when Tor Browser makes a request to “cloudflare.com,” Cloudflare adds an Alternative Service header to indicate that the site is available to access over HTTP/2 via our onion services.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2G5bKEOaIJdnsqhNTT2Ozo/e1466f89156e68b539b2cefc8d506d2a/tor-resquest_2x.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;2000\&quot; height=\&quot;413\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;In the same sense that Cloudflare owns the IP addresses that serve our customers’ websites, we run 10 .onion addresses. Think of them as 10 Cloudflare points of presence (or PoPs) within the Tor network. The exact header looks something like this, except with all 10 .onion addresses included, each starting with the prefix “cflare”:&lt;/p&gt;\n &lt;pre class=\&quot;language-bash\&quot;&gt;&lt;code class=\&quot;language-bash\&quot;&gt;alt-svc: h2=&amp;quot;cflare2nge4h4yqr3574crrd7k66lil3torzbisz6uciyuzqc2h2ykyd.onion:443&amp;quot;; ma=86400; persist=1&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;This simply indicates that the “cloudflare.com” can be authoritatively accessed using HTTP/2 (“h2”) via the onion service “cflare2n[...].onion”, over virtual port 443. The field “ma” (max-age) indicates how long in seconds the client should remember the existence of the alternative service and “persist” indicates whether alternative service cache should be cleared when the network is interrupted.&lt;/p&gt;&lt;p&gt;Once the browser receives this header, it attempts to make a new Tor circuit to the onion service advertised in the alt-svc header and confirm that the server listening on virtual port 443 can present a valid certificate for “cloudflare.com” — that is, the original hostname, not the .onion address.&lt;/p&gt;&lt;p&gt;The onion service then relays the Client Hello packet to a local server which can serve a certificate for “cloudflare.com.” This way the Tor daemon itself can be very minimal. Here is a sample configuration file:&lt;/p&gt;\n &lt;pre class=\&quot;language-bash\&quot;&gt;&lt;code class=\&quot;language-bash\&quot;&gt;SocksPort 0\nHiddenServiceNonAnonymousMode 1\nHiddenServiceSingleHopMode 1\nHiddenServiceVersion 3\nHiddenServicePort 443\nSafeLogging 1\nLog notice stdout&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;Be careful with using the configuration above, as it enables a non-anonymous setting for onion services that do not require anonymity for themselves. To clarify, this does not sacrifice privacy or anonymity of Tor users, just the server. Plus, it improves latency of the circuits.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5NVzWfvM9FVH73gjp0AG3X/8a3dbf2a8440bb0f32e05626e30bb695/Tor-Onion-Service-Cloudflare.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1999\&quot; height=\&quot;474\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;If the certificate is signed by a trusted certificate authority, for any subsequent requests to “cloudflare.com” the browser will connect using HTTP/2 via the onion service, sidestepping the need for going through an exit node.&lt;/p&gt;&lt;p&gt;Here are the steps summarized one more time:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;A new Tor circuit is established;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The browser sends a Client Hello to the onion service with SNI=cloudflare.com;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The onion service relays the packet to a local server;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The server replies with Server Hello for SNI=cloudflare.com;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The onion service relays the packet to the browser;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The browser verifies that the certificate is valid.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;To reiterate, the certificate presented by the onion service only needs to be valid for the original hostname, meaning that the onion address need not be mentioned anywhere on the certificate. This is a huge benefit, because it allows you to, for instance, present a free &lt;a href=\&quot;https://letsencrypt.org\&quot;&gt;Let’s Encrypt&lt;/a&gt; certificate for your .org domain rather than an expensive EV certificate.&lt;/p&gt;&lt;p&gt;Convenience, ✓&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;distinguishing-the-circuits\&quot;&gt;Distinguishing the Circuits&lt;/h3&gt;\n &lt;a href=\&quot;#distinguishing-the-circuits\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Remember that while one exit node can serve many many different clients, from Cloudflare’s point of view all of that traffic comes from one IP address. This pooling helps cover the malicious traffic among legitimate traffic, but isn’t essential in the security or privacy of Tor. In fact, it can potentially hurt users by exposing their traffic to &lt;a href=\&quot;https://trac.torproject.org/projects/tor/wiki/doc/ReportingBadRelays\&quot;&gt;bad exit nodes&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Remember that Tor circuits to onion services carry a circuit number which we can use to rate-limit the circuit. Now, the question is how to inform a server such as nginx of this number with minimal effort. As it turns out, with only a &lt;a href=\&quot;https://github.com/torproject/tor/pull/343/\&quot;&gt;small tweak&lt;/a&gt; in the Tor binary, we can insert a &lt;a href=\&quot;https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt\&quot;&gt;Proxy Protocol&lt;/a&gt; header in the beginning of each packet that is forwarded to the server. This protocol is designed to help TCP proxies pass on parameters that can be lost in translation, such as source and destination IP addresses, and is already supported by nginx, Apache, Caddy, etc.&lt;/p&gt;&lt;p&gt;Luckily for us, the IPv6 space is so vast that we can encode the Tor circuit number as an IP address in an unused range and use the Proxy Protocol to send it to the server. Here is an example of the header that our Tor daemon would insert in the connection:&lt;/p&gt;\n &lt;pre class=\&quot;language-bash\&quot;&gt;&lt;code class=\&quot;language-bash\&quot;&gt;PROXY TCP6 2405:8100:8000:6366:1234:ABCD ::1 43981 443\\r\\n&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;In this case, 0x1234ABCD encodes the circuit number in the last 32 bits of the source IP address. The local Cloudflare server can then transparently use that IP to assign reputation, show CAPTCHAs, or block requests when needed.&lt;/p&gt;&lt;p&gt;Note that even though requests relayed by an onion service don’t carry an IP address, you will see an IP address like the one above with country code “T1” in your logs. This IP only specifies the circuit number seen by the onion service, not the actual user IP address. In fact, 2405:8100:8000::/48 is an unused subnet allocated to Cloudflare that we are not routing globally for this purpose.&lt;/p&gt;&lt;p&gt;This enables customers to continue detecting bots using IP reputation while sparing humans the trouble of clicking on CAPTCHA street signs over and over again.&lt;/p&gt;&lt;p&gt;Security, ✓&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;why-should-i-trust-cloudflare\&quot;&gt;Why should I trust Cloudflare?&lt;/h3&gt;\n &lt;a href=\&quot;#why-should-i-trust-cloudflare\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;You don’t need to. The Cloudflare Onion Service presents the exact same certificate that we would have used for direct requests to our servers, so you could audit this service using Certificate Transparency (which includes &lt;a href=\&quot;/introducing-certificate-transparency-and-nimbus/\&quot;&gt;Nimbus&lt;/a&gt;, our certificate transparency log), to reveal any potential cheating.&lt;/p&gt;&lt;p&gt;Additionally, since Tor Browser 8.0 makes a new circuit for each hostname when connecting via an .onion alternative service, the circuit number cannot be used to link connections to two different sites together.&lt;/p&gt;&lt;p&gt;Note that all of this works without running any entry, relay, or exit nodes. Therefore the only requests that we see as a result of this feature are the requests that were headed for us anyway. In particular, since no new traffic is introduced, Cloudflare does not gain any more information about what people do on the internet.&lt;/p&gt;&lt;p&gt;Anonymity, ✓&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;is-it-faster\&quot;&gt;Is it faster?&lt;/h3&gt;\n &lt;a href=\&quot;#is-it-faster\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Tor isn’t known for being fast. One reason for that is the physical cost of having packets bounce around in a decentralized network. Connections made through the Cloudflare Onion Service don’t add to this cost because the number of hops is no more than usual.&lt;/p&gt;&lt;p&gt;Another reason is the bandwidth costs of exit node operators. This is an area that we hope this service can offer relief since it shifts traffic from exit nodes to our own servers, reducing exit node operation costs along with it.&lt;/p&gt;&lt;p&gt;BONUS: Performance, ✓&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;how-do-i-enable-it\&quot;&gt;How do I enable it?&lt;/h3&gt;\n &lt;a href=\&quot;#how-do-i-enable-it\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Onion Routing is now available to all Cloudflare customers, enabled by default for Free and &lt;a href=\&quot;https://www.cloudflare.com/plans/pro/\&quot;&gt;Pro plans&lt;/a&gt;. The option is available in the Crypto tab of the Cloudflare dashboard.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5hA2RUo2mh5WZDM5xSkwow/d407c5fb030c3df65cf64fdbad2fffcd/Screen-Shot-2018-09-20-at-7.36.11-AM.jpg\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1728\&quot; height=\&quot;370\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;browser-support\&quot;&gt;Browser support&lt;/h3&gt;\n &lt;a href=\&quot;#browser-support\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;We recommend using &lt;a href=\&quot;https://blog.torproject.org/new-release-tor-browser-80\&quot;&gt;Tor Browser 8.0&lt;/a&gt;, which is the first stable release based on Firefox 60 ESR, and supports .onion Alt-Svc headers as well as HTTP/2. The new Tor Browser for Android (alpha) also supports this feature. You can check whether your connection is routed through an onion service or not in the Developer Tools window under the Network tab. If you&amp;#39;re using the Tor Browser and you don&amp;#39;t see the Alt-Svc in the response headers, that means you&amp;#39;re already using the .onion route. In future versions of Tor Browser you&amp;#39;ll be able to see this &lt;a href=\&quot;https://trac.torproject.org/projects/tor/ticket/27590\&quot;&gt;in the UI&lt;/a&gt;.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;We&amp;#39;ve got BIG NEWS. We gave Tor Browser a UX overhaul.&lt;/p&gt;&lt;p&gt;Tor Browser 8.0 has a new user onboarding experience, an updated landing page, additional language support, and new behaviors for bridge fetching, displaying a circuit, and visiting .onion sites.&lt;a href=\&quot;https://t.co/fpCpSTXT2L\&quot;&gt;https://t.co/fpCpSTXT2L&lt;/a&gt; &lt;a href=\&quot;https://t.co/xbj9lKTApP\&quot;&gt;pic.twitter.com/xbj9lKTApP&lt;/a&gt;&lt;/p&gt;&lt;p&gt;— The Tor Project (@torproject) &lt;a href=\&quot;https://twitter.com/torproject/status/1037397236257366017?ref_src=twsrc%5Etfw\&quot;&gt;September 5, 2018&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;There is also interest from other privacy-conscious browser vendors. Tom Lowenthal, Product Manager for Privacy &amp;amp; Security at &lt;a href=\&quot;https://brave.com/\&quot;&gt;Brave&lt;/a&gt; said:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Automatic upgrades to `.onion` sites will provide another layer of safety to Brave’s Private Browsing with Tor. We’re excited to implement this emerging standard.&lt;/p&gt;&lt;/blockquote&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;any-last-words\&quot;&gt;Any last words?&lt;/h3&gt;\n &lt;a href=\&quot;#any-last-words\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Similar to Opportunistic Encryption, Opportunistic Onions do not fully protect against attackers who can simply remove the alternative service header. Therefore it is important to use &lt;a href=\&quot;https://www.eff.org/https-everywhere\&quot;&gt;HTTPS Everywhere&lt;/a&gt; to secure the first request. Once a Tor circuit is established, subsequent requests should stay in the Tor network from source to destination.&lt;/p&gt;&lt;p&gt;As we maintain and &lt;a href=\&quot;https://trac.torproject.org/projects/tor/ticket/27502\&quot;&gt;improve&lt;/a&gt; this service we will share what we learn. In the meanwhile, feel free to try out this idea on &lt;a href=\&quot;https://github.com/mahrud/caddy-altonions\&quot;&gt;Caddy&lt;/a&gt; and reach out to us with any comments or suggestions that you might have.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;acknowledgments\&quot;&gt;Acknowledgments&lt;/h3&gt;\n &lt;a href=\&quot;#acknowledgments\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Patrick McManus of Mozilla for enabling support for .onion alternative services in Firefox; Arthur Edelstein of the Tor Project for reviewing and enabling HTTP/2 and HTTP Alternative Services in Tor Browser 8.0; Alexander Færøy and George Kadianakis of the Tor Project for adding support for Proxy Protocol in onion services; the entire Tor Project team for their invaluable assistance and discussions; and last, but not least, many folks at Cloudflare who helped with this project.&lt;/p&gt;&lt;h4&gt;Addresses used by the Cloudflare Onion Service&lt;/h4&gt;\n &lt;pre class=\&quot;language-bash\&quot;&gt;&lt;code class=\&quot;language-bash\&quot;&gt;cflarexljc3rw355ysrkrzwapozws6nre6xsy3n4yrj7taye3uiby3ad.onion\ncflarenuttlfuyn7imozr4atzvfbiw3ezgbdjdldmdx7srterayaozid.onion\ncflares35lvdlczhy3r6qbza5jjxbcplzvdveabhf7bsp7y4nzmn67yd.onion\ncflareusni3s7vwhq2f7gc4opsik7aa4t2ajedhzr42ez6uajaywh3qd.onion\ncflareki4v3lh674hq55k3n7xd4ibkwx3pnw67rr3gkpsonjmxbktxyd.onion\ncflarejlah424meosswvaeqzb54rtdetr4xva6mq2bm2hfcx5isaglid.onion\ncflaresuje2rb7w2u3w43pn4luxdi6o7oatv6r2zrfb5xvsugj35d2qd.onion\ncflareer7qekzp3zeyqvcfktxfrmncse4ilc7trbf6bp6yzdabxuload.onion\ncflareub6dtu7nvs3kqmoigcjdwap2azrkx5zohb2yk7gqjkwoyotwqd.onion\ncflare2nge4h4yqr3574crrd7k66lil3torzbisz6uciyuzqc2h2ykyd.onion&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;&lt;a href=\&quot;/subscribe/\&quot;&gt;&lt;i&gt;Subscribe to the blog&lt;/i&gt;&lt;/a&gt;&lt;i&gt; for daily updates on our announcements.&lt;/i&gt;&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/15NmOPYhQ1eUrnNvavD3TX/f3878ea7031dee5fa0b8fcfffb5e6563/Crypto-Week.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1808\&quot; height=\&quot;925\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&quot;],&quot;published_at&quot;:[0,&quot;2018-09-20T13:00:00.000+01:00&quot;],&quot;updated_at&quot;:[0,&quot;2024-11-05T21:23:46.261Z&quot;],&quot;feature_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5TRVgKXIsxFHQJhUVRTTKs/d419e463c376335efa48a0c6c47cd7ab/cloudflare-onion-service.png&quot;],&quot;tags&quot;:[1,[[0,{&quot;id&quot;:[0,&quot;5grQBv96AL5Ck0c8I54a0f&quot;],&quot;name&quot;:[0,&quot;Crypto Week&quot;],&quot;slug&quot;:[0,&quot;crypto-week&quot;]}],[0,{&quot;id&quot;:[0,&quot;6Mp7ouACN2rT3YjL1xaXJx&quot;],&quot;name&quot;:[0,&quot;Security&quot;],&quot;slug&quot;:[0,&quot;security&quot;]}],[0,{&quot;id&quot;:[0,&quot;6Nqy1V9XurncHC2WQb8NW8&quot;],&quot;name&quot;:[0,&quot;Tor&quot;],&quot;slug&quot;:[0,&quot;tor&quot;]}],[0,{&quot;id&quot;:[0,&quot;3BWeMuiOShelE7QM48sW9j&quot;],&quot;name&quot;:[0,&quot;Privacy&quot;],&quot;slug&quot;:[0,&quot;privacy&quot;]}],[0,{&quot;id&quot;:[0,&quot;3ZtL0yV0R4ScAreV1dTfIY&quot;],&quot;name&quot;:[0,&quot;Privacy Pass&quot;],&quot;slug&quot;:[0,&quot;privacy-pass&quot;]}],[0,{&quot;id&quot;:[0,&quot;1QsJUMpv0QBSLiVZLLQJ3V&quot;],&quot;name&quot;:[0,&quot;Cryptography&quot;],&quot;slug&quot;:[0,&quot;cryptography&quot;]}]]],&quot;relatedTags&quot;:[0],&quot;authors&quot;:[1,[[0,{&quot;name&quot;:[0,&quot;Mahrud Sayrafi&quot;],&quot;slug&quot;:[0,&quot;mahrud&quot;],&quot;bio&quot;:[0,null],&quot;profile_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3oJ9WVHHNMlgP7JrGdw98U/05f975dfccb065a94458a13e0cba2e5d/mahrud.jpg&quot;],&quot;location&quot;:[0,null],&quot;website&quot;:[0,null],&quot;twitter&quot;:[0,null],&quot;facebook&quot;:[0,null]}]]],&quot;meta_description&quot;:[0,&quot;Two years ago this week Cloudflare introduced Opportunistic Encryption, a feature that provided additional security and performance benefits to websites that had not yet moved to HTTPS.&quot;],&quot;primary_author&quot;:[0,{}],&quot;localeList&quot;:[0,{&quot;name&quot;:[0,&quot;Introducing the Cloudflare Onion Service Config&quot;],&quot;enUS&quot;:[0,&quot;English for Locale&quot;],&quot;zhCN&quot;:[0,&quot;Translated for Locale&quot;],&quot;zhHansCN&quot;:[0,&quot;No Page for Locale&quot;],&quot;zhTW&quot;:[0,&quot;No Page for Locale&quot;],&quot;frFR&quot;:[0,&quot;Translated for Locale&quot;],&quot;deDE&quot;:[0,&quot;Translated for Locale&quot;],&quot;itIT&quot;:[0,&quot;No Page for Locale&quot;],&quot;jaJP&quot;:[0,&quot;No Page for Locale&quot;],&quot;koKR&quot;:[0,&quot;No Page for Locale&quot;],&quot;ptBR&quot;:[0,&quot;No Page for Locale&quot;],&quot;esLA&quot;:[0,&quot;No Page for Locale&quot;],&quot;esES&quot;:[0,&quot;Translated for Locale&quot;],&quot;enAU&quot;:[0,&quot;No Page for Locale&quot;],&quot;enCA&quot;:[0,&quot;No Page for Locale&quot;],&quot;enIN&quot;:[0,&quot;No Page for Locale&quot;],&quot;enGB&quot;:[0,&quot;No Page for Locale&quot;],&quot;idID&quot;:[0,&quot;No Page for Locale&quot;],&quot;ruRU&quot;:[0,&quot;No Page for Locale&quot;],&quot;svSE&quot;:[0,&quot;No Page for Locale&quot;],&quot;viVN&quot;:[0,&quot;No Page for Locale&quot;],&quot;plPL&quot;:[0,&quot;No Page for Locale&quot;],&quot;arAR&quot;:[0,&quot;No Page for Locale&quot;],&quot;nlNL&quot;:[0,&quot;No Page for Locale&quot;],&quot;thTH&quot;:[0,&quot;No Page for Locale&quot;],&quot;trTR&quot;:[0,&quot;No Page for Locale&quot;],&quot;heIL&quot;:[0,&quot;No Page for Locale&quot;],&quot;lvLV&quot;:[0,&quot;No Page for Locale&quot;],&quot;etEE&quot;:[0,&quot;No Page for Locale&quot;],&quot;ltLT&quot;:[0,&quot;No Page for Locale&quot;]}],&quot;url&quot;:[0,&quot;https://blog.cloudflare.com/cloudflare-onion-service&quot;],&quot;metadata&quot;:[0,{&quot;title&quot;:[0],&quot;description&quot;:[0],&quot;imgPreview&quot;:[0,&quot;&quot;]}]}],&quot;translations&quot;:[0,{&quot;posts.by&quot;:[0,&quot;By&quot;],&quot;footer.gdpr&quot;:[0,&quot;GDPR&quot;],&quot;lang_blurb1&quot;:[0,&quot;This post is also available in {lang1}.&quot;],&quot;lang_blurb2&quot;:[0,&quot;This post is also available in {lang1} and {lang2}.&quot;],&quot;lang_blurb3&quot;:[0,&quot;This post is also available in {lang1}, {lang2} and {lang3}.&quot;],&quot;footer.press&quot;:[0,&quot;Press&quot;],&quot;header.title&quot;:[0,&quot;The Cloudflare Blog&quot;],&quot;search.clear&quot;:[0,&quot;Clear&quot;],&quot;search.filter&quot;:[0,&quot;Filter&quot;],&quot;search.source&quot;:[0,&quot;Source&quot;],&quot;footer.careers&quot;:[0,&quot;Careers&quot;],&quot;footer.company&quot;:[0,&quot;Company&quot;],&quot;footer.support&quot;:[0,&quot;Support&quot;],&quot;footer.the_net&quot;:[0,&quot;theNet&quot;],&quot;search.filters&quot;:[0,&quot;Filters&quot;],&quot;footer.our_team&quot;:[0,&quot;Our team&quot;],&quot;footer.webinars&quot;:[0,&quot;Webinars&quot;],&quot;page.more_posts&quot;:[0,&quot;More posts&quot;],&quot;posts.time_read&quot;:[0,&quot;{time} min read&quot;],&quot;search.language&quot;:[0,&quot;Language&quot;],&quot;footer.community&quot;:[0,&quot;Community&quot;],&quot;footer.resources&quot;:[0,&quot;Resources&quot;],&quot;footer.solutions&quot;:[0,&quot;Solutions&quot;],&quot;footer.trademark&quot;:[0,&quot;Trademark&quot;],&quot;header.subscribe&quot;:[0,&quot;Subscribe&quot;],&quot;footer.compliance&quot;:[0,&quot;Compliance&quot;],&quot;footer.free_plans&quot;:[0,&quot;Free plans&quot;],&quot;footer.impact_ESG&quot;:[0,&quot;Impact/ESG&quot;],&quot;posts.follow_on_X&quot;:[0,&quot;Follow on X&quot;],&quot;footer.help_center&quot;:[0,&quot;Help center&quot;],&quot;footer.network_map&quot;:[0,&quot;Network Map&quot;],&quot;header.please_wait&quot;:[0,&quot;Please Wait&quot;],&quot;page.related_posts&quot;:[0,&quot;Related posts&quot;],&quot;search.result_stat&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt; for &lt;strong&gt;{search_keyword}&lt;/strong&gt;&quot;],&quot;footer.case_studies&quot;:[0,&quot;Case Studies&quot;],&quot;footer.connect_2024&quot;:[0,&quot;Connect 2024&quot;],&quot;footer.terms_of_use&quot;:[0,&quot;Terms of Use&quot;],&quot;footer.white_papers&quot;:[0,&quot;White Papers&quot;],&quot;footer.cloudflare_tv&quot;:[0,&quot;Cloudflare TV&quot;],&quot;footer.community_hub&quot;:[0,&quot;Community Hub&quot;],&quot;footer.compare_plans&quot;:[0,&quot;Compare plans&quot;],&quot;footer.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.email_address&quot;:[0,&quot;Email Address&quot;],&quot;page.error.not_found&quot;:[0,&quot;Page not found&quot;],&quot;footer.developer_docs&quot;:[0,&quot;Developer docs&quot;],&quot;footer.privacy_policy&quot;:[0,&quot;Privacy Policy&quot;],&quot;footer.request_a_demo&quot;:[0,&quot;Request a demo&quot;],&quot;page.continue_reading&quot;:[0,&quot;Continue reading&quot;],&quot;footer.analysts_report&quot;:[0,&quot;Analyst reports&quot;],&quot;footer.for_enterprises&quot;:[0,&quot;For enterprises&quot;],&quot;footer.getting_started&quot;:[0,&quot;Getting Started&quot;],&quot;footer.learning_center&quot;:[0,&quot;Learning Center&quot;],&quot;footer.project_galileo&quot;:[0,&quot;Project Galileo&quot;],&quot;pagination.newer_posts&quot;:[0,&quot;Newer Posts&quot;],&quot;pagination.older_posts&quot;:[0,&quot;Older Posts&quot;],&quot;posts.social_buttons.x&quot;:[0,&quot;Discuss on X&quot;],&quot;search.icon_aria_label&quot;:[0,&quot;Search&quot;],&quot;search.source_location&quot;:[0,&quot;Source/Location&quot;],&quot;footer.about_cloudflare&quot;:[0,&quot;About Cloudflare&quot;],&quot;footer.athenian_project&quot;:[0,&quot;Athenian Project&quot;],&quot;footer.become_a_partner&quot;:[0,&quot;Become a partner&quot;],&quot;footer.cloudflare_radar&quot;:[0,&quot;Cloudflare Radar&quot;],&quot;footer.network_services&quot;:[0,&quot;Network services&quot;],&quot;footer.trust_and_safety&quot;:[0,&quot;Trust &amp; Safety&quot;],&quot;header.get_started_free&quot;:[0,&quot;Get Started Free&quot;],&quot;page.search.placeholder&quot;:[0,&quot;Search Cloudflare&quot;],&quot;footer.cloudflare_status&quot;:[0,&quot;Cloudflare Status&quot;],&quot;footer.cookie_preference&quot;:[0,&quot;Cookie Preferences&quot;],&quot;header.valid_email_error&quot;:[0,&quot;Must be valid email.&quot;],&quot;search.result_stat_empty&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt;&quot;],&quot;footer.connectivity_cloud&quot;:[0,&quot;Connectivity cloud&quot;],&quot;footer.developer_services&quot;:[0,&quot;Developer services&quot;],&quot;footer.investor_relations&quot;:[0,&quot;Investor relations&quot;],&quot;page.not_found.error_code&quot;:[0,&quot;Error Code: 404&quot;],&quot;search.autocomplete_title&quot;:[0,&quot;Insert a query. Press enter to send&quot;],&quot;footer.logos_and_press_kit&quot;:[0,&quot;Logos &amp; press kit&quot;],&quot;footer.application_services&quot;:[0,&quot;Application services&quot;],&quot;footer.get_a_recommendation&quot;:[0,&quot;Get a recommendation&quot;],&quot;posts.social_buttons.reddit&quot;:[0,&quot;Discuss on Reddit&quot;],&quot;footer.sse_and_sase_services&quot;:[0,&quot;SSE and SASE services&quot;],&quot;page.not_found.outdated_link&quot;:[0,&quot;You may have used an outdated link, or you may have typed the address incorrectly.&quot;],&quot;footer.report_security_issues&quot;:[0,&quot;Report Security Issues&quot;],&quot;page.error.error_message_page&quot;:[0,&quot;Sorry, we can&#39;t find the page you are looking for.&quot;],&quot;header.subscribe_notifications&quot;:[0,&quot;Subscribe to receive notifications of new posts:&quot;],&quot;footer.cloudflare_for_campaigns&quot;:[0,&quot;Cloudflare for Campaigns&quot;],&quot;header.subscription_confimation&quot;:[0,&quot;Subscription confirmed. Thank you for subscribing!&quot;],&quot;posts.social_buttons.hackernews&quot;:[0,&quot;Discuss on Hacker News&quot;],&quot;footer.diversity_equity_inclusion&quot;:[0,&quot;Diversity, equity &amp; inclusion&quot;],&quot;footer.critical_infrastructure_defense_project&quot;:[0,&quot;Critical Infrastructure Defense Project&quot;]}]}" ssr client="load" opts="{&quot;name&quot;:&quot;PostCard&quot;,&quot;value&quot;:true}" await-children><article class="w-50-l mt4 mt2-l mb4 ph3 bb b--gray8 bn-l"><div class="w-100"><a href="/cloudflare-onion-service/" class="fw5 no-underline gray1" data-testid="post-title"><h2 class="fw5 mt2">Introducing the Cloudflare Onion Service</h2></a><p class="f3 fw5 gray5 my" data-testid="post-date">2018-09-20</p><div class=""><a href="/tag/crypto-week/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Crypto Week</a><a href="/tag/security/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Security</a><a href="/tag/tor/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Tor</a><a href="/tag/privacy/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Privacy</a><a href="/tag/privacy-pass/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Privacy Pass</a><a href="/tag/cryptography/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Cryptography</a></div><p class="f3 fw4 gray1 lh-copy " data-testid="post-content">Two years ago this week Cloudflare introduced Opportunistic Encryption, a feature that provided additional security and performance benefits to websites that had not yet moved to HTTPS.<!-- -->...</p><ul class="author-lists flex pl0"><li class="list flex items-center pr2 mb3"><a href="/author/mahrud/" class="static-avatar pr1"><img class="author-profile-image br-100 mr2" src="https://blog.cloudflare.com/cdn-cgi/image/format=auto,dpr=3,width=64,height=64,gravity=face,fit=crop,zoom=0.5/https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3oJ9WVHHNMlgP7JrGdw98U/05f975dfccb065a94458a13e0cba2e5d/mahrud.jpg" alt="Mahrud Sayrafi" width="62" height="62"/></a><div class="author-name-tooltip"><a href="/author/mahrud/" class="fw4 f3 no-underline black">Mahrud Sayrafi</a></div></li></ul></div></article><!--astro:end--></astro-island><astro-island uid="1tzhCY" prefix="r4" component-url="/_astro/PostCard.CG32ktie.js" component-export="PostCard" renderer-url="/_astro/client.DLO1yDVm.js" props="{&quot;currentPage&quot;:[0,1],&quot;isFeaturedImageFirstPost&quot;:[0,false],&quot;post&quot;:[0,{&quot;id&quot;:[0,&quot;1PeYMnOt6XNE3dqjt2m9aq&quot;],&quot;title&quot;:[0,&quot;Technical reading from the Cloudflare blog for the holidays&quot;],&quot;slug&quot;:[0,&quot;2017-holiday-reading-from-the-cloudflare-blog&quot;],&quot;excerpt&quot;:[0,&quot;During 2017 Cloudflare published 172 blog posts (including this one). If you need a distraction from the holiday festivities at this time of year here are some highlights from the year.&quot;],&quot;featured&quot;:[0,false],&quot;html&quot;:[0,&quot;&lt;p&gt;During 2017 Cloudflare published 172 blog posts (including this one). If you need a distraction from the holiday festivities at this time of year here are some highlights from the year.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1FupNPeMEDTcUGuKJCQ2hX/69f106f4d37e6f7ce629f3845d88f8ed/33651510973_9bc38cc550_z.jpg\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;640\&quot; height=\&quot;428\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;&lt;a href=\&quot;https://creativecommons.org/licenses/by/2.0/\&quot;&gt;CC BY 2.0&lt;/a&gt; &lt;a href=\&quot;https://www.flickr.com/photos/148114704@N05/33651510973/in/photolist-TgEMP4-5W4SKe-5QXuaQ-avwN4J-9kM47Q-5sZfg5-62HmQr-vRsPNX-9gu8zw-8tzfDA-7L9szU-2j3fkx-kdS5xh-dTvJ1k-bd2nWP-5eyMyX-cYKDeY-aha8Je-s9FApd-afsNQp-Rr9uMb-6w5kZp-e8k7Zc-7JV8KQ-Sbxdzt-emJeJJ-fvoSPx-7jDQjL-cNbEy7-Ht7oDe-6w5mqM-cDJ6PS-cDHREJ-2L3KsB-2rjJQY-9kxtQm-b31okB-2rfQ8c-bHhPX-dr6fiP-5sUUEp-DDzAGu-onQfBb-afsNzx-kdS4E5-fVkm7-okB223-7ZrhKH-9eLu3Y-pcsdc4\&quot;&gt;image&lt;/a&gt; by &lt;a href=\&quot;https://perzonseo.com\&quot;&gt;perzon seo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/the-wirex-botnet/\&quot;&gt;The WireX Botnet: How Industry Collaboration Disrupted a DDoS Attack&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We worked closely with companies across the industry to track and take down the Android WireX Botnet. This blog post goes into detail about how that botnet operated, how it was distributed and how it was taken down.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/randomness-101-lavarand-in-production/\&quot;&gt;Randomness 101: LavaRand in Production&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The wall of Lava Lamps in the San Francisco office is used to feed entropy into random number generators across our network. This blog post explains how.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/arm-takes-wing/\&quot;&gt;ARM Takes Wing: Qualcomm vs. Intel CPU comparison&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Our &lt;a href=\&quot;https://www.cloudflare.com/network/\&quot;&gt;network&lt;/a&gt; of data centers around the world all contain Intel-based servers, but we&amp;#39;re interested in ARM-based servers because of the potential cost/power savings. This blog post took a look at the relative performance of Intel processors and Qualcomm&amp;#39;s latest server offering.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/how-to-monkey-patch-the-linux-kernel/\&quot;&gt;How to Monkey Patch the Linux Kernel&lt;/a&gt;&lt;/p&gt;&lt;p&gt;One engineer wanted to combine the Dvorak and QWERTY keyboard layouts and did so by patching the Linux kernel using &lt;a href=\&quot;https://sourceware.org/systemtap/\&quot;&gt;SystemTap&lt;/a&gt;. This blog explains how and why. Where there&amp;#39;s a will, there&amp;#39;s a way.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/introducing-cloudflare-workers/\&quot;&gt;Introducing Cloudflare Workers: Run JavaScript Service Workers at the Edge&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Traditionally, the Cloudflare network has been &lt;i&gt;configurable&lt;/i&gt; by our users, but not &lt;i&gt;programmable&lt;/i&gt;. In September, we introduced &lt;a href=\&quot;https://www.cloudflare.com/products/cloudflare-workers/\&quot;&gt;Cloudflare Workers&lt;/a&gt; which allows users to write JavaScript code that runs on our edge worldwide. This blog post explains why we chose JavaScript and how it works.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3rDQWcCe0YDvxU6a8enygs/e436188ab1b54b75b1a875143e9c08c5/5586120601_a7b1776371_b.jpg\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1024\&quot; height=\&quot;682\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;&lt;a href=\&quot;https://creativecommons.org/licenses/by/2.0/\&quot;&gt;CC BY 2.0&lt;/a&gt; &lt;a href=\&quot;https://www.flickr.com/photos/werkman/5586120601/in/photolist-9vCk3a-21Bd6Xh-8nCHw7-ptePkD-RJQgiN-nWZ5u6-3xLVWE-rDFYG8-LH8sS-2peYb-mX5MQc-6JxAT-aAArZQ-rJfmkx-9HavML-TX5hUW-niuhtp-jHGzT5-5eRuc3-Gv67PP-fs2mGn-8mhB7f-8pDZbD-ZPoZDF-3xLxd3-6k15Ni-j1zK3-8mhB8b-7RjyKs-57C9rW-j1zBX-bTs5tP-8wuUBf-7r7fAq-8jPBD4-5bnWiq-e88EiF-ddTbY7-PVC9U-e88E6P-S4eP6f-8jPkh2-5bj6xn-NzVdo-7rQyZa-4Dm4gX-ZCuaMm-pQr1Hw-yf9rdC-21HJvkv\&quot;&gt;image&lt;/a&gt; by &lt;a href=\&quot;https://www.flickr.com/photos/werkman/\&quot;&gt;Peter Werkman&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/geo-key-manager-how-it-works/\&quot;&gt;Geo Key Manager: How It Works&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Our &lt;a href=\&quot;/introducing-cloudflare-geo-key-manager/\&quot;&gt;Geo Key Manager&lt;/a&gt; gives customers granular control of the location of their private keys on the Cloudflare network. This blog post explains the mathematics that makes the possible.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/sidh-go/\&quot;&gt;SIDH in Go for quantum-resistant TLS 1.3&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Quantum-resistant cryptography isn&amp;#39;t an academic fantasy. We implemented the SIDH scheme as part of our Go implementation of TLS 1.3 and open sourced it.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/the-languages-which-almost-became-css/\&quot;&gt;The Languages Which Almost Became CSS&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This blog post recounts the history of CSS and the languages that might have been CSS.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/perfect-locality-and-three-epic-systemtap-scripts/\&quot;&gt;Perfect locality and three epic SystemTap scripts&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In an ongoing effort to understand the performance of NGINX under heavy load on our machines (and wring out the greatest number of requests/core), we used SystemTap to experiment with different queuing models.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/counting-things-a-lot-of-different-things/\&quot;&gt;How we built rate limiting capable of scaling to millions of domains&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We rolled out a &lt;a href=\&quot;cloudflare\&quot;&gt;rate limiting&lt;/a&gt; feature that allows our customers to control the maximum number of HTTP requests per second/minute/hour that their servers receive. This blog post explains how we made that operate efficiently at our scale.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4cQPAfJHM6gES4uXsyRwd4/f871a9d7627a4ea4f405ea76524e9545/26797557806_18daa76ec2_z.jpg\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;640\&quot; height=\&quot;427\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;&lt;a href=\&quot;https://creativecommons.org/licenses/by/2.0/\&quot;&gt;CC BY 2.0&lt;/a&gt; &lt;a href=\&quot;https://www.flickr.com/photos/waters2712/26797557806/in/photolist-GQ1ujJ-ovpzb8-5hGjhb-pkkHPH-7Ed3eQ-5TiuCW-6tknkf-7JGpz4-81Rc1J-qM8AwX-dQVifV-nWZ5u6-puAvLe-acEK6v-F5KyvG-4Ykyf1-bvH81M-FF6XnD-KLqgJ-4rLnJE-d8b1tS-dQVisV-7cTp1r-pkkHic-6oKTtx-9mKe1u-5vsfch-coUNp9-o9Txa7-9p7thZ-aWYjuc-SV2qEb-7LXSYz-9Fcnam-fkr4Fc-b6Dtmt-6r1QQ2-5ndv1D-fuUiKV-qDAQxe-cjZhVY-6Hn6G1-qPMScz-mJAvhc-8LVJNj-7Ed3cf-9wFgvw-9z5jt9-bGsg4R-72BBkc\&quot;&gt;image&lt;/a&gt; by &lt;a href=\&quot;https://www.flickr.com/photos/waters2712/\&quot;&gt;Han Cheng Yeh&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/reflections-on-reflections/\&quot;&gt;Reflections on reflection (attacks)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We deal with a new DDoS attack every few minutes and in this blog post we took a close look at reflection attacks and revealed statistics on the types of reflection-based DDoS attacks we see.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/on-the-dangers-of-intels-frequency-scaling/\&quot;&gt;On the dangers of Intel&amp;#39;s frequency scaling&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Intel processors contain special AVX-512 that provide 512-bit wide SIMD instructions to speed up certain calculations. However, these instructions have a downside: when used the CPU base frequency is scaled down slowing down other instructions. This blog post explores that problem.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/how-cloudflare-analyzes-1m-dns-queries-per-second/\&quot;&gt;How Cloudflare analyzes 1M DNS queries per second&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This blog post details how we handle logging information for 1M DNS queries per second using a custom pipeline, &lt;a href=\&quot;https://clickhouse.yandex/\&quot;&gt;ClickHouse&lt;/a&gt; and Grafana (via a connector we &lt;a href=\&quot;https://github.com/vavrusa/grafana-sqldb-datasource\&quot;&gt;open sourced&lt;/a&gt;) to build real time dashboards.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/aes-cbc-going-the-way-of-the-dodo/\&quot;&gt;AES-CBC is going the way of the dodo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;CBC-mode cipher suites have been declining for some time because of padding oracle-based attacks. In this blog we demonstrate that AES-CBC has now largely been replaced by &lt;a href=\&quot;/it-takes-two-to-chacha-poly/\&quot;&gt;ChaCha20-Poly1305&lt;/a&gt; .&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6CVkU8gCFVwghZzoP3x0Sd/c90d63d983ab453d7115daac2d16e632/3414054443_2bd47e12f7_b.jpg\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1024\&quot; height=\&quot;576\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;&lt;a href=\&quot;https://creativecommons.org/licenses/by-sa/2.0/\&quot;&gt;CC BY-SA 2.0&lt;/a&gt; &lt;a href=\&quot;https://www.flickr.com/photos/spanginator/3414054443/in/photolist-6cFVrD-6cvz6R-6cKZLw-rn74T-7RoM6f-ATb57-aQHtja-7i1omC-xGoWE-8FsWpL-6DbHyD-9aFjZn-BxbDmF-23fTGw-4v5aS-81KR9D-ahC42F-7ibXNR-Hod7ZY-7hS2JP-fnyx1X-4Pjy9v-kNu6rR-FFmpx9-Gyx1By-GsEegj-7hVPHw-Gv6zDR-F5KyvG-FF6XnD-FZk6kU-9re3Rz-dRTft-btLnvB-o3PQ5p-nU34U-VCRL7q-YhCTjj-L44FTc-Ke5mko-L1vxdJ-KehBhx-7BjC9n-7xSGtH-pEfb5f-2pqSst-7Xhhmq-o8u7ja-pWNcy2-KSCBjW\&quot;&gt;image&lt;/a&gt; by &lt;a href=\&quot;https://www.flickr.com/photos/spanginator/\&quot;&gt;Christine&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/how-we-made-our-dns-stack-3x-faster/\&quot;&gt;How we made our DNS stack 3x faster&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We answer around 1 million authoritative DNS queries per second using a custom software stack. Responding to those queries as quickly as possible is why Cloudflare is &lt;a href=\&quot;http://www.dnsperf.com/\&quot;&gt;fastest&lt;/a&gt; authoritative DNS provider on the Internet. This blog post details how we made our stack even faster.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/quantifying-the-impact-of-cloudbleed/\&quot;&gt;Quantifying the Impact of &amp;quot;Cloudbleed&amp;quot;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;On February 18 a serious security bug was reported to Cloudflare. Five days &lt;a href=\&quot;/incident-report-on-memory-leak-caused-by-cloudflare-parser-bug/\&quot;&gt;later&lt;/a&gt; we released details of the problem and six days after that we posted this analysis of the impact.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/luajit-hacking-getting-next-out-of-the-nyi-list/\&quot;&gt;LuaJIT Hacking: Getting next() out of the NYI list&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We make extensive use of &lt;a href=\&quot;http://luajit.org/\&quot;&gt;LuaJIT&lt;/a&gt; when processing our customers&amp;#39; traffic and making it faster is a key goal. In the past, we&amp;#39;ve sponsored the project and everyone benefits from those contributions. This blog post examines getting one specific function JITted correctly for additional speed.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/privacy-pass-the-math/\&quot;&gt;Privacy Pass: The Math&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The &lt;a href=\&quot;https://privacypass.github.io/\&quot;&gt;Privacy Pass&lt;/a&gt; project provides a zero knowledge way of proving your identity to a service like Cloudflare. This detailed blog post explains the mathematics behind authenticating a user without knowing their identity.&lt;/p&gt;&lt;p&gt;&lt;a href=\&quot;/how-and-why-the-leap-second-affected-cloudflare-dns/\&quot;&gt;How and why the leap second affected Cloudflare DNS&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The year started with a bang for some engineers at Cloudflare when we ran into a bug in our custom DNS server, &lt;a href=\&quot;/tag/rrdns/\&quot;&gt;RRDNS&lt;/a&gt;, caused by the introduction of a &lt;a href=\&quot;https://en.wikipedia.org/wiki/Leap_second\&quot;&gt;leap second&lt;/a&gt; at midnight UTC on January 1, 2017. This blog explains the error and why it happened.&lt;/p&gt;&lt;p&gt;There&amp;#39;s &lt;a href=\&quot;https://datacenter.iers.org/web/guest/eop/-/somos/5Rgv/latest/16\&quot;&gt;no leap second&lt;/a&gt; this year.&lt;/p&gt;&quot;],&quot;published_at&quot;:[0,&quot;2017-12-22T14:17:57.000+00:00&quot;],&quot;updated_at&quot;:[0,&quot;2024-10-09T23:08:39.430Z&quot;],&quot;feature_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5FmsOPxixvvI0cjAz5nHNG/8ee010e2e2e1ba861d799896e4d71340/2017-holiday-reading-from-the-cloudflare-blog.jpg&quot;],&quot;tags&quot;:[1,[[0,{&quot;id&quot;:[0,&quot;231XTGyX1Pw7Huv9D0rhMS&quot;],&quot;name&quot;:[0,&quot;Year in Review&quot;],&quot;slug&quot;:[0,&quot;year-in-review&quot;]}],[0,{&quot;id&quot;:[0,&quot;6QktrXeEFcl4e2dZUTZVGl&quot;],&quot;name&quot;:[0,&quot;Product News&quot;],&quot;slug&quot;:[0,&quot;product-news&quot;]}],[0,{&quot;id&quot;:[0,&quot;6HY8KI1rCqRo1Pj3Vc0XE3&quot;],&quot;name&quot;:[0,&quot;LavaRand&quot;],&quot;slug&quot;:[0,&quot;lavarand&quot;]}],[0,{&quot;id&quot;:[0,&quot;64g1G2mvZyb6PjJsisO09T&quot;],&quot;name&quot;:[0,&quot;DDoS&quot;],&quot;slug&quot;:[0,&quot;ddos&quot;]}],[0,{&quot;id&quot;:[0,&quot;3GvEkdqz5nPparmzF0mpl6&quot;],&quot;name&quot;:[0,&quot;Geo Key Manager&quot;],&quot;slug&quot;:[0,&quot;geo-key-manager&quot;]}],[0,{&quot;id&quot;:[0,&quot;5fZHv2k9HnJ7phOPmYexHw&quot;],&quot;name&quot;:[0,&quot;DNS&quot;],&quot;slug&quot;:[0,&quot;dns&quot;]}],[0,{&quot;id&quot;:[0,&quot;7oLqpn3vNWao1PXv53X42G&quot;],&quot;name&quot;:[0,&quot;LUA&quot;],&quot;slug&quot;:[0,&quot;lua&quot;]}],[0,{&quot;id&quot;:[0,&quot;3ZtL0yV0R4ScAreV1dTfIY&quot;],&quot;name&quot;:[0,&quot;Privacy Pass&quot;],&quot;slug&quot;:[0,&quot;privacy-pass&quot;]}],[0,{&quot;id&quot;:[0,&quot;2pFyOCtANFB5qS6nbtQbVp&quot;],&quot;name&quot;:[0,&quot;Vulnerabilities&quot;],&quot;slug&quot;:[0,&quot;vulnerabilities&quot;]}],[0,{&quot;id&quot;:[0,&quot;4l3WDYLk6bXCyaRc9pRzXa&quot;],&quot;name&quot;:[0,&quot;Bots&quot;],&quot;slug&quot;:[0,&quot;bots&quot;]}]]],&quot;relatedTags&quot;:[0],&quot;authors&quot;:[1,[[0,{&quot;name&quot;:[0,&quot;John Graham-Cumming&quot;],&quot;slug&quot;:[0,&quot;john-graham-cumming&quot;],&quot;bio&quot;:[0,null],&quot;profile_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5vGNsXzZrtSLn2X30pnpUY/6f350e7dd36058a6422f9199b452bb02/john-graham-cumming.jpg&quot;],&quot;location&quot;:[0,&quot;Lisbon, Portugal&quot;],&quot;website&quot;:[0,null],&quot;twitter&quot;:[0,null],&quot;facebook&quot;:[0,null]}]]],&quot;meta_description&quot;:[0,&quot;During 2017 Cloudflare published 172 blog posts. If you need a distraction from the holiday festivities here are some highlights from the year.&quot;],&quot;primary_author&quot;:[0,{}],&quot;localeList&quot;:[0,{&quot;name&quot;:[0,&quot;Technical reading from the Cloudflare blog for the holidays Config&quot;],&quot;enUS&quot;:[0,&quot;English for Locale&quot;],&quot;zhCN&quot;:[0,&quot;No Page for Locale&quot;],&quot;zhHansCN&quot;:[0,&quot;No Page for Locale&quot;],&quot;zhTW&quot;:[0,&quot;No Page for Locale&quot;],&quot;frFR&quot;:[0,&quot;No Page for Locale&quot;],&quot;deDE&quot;:[0,&quot;No Page for Locale&quot;],&quot;itIT&quot;:[0,&quot;No Page for Locale&quot;],&quot;jaJP&quot;:[0,&quot;No Page for Locale&quot;],&quot;koKR&quot;:[0,&quot;No Page for Locale&quot;],&quot;ptBR&quot;:[0,&quot;No Page for Locale&quot;],&quot;esLA&quot;:[0,&quot;No Page for Locale&quot;],&quot;esES&quot;:[0,&quot;No Page for Locale&quot;],&quot;enAU&quot;:[0,&quot;No Page for Locale&quot;],&quot;enCA&quot;:[0,&quot;No Page for Locale&quot;],&quot;enIN&quot;:[0,&quot;No Page for Locale&quot;],&quot;enGB&quot;:[0,&quot;No Page for Locale&quot;],&quot;idID&quot;:[0,&quot;No Page for Locale&quot;],&quot;ruRU&quot;:[0,&quot;No Page for Locale&quot;],&quot;svSE&quot;:[0,&quot;No Page for Locale&quot;],&quot;viVN&quot;:[0,&quot;No Page for Locale&quot;],&quot;plPL&quot;:[0,&quot;No Page for Locale&quot;],&quot;arAR&quot;:[0,&quot;No Page for Locale&quot;],&quot;nlNL&quot;:[0,&quot;No Page for Locale&quot;],&quot;thTH&quot;:[0,&quot;No Page for Locale&quot;],&quot;trTR&quot;:[0,&quot;No Page for Locale&quot;],&quot;heIL&quot;:[0,&quot;No Page for Locale&quot;],&quot;lvLV&quot;:[0,&quot;No Page for Locale&quot;],&quot;etEE&quot;:[0,&quot;No Page for Locale&quot;],&quot;ltLT&quot;:[0,&quot;No Page for Locale&quot;]}],&quot;url&quot;:[0,&quot;https://blog.cloudflare.com/2017-holiday-reading-from-the-cloudflare-blog&quot;],&quot;metadata&quot;:[0,{&quot;title&quot;:[0],&quot;description&quot;:[0],&quot;imgPreview&quot;:[0,&quot;&quot;]}]}],&quot;translations&quot;:[0,{&quot;posts.by&quot;:[0,&quot;By&quot;],&quot;footer.gdpr&quot;:[0,&quot;GDPR&quot;],&quot;lang_blurb1&quot;:[0,&quot;This post is also available in {lang1}.&quot;],&quot;lang_blurb2&quot;:[0,&quot;This post is also available in {lang1} and {lang2}.&quot;],&quot;lang_blurb3&quot;:[0,&quot;This post is also available in {lang1}, {lang2} and {lang3}.&quot;],&quot;footer.press&quot;:[0,&quot;Press&quot;],&quot;header.title&quot;:[0,&quot;The Cloudflare Blog&quot;],&quot;search.clear&quot;:[0,&quot;Clear&quot;],&quot;search.filter&quot;:[0,&quot;Filter&quot;],&quot;search.source&quot;:[0,&quot;Source&quot;],&quot;footer.careers&quot;:[0,&quot;Careers&quot;],&quot;footer.company&quot;:[0,&quot;Company&quot;],&quot;footer.support&quot;:[0,&quot;Support&quot;],&quot;footer.the_net&quot;:[0,&quot;theNet&quot;],&quot;search.filters&quot;:[0,&quot;Filters&quot;],&quot;footer.our_team&quot;:[0,&quot;Our team&quot;],&quot;footer.webinars&quot;:[0,&quot;Webinars&quot;],&quot;page.more_posts&quot;:[0,&quot;More posts&quot;],&quot;posts.time_read&quot;:[0,&quot;{time} min read&quot;],&quot;search.language&quot;:[0,&quot;Language&quot;],&quot;footer.community&quot;:[0,&quot;Community&quot;],&quot;footer.resources&quot;:[0,&quot;Resources&quot;],&quot;footer.solutions&quot;:[0,&quot;Solutions&quot;],&quot;footer.trademark&quot;:[0,&quot;Trademark&quot;],&quot;header.subscribe&quot;:[0,&quot;Subscribe&quot;],&quot;footer.compliance&quot;:[0,&quot;Compliance&quot;],&quot;footer.free_plans&quot;:[0,&quot;Free plans&quot;],&quot;footer.impact_ESG&quot;:[0,&quot;Impact/ESG&quot;],&quot;posts.follow_on_X&quot;:[0,&quot;Follow on X&quot;],&quot;footer.help_center&quot;:[0,&quot;Help center&quot;],&quot;footer.network_map&quot;:[0,&quot;Network Map&quot;],&quot;header.please_wait&quot;:[0,&quot;Please Wait&quot;],&quot;page.related_posts&quot;:[0,&quot;Related posts&quot;],&quot;search.result_stat&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt; for &lt;strong&gt;{search_keyword}&lt;/strong&gt;&quot;],&quot;footer.case_studies&quot;:[0,&quot;Case Studies&quot;],&quot;footer.connect_2024&quot;:[0,&quot;Connect 2024&quot;],&quot;footer.terms_of_use&quot;:[0,&quot;Terms of Use&quot;],&quot;footer.white_papers&quot;:[0,&quot;White Papers&quot;],&quot;footer.cloudflare_tv&quot;:[0,&quot;Cloudflare TV&quot;],&quot;footer.community_hub&quot;:[0,&quot;Community Hub&quot;],&quot;footer.compare_plans&quot;:[0,&quot;Compare plans&quot;],&quot;footer.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.email_address&quot;:[0,&quot;Email Address&quot;],&quot;page.error.not_found&quot;:[0,&quot;Page not found&quot;],&quot;footer.developer_docs&quot;:[0,&quot;Developer docs&quot;],&quot;footer.privacy_policy&quot;:[0,&quot;Privacy Policy&quot;],&quot;footer.request_a_demo&quot;:[0,&quot;Request a demo&quot;],&quot;page.continue_reading&quot;:[0,&quot;Continue reading&quot;],&quot;footer.analysts_report&quot;:[0,&quot;Analyst reports&quot;],&quot;footer.for_enterprises&quot;:[0,&quot;For enterprises&quot;],&quot;footer.getting_started&quot;:[0,&quot;Getting Started&quot;],&quot;footer.learning_center&quot;:[0,&quot;Learning Center&quot;],&quot;footer.project_galileo&quot;:[0,&quot;Project Galileo&quot;],&quot;pagination.newer_posts&quot;:[0,&quot;Newer Posts&quot;],&quot;pagination.older_posts&quot;:[0,&quot;Older Posts&quot;],&quot;posts.social_buttons.x&quot;:[0,&quot;Discuss on X&quot;],&quot;search.icon_aria_label&quot;:[0,&quot;Search&quot;],&quot;search.source_location&quot;:[0,&quot;Source/Location&quot;],&quot;footer.about_cloudflare&quot;:[0,&quot;About Cloudflare&quot;],&quot;footer.athenian_project&quot;:[0,&quot;Athenian Project&quot;],&quot;footer.become_a_partner&quot;:[0,&quot;Become a partner&quot;],&quot;footer.cloudflare_radar&quot;:[0,&quot;Cloudflare Radar&quot;],&quot;footer.network_services&quot;:[0,&quot;Network services&quot;],&quot;footer.trust_and_safety&quot;:[0,&quot;Trust &amp; Safety&quot;],&quot;header.get_started_free&quot;:[0,&quot;Get Started Free&quot;],&quot;page.search.placeholder&quot;:[0,&quot;Search Cloudflare&quot;],&quot;footer.cloudflare_status&quot;:[0,&quot;Cloudflare Status&quot;],&quot;footer.cookie_preference&quot;:[0,&quot;Cookie Preferences&quot;],&quot;header.valid_email_error&quot;:[0,&quot;Must be valid email.&quot;],&quot;search.result_stat_empty&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt;&quot;],&quot;footer.connectivity_cloud&quot;:[0,&quot;Connectivity cloud&quot;],&quot;footer.developer_services&quot;:[0,&quot;Developer services&quot;],&quot;footer.investor_relations&quot;:[0,&quot;Investor relations&quot;],&quot;page.not_found.error_code&quot;:[0,&quot;Error Code: 404&quot;],&quot;search.autocomplete_title&quot;:[0,&quot;Insert a query. Press enter to send&quot;],&quot;footer.logos_and_press_kit&quot;:[0,&quot;Logos &amp; press kit&quot;],&quot;footer.application_services&quot;:[0,&quot;Application services&quot;],&quot;footer.get_a_recommendation&quot;:[0,&quot;Get a recommendation&quot;],&quot;posts.social_buttons.reddit&quot;:[0,&quot;Discuss on Reddit&quot;],&quot;footer.sse_and_sase_services&quot;:[0,&quot;SSE and SASE services&quot;],&quot;page.not_found.outdated_link&quot;:[0,&quot;You may have used an outdated link, or you may have typed the address incorrectly.&quot;],&quot;footer.report_security_issues&quot;:[0,&quot;Report Security Issues&quot;],&quot;page.error.error_message_page&quot;:[0,&quot;Sorry, we can&#39;t find the page you are looking for.&quot;],&quot;header.subscribe_notifications&quot;:[0,&quot;Subscribe to receive notifications of new posts:&quot;],&quot;footer.cloudflare_for_campaigns&quot;:[0,&quot;Cloudflare for Campaigns&quot;],&quot;header.subscription_confimation&quot;:[0,&quot;Subscription confirmed. Thank you for subscribing!&quot;],&quot;posts.social_buttons.hackernews&quot;:[0,&quot;Discuss on Hacker News&quot;],&quot;footer.diversity_equity_inclusion&quot;:[0,&quot;Diversity, equity &amp; inclusion&quot;],&quot;footer.critical_infrastructure_defense_project&quot;:[0,&quot;Critical Infrastructure Defense Project&quot;]}]}" ssr client="load" opts="{&quot;name&quot;:&quot;PostCard&quot;,&quot;value&quot;:true}" await-children><article class="w-50-l mt4 mt2-l mb4 ph3 bb b--gray8 bn-l"><div class="w-100"><a href="/2017-holiday-reading-from-the-cloudflare-blog/" class="fw5 no-underline gray1" data-testid="post-title"><h2 class="fw5 mt2">Technical reading from the Cloudflare blog for the holidays</h2></a><p class="f3 fw5 gray5 my" data-testid="post-date">2017-12-22</p><div class=""><a href="/tag/year-in-review/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Year in Review</a><a href="/tag/product-news/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Product News</a><a href="/tag/lavarand/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">LavaRand</a><a href="/tag/ddos/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">DDoS</a><a href="/tag/geo-key-manager/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Geo Key Manager</a><a href="/tag/dns/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">DNS</a><a href="/tag/lua/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">LUA</a><a href="/tag/privacy-pass/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Privacy Pass</a><a href="/tag/vulnerabilities/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Vulnerabilities</a><a href="/tag/bots/" class="dib pl2 pr2 pt1 pb1 mb2 bg-gray8 no-underline blue3 f2 mr1" data-testid="post-tag">Bots</a></div><p class="f3 fw4 gray1 lh-copy " data-testid="post-content">During 2017 Cloudflare published 172 blog posts (including this one). If you need a distraction from the holiday festivities at this time of year here are some highlights from the year.<!-- -->...</p><ul class="author-lists flex pl0"><li class="list flex items-center pr2 mb3"><a href="/author/john-graham-cumming/" class="static-avatar pr1"><img class="author-profile-image br-100 mr2" src="https://blog.cloudflare.com/cdn-cgi/image/format=auto,dpr=3,width=64,height=64,gravity=face,fit=crop,zoom=0.5/https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5vGNsXzZrtSLn2X30pnpUY/6f350e7dd36058a6422f9199b452bb02/john-graham-cumming.jpg" alt="John Graham-Cumming" width="62" height="62"/></a><div class="author-name-tooltip"><a href="/author/john-graham-cumming/" class="fw4 f3 no-underline black">John Graham-Cumming</a></div></li></ul></div></article><!--astro:end--></astro-island> <astro-island uid="ZYWKbo" prefix="r5" component-url="/_astro/MorePosts.DyRVOquy.js" component-export="default" renderer-url="/_astro/client.DLO1yDVm.js" props="{&quot;locale&quot;:[0,&quot;en-us&quot;],&quot;posts&quot;:[1,[[0,{&quot;id&quot;:[0,&quot;41Lr8xZtaEnIidX8Q0fvEX&quot;],&quot;title&quot;:[0,&quot;Privacy Pass - “The Math”&quot;],&quot;slug&quot;:[0,&quot;privacy-pass-the-math&quot;],&quot;excerpt&quot;:[0,&quot;During a recent internship at Cloudflare, I had the chance to help integrate support for improving the accessibility of websites that are protected by the Cloudflare edge network. &quot;],&quot;featured&quot;:[0,false],&quot;html&quot;:[0,&quot;&lt;p&gt;&lt;i&gt;This is a guest post by Alex Davidson, a PhD student in Cryptography at Royal Holloway, University of London, who is part of the team that developed &lt;/i&gt;&lt;a href=\&quot;https://privacypass.github.io\&quot;&gt;&lt;i&gt;Privacy Pass&lt;/i&gt;&lt;/a&gt;&lt;i&gt;. Alex worked at Cloudflare for the summer on deploying Privacy Pass on the Cloudflare network&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;During a recent internship at Cloudflare, I had the chance to help integrate support for improving the accessibility of websites that are protected by the Cloudflare edge network. Specifically, I helped develop an open-source browser extension named ‘Privacy Pass’ and added support for the Privacy Pass protocol within Cloudflare infrastructure. Currently, Privacy Pass works with the Cloudflare edge to help honest users to reduce the number of Cloudflare CAPTCHA pages that they see when browsing the web. However, the operation of Privacy Pass is not limited to the Cloudflare use-case and we envisage that it has applications over a wider and more diverse range of applications as support grows.&lt;/p&gt;&lt;p&gt;In summary, this browser extension allows a user to generate cryptographically ‘blinded’ tokens that can then be signed by supporting servers following some receipt of authenticity (e.g. a CAPTCHA solution). The browser extension can then use these tokens to ‘prove’ honesty in future communications with the server, without having to solve more authenticity challenges.&lt;/p&gt;&lt;p&gt;The ‘blind’ aspect of the protocol means that it is infeasible for a server to link tokens token that it signs to tokens that are redeemed in the future. This means that a client using the browser extension should not compromise their own privacy with respect to the server they are communicating with.&lt;/p&gt;&lt;p&gt;In this blog post we hope to give more of an insight into how we have developed the protocol and the security considerations that we have taken into account. We have made use of some interesting and modern cryptographic techniques that we believe could have a future impact on a wide array of problems.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;previously\&quot;&gt;Previously…&lt;/h3&gt;\n &lt;a href=\&quot;#previously\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;The research team released a specification last year for a “blind signing” protocol (very similar to the original proposal of &lt;a href=\&quot;#Cha82\&quot;&gt;Chaum&lt;/a&gt; using a variant of RSA known as ‘blind RSA’. Blind RSA simply uses the homomorphic properties of the textbook RSA signature scheme to allow the user to have messages signed &lt;i&gt;obliviously&lt;/i&gt;. Since then, George Tankersley and Filippo Valsorda gave a talk at &lt;a href=\&quot;https://youtu.be/GqY7YUv8b5Y\&quot;&gt;Real World Crypto 2017&lt;/a&gt; explaining the idea in more detail and how the protocol could be implemented. The intuition behind a blind signing protocol is also given in &lt;a href=\&quot;/cloudflare-supports-privacy-pass\&quot;&gt;Nick’s blog post&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;A blind signing protocol between a server A and a client B roughly takes the following form:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;B generates some value &lt;code&gt;t&lt;/code&gt; that they require a signature from A for.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;B calculates a ‘blinded’ version of &lt;code&gt;t&lt;/code&gt; that we will call &lt;code&gt;bt&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;B sends &lt;code&gt;bt&lt;/code&gt; to A&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A signs &lt;code&gt;bt&lt;/code&gt; with their secret signing key and returns a signature &lt;code&gt;bz&lt;/code&gt; to B&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;B receives &lt;code&gt;bz&lt;/code&gt; and ‘unblinds’ to receive a signature &lt;code&gt;z&lt;/code&gt; for value &lt;code&gt;t&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Due to limitations arising from the usage of RSA (e.g. large signature sizes, slower operations), there were efficiency concerns surrounding the extra bandwidth and computation time on the client browser. Fortunately, we received a lot of feedback from many notable individuals (full acknowledgments below). In short, this helped us to come up with a protocol with much lower overheads in storage, bandwidth and computation time using elliptic curve cryptography as the foundation instead.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;elliptic-curves-a-very-short-introduction\&quot;&gt;Elliptic curves (a very short introduction)&lt;/h3&gt;\n &lt;a href=\&quot;#elliptic-curves-a-very-short-introduction\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;An elliptic curve is defined over a finite field modulo some prime &lt;code&gt;p&lt;/code&gt;. Briefly, an &lt;code&gt;(x,y)&lt;/code&gt; coordinate is said to lie on the curve if it satisfies the following equation:&lt;/p&gt;&lt;p&gt;&lt;code&gt;y^2 = x^3 + a*x + b (modulo p)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Nick Sullivan wrote an introductory &lt;a href=\&quot;/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/\&quot;&gt;blog post&lt;/a&gt; on the use of elliptic curves in cryptography a while back, so this may be a good place to start if you’re new to the area.&lt;/p&gt;&lt;p&gt;Elliptic curves have been studied for use in cryptography since the independent works of Koblitz and Miller (1984-85). However, EC-based ciphers and signature algorithms have rapidly started replacing older primitives in the Internet-space due to large improvements in the choice of security parameters available. What this translates to is that encryption/signing keys can be much smaller in EC cryptography when compared to more traditional methods such as RSA. This comes with huge efficiency benefits when computing encryption and signing operations, thus making EC cipher suites perfect for use on an Internet-wide scale.&lt;/p&gt;&lt;p&gt;Importantly, there are many different elliptic curve configurations that are defined by the choice of &lt;code&gt;p&lt;/code&gt;, &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; for the equation above. These prevent different security and efficiency benefits; some have been standardized by NIST. In this work, we will be using the NIST specified &lt;a href=\&quot;https://csrc.nist.gov/publications/detail/fips/186/4/final\&quot;&gt;P256 curve&lt;/a&gt;, however, this choice is largely agnostic to the protocol that we have designed.&lt;/p&gt;&lt;h4&gt;Blind signing via elliptic curves&lt;/h4&gt;&lt;p&gt;Translating our blind signing protocol from RSA to elliptic curves required deriving a whole new protocol. Some of the suggestions pointed out cryptographic constructions known as “oblivious pseudorandom functions”. A pseudorandom function or PRF is a mainstay of the traditional cryptographic arsenal and essentially takes a key and some string as input and outputs some cryptographically random value.&lt;/p&gt;&lt;p&gt;Let F be our PRF, then the security requirement on such a function is that evaluating:&lt;/p&gt;&lt;p&gt;&lt;code&gt;y = F(K,x)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;is indistinguishable from evaluating:&lt;/p&gt;&lt;p&gt;&lt;code&gt;y’ = f(x)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;where f is a randomly chosen function with outputs defined in the same domain as &lt;code&gt;F(K,-)&lt;/code&gt;. Choosing a function f at random undoubtedly leads to random outputs, however for &lt;code&gt;F&lt;/code&gt;, randomness is derived from the choice of key &lt;code&gt;K&lt;/code&gt;. In practice, we would instantiate a PRF using something like HMAC-SHA256.&lt;/p&gt;&lt;h4&gt;Oblivious PRFs&lt;/h4&gt;&lt;p&gt;An oblivious PRF (OPRF) is actually a protocol between a server S and a client C. In the protocol, S holds a key &lt;code&gt;K&lt;/code&gt; for some PRF &lt;code&gt;F&lt;/code&gt; and C holds an input &lt;code&gt;x&lt;/code&gt;. The security goal is that C receives the output &lt;code&gt;y = F(K,x)&lt;/code&gt; without learning the key &lt;code&gt;K&lt;/code&gt; and S does not learn the value &lt;code&gt;x&lt;/code&gt;.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5LG1M3dg4OwiUYd1TFWIWJ/8e26d23ae4dd905c599cece4cf9c1cbd/image3-1.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;600\&quot; height=\&quot;400\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;It may seem difficult to construct such a functionality without revealing the input x or the key K. However, there are numerous (and very efficient) constructions of OPRFs with applications to many different cryptographic problems such as &lt;a href=\&quot;https://eprint.iacr.org/2016/799\&quot;&gt;private set intersection&lt;/a&gt;, &lt;a href=\&quot;https://eprint.iacr.org/2016/144\&quot;&gt;password-protected secret-sharing&lt;/a&gt; and &lt;a href=\&quot;http://webee.technion.ac.il/~hugo/sphinx.pdf\&quot;&gt;cryptographic password storage&lt;/a&gt; to name a few.&lt;/p&gt;&lt;h4&gt;OPRFs from elliptic curves&lt;/h4&gt;&lt;p&gt;A simple instantiation of an OPRF from elliptic curves was given by Jarecki et al. &lt;a href=\&quot;#jkk14\&quot;&gt;JKK14&lt;/a&gt;, we use this as the foundation for our blind signing protocol.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Let &lt;code&gt;&lt;b&gt;G&lt;/b&gt;&lt;/code&gt; be a cyclic group of prime-order&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Let &lt;code&gt;H&lt;/code&gt; be a collision-resistant hash function hashing into &lt;code&gt;G&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Let &lt;code&gt;k&lt;/code&gt; be a private key held by S&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Let &lt;code&gt;x&lt;/code&gt; be a private input held by C&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The protocol now proceeds as:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;C sends &lt;code&gt;H(x)&lt;/code&gt; to S&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;S returns &lt;code&gt;kH(x)&lt;/code&gt; to C&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Clearly, this is an exceptionally simple protocol, security is established since:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;The collision-resistant hash function prevents S from reversing &lt;code&gt;H(x)&lt;/code&gt; to learn &lt;code&gt;x&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The hardness of the discrete log problem (DLP) prevents C from learning &lt;code&gt;k&lt;/code&gt; from &lt;code&gt;kH(x)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The output &lt;code&gt;kH(x)&lt;/code&gt; is pseudorandom since &lt;code&gt;&lt;b&gt;G&lt;/b&gt;&lt;/code&gt; is a prime-order group and &lt;code&gt;k&lt;/code&gt; is chosen at random.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Blind signing via an OPRF&lt;/h4&gt;&lt;p&gt;Using the OPRF design above as the foundation, the research team wrote a variation that we can use for a blind signing protocol; we detail this construction below. In our ‘blind signing’ protocol we require that:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;The client/user can have random values signed obliviously by the edge server&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The client can ‘unblind’ these values and present them in the future for verification&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The edge can commit to the secret key publicly and prove that it is used for signing all tokens globally&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The blind signing protocol is split into two phases.&lt;/p&gt;&lt;p&gt;Firstly, there is a &lt;b&gt;blind signing phase&lt;/b&gt; that is carried out between the user and the edge after the user has successfully solved a challenge. The result is that the user receives a number of &lt;code&gt;signed&lt;/code&gt; tokens (default 30) that are unblinded and stored for future use. Intuitively, this mirrors the execution of the OPRF protocol above.&lt;/p&gt;&lt;p&gt;Secondly, there is a &lt;b&gt;redemption phase&lt;/b&gt; where an unblinded token is used for bypassing a future iteration of the challenge.&lt;/p&gt;&lt;p&gt;Let &lt;code&gt;&lt;b&gt;G&lt;/b&gt;&lt;/code&gt; be a cyclic group of prime-order &lt;code&gt;q&lt;/code&gt;. Let &lt;code&gt;H_1&lt;/code&gt;,&lt;code&gt;H_2&lt;/code&gt; be a pair of collision-resistant hash functions; &lt;code&gt;H_1&lt;/code&gt; hashes into the group &lt;code&gt;&lt;b&gt;G&lt;/b&gt;&lt;/code&gt; as before, &lt;code&gt;H_2&lt;/code&gt; hashes into a binary string of length &lt;code&gt;n&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;In the following, we will slightly different notation to make it consistent with existing literature. Let &lt;code&gt;x&lt;/code&gt; be a private key held by the server S. Let &lt;code&gt;t&lt;/code&gt; be the input held by the user/client C. Let &lt;code&gt;ZZ_q&lt;/code&gt; be the ring of integers modulo &lt;code&gt;q&lt;/code&gt;. We write all operations in their scalar multiplication form to be consistent with EC notation. Let &lt;code&gt;MAC_K()&lt;/code&gt; be a &lt;a href=\&quot;https://en.wikipedia.org/wiki/Message_authentication_code\&quot;&gt;message-authentication code&lt;/a&gt; algorithm keyed by a key &lt;code&gt;K&lt;/code&gt;.&lt;/p&gt;&lt;h4&gt;Signing phase&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;C samples a random ‘blind’ &lt;code&gt;r ← ZZ_q&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;C computes &lt;code&gt;T = H_1(t)&lt;/code&gt; and then blinds it by computing &lt;code&gt;rT&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;C sends &lt;code&gt;M = rT&lt;/code&gt; to S&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;S computes &lt;code&gt;Z = xM&lt;/code&gt; and returns &lt;code&gt;Z&lt;/code&gt; to C&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;C computes &lt;code&gt;(1/r)*Z = xT = N&lt;/code&gt; and stores the pair &lt;code&gt;(t,N)&lt;/code&gt; for some point in the future&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We think of &lt;code&gt;T = H_1(t)&lt;/code&gt; as a token, these objects form the backbone of the protocol that we use to bypass challenges.Notice, that the only difference between this protocol and the OPRF above is the blinding factor &lt;code&gt;r&lt;/code&gt; that we use.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3LJYvqKAwDw1Rh6oPlGeZy/ef4c5d38cf87ce48480c6e7680d17444/image2.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;600\&quot; height=\&quot;400\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;h4&gt;Redemption phase&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;C calculates request binding data &lt;code&gt;req&lt;/code&gt; and chooses an unspent token &lt;code&gt;(t,N)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;C calculates a shared key &lt;code&gt;sk = H_2(t,N)&lt;/code&gt; and sends &lt;code&gt;(t, MAC_sk(req))&lt;/code&gt; to S&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;S recalculates &lt;code&gt;req&amp;#39;&lt;/code&gt; based on the request data that it witnesses&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;S checks that &lt;code&gt;t&lt;/code&gt; has not been spent already and calculates &lt;code&gt;T = H_1(t)&lt;/code&gt;, &lt;code&gt;N = xT&lt;/code&gt;, and &lt;code&gt;sk = H_2(t,N)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Finally S checks that &lt;code&gt;MAC_sk(req&amp;#39;) =?= MAC_sk(req)&lt;/code&gt;, and stores &lt;code&gt;t&lt;/code&gt; to check against future redemptions&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If all the steps above pass, then the server validates that the user has a validly signed token. When we refer to ‘passes’ we mean the pair &lt;code&gt;(t, MAC_sk(req))&lt;/code&gt; and if verification is successful the edge server grants the user access to the requested resource.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5UrTr7lpAY9Fin8rctVoLa/61fbb098340ac56a5012b6f03a13acc0/image1-1.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;600\&quot; height=\&quot;400\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;cryptographic-security-of-protocol\&quot;&gt;Cryptographic security of protocol&lt;/h3&gt;\n &lt;a href=\&quot;#cryptographic-security-of-protocol\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;There are many different ways in which we need to ensure that the protocol remains “secure”. Clearly one of the main features is that the user remains anonymous in the transaction. Furthermore, we need to show that the client is unable to leverage the protocol in order to learn the private key of the edge, or arbitrarily gain infinite tokens. We give two security arguments for our protocol that we can easily reduce to cryptographic assumptions on the hardness of widely-used problems. There are a number of other security goals for the protocol but we consider the two arguments below as fundamental security requirements.&lt;/p&gt;&lt;h4&gt;Unlinkability in the presence of an adversarial edge&lt;/h4&gt;&lt;p&gt;Similarly to the RSA blind signing protocol, the blind r is used to prevent the edge from learning the value of &lt;code&gt;T&lt;/code&gt;, above. Since &lt;code&gt;r&lt;/code&gt; is not used in the redemption phase of the protocol, there is no way that the server can link a blinded token &lt;code&gt;rT&lt;/code&gt; in the signing phase to any token in a given redemption phase. Since S recalculates &lt;code&gt;T&lt;/code&gt; during redemption, it may be tempting to think that S could recover &lt;code&gt;r&lt;/code&gt; from &lt;code&gt;rT&lt;/code&gt;. However, the hardness of the discrete log problem prevents S from launching this attack. Therefore, the server has no knowledge of &lt;code&gt;r&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;As mentioned and similarly to the &lt;a href=\&quot;#jkk14\&quot;&gt;JKK14&lt;/a&gt; OPRF protocol above, we rely on the hardness of standard cryptographic assumptions such as the discrete log problem (DLP), and collision-resistant hash functions. Using these hardness assumptions it is possible to write a proof of security in the presence of a dishonest server. The proof of security shows that assuming that these assumptions are hard, then a dishonest server is unable to link an execution of the signing phase with any execution of the redemption phase with probability higher than just randomly guessing.&lt;/p&gt;&lt;p&gt;Intuitively, in the signing phase, C sends randomly distributed data due to the blinding mechanism and so S cannot learn anything from this data alone. In the redemption phase, C unveils their token, but the transcript of the signing phase witnessed by S is essentially random and so it cannot be used to learn anything from the redemption phase.&lt;/p&gt;&lt;p&gt;This is not a full proof of security but gives an idea as to how we can derive cryptographic hardness for the underlying protocol. We hope to publish a more detailed cryptographic proof in the near future to accompany our protocol design.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;key-privacy-for-the-edge\&quot;&gt;Key privacy for the edge&lt;/h3&gt;\n &lt;a href=\&quot;#key-privacy-for-the-edge\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;It is also crucial to prove that the exchange does not reveal the secret key &lt;code&gt;x&lt;/code&gt; to the user. If this were to happen, then the user would be able to arbitrarily sign their own tokens, giving them an effectively infinite supply.&lt;/p&gt;&lt;p&gt;Notice that the only time when the client is exposed to the key is when they receive &lt;code&gt;Z = xM&lt;/code&gt;. In elliptic-curve terminology, the client receives their blinded token scalar multiplied with &lt;code&gt;x&lt;/code&gt;. Notice, that this is also identical to the interaction that an adversary witnesses in the discrete log problem. In fact, if the client was able to compute &lt;code&gt;x&lt;/code&gt; from &lt;code&gt;Z&lt;/code&gt;, then the client would also be able to solve the DLP — which is thought to be very hard for established key sizes. In this way, we have a sufficient guarantee that an adversarial client would not be able to learn the key from the signing interaction.&lt;/p&gt;&lt;h4&gt;Preventing further deanonymization attacks using “Verifiable” OPRFs&lt;/h4&gt;&lt;p&gt;While the proof of security above gives some assurances about the cryptographic design of the protocol, it does not cover the possibility of possible out-of-band deanonymization. For instance, the edge server can sign tokens with a new secret key each time. Ignoring the cost that this would incur, the server would be able to link token signing and redemption phases by simply checking the validation for each private key in use.&lt;/p&gt;&lt;p&gt;There is a solution known as a ‘discrete log equivalence proof’ (DLEQ proof). Using this, a server commits to a secret key &lt;code&gt;x&lt;/code&gt; by publicly posting a pair &lt;code&gt;(G, xG)&lt;/code&gt; for a generator &lt;code&gt;G&lt;/code&gt; of the prime-order group &lt;code&gt;&lt;b&gt;G&lt;/b&gt;&lt;/code&gt;. A DLEQ proof intuitively allows the server to prove to the user that the signed tokens &lt;code&gt;Z = xrT&lt;/code&gt; and commitment &lt;code&gt;xG&lt;/code&gt; both have the same discrete log relation &lt;code&gt;x&lt;/code&gt;. Since the commitment is posted publicly (similarly to a &lt;a href=\&quot;https://www.certificate-transparency.org/\&quot;&gt;Certificate Transparency Log&lt;/a&gt;) this would be verifiable by all users and so the deanonymization attack above would not be possible.&lt;/p&gt;&lt;h4&gt;DLEQ proofs&lt;/h4&gt;&lt;p&gt;The DLEQ proof objects take the form of a Chaum-Pedersen &lt;a href=\&quot;#cp93\&quot;&gt;CP93&lt;/a&gt; non-interactive zero-knowledge (NIZK) proof. Similar proofs were used in &lt;a href=\&quot;#jkk14\&quot;&gt;JKK14&lt;/a&gt; to show that their OPRF protocol produced “verifiable” randomness, they defined their construction as a VOPRF. In the following, we will describe how these proofs can be augmented into the signing phase above.&lt;/p&gt;&lt;p&gt;&lt;i&gt;The DLEQ proof verification in the extension is still in development and is not completely consistent with the protocol below. We hope to complete the verification functionality in the near future.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Let &lt;code&gt;M = rT&lt;/code&gt; be the blinded token that C sends to S, let &lt;code&gt;(G,Y) = (G,xG)&lt;/code&gt; be the commitment from above, and let H_3 be a new hash function (modelled as a random oracle for security purposes). In the protocol below, we can think of S playing the role of the &amp;#39;prover&amp;#39; and C the &amp;#39;verifier&amp;#39; in a traditional NIZK proof system.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;S computes &lt;code&gt;Z = xM&lt;/code&gt;, as before.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;S also samples a random nonce &lt;code&gt;k ← ZZ_q&lt;/code&gt; and commits to the nonce by calculating &lt;code&gt;A = kG&lt;/code&gt; and &lt;code&gt;B = kM&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;S constructs a challenge &lt;code&gt;c ← H_3(G,Y,M,Z,A,B)&lt;/code&gt; and computes &lt;code&gt;s = k-cx (mod q)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;S sends &lt;code&gt;(c,s)&lt;/code&gt; to the user C&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;C recalculates &lt;code&gt;A&amp;#39; = sG + cY&lt;/code&gt; and &lt;code&gt;B&amp;#39; = s*M + c*Z&lt;/code&gt; and hashes &lt;code&gt;c&amp;#39; = H_3(G,Y,M,Z,A’,B’)&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;C verifies that &lt;code&gt;c&amp;#39; =?= c&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Note that correctness follows since&lt;/p&gt;\n &lt;pre class=\&quot;language-bash\&quot;&gt;&lt;code class=\&quot;language-bash\&quot;&gt;A&amp;#039; = sG + cY = (k-cx)G + cxG = kG and B&amp;#039; = sM + cZ = r(k-cx)T + crxT = krT = kM &lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;We write DLEQ(Z/M == Y/G) to denote the proof that is created by S and validated by C.In summary, if both parties have a consistent view of &lt;code&gt;(G,Y)&lt;/code&gt; for the same epoch then the proof should verify correctly. As long as the discrete log problem remains hard to solve, then this proof remains zero-knowledge (in the random oracle model). For our use-case the proof verifies that the same key &lt;code&gt;x&lt;/code&gt; is used for each invocation of the protocol, as long as &lt;code&gt;(G,Y)&lt;/code&gt; does not change.&lt;/p&gt;&lt;h4&gt;Batching the proofs&lt;/h4&gt;&lt;p&gt;Unfortunately, a drawback of the proof above is that it has to be instantiated for each individual token sent in the protocol. Since we send 30 tokens by default, this would require the server to also send 30 DLEQ proofs (with two EC elements each) and the client to verify each proof individually.&lt;/p&gt;&lt;p&gt;Interestingly, Henry showed that it was possible to batch the above NIZK proofs into one object with only one verification required &lt;a href=\&quot;#hen14\&quot;&gt;Hen14&lt;/a&gt;. Using this batching technique substantially reduces the communication and computation cost of including the proof.&lt;/p&gt;&lt;p&gt;Let &lt;code&gt;n&lt;/code&gt; be the number of tokens to be signed in the interaction, so we have &lt;code&gt;M_i = r_i*T_i&lt;/code&gt; for the set of blinded tokens corresponding to inputs &lt;code&gt;t_i&lt;/code&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;S generates corresponding &lt;code&gt;Z_i = x*M_i&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;S also computes a seed &lt;code&gt;z = H_3(G,Y,M_1,...,M_n,Z_1,...,Z_n)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;S then initializes a pseudorandom number generator PRNG with the seed &lt;code&gt;z&lt;/code&gt; and outputs &lt;code&gt;c_1, ... , c_n ← PRNG(z)&lt;/code&gt; where the output domain of PRNG is &lt;code&gt;ZZ_q&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;S generates composite group elements:&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;\n &lt;pre class=\&quot;language-bash\&quot;&gt;&lt;code class=\&quot;language-bash\&quot;&gt;M = (c_1*M_1) + ... + (c_n*M_n), Z = (c_1*Z_1) + ... + (c_n*Z_n)&lt;/pre&gt;&lt;/code&gt;\n &lt;ul&gt;&lt;li&gt;&lt;p&gt;S calculates &lt;code&gt;(c,s) ← DLEQ(M:Z == G:Y)&lt;/code&gt; and sends &lt;code&gt;(c,s)&lt;/code&gt; to C, where &lt;code&gt;DLEQ(Z/M == Y/G)&lt;/code&gt; refers to the proof protocol used in the non-batching case.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;C computes &lt;code&gt;c’_1, … , c’_n ← PRNG(z)&lt;/code&gt; and re-computes &lt;code&gt;M’&lt;/code&gt;, &lt;code&gt;Z’&lt;/code&gt; and checks that &lt;code&gt;c’ =?= c&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;To see why this works, consider the reduced case where m = 2:&lt;/p&gt;\n &lt;pre class=\&quot;language-bash\&quot;&gt;&lt;code class=\&quot;language-bash\&quot;&gt;Z_1 = x(M_1),\nZ_2 = x(M_2),\n(c_1*Z_1) = c_1(x*M_1) = x(c_1*M_1),\n(c_2*Z_2) = c_2(x*M_2) = x(c_2*M_2),\n(c_1*Z_1) + (c_2*Z_2) = x[(c_1*M_1) + (c_2*M_2)]\n&lt;/pre&gt;&lt;/code&gt;\n &lt;p&gt;Therefore, all the elliptic curve points will have the same discrete log relation as each other, and hence equal to the secret key that is committed to by the edge.&lt;/p&gt;&lt;h4&gt;Benefits of V-OPRF vs blind RSA&lt;/h4&gt;&lt;p&gt;While the blind RSA specification that we released fulfilled our needs, we make the following concrete gains&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Simpler, faster primitives&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;10x savings in pass size (~256 bits using P-256 instead of ~2048)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The only thing edge to manage is a private scalar. No certificates.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;No need for public-key encryption at all, since the derived shared key used to calculate each MAC is never transmitted and cannot be found from passive observation without knowledge of the edge key or the user&amp;#39;s blinding factor.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Exponentiations are more efficient due to use of elliptic curves.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Easier key rotation. Instead of managing certificates pinned in TBB and submitted to CT, we can use the DLEQ proofs to allow users to positively verify they&amp;#39;re in the same anonymity set with regard to the edge secret key as everyone else.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Download&lt;/h4&gt;&lt;p&gt;Privacy Pass v1.0 is available as a browser extension for &lt;a href=\&quot;https://chrome.google.com/webstore/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi\&quot;&gt;Chrome&lt;/a&gt; and &lt;a href=\&quot;https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/\&quot;&gt;Firefox&lt;/a&gt;. If you find any issues while using then &lt;a href=\&quot;https://privacypass.github.io\&quot;&gt;let us know&lt;/a&gt;.&lt;/p&gt;&lt;h4&gt;Source code&lt;/h4&gt;&lt;p&gt;The code for the browser extension and server has been open-sourced and can be found at &lt;a href=\&quot;https://github.com/privacypass/challenge-bypass-extension\&quot;&gt;https://github.com/privacypass/challenge-bypass-extension&lt;/a&gt; and &lt;a href=\&quot;https://github.com/privacypass/challenge-bypass-server\&quot;&gt;https://github.com/privacypass/challenge-bypass-server&lt;/a&gt; respectively. We are welcoming contributions if you happen to notice any improvements that can be made to either component. If you would like to get in contact with the Privacy Pass team then find us at our &lt;a href=\&quot;https://privacypass.github.io\&quot;&gt;website&lt;/a&gt;.&lt;/p&gt;&lt;h4&gt;Protocol details&lt;/h4&gt;&lt;p&gt;More information about the protocol can be found &lt;a href=\&quot;https://privacypass.github.io/protocol\&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;h4&gt;Acknowledgements&lt;/h4&gt;&lt;p&gt;The creation of Privacy Pass has been a joint effort by the team made up of George Tankersley, Ian Goldberg, Nick Sullivan, Filippo Valsorda and myself.&lt;/p&gt;&lt;p&gt;I&amp;#39;d also like to thank Eric Tsai for creating the logo and extension design, Dan Boneh for helping us develop key parts of the protocol, as well as Peter Wu and Blake Loring for their helpful code reviews. We would also like to acknowledge Sharon Goldberg, Christopher Wood, Peter Eckersley, Brian Warner, Zaki Manian, Tony Arcieri, Prateek Mittal, Zhuotao Liu, Isis Lovecruft, Henry de Valence, Mike Perry, Trevor Perrin, Zi Lin, Justin Paine, Marek Majkowski, Eoin Brady, Aaran McGuire, and many others who were involved in one way or another and whose efforts are appreciated.&lt;/p&gt;&lt;h4&gt;References&lt;/h4&gt;&lt;p&gt;Cha82: Chaum. &lt;a href=\&quot;https://dl.acm.org/citation.cfm?doid=4372.4373\&quot;&gt;Blind signatures for untraceable payments. CRYPTO’82&lt;/a&gt;CP93: Chaum, Pedersen. &lt;a href=\&quot;http://chaum.com/publications/Wallet_Databases.pdf\&quot;&gt;Wallet Databases with Observers. CRYPTO&amp;#39;92.&lt;/a&gt;Hen14: Ryan Henry. &lt;a href=\&quot;https://uwspace.uwaterloo.ca/bitstream/handle/10012/8621/Henry_Ryan.pdf\&quot;&gt;Efficient Zero-Knowledge Proofs and Applications, August 2014.&lt;/a&gt;JKK14: Jarecki, Kiayias, Krawczyk. &lt;a href=\&quot;https://eprint.iacr.org/2014/650.pdf\&quot;&gt;Round-Optimal Password-Protected Secret Sharing and T-PAKE in the Password-Only model.&lt;/a&gt;JKKX16: Jarecki, Kiayias, Krawczyk, Xu. &lt;a href=\&quot;https://eprint.iacr.org/2016/144.pdf\&quot;&gt;Highly-Efficient and Composable Password-Protected Secret Sharing.&lt;/a&gt;&lt;/p&gt;&quot;],&quot;published_at&quot;:[0,&quot;2017-11-09T16:05:00.000+00:00&quot;],&quot;updated_at&quot;:[0,&quot;2024-10-10T00:42:12.304Z&quot;],&quot;feature_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1yXzyZDnhtRQkiULdIAWCK/221255b93aab8c3fe5dce7eb2d871a80/privacy-pass-the-math.png&quot;],&quot;tags&quot;:[1,[[0,{&quot;id&quot;:[0,&quot;3ZtL0yV0R4ScAreV1dTfIY&quot;],&quot;name&quot;:[0,&quot;Privacy Pass&quot;],&quot;slug&quot;:[0,&quot;privacy-pass&quot;]}],[0,{&quot;id&quot;:[0,&quot;6Mp7ouACN2rT3YjL1xaXJx&quot;],&quot;name&quot;:[0,&quot;Security&quot;],&quot;slug&quot;:[0,&quot;security&quot;]}],[0,{&quot;id&quot;:[0,&quot;11uq7RpwEtvy8Ic53C6cMR&quot;],&quot;name&quot;:[0,&quot;CAPTCHA&quot;],&quot;slug&quot;:[0,&quot;captcha&quot;]}],[0,{&quot;id&quot;:[0,&quot;3skwJ34K0c3CEY1cNogR4n&quot;],&quot;name&quot;:[0,&quot;Chrome&quot;],&quot;slug&quot;:[0,&quot;chrome&quot;]}],[0,{&quot;id&quot;:[0,&quot;kn8Lmy4luvCeAabblVvHH&quot;],&quot;name&quot;:[0,&quot;Firefox&quot;],&quot;slug&quot;:[0,&quot;firefox&quot;]}],[0,{&quot;id&quot;:[0,&quot;1x7tpPmKIUCt19EDgM1Tsl&quot;],&quot;name&quot;:[0,&quot;Research&quot;],&quot;slug&quot;:[0,&quot;research&quot;]}],[0,{&quot;id&quot;:[0,&quot;1QsJUMpv0QBSLiVZLLQJ3V&quot;],&quot;name&quot;:[0,&quot;Cryptography&quot;],&quot;slug&quot;:[0,&quot;cryptography&quot;]}]]],&quot;relatedTags&quot;:[0],&quot;authors&quot;:[1,[[0,{&quot;name&quot;:[0,&quot;Alex Davidson&quot;],&quot;slug&quot;:[0,&quot;alex-davidson&quot;],&quot;bio&quot;:[0,null],&quot;profile_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1m0ky2DnnbIO9nnFOvrHoH/cc78437164b23c2556e933cae0681534/alex-davidson.jpg&quot;],&quot;location&quot;:[0,null],&quot;website&quot;:[0,null],&quot;twitter&quot;:[0,null],&quot;facebook&quot;:[0,null]}]]],&quot;meta_description&quot;:[0,null],&quot;primary_author&quot;:[0,{}],&quot;localeList&quot;:[0,{&quot;name&quot;:[0,&quot;Privacy Pass - “The Math” Config&quot;],&quot;enUS&quot;:[0,&quot;English for Locale&quot;],&quot;zhCN&quot;:[0,&quot;No Page for Locale&quot;],&quot;zhHansCN&quot;:[0,&quot;No Page for Locale&quot;],&quot;zhTW&quot;:[0,&quot;No Page for Locale&quot;],&quot;frFR&quot;:[0,&quot;No Page for Locale&quot;],&quot;deDE&quot;:[0,&quot;No Page for Locale&quot;],&quot;itIT&quot;:[0,&quot;No Page for Locale&quot;],&quot;jaJP&quot;:[0,&quot;No Page for Locale&quot;],&quot;koKR&quot;:[0,&quot;No Page for Locale&quot;],&quot;ptBR&quot;:[0,&quot;No Page for Locale&quot;],&quot;esLA&quot;:[0,&quot;No Page for Locale&quot;],&quot;esES&quot;:[0,&quot;No Page for Locale&quot;],&quot;enAU&quot;:[0,&quot;No Page for Locale&quot;],&quot;enCA&quot;:[0,&quot;No Page for Locale&quot;],&quot;enIN&quot;:[0,&quot;No Page for Locale&quot;],&quot;enGB&quot;:[0,&quot;No Page for Locale&quot;],&quot;idID&quot;:[0,&quot;No Page for Locale&quot;],&quot;ruRU&quot;:[0,&quot;No Page for Locale&quot;],&quot;svSE&quot;:[0,&quot;No Page for Locale&quot;],&quot;viVN&quot;:[0,&quot;No Page for Locale&quot;],&quot;plPL&quot;:[0,&quot;No Page for Locale&quot;],&quot;arAR&quot;:[0,&quot;No Page for Locale&quot;],&quot;nlNL&quot;:[0,&quot;No Page for Locale&quot;],&quot;thTH&quot;:[0,&quot;No Page for Locale&quot;],&quot;trTR&quot;:[0,&quot;No Page for Locale&quot;],&quot;heIL&quot;:[0,&quot;No Page for Locale&quot;],&quot;lvLV&quot;:[0,&quot;No Page for Locale&quot;],&quot;etEE&quot;:[0,&quot;No Page for Locale&quot;],&quot;ltLT&quot;:[0,&quot;No Page for Locale&quot;]}],&quot;url&quot;:[0,&quot;https://blog.cloudflare.com/privacy-pass-the-math&quot;],&quot;metadata&quot;:[0,{&quot;title&quot;:[0],&quot;description&quot;:[0],&quot;imgPreview&quot;:[0,&quot;&quot;]}]}],[0,{&quot;id&quot;:[0,&quot;7vBxBfvbpwQEokzxhTdIy6&quot;],&quot;title&quot;:[0,&quot;Cloudflare supports Privacy Pass&quot;],&quot;slug&quot;:[0,&quot;cloudflare-supports-privacy-pass&quot;],&quot;excerpt&quot;:[0,&quot;Cloudflare supports Privacy Pass, a recently-announced privacy-preserving protocol developed in collaboration with researchers from Royal Holloway and the University of Waterloo. &quot;],&quot;featured&quot;:[0,false],&quot;html&quot;:[0,&quot;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7vA4PjhsAUXab0yreDk1Mu/c21cba4090509585301555d18a44f02f/DONF9cRWsAE3OZf-1-2.jpg\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;440\&quot; height=\&quot;131\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;enabling-anonymous-access-to-the-web-with-privacy-preserving-cryptography\&quot;&gt;Enabling anonymous access to the web with privacy-preserving cryptography&lt;/h3&gt;\n &lt;a href=\&quot;#enabling-anonymous-access-to-the-web-with-privacy-preserving-cryptography\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Cloudflare supports Privacy Pass, a &lt;a href=\&quot;https://medium.com/@alxdavids/privacy-pass-6f0acf075288\&quot;&gt;recently-announced&lt;/a&gt; privacy-preserving protocol developed in collaboration &lt;a href=\&quot;https://privacypass.github.io\&quot;&gt;with researchers from Royal Holloway and the University of Waterloo&lt;/a&gt;. Privacy Pass leverages an idea from cryptography — zero-knowledge proofs — to let users prove their identity across multiple sites anonymously without enabling tracking. Users can now use the Privacy Pass browser extension to reduce the number of challenge pages presented by Cloudflare. We are happy to support this protocol and believe that it will help improve the browsing experience for some of the Internet’s least privileged users.&lt;/p&gt;&lt;p&gt;The Privacy Pass extension is available for both &lt;a href=\&quot;https://chrome.google.com/webstore/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi\&quot;&gt;Chrome&lt;/a&gt; and &lt;a href=\&quot;https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/\&quot;&gt;Firefox&lt;/a&gt;. When people use anonymity services or shared IPs, it makes it more difficult for &lt;a href=\&quot;https://www.cloudflare.com/learning/security/how-to-secure-a-website/\&quot;&gt;website protection services&lt;/a&gt; like Cloudflare to identify their requests as coming from legitimate users and not bots. Privacy Pass helps reduce the friction for these users—which include some of the most vulnerable users online—by providing them a way to prove that they are a human across multiple sites on the Cloudflare network. This is done without revealing their identity, and without exposing Cloudflare customers to additional threats from malicious bots. As the first service to support Privacy Pass, we hope to help demonstrate its usefulness and encourage more Internet services to adopt it.&lt;/p&gt;&lt;p&gt;Adding support for Privacy Pass is part of a broader initiative to help make the Internet accessible to as many people as possible. Because Privacy Pass will only be used by a small subset of users, we are also working on other improvements to our network in service of this goal. For example, we are making improvements in our request categorization logic to better identify bots and to improve the web experience for legitimate users who are negatively affected by Cloudflare’s current bot protection algorithms. As this system improves, users should see fewer challenges and site operators should see fewer requests from unwanted bots. We consider Privacy Pass a piece of this puzzle.&lt;/p&gt;&lt;p&gt;Privacy Pass is fully open source under a BSD license and the code is available &lt;a href=\&quot;https://github.com/privacypass/challenge-bypass-extension\&quot;&gt;on GitHub&lt;/a&gt;. We encourage anyone who is interested to download the source code, play around with the implementations and contribute to the project. The Pass Team have also open sourced a &lt;a href=\&quot;https://github.com/privacypass/challenge-bypass-server\&quot;&gt;reference implementation of the server&lt;/a&gt; in Go if you want to test both sides of the system. Privacy Pass support at Cloudflare is currently in beta. If you find a bug, please let the team know by creating an issue on GitHub.&lt;/p&gt;&lt;p&gt;In this blog post I&amp;#39;ll be going into depth about the problems that motivated our support for this project and how you can use it to reduce the annoyance factor of CAPTCHAs and other user challenges online.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;enabling-universal-access-to-content\&quot;&gt;Enabling universal access to content&lt;/h3&gt;\n &lt;a href=\&quot;#enabling-universal-access-to-content\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;Cloudflare believes that the &lt;a href=\&quot;/ensuring-that-the-web-is-for-everyone/\&quot;&gt;web is for everyone&lt;/a&gt;. This includes people who are accessing the web anonymously or through shared infrastructure. Tools like VPNs are useful for protecting your identity online, and people using these tools should have the same access as everyone else. We believe the vast collection of information and services that make up the Internet should be available to every person.&lt;/p&gt;&lt;p&gt;In a &lt;a href=\&quot;/the-trouble-with-tor/\&quot;&gt;blog post last year&lt;/a&gt;, our CEO, Matthew Prince, spoke about the tension between security, anonymity, and convenience on the Internet. He posited that in order to secure a website or service while still allowing anonymous visitors, you have to sacrifice a bit of convenience for these users. This tradeoff is something that every website or web service has to make.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1rTJ4tISNkUI4x5SxAZIWU/3a9ad7898fa4811504aeb44db6b168d2/image5.jpg\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1718\&quot; height=\&quot;1226\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;The Internet is full of bad actors. The frequency and severity of online attacks is &lt;a href=\&quot;http://techspective.net/2017/08/12/latest-ddos-trends-learning-experts/\&quot;&gt;rising every year&lt;/a&gt;. This turbulent environment not only threatens websites and web services with attacks, it threatens their ability to stay online. As smaller and more diverse sites become targets of anonymous threats, a greater percentage of the Internet will choose to sacrifice user convenience in order to stay secure and universally accessible.&lt;/p&gt;&lt;p&gt;The average Internet user visits dozens of sites and services every day. Jumping through a hoop or two when trying to access a single website is not that big of a problem for people. Having to do that for every site you visit every day can be exhausting. This is the problem that Privacy Pass is perfectly designed to solve.&lt;/p&gt;&lt;p&gt;Privacy Pass doesn’t completely eliminate this inconvenience. Matthew’s trilemma still applies: anonymous users are still inconvenienced for sites that want security. What Privacy Pass does is to notably reduce that inconvenience for users with access to a browser. Instead of having to be inconvenienced thirty times to visit thirty different domains, you only have to be inconvenienced once to gain access to thirty domains on the Cloudflare network. Crucially, unlike unauthorized services like &lt;a href=\&quot;https://addons.mozilla.org/firefox/addon/cloudhole/\&quot;&gt;CloudHole&lt;/a&gt;, Privacy Pass is designed to respect user privacy and anonymity. This is done using privacy-preserving cryptography, which prevents Cloudflare or anyone else from tracking a user’s browsing across sites. Before we go into how this works, let’s take a step back and take a look at why this is necessary.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;am-i-a-bot-or-not\&quot;&gt;Am I a bot or not?&lt;/h3&gt;\n &lt;a href=\&quot;#am-i-a-bot-or-not\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n \n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/43zt4JxSv0HW37HA0mfbpj/35736e017d0903dc6c0a89e135635e67/image2.jpg\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1999\&quot; height=\&quot;1500\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;&lt;a href=\&quot;https://commons.wikimedia.org/wiki/File:Metal_House_Battery_Operated_New_2010_Robots_You_are_Three_Times_a_Robot~~.jpg\&quot;&gt;D J Shin&lt;/a&gt; Creative Commons Attribution-Share Alike 3.0 Unported&lt;/p&gt;&lt;p&gt;Without explicit information about the identity of a user, a web server has to rely on fuzzy signals to guess which request is from a bot and which is from a human. For example, bots often use automated scripts instead of web browsers to do their crawling. The way in which scripts make web requests is often different than how web browsers would make the same request in subtle ways.&lt;/p&gt;&lt;p&gt;A simple way for a user to prove they are not a bot to a website is by logging in. By providing valid authentication credentials tied to a long-term identity, a user is exchanging their anonymity for convenience. Having valid authentication credentials is a strong signal that a request is not from a bot. Typically, if you authenticate yourself to a website (say by entering your username and password) the website sets what’s called a “cookie”. A cookie is just a piece of data with an expiration date that’s stored by the browser. As long as the cookie hasn’t expired, the browser includes it as part of the subsequent requests to the server that set it. Authentication cookies are what websites use to know whether you’re logged in or not. Cookies are only sent on the domain that set them. A cookie set by site1.com is not sent for requests to site2.com. This prevents identity leakage from one site to another.&lt;/p&gt;&lt;p&gt;A request with an authentication cookie is usually not from a bot, so bot detection is much easier for sites that require authentication. Authentication is by definition de-anonymizing, so putting this in terms of Matthew’s trilemma, these sites can have security and convenience because they provide no anonymous access. The web would be a very different place if every website required authentication to display content, so this signal can only be used for a small set of sites. The question for the rest of the Internet becomes: without authentication cookies, what else can be used as a signal that a user is a person and not a bot?&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;the-turing-test\&quot;&gt;The Turing Test&lt;/h3&gt;\n &lt;a href=\&quot;#the-turing-test\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;One thing that can be used is a user challenge: a task that the server asks the user to do before showing content. User challenges can come in many forms, from a &lt;a href=\&quot;https://en.wikipedia.org/wiki/Proof-of-work_system\&quot;&gt;proof-of-work&lt;/a&gt; to a &lt;a href=\&quot;https://en.wikipedia.org/w/index.php?title=Guided_tour_puzzle_protocol\&quot;&gt;guided tour puzzle&lt;/a&gt; to the classic CAPTCHA. A CAPTCHA (an acronym for &amp;quot;Completely Automated Public Turing test to tell Computers and Humans Apart&amp;quot;) is a test to see if the user is a human or not. It often involves reading some scrambled letters or identifying certain slightly obscured objects — tasks that humans are generally better at than automated programs. The goal of a user challenge is not only to deter bots, but to gain confidence that a visitor is a person. Cloudflare uses a combination of different techniques as user challenges.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2VcN8gtQWsULtIcGMggqDJ/c51be6c6bb97edf8836d04b2542a4f63/image7.jpg\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;300\&quot; height=\&quot;57\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;CAPTCHAs can be annoying and time-consuming to solve, so they are usually reserved for visitors with a high probability of being malicious.&lt;/p&gt;&lt;p&gt;The challenge system Cloudflare uses is cookie-based. If you solve a challenge correctly, Cloudflare will set a cookie called &lt;code&gt;CF_CLEARANCE&lt;/code&gt; for the domain that presented the challenge. Clearance cookies are like authentication cookies, but instead of being tied to an identity, they are tied to the fact that you solved a challenge sometime in the past.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Person sends Request&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Server responds with a challenge&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Person sends solution&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Server responds with &lt;code&gt;set-cookie&lt;/code&gt; and bypass cookie&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Person sends new request with cookie&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Server responds with content from origin&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Site visitors who are able to solve a challenge are much more likely to be people than bots, the harder the challenge, the more likely the visitor is a person. The presence of a valid &lt;code&gt;CF_CLEARANCE&lt;/code&gt; cookie is a strong positive signal that a request is from a legitimate person.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;how-privacy-pass-protects-your-privacy-a-voting-analogy\&quot;&gt;How Privacy Pass protects your privacy: a voting analogy&lt;/h3&gt;\n &lt;a href=\&quot;#how-privacy-pass-protects-your-privacy-a-voting-analogy\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;You can use cryptography to prove that you have solved a challenge of a certain difficulty without revealing which challenge you solved. The technique that enables this is something called a &lt;a href=\&quot;https://en.wikipedia.org/wiki/Zero-knowledge_proof\&quot;&gt;Zero-knowledge proof&lt;/a&gt;. This may sound scary, so let’s use a real-world scenario, vote certification, to explain the idea.&lt;/p&gt;&lt;p&gt;In some voting systems the operators of the voting center certify every ballot before sending them to be counted. This is to prevent people from adding fraudulent ballots while the ballots are being transferred from where the vote takes place to where the vote is counted.&lt;/p&gt;&lt;p&gt;An obvious mechanism would be to have the certifier sign every ballot that a voter submits. However, this would mean that the certifier, having just seen the person that handed them a ballot, would know how each person voted. Instead, we can use a better mechanism that preserves voters’ privacy using an envelope and some carbon paper.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;The voter fills out their ballot&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3jJCdqzHAp2kJrLYM3sYCT/5cfc32ff560877037977e7530faf1929/image6.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1042\&quot; height=\&quot;730\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The voter puts their ballot into an envelope along with a piece of carbon paper, and seals the envelope&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7z8pR9zhr9HYM4OE9y2r4f/26fc8bcb4a1e4c92637cfc5b0f6ea0fb/image1.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1042\&quot; height=\&quot;730\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The sealed envelope is given to the certifier&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3OhNebQdBXnoTBrBOTcDN9/54ad9db17b0956adc0a973f9a4d56b6b/image3.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1043\&quot; height=\&quot;730\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The certifier signs the outside of the envelope. The pressure of the signature transfers the signature from the carbon paper to the ballot itself, effectively signing the ballot.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/fOvx6CrNvdsaPofVLPgPG/c33497b10a9212634b63c0bb349809dc/image8.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1043\&quot; height=\&quot;730\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Later, when the ballot counter unseals the envelope, they see the certifier’s signature on the ballot.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4FSldNuKdhhv537vDigZtp/c35bd412ad8c468d9b2068149afef072/image4.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1042\&quot; height=\&quot;730\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;With this system, a voting administrator can authenticate a ballot without knowing its content, and then the ballot can be verified by an independent assessor.&lt;/p&gt;&lt;p&gt;Privacy Pass is like vote certification for the Internet. In this analogy, Cloudflare’s challenge checking service is the vote certifier, Cloudflare’s bot detection service is the vote counter and the anonymous visitor is the voter. When a user encounters a challenge on site A, they put a ballot into a sealed envelope and send it to the server along with the challenge solution. The server then signs the envelope and returns it to the client. Since the server is effectively signing the ballot without knowing its contents, this is called a &lt;i&gt;blind signature&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;When the user sees a challenge on site B, the user takes the ballot out of the envelope and sends it to the server. The server then checks the signature on the ballot, which proves that the user has solved a challenge. Because the server has never seen the contents of the ballot, it doesn’t know which site the challenge was solved for, just that a challenge was solved.&lt;/p&gt;&lt;p&gt;It turns out that with the right cryptographic construction, you can approximate this scenario digitally. This is the idea behind Privacy Pass.&lt;/p&gt;&lt;p&gt;The Privacy Pass team implemented this using a privacy-preserving cryptographic construction called an Elliptic Curve Verifiable Oblivious Pseudo-Random Function (EC-VOPRF). Yes, it’s a mouthful. From the Privacy Pass Team:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Every time the Privacy Pass plugin needs a new set of privacy passes, it creates a set of thirty random numbers &lt;code&gt;t1&lt;/code&gt; to &lt;code&gt;t30&lt;/code&gt;, hashes them into a curve (P-256 in our case), blinds them with a value &lt;code&gt;b&lt;/code&gt; and sends them along with a challenge solution. The server returns the set of points multiplied by its private key and a batch discrete logarithm equivalence proof. Each pair &lt;code&gt;tn, HMAC(n,M)&lt;/code&gt; constitutes a Privacy Pass and can be redeemed to solve a subsequent challenge. Voila!&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;If none of these words make sense to you and you want to know more, check out the Privacy Pass team’s [protocol design document](&lt;a href=\&quot;https://privacypass.github.io/protocol/\&quot;&gt;https://privacypass.github.io/protocol/&lt;/a&gt;).&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;making-it-work-in-the-browser\&quot;&gt;Making it work in the browser&lt;/h3&gt;\n &lt;a href=\&quot;#making-it-work-in-the-browser\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;It takes more than a nice security protocol based on solid cryptography to make something useful in the real world. To bring the advantages of this protocol to users, the Privacy Pass team built a client in JavaScript and packaged it using &lt;a href=\&quot;https://developer.mozilla.org/en-US/Add-ons/WebExtensions/What_are_WebExtensions\&quot;&gt;WebExtensions&lt;/a&gt;, a cross-browser framework for developing applications that run in the browser and modify website behavior. This standard is compatible with both Chrome and Firefox. A reference implementation of the server side of the protocol was &lt;a href=\&quot;https://github.com/privacypass/challenge-bypass-server\&quot;&gt;also implemented in Go&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you’re a web user and are annoyed by CAPTCHAs, you can download the Privacy Pass extension for Chrome &lt;a href=\&quot;https://chrome.google.com/webstore/detail/privacy-pass/ajhmfdgkijocedmfjonnpjfojldioehi\&quot;&gt;here&lt;/a&gt; and for Firefox &lt;a href=\&quot;https://addons.mozilla.org/en-US/firefox/addon/privacy-pass/\&quot;&gt;here&lt;/a&gt;. It will significantly improve your web browsing experience. Once it is installed, you’ll see a small icon on your browser with a number under it. The number is how many unused privacy passes you have. If you are running low on passes, simply click on the icon and select “Get More Passes,” which will load a CAPTCHA you can solve in exchange for thirty passes. Every time you visit a domain that requires a user challenge page to view, Privacy Pass will “spend” a pass and the content will load transparently. Note that you may see more than one pass spent up when you load a site for the first time if the site has subresources from multiple domains.&lt;/p&gt;\n &lt;figure class=\&quot;kg-card kg-image-card \&quot;&gt;\n \n &lt;Image src=\&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/23gnEcti3z4owPHwH37m6o/09b9335b07c60d4e20b2510159f83440/Firefox-3--2-.png\&quot; alt=\&quot;\&quot; class=\&quot;kg-image\&quot; width=\&quot;1280\&quot; height=\&quot;800\&quot; loading=\&quot;lazy\&quot;/&gt;\n \n &lt;/figure&gt;&lt;p&gt;The Privacy Pass extension works by hooking into the browser and looking for HTTP responses that have a specific header that indicates support for the Privacy Pass protocol. When a challenge page is returned, the extension will either try to issue new privacy passes or redeem existing privacy passes. The cryptographic operations in the plugin were built on top of &lt;a href=\&quot;https://github.com/bitwiseshiftleft/sjcl\&quot;&gt;SJCL&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you’re a Cloudflare customer and want to opt out from supporting Privacy Pass, please &lt;a href=\&quot;https://support.cloudflare.com\&quot;&gt;contact our support team&lt;/a&gt; and they will disable it for you. We are soon adding a toggle for Privacy Pass in the Firewall app in the Cloudflare dashboard.&lt;/p&gt;\n &lt;div class=\&quot;flex anchor relative\&quot;&gt;\n &lt;h3 id=\&quot;the-web-is-for-everyone\&quot;&gt;The web is for everyone&lt;/h3&gt;\n &lt;a href=\&quot;#the-web-is-for-everyone\&quot; aria-hidden=\&quot;true\&quot; class=\&quot;relative sm:absolute sm:-left-5\&quot;&gt;\n &lt;svg width=\&quot;16\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 24 24\&quot;&gt;&lt;path fill=\&quot;currentcolor\&quot; d=\&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\&quot;&gt;&lt;/path&gt;&lt;/svg&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n &lt;p&gt;The technology behind Privacy Pass is free for anyone to use. We see a bright future for this technology and think it will benefit from community involvement. The protocol is currently only deployed at Cloudflare, but it could easily be used across different organizations. It’s easy to imagine obtaining a Privacy Pass that proves that you have a Twitter or Facebook identity and using it to access other services on the Internet without revealing your identity, for example. There are a wide variety of applications of this technology that extend well beyond our current use cases.&lt;/p&gt;&lt;p&gt;If this technology is intriguing to you and you want to collaborate, please reach out to the Privacy Pass team on &lt;a href=\&quot;https://github.com/privacypass\&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&quot;],&quot;published_at&quot;:[0,&quot;2017-11-09T16:00:00.000+00:00&quot;],&quot;updated_at&quot;:[0,&quot;2024-10-10T00:42:11.701Z&quot;],&quot;feature_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5Q9x8oXuoqqS5PV6rsYOBm/cf4adf16d3d2c75555d5bb6eef5405ce/cloudflare-supports-privacy-pass.png&quot;],&quot;tags&quot;:[1,[[0,{&quot;id&quot;:[0,&quot;3BWeMuiOShelE7QM48sW9j&quot;],&quot;name&quot;:[0,&quot;Privacy&quot;],&quot;slug&quot;:[0,&quot;privacy&quot;]}],[0,{&quot;id&quot;:[0,&quot;11uq7RpwEtvy8Ic53C6cMR&quot;],&quot;name&quot;:[0,&quot;CAPTCHA&quot;],&quot;slug&quot;:[0,&quot;captcha&quot;]}],[0,{&quot;id&quot;:[0,&quot;3ZtL0yV0R4ScAreV1dTfIY&quot;],&quot;name&quot;:[0,&quot;Privacy Pass&quot;],&quot;slug&quot;:[0,&quot;privacy-pass&quot;]}],[0,{&quot;id&quot;:[0,&quot;kn8Lmy4luvCeAabblVvHH&quot;],&quot;name&quot;:[0,&quot;Firefox&quot;],&quot;slug&quot;:[0,&quot;firefox&quot;]}],[0,{&quot;id&quot;:[0,&quot;3skwJ34K0c3CEY1cNogR4n&quot;],&quot;name&quot;:[0,&quot;Chrome&quot;],&quot;slug&quot;:[0,&quot;chrome&quot;]}],[0,{&quot;id&quot;:[0,&quot;1x7tpPmKIUCt19EDgM1Tsl&quot;],&quot;name&quot;:[0,&quot;Research&quot;],&quot;slug&quot;:[0,&quot;research&quot;]}],[0,{&quot;id&quot;:[0,&quot;1QsJUMpv0QBSLiVZLLQJ3V&quot;],&quot;name&quot;:[0,&quot;Cryptography&quot;],&quot;slug&quot;:[0,&quot;cryptography&quot;]}]]],&quot;relatedTags&quot;:[0],&quot;authors&quot;:[1,[[0,{&quot;name&quot;:[0,&quot;Nick Sullivan&quot;],&quot;slug&quot;:[0,&quot;nick-sullivan&quot;],&quot;bio&quot;:[0,&quot;Nick Sullivan was Head of Research (&amp; Cryptography) at Cloudflare until 2023. He is passionate about improving security and privacy through cutting-edge research and the development of open standards.&quot;],&quot;profile_image&quot;:[0,&quot;https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1awsFzXodRY6h5BEcWKcCE/790c21d068aea9d2fd26497f095abdc5/nick-sullivan.jpg&quot;],&quot;location&quot;:[0,&quot;San Francisco&quot;],&quot;website&quot;:[0,&quot;https://crypto.dance&quot;],&quot;twitter&quot;:[0,&quot;@grittygrease&quot;],&quot;facebook&quot;:[0,null]}]]],&quot;meta_description&quot;:[0,null],&quot;primary_author&quot;:[0,{}],&quot;localeList&quot;:[0,{&quot;name&quot;:[0,&quot;Cloudflare supports Privacy Pass Config&quot;],&quot;enUS&quot;:[0,&quot;English for Locale&quot;],&quot;zhCN&quot;:[0,&quot;No Page for Locale&quot;],&quot;zhHansCN&quot;:[0,&quot;No Page for Locale&quot;],&quot;zhTW&quot;:[0,&quot;No Page for Locale&quot;],&quot;frFR&quot;:[0,&quot;No Page for Locale&quot;],&quot;deDE&quot;:[0,&quot;No Page for Locale&quot;],&quot;itIT&quot;:[0,&quot;No Page for Locale&quot;],&quot;jaJP&quot;:[0,&quot;No Page for Locale&quot;],&quot;koKR&quot;:[0,&quot;No Page for Locale&quot;],&quot;ptBR&quot;:[0,&quot;No Page for Locale&quot;],&quot;esLA&quot;:[0,&quot;No Page for Locale&quot;],&quot;esES&quot;:[0,&quot;No Page for Locale&quot;],&quot;enAU&quot;:[0,&quot;No Page for Locale&quot;],&quot;enCA&quot;:[0,&quot;No Page for Locale&quot;],&quot;enIN&quot;:[0,&quot;No Page for Locale&quot;],&quot;enGB&quot;:[0,&quot;No Page for Locale&quot;],&quot;idID&quot;:[0,&quot;No Page for Locale&quot;],&quot;ruRU&quot;:[0,&quot;No Page for Locale&quot;],&quot;svSE&quot;:[0,&quot;No Page for Locale&quot;],&quot;viVN&quot;:[0,&quot;No Page for Locale&quot;],&quot;plPL&quot;:[0,&quot;No Page for Locale&quot;],&quot;arAR&quot;:[0,&quot;No Page for Locale&quot;],&quot;nlNL&quot;:[0,&quot;No Page for Locale&quot;],&quot;thTH&quot;:[0,&quot;No Page for Locale&quot;],&quot;trTR&quot;:[0,&quot;No Page for Locale&quot;],&quot;heIL&quot;:[0,&quot;No Page for Locale&quot;],&quot;lvLV&quot;:[0,&quot;No Page for Locale&quot;],&quot;etEE&quot;:[0,&quot;No Page for Locale&quot;],&quot;ltLT&quot;:[0,&quot;No Page for Locale&quot;]}],&quot;url&quot;:[0,&quot;https://blog.cloudflare.com/cloudflare-supports-privacy-pass&quot;],&quot;metadata&quot;:[0,{&quot;title&quot;:[0],&quot;description&quot;:[0],&quot;imgPreview&quot;:[0,&quot;&quot;]}]}]]],&quot;translations&quot;:[0,{&quot;posts.by&quot;:[0,&quot;By&quot;],&quot;footer.gdpr&quot;:[0,&quot;GDPR&quot;],&quot;lang_blurb1&quot;:[0,&quot;This post is also available in {lang1}.&quot;],&quot;lang_blurb2&quot;:[0,&quot;This post is also available in {lang1} and {lang2}.&quot;],&quot;lang_blurb3&quot;:[0,&quot;This post is also available in {lang1}, {lang2} and {lang3}.&quot;],&quot;footer.press&quot;:[0,&quot;Press&quot;],&quot;header.title&quot;:[0,&quot;The Cloudflare Blog&quot;],&quot;search.clear&quot;:[0,&quot;Clear&quot;],&quot;search.filter&quot;:[0,&quot;Filter&quot;],&quot;search.source&quot;:[0,&quot;Source&quot;],&quot;footer.careers&quot;:[0,&quot;Careers&quot;],&quot;footer.company&quot;:[0,&quot;Company&quot;],&quot;footer.support&quot;:[0,&quot;Support&quot;],&quot;footer.the_net&quot;:[0,&quot;theNet&quot;],&quot;search.filters&quot;:[0,&quot;Filters&quot;],&quot;footer.our_team&quot;:[0,&quot;Our team&quot;],&quot;footer.webinars&quot;:[0,&quot;Webinars&quot;],&quot;page.more_posts&quot;:[0,&quot;More posts&quot;],&quot;posts.time_read&quot;:[0,&quot;{time} min read&quot;],&quot;search.language&quot;:[0,&quot;Language&quot;],&quot;footer.community&quot;:[0,&quot;Community&quot;],&quot;footer.resources&quot;:[0,&quot;Resources&quot;],&quot;footer.solutions&quot;:[0,&quot;Solutions&quot;],&quot;footer.trademark&quot;:[0,&quot;Trademark&quot;],&quot;header.subscribe&quot;:[0,&quot;Subscribe&quot;],&quot;footer.compliance&quot;:[0,&quot;Compliance&quot;],&quot;footer.free_plans&quot;:[0,&quot;Free plans&quot;],&quot;footer.impact_ESG&quot;:[0,&quot;Impact/ESG&quot;],&quot;posts.follow_on_X&quot;:[0,&quot;Follow on X&quot;],&quot;footer.help_center&quot;:[0,&quot;Help center&quot;],&quot;footer.network_map&quot;:[0,&quot;Network Map&quot;],&quot;header.please_wait&quot;:[0,&quot;Please Wait&quot;],&quot;page.related_posts&quot;:[0,&quot;Related posts&quot;],&quot;search.result_stat&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt; for &lt;strong&gt;{search_keyword}&lt;/strong&gt;&quot;],&quot;footer.case_studies&quot;:[0,&quot;Case Studies&quot;],&quot;footer.connect_2024&quot;:[0,&quot;Connect 2024&quot;],&quot;footer.terms_of_use&quot;:[0,&quot;Terms of Use&quot;],&quot;footer.white_papers&quot;:[0,&quot;White Papers&quot;],&quot;footer.cloudflare_tv&quot;:[0,&quot;Cloudflare TV&quot;],&quot;footer.community_hub&quot;:[0,&quot;Community Hub&quot;],&quot;footer.compare_plans&quot;:[0,&quot;Compare plans&quot;],&quot;footer.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.contact_sales&quot;:[0,&quot;Contact Sales&quot;],&quot;header.email_address&quot;:[0,&quot;Email Address&quot;],&quot;page.error.not_found&quot;:[0,&quot;Page not found&quot;],&quot;footer.developer_docs&quot;:[0,&quot;Developer docs&quot;],&quot;footer.privacy_policy&quot;:[0,&quot;Privacy Policy&quot;],&quot;footer.request_a_demo&quot;:[0,&quot;Request a demo&quot;],&quot;page.continue_reading&quot;:[0,&quot;Continue reading&quot;],&quot;footer.analysts_report&quot;:[0,&quot;Analyst reports&quot;],&quot;footer.for_enterprises&quot;:[0,&quot;For enterprises&quot;],&quot;footer.getting_started&quot;:[0,&quot;Getting Started&quot;],&quot;footer.learning_center&quot;:[0,&quot;Learning Center&quot;],&quot;footer.project_galileo&quot;:[0,&quot;Project Galileo&quot;],&quot;pagination.newer_posts&quot;:[0,&quot;Newer Posts&quot;],&quot;pagination.older_posts&quot;:[0,&quot;Older Posts&quot;],&quot;posts.social_buttons.x&quot;:[0,&quot;Discuss on X&quot;],&quot;search.icon_aria_label&quot;:[0,&quot;Search&quot;],&quot;search.source_location&quot;:[0,&quot;Source/Location&quot;],&quot;footer.about_cloudflare&quot;:[0,&quot;About Cloudflare&quot;],&quot;footer.athenian_project&quot;:[0,&quot;Athenian Project&quot;],&quot;footer.become_a_partner&quot;:[0,&quot;Become a partner&quot;],&quot;footer.cloudflare_radar&quot;:[0,&quot;Cloudflare Radar&quot;],&quot;footer.network_services&quot;:[0,&quot;Network services&quot;],&quot;footer.trust_and_safety&quot;:[0,&quot;Trust &amp; Safety&quot;],&quot;header.get_started_free&quot;:[0,&quot;Get Started Free&quot;],&quot;page.search.placeholder&quot;:[0,&quot;Search Cloudflare&quot;],&quot;footer.cloudflare_status&quot;:[0,&quot;Cloudflare Status&quot;],&quot;footer.cookie_preference&quot;:[0,&quot;Cookie Preferences&quot;],&quot;header.valid_email_error&quot;:[0,&quot;Must be valid email.&quot;],&quot;search.result_stat_empty&quot;:[0,&quot;Results &lt;strong&gt;{search_range}&lt;/strong&gt; of &lt;strong&gt;{search_total}&lt;/strong&gt;&quot;],&quot;footer.connectivity_cloud&quot;:[0,&quot;Connectivity cloud&quot;],&quot;footer.developer_services&quot;:[0,&quot;Developer services&quot;],&quot;footer.investor_relations&quot;:[0,&quot;Investor relations&quot;],&quot;page.not_found.error_code&quot;:[0,&quot;Error Code: 404&quot;],&quot;search.autocomplete_title&quot;:[0,&quot;Insert a query. Press enter to send&quot;],&quot;footer.logos_and_press_kit&quot;:[0,&quot;Logos &amp; press kit&quot;],&quot;footer.application_services&quot;:[0,&quot;Application services&quot;],&quot;footer.get_a_recommendation&quot;:[0,&quot;Get a recommendation&quot;],&quot;posts.social_buttons.reddit&quot;:[0,&quot;Discuss on Reddit&quot;],&quot;footer.sse_and_sase_services&quot;:[0,&quot;SSE and SASE services&quot;],&quot;page.not_found.outdated_link&quot;:[0,&quot;You may have used an outdated link, or you may have typed the address incorrectly.&quot;],&quot;footer.report_security_issues&quot;:[0,&quot;Report Security Issues&quot;],&quot;page.error.error_message_page&quot;:[0,&quot;Sorry, we can&#39;t find the page you are looking for.&quot;],&quot;header.subscribe_notifications&quot;:[0,&quot;Subscribe to receive notifications of new posts:&quot;],&quot;footer.cloudflare_for_campaigns&quot;:[0,&quot;Cloudflare for Campaigns&quot;],&quot;header.subscription_confimation&quot;:[0,&quot;Subscription confirmed. Thank you for subscribing!&quot;],&quot;posts.social_buttons.hackernews&quot;:[0,&quot;Discuss on Hacker News&quot;],&quot;footer.diversity_equity_inclusion&quot;:[0,&quot;Diversity, equity &amp; inclusion&quot;],&quot;footer.critical_infrastructure_defense_project&quot;:[0,&quot;Critical Infrastructure Defense Project&quot;]}]}" ssr client="load" opts="{&quot;name&quot;:&quot;MorePosts&quot;,&quot;value&quot;:true}" await-children><div class="w-100 bt-l b--gray8"><h3 data-testid="more-posts-title" class="orange fw5 f4 ph3 mt4">MORE POSTS</h3></div><article data-testid="more-posts-article" class="w-100 w-100-m ph3 mb4"><p class="f3 fw5 gray1" data-iso-date="2017-11-09T16:05:00.000+00:00">November 09, 2017 4:05 PM</p><a href="/privacy-pass-the-math/" class="no-underline gray1 f4 fw5"><h6 class="gray1 f4 fw5 mt2">Privacy Pass - “The Math”</h6></a><p class="gray1 lh-copy">During a recent internship at Cloudflare, I had the chance to help integrate support for improving the accessibility of websites that are protected by the Cloudflare edge network. <!-- -->...</p><ul class="flex pl0 fw6 f2"><span>By<!-- --> </span><li class="list flex items-center"><div class="author-name-tooltip"><a href="/author/alex-davidson/" class="fw5 f2 black no-underline">Alex Davidson</a></div></li></ul><div class="flex flex-row flex-wrap"><div><a href="/tag/privacy-pass/" class="no-underline f1 fw2 blue3 underline-hover">Privacy Pass</a></div><div><span class="f1 fw2 blue3 no-underline underline-hover">, </span><a href="/tag/security/" class="no-underline f1 fw2 blue3 underline-hover">Security</a></div><div><span class="f1 fw2 blue3 no-underline underline-hover">, </span><a href="/tag/captcha/" class="no-underline f1 fw2 blue3 underline-hover">CAPTCHA</a></div><div><span class="f1 fw2 blue3 no-underline underline-hover">, </span><a href="/tag/chrome/" class="no-underline f1 fw2 blue3 underline-hover">Chrome</a></div><div><span class="f1 fw2 blue3 no-underline underline-hover">, </span><a href="/tag/firefox/" class="no-underline f1 fw2 blue3 underline-hover">Firefox</a></div></div></article><article data-testid="more-posts-article" class="w-100 w-100-m ph3 mb4"><p class="f3 fw5 gray1" data-iso-date="2017-11-09T16:00:00.000+00:00">November 09, 2017 4:00 PM</p><a href="/cloudflare-supports-privacy-pass/" class="no-underline gray1 f4 fw5"><h6 class="gray1 f4 fw5 mt2">Cloudflare supports Privacy Pass</h6></a><p class="gray1 lh-copy">Cloudflare supports Privacy Pass, a recently-announced privacy-preserving protocol developed in collaboration with researchers from Royal Holloway and the University of Waterloo. <!-- -->...</p><ul class="flex pl0 fw6 f2"><span>By<!-- --> </span><li class="list flex items-center"><div class="author-name-tooltip"><a href="/author/nick-sullivan/" class="fw5 f2 black no-underline">Nick Sullivan</a></div></li></ul><div class="flex flex-row flex-wrap"><div><a href="/tag/privacy/" class="no-underline f1 fw2 blue3 underline-hover">Privacy</a></div><div><span class="f1 fw2 blue3 no-underline underline-hover">, </span><a href="/tag/captcha/" class="no-underline f1 fw2 blue3 underline-hover">CAPTCHA</a></div><div><span class="f1 fw2 blue3 no-underline underline-hover">, </span><a href="/tag/privacy-pass/" class="no-underline f1 fw2 blue3 underline-hover">Privacy Pass</a></div><div><span class="f1 fw2 blue3 no-underline underline-hover">, </span><a href="/tag/firefox/" class="no-underline f1 fw2 blue3 underline-hover">Firefox</a></div><div><span class="f1 fw2 blue3 no-underline underline-hover">, </span><a href="/tag/chrome/" class="no-underline f1 fw2 blue3 underline-hover">Chrome</a></div></div></article><!--astro:end--></astro-island> <div class="pagination mw-100 center mv5 ph3 w-100 tc"><div class="center w-50-l w-100"><div class="flex items-center justify-center justify-around-m "><ul class="flex list ml3" style="padding-inline-start:inherit"><li class="gray"><a class="no-underline underline-hover dib-m dib-l mr1 gray3 " href="/tag/privacy-pass/">1</a></li></ul></div></div></div> </main> <footer class="pt4 pb4 pl1 pr1 main-footer"><div class="mw8 center dn db-l ph3"><div class="flex flex-row justify-between"><div class="main-footer__menu-group"><ul id="getting-started-menu" class="list pl0"><li class="pt1 pb1 f1 main-footer__menu-group__header js-toggle-footer-group" data-submenu="getting-started-menu">Getting Started<i class="icon-caret-down"></i></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/plans/free/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="free-plans" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Free plans</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/enterprise/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="enterprise" class="f1 blue3 no-underline underline-hover" rel="noreferrer">For enterprises</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/plans/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="compare-plans" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Compare plans</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/about-your-website/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="get-a-recommendation" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Get a recommendation</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/plans/enterprise/demo/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="request-a-demo" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Request a demo</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/plans/enterprise/contact/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="contact-sales" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Contact Sales</a></li></ul></div><div class="main-footer__menu-group"><ul id="company-menu" class="list pl0"><li class="pt1 pb1 f1" data-submenu="company-menu">Resources<i class="icon-caret-down"></i></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/learning/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="learning-center" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Learning Center</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/analysts/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="analysts-report" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Analyst reports</a></li><li class="pt1 pb1"><a href="https://radar.cloudflare.com/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="overview" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Cloudflare Radar</a></li><li class="pt1 pb1"><a href="https://cloudflare.tv/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="tv" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Cloudflare TV</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/case-studies/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="case-studies" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Case Studies</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/resource-hub/?resourcetype=Webinar" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="webinars" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Webinars</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/resource-hub/?resourcetype=Whitepaper" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="white-papers" class="f1 blue3 no-underline underline-hover" rel="noreferrer">White Papers</a></li><li class="pt1 pb1"><a href="https://developers.cloudflare.com" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="developer-docs" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Developer docs</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/the-net/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="theNet" class="f1 blue3 no-underline underline-hover" rel="noreferrer">theNet</a></li></ul></div><div class="main-footer__menu-group"><ul id="sales-menu" class="list pl0"><li class="pt1 pb1 f1 main-footer__menu-group__header js-toggle-footer-group" data-submenu="sales-menu">Solutions<i class="icon-caret-down"></i></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/connectivity-cloud/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="connectivity-cloud" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Connectivity cloud</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/zero-trust/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="zero-trust" class="f1 blue3 no-underline underline-hover" rel="noreferrer">SSE and SASE services</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/application-services/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="application-services" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Application services</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/network-services/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="network-services" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Network services</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/developer-platform/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="developer-services" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Developer services</a></li></ul></div><div class="main-footer__menu-group"><ul id="community-menu" class="list pl0"><li class="pt1 pb1 f1 main-footer__menu-group__header js-toggle-footer-group" data-submenu="community-menu">Community<i class="icon-caret-down"></i></li><li class="pt1 pb1"><a href="https://community.cloudflare.com" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="community_hub" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Community Hub</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/galileo/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="galileo" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Project Galileo</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/athenian/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="athenian" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Athenian Project</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/campaigns/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="cloudflare-for-campaigns" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Cloudflare for Campaigns</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/partners/technology-partners/cidp/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="critical-infrastructure-defense-project" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Critical Infrastructure Defense Project</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/connect2024/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="connect-2024" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Connect 2024</a></li></ul></div><div class="main-footer__menu-group"><ul id="support-menu" class="list pl0"><li class="pt1 pb1 f1 main-footer__menu-group__header js-toggle-footer-group" data-submenu="support-menu">Support<i class="icon-caret-down"></i></li><li class="pt1 pb1"><a href="https://support.cloudflare.com" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="help-center" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Help center</a></li><li class="pt1 pb1"><a href="https://www.cloudflarestatus.com" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="status" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Cloudflare Status</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/compliance/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="compliance" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Compliance</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/gdpr/introduction/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="gdpr" class="f1 blue3 no-underline underline-hover" rel="noreferrer">GDPR</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/trust-hub/abuse-approach/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="trust-and-safety" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Trust &amp; Safety</a></li></ul></div><div class="main-footer__menu-group"><ul id="company-menu" class="list pl0"><li class="pt1 pb1 f1 main-footer__menu-group__header js-toggle-footer-group" data-submenu="company-menu">Company<i class="icon-caret-down"></i></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/about-overview/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="overview" class="f1 blue3 no-underline underline-hover" rel="noreferrer">About Cloudflare</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/people/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="our_team" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Our team</a></li><li class="pt1 pb1"><a href="https://cloudflare.net/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="investor-relations" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Investor relations</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/press/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="press" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Press</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/careers/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="careers" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Careers</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/diversity-equity-and-inclusion/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="diversity-equity-inclusion" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Diversity, equity &amp; inclusion</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/impact/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="impact-ESG" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Impact/ESG</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/network/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="network_map" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Network Map</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/press-kit/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="press-kit" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Logos &amp; press kit</a></li><li class="pt1 pb1"><a href="https://www.cloudflare.com/partners/" target="_blank" data-tracking-category="footer" data-tracking-action="click" data-tracking-label="partners" class="f1 blue3 no-underline underline-hover" rel="noreferrer">Become a partner</a></li></ul></div></div></div><div class="mw8 center ph3"><div class="flex flex-row flex-wrap justify-center md:justify-between items-center pt4"><div class="flex flex-row space-x-4 items-start w-25-l pb4 pb0-l"><a target="_blank" rel="noreferrer" href="https://www.facebook.com/Cloudflare/" class="w-8"><img class="w-8" src="https://www.cloudflare.com/img/footer/facebook.svg" alt="facebook"/></a><a target=" _blank" rel="noreferrer" href="https://x.com/Cloudflare" class="w-8"><img class="w-8" src="https://www.cloudflare.com/img/footer/twitter.svg" alt="X"/></a><a target="_blank" rel="noreferrer" href="https://www.linkedin.com/company/cloudflare" class="w-8"><img class="w-8" src="https://www.cloudflare.com/img/footer/linkedin.svg" alt="linkedin"/></a><a target="_blank" rel="noreferrer" href="https://www.youtube.com/cloudflare" class="w-8"><img class="w-8" src="https://www.cloudflare.com/img/footer/youtube.svg" alt="youtube"/></a><a target="_blank" rel="noreferrer" href="https://www.instagram.com/cloudflare" class="w-8"><img class="w-8" src="https://www.cloudflare.com/img/footer/instagram.svg" alt="instagram"/></a></div><div class="w-70-l tr-l tl-ns"><div><span class="main-footer__copyright f1">© <!-- -->2025<!-- --> Cloudflare, Inc.<!-- --> </span><span class="main-footer__copyright f1">|</span><a href="https://www.cloudflare.com/privacypolicy/" target="_blank" class="main-footer__copyright f1 no-underline underline-hover" rel="noreferrer"> <!-- -->Privacy Policy<!-- --> </a><span class="main-footer__copyright f1">|</span><a href="https://www.cloudflare.com/website-terms/" target="_blank" class="main-footer__copyright f1 no-underline underline-hover" rel="noreferrer"> <!-- -->Terms of Use<!-- --> </a><span class="main-footer__copyright f1">|</span><a href="https://www.cloudflare.com/disclosure/" target="_blank" class="main-footer__copyright f1 no-underline underline-hover" rel="noreferrer"> <!-- -->Report Security Issues<!-- --> </a><span class="main-footer__copyright f1">|</span><img class="mw2 ph1" src="/images/privacy-options.svg" alt="Privacy Options"/><a href="#cookie-settings" id="ot-sdk-btn" class="ot-sdk-show-settings main-footer__copyright f1 no-underline underline-hover"><span class="brandGray5">Cookie Preferences</span> </a><span class="main-footer__copyright f1">|</span><a href="https://www.cloudflare.com/trademark/" target="_blank" class="main-footer__copyright f1 no-underline underline-hover" rel="noreferrer"> <!-- -->Trademark<!-- --> </a></div></div></div></div></footer></html>

Pages: 1 2 3 4 5 6 7 8 9 10