all-in-one privacy solution":["Proton Unlimited ist eine All-in-One-Datenschutzlösung"],"Black Friday":["Black Friday"],"No ads. Privacy by default.":["Keine Werbung. Privatsphäre als Standard."],"People before profits":["Menschen sind uns wichtiger als Gewinne"],"Security through transparency":["Sicherheit durch Transparenz"],"The best Proton Mail ${ BLACK_FRIDAY } deals":["Die besten Proton Mail-Angebote zum ${ BLACK_FRIDAY }"],"The world’s only community- supported email service":["Der weltweit einzige von der Community unterstützte E-Mail-Dienst"]},"specialoffer:limited":{"${ hours } hour":["${ hours } Stunde","${ hours } Stunden"],"${ hoursLeft }, ${ minutesLeft } and ${ secondsLeft } left":["Nur noch ${ hoursLeft }, ${ minutesLeft } und ${ secondsLeft }"],"${ minutes } minute":["${ minutes } Minute","${ minutes } Minuten"],"${ seconds } second":["${ seconds } Sekunde","${ seconds } Sekunden"],"Limited time offer":["Zeitlich befristetes Angebot"]},"specialoffer:listitem":{"Create multiple addresses":["Erstelle mehrere Adressen"],"Hide-my-email aliases":["Hide-my-email-Aliase"],"Quickly unsubscribe from newsletters":["Newsletter schnell abbestellen"],"Use your own domain name":["Verwende deine eigene Domain"]},"specialoffer:logos":{"As featured in":["Vorgestellt in"]},"specialoffer:metadescription":{"Get an encrypted email that protects your privacy":["Nutze einen verschlüsselte E-Mail-Dienst, der deine Privatsphäre schützt"]},"specialoffer:metatitle":{"Proton Mail Black Friday Sale - Up to 40% off":["Proton Mail Black Friday-Angebot – Bis zu 40 % Rabatt"]},"specialoffer:newmetadescription":{"Get up to 40% off Proton Mail subscriptions this Black Friday. Find great deals on our secure end-to-end encrypted email plans.":["Erhalte an diesem Black Friday bis zu 40 % Rabatt auf Proton Mail-Abonnements. Mache tolle Schnäppchen bei unseren sicheren, Ende-zu-Ende-verschlüsselten E-Mail-Abonnements."]},"specialoffer:newmetatitle":{"Proton Mail Black Friday sale | Up to 40% off secure email":["Proton Mail-Black-Friday-Angebot | Bis zu 40 % Rabatt auf sichere E-Mails"]},"specialoffer:note":{"* Billed at ${ TOTAL_SUM } for the first year":["* Zum Preis von ${ TOTAL_SUM } im ersten Jahr"],"*Billed at ${ TOTAL_SUM } for the first 2 years":["*Zum Preis von ${ TOTAL_SUM } in den ersten zwei Jahren"],"30-day money-back guarantee":["30-tägige Geld-zurück-Garantie"],"Billed at ${ TOTAL_SUM } for the first 2 years":["Zum Preis von ${ TOTAL_SUM } in den ersten zwei Jahren"],"Billed at ${ TOTAL_SUM } for the first year":["Zum Preis von ${ TOTAL_SUM } im ersten Jahr"],"You save ${ SAVE_SUM }":["Du sparst ${ SAVE_SUM }"]},"specialoffer:off":{"${ PERCENT_OFF } off":["− ${ PERCENT_OFF }"]},"specialoffer:testimonial":{"I love my ProtonMail":["Ich liebe mein ProtonMail"],"My favorite email service":["Mein Lieblings-E-Mail-Dienst"],"Thanks Proton for keeping us all safe in the complicated internet universe.":["Danke Proton, dass du uns alle im komplizierten Internet-Universum beschützt."],"You get what you pay for. In the case of big tech, if you pay nothing, you get used. I quit using Gmail and switched to @ProtonMail":["Du bekommst, wofür du bezahlst. Wenn du nichts bezahlst, wirst du bei der Nutzung von Big Tech ausgenutzt. Ich habe Gmail aufgegeben und bin zu @ProtonMail gewechselt"]},"specialoffer:time":{"Days":["Tage"],"Hours":["Stunden"],"Min":["Min."]},"specialoffer:title":{"And much more":["Und vieles mehr"],"Safe from trackers":["Sicher vor Trackern"],"Stay organized":["Ordnung halten"],"Black Friday email deals":["E-Mail-Angebote zum Black Friday"],"Don’t just take our word for it":["Verlasse dich nicht nur auf unser Wort"],"Make your inbox yours":["Passe deinen Posteingang an"],"Our story":["Unsere Geschichte"],"Transfer your data from Google in one click":["Übertrage deine Daten von Google mit einem Klick"]},"specialoffer:tooltip":{"Access blocked content and browse privately. Includes ${ TOTAL_VPN_SERVERS }+ servers in ${ TOTAL_VPN_COUNTRIES }+ countries, connect up to 10 devices, access worldwide streaming services, malware and ad-blocker, and more.":["Greife auf blockierte Inhalte zu und surfe privat. Umfasst ${ TOTAL_VPN_SERVERS } Server in über ${ TOTAL_VPN_COUNTRIES } Ländern, die Verbindung \nvon bis zu 10 Geräten, weltweite Streaming-Dienste, Malware- und Werbeblocker und mehr."],"Easily share your calendar with your family, friends or colleagues, and view external calendars.":["Teile deinen Kalender ganz einfach mit Verwandten, Freunden oder Kollegen und rufe externe Kalender auf."],"Includes support for 1 custom email domain, 10 email addresses, 10 hide-my-email aliases, calendar sharing, and more.":["Beinhaltet Unterstützung für eine eigene E-Mail-Domain, 10 E-Mail-Adressen, 10 „hide-my-email“-Aliasse, Kalenderfreigabe und mehr."],"Includes support for 3 custom email domains, 15 email addresses, unlimited hide-my-email aliases, calendar sharing, and more.":["Beinhaltet Unterstützung für 3 benutzerdefinierte E-Mail-Domänen, 15 E-Mail-Adressen, unbegrenzte „hide-my-email“-Aliase, Kalenderfreigabe und mehr."],"Manage up to 25 calendars, mobile apps, secured with end-to-end encryption, 1-click calendar import from Google, and more.":["Verwalte bis zu 25 Kalender, Ende zu Ende verschlüsselte mobile Apps, 1-Klick-Kalenderimporte von Google und vieles mehr."]},"Status Banner":{"At the moment we are experiencing issues with the Proton VPN service":["Im Moment gibt es Probleme mit dem Proton VPN-Dienst"]},"Status banner":{"Learn more":["Mehr erfahren"],"Please note that at the moment we are experiencing issues with the ${ issues[0] } service.":["Bitte beachte, dass wir im Moment Probleme mit dem Dienst ${ issues[0] } haben."],"We are experiencing issues with one or more services at the moment.":["Im Moment gibt es Probleme mit einem oder mehreren Diensten."]},"steps":{"Step":["Schritt"]},"suggestions":{"Suggestions":["Vorschläge"]},"Support":{"Sub category":["Unterkategorie","Unterkategorien"]},"Support article":{"${ readingTime } min":["${ readingTime } Min.","${ readingTime } Min."],"Category":["Kategorie","Kategorien"],"Didn’t find what you were looking for?":["Hast du nicht gefunden, wonach du gesucht hast?"],"General contact":["Allgemeiner Kontakt"],"Get help":["Hilfe erhalten"],"Legal contact":["Kontakt für Rechtliches"],"Media contact":["Kontakt für Medien"],"Partnerships contact":["Kontakt für Partnerschaften"],"Reading":["Lesen"]},"Support Form Platform option":{"VPN for Android TV":["VPN für Android TV"],"VPN for Apple TV":["VPN für Apple TV"],"VPN for Chromebook":["VPN für Chromebook"]},"Support troubleshooting":{"App version":["App-Version"],"Browser":["Browser"],"Check if this helps":["Schau, ob das hilft."],"Choose a product":["Produkt auswählen"],"Did this solve your issue?":["Hat dies dein Problem gelöst?"],"Faster assistance is just a few clicks away":["Schnellere Hilfe ist nur ein paar Klicks entfernt"],"How can we help?":["Wie können wir dir helfen?"],"No, contact support":["Nein, Support kontaktieren"],"Please fill out one field after another":["Bitte fülle ein Feld nach dem anderen aus"],"Please make your selections":["Bitte triff deine Auswahl"],"Proton account":["Proton-Konto"],"Proton for Business":["Proton for Business"],"Thank you for your feedback":["Danke für dein Feedback"],"What can we help with?":["Wobei können wir dir helfen?"],"Yes":["Ja"]},"support_modal_search_query":{"Search query":["Anfrage suchen"]},"support_search_button":{"Search":["Suchen"]},"support_search_i_am_looking_for":{"I'm looking for":["Ich suche"]},"SupportForm":{"For a faster resolution, please report the issue from the Bridge app: Help > Report a problem.":["Damit das Problem schneller gelöst werden kann, melde es bitte über die Bridge-App: Help > Report a problem (Hilfe > Problem melden)."],"Information":["Informationen"]},"SupportForm:option":{"Account Security":["Kontosicherheit"],"Contacts":["Kontakte"],"Custom email domain":["Benutzerdefinierte E-Mail-Domain"],"Email delivery and Spam":["E-Mail-Zustellung und Spam"],"Encryption":["Verschlüsselung"],"Login and password":["Anmeldung und Passwort"],"Merge aliases and accounts":["Zusammenführung von Aliassen und Konten"],"Migrate to Proton":["Migration zu Proton"],"Notifications":["Benachrichtigungen"],"Other":["Sonstiges"],"Plans and billing":["Abonnements und Abrechnung"],"Proton for Business":["Proton for Business"],"Sign up":["Registrierung"],"Storage":["Speicher"],"Users, addresses, and identities":["Benutzer, Adressen und Identitäten"]},"SupportForm:optionIntro":{"Select a topic":["Thema auswählen"]},"Testimonial":{"Awards":["Auszeichnungen"],"Customers":["Kunden"],"Featured":["Empfohlen"],"Go to testimonial source":["Zur Referenzquelle wechseln"],"Open source of award":["Quelle der Auszeichnung öffnen"],"Open source of quote":["Quelle des Zitats öffnen"],"Reviews":["Bewertungen"],"Videos":["Videos"],"Watch on TikTok":["Auf TikTok ansehen"],"Watch on YouTube":["Auf YouTube ansehen"]},"TestimonialCategory":{"Awards":["Auszeichnungen"],"Customers":["Kunden"],"Featured":["Empfohlen"],"Media":["Medien"],"Reviews":["Bewertungen"],"Videos":["Videos"]},"Text":{"If you need help, check out our ${ supportLink }.":["Hilfe erhältst du in unserem ${ supportLink }."],"The page you’re looking for might have been removed, or it could be an\nold link.":["Die von dir gesuchte Seite wurde möglicherweise entfernt, oder es könnte sich um einen alten Link handeln."],"Your question may already have an answer in our knowledge base:":["Vielleicht gibt es bereits eine Antwort auf deine Frage in unserer Wissensdatenbank:"]},"Title":{"On this page":["Auf dieser Seite"],"Page not found":["Seite nicht gefunden"],"Related articles":["Verwandte Artikel"],"Share ${ thisPage }":["${ thisPage } teilen"],"Switch to Proton Pass - Contact us":["Zu Proton Pass wechseln – Kontaktiere uns"],"Thank you!":["Vielen Dank!"],"this page":["diese Seite"]},"tooltip_vpn":{"Access blocked content and browse privately. Includes ${ TOTAL_VPN_SERVERS }+ servers in ${ TOTAL_VPN_COUNTRIES }+ countries, highest VPN speed, ${ TOTAL_VPN_CONNECTIONS } VPN connections, worldwide streaming services, malware and ad-blocker, and more.":["Greife auf blockierte Inhalte zu und surfe privat. Enthält über ${ TOTAL_VPN_SERVERS } Server in mehr als ${ TOTAL_VPN_COUNTRIES } Ländern, höchste VPN-Geschwindigkeiten, ${ TOTAL_VPN_CONNECTIONS } VPN-Verbindungen, weltweite Streaming-Dienste, Malware- und Werbeblocker und mehr."]},"vpn_servers":{"Get Proton VPN Plus":["Proton VPN Plus holen"]},"wallet_signup_2024:Action":{"Get Proton Wallet":["Hol dir Proton Wallet"]},"wallet_signup_2024:Homepage hero product link title":{"Wallet":["Wallet"]},"wallet_signup_2024:Homepage product navigation bar":{"Wallet":["Wallet"]},"wallet_signup_2024:menu item":{"Bitcoin guide":["Bitcoin-Leitfaden"],"Proton Wallet news":["Proton Wallet-Neuigkeiten"],"Proton Wallet support":["Proton Wallet-Support"]},"wallet_signup_2024:Pricing":{"Includes everything in Proton Unlimited and":["Umfasst alles, was in Proton Unlimited enthalten ist und"],"Limited availability":["Begrenzte Verfügbarkeit"],"The easiest way to securely own, send, and receive Bitcoin":["Der einfachste Weg, Bitcoin sicher aufzubewahren, zu senden und zu empfangen"]},"wallet_signup_2024:ProductRange":{"Discover Proton Wallet":["Proton Wallet entdecken"],"Store and transact Bitcoin privately with an encrypted self-custody wallet.":["Bewahre Bitcoins auf und überweise sie auf private Weise mit einer verschlüsselten, selbstverwahrenden Wallet."]},"wallet_signup_2024:wallet bitcoin":{"Learn about Bitcoin, the Internet's value network.":["Erfahre mehr über Bitcoin, das Wertnetzwerk des Internets."]},"wallet_signup_2024:wallet overview":{"Ensure you're always in control of your Bitcoin.":["Stelle sicher, dass du immer die Kontrolle über deine Bitcoins behältst."]},"wallet_signup_2024:wallet security":{"The encrypted, open-source wallet that puts you in control.":["Die verschlüsselte Open-Source-Wallet, die dir die Kontrolle gibt."]}}},"base":"blog","cdn":{"enabledForAssets":true,"enabledForImages":true,"url":"https://pmecdn.protonweb.com/"},"unleashApi":"https://account.proton.me/api"};
window.frameworkContext = frameworkContext;
const context = frameworkContext.base === '' ? '' : `${frameworkContext.base}/`;
window.__toAssetUrl = (filename) => {
if (frameworkContext.cdn !== undefined && frameworkContext.cdn.enabledForAssets === true) {
return `${frameworkContext.cdn.url}${context}${filename}`;
} else {
return `/${context}${filename}`;
}
};
})();
Open source cryptography takes a step forward with the release of OpenPGPjs 4.0 | Proton
The goal of our OpenPGPjs project is to make public-key cryptography not only available to users, but also to the global developer community. We believe the widespread availability of open-source and secure cryptography libraries is a prerequisite of the privacy revolution.
OpenPGPjs version 4.0 introduces streaming cryptography. This makes it possible for users of the library to encrypt, decrypt, sign, and verify files while they are simultaneously being downloaded or uploaded, meaning that large files no longer need to be stored in memory in order to perform these operations. The associated performance and storage benefits will allow us to speed up the encryption and decryption of email attachments and help us develop new products like ProtonDrive.
The support of the developer community is essential for the continued development of OpenPGPjs, and we welcome pull requests and comments. Here’s what’s new with OpenPGPjs 4.0:
Streaming Encryption
There are two different types of streaming implemented in this release.
The first can only be used in implementations that support the latest draft of authenticated encryption with associated data (AEAD), which was first added in OpenPGPjs v3.0.9. AEAD is particularly well-suited to streaming, because it allows messages to be divided into chunks, each of which has its own integrity tag that can be used to authenticate it as it is downloaded. In contrast to non-AEAD messages, this allows the client to trust each chunk as it is received, rather than waiting until the end of the data packet to check the integrity tag.
For compatibility with older messages and with other OpenPGP clients that do not support this draft, we have also implemented streaming for non-AEAD OpenPGP messages that use the unauthenticated cipher feedback mode (CFB) encryption rather than the authenticated modes supported in the AEAD implementation (EAX, OCB, and GCM).
Configuration Details
Streaming AEAD
The configuration setting openpgp.config.aead_chunk_size_byte controls the one-octet chunk size defined in the AEAD data packet, and defaults to 12. The size of each message chunk will be 2 ^ (openpgp.config.aead_chunk_size_byte + 6) bytes, and thus defaults to 256KB. This can be adjusted to receive data on the stream more or less frequently.
Streaming CFB
Because CFB-encrypted OpenPGP messages only have a single integrity tag, at the end of the message, it is not possible to authenticate data during stream decryption until the end of the message. Therefore, due to the security issues associated with using unauthenticated data(neues Fenster), we do not output any data to the stream by default during decryption. To override this default and allow unauthenticated data to be streamed, set openpgp.config.allow_unauthenticated_stream to true.
Web Streams Implementation
Browser support and Polyfills
This feature relies on the Web Streams API(neues Fenster), which Chrome, Safari, Firefox, and Edge currently have partially implemented, with Firefox’s implementation behind feature flags. Chrome is the only browser that implements TransformStreams, which are required in our implementation, so we include a polyfill for all other browsers. Please note that in those browsers, the global ReadableStream property gets overwritten with the polyfill version if it exists. Thus, if you need to use the native ReadableStream, you may need to store a reference to it before loading OpenPGPjs, or use the web-streams-adapter library to convert back and forth between them.In order to avoid separate implementations for web streams, node streams, and non-streamed data, all data is temporarily converted to a web stream internally and then converted back when returning. However, in the future, we might look into re-implementing some of the convenience functions of the web-stream-tools (see below) to not need streams, so that you don’t need to include the streams polyfill when not using streams.
New Web-Stream-Tools library
The OpenPGP spec requires us to manipulate and transform streams in complex ways: a stream of armored encrypted data needs to be parsed, then base64-decoded, then decrypted, then perhaps decompressed, then perhaps UTF8-decoded. Internally, we’re chaining together TransformStreams to achieve this. However, the TransformStream API is not quite sufficient for us: there is no way to control the amount of data that comes in at once, for example. And even if there was, we don’t always know in advance how many bytes we need: often, that depends on a field earlier in the data. To avoid having complex buffering code at every step of the way, we created a library to make this and other aspects of reading and transforming streams easier: web-stream-tools(neues Fenster). Contributions to make handling streams even easier are welcome!
High-Level API Changes
openpgp.message.fromText(), fromBinary(), readArmored() and
read() now accept ReadableStreams as well as Node streams.
The high-level encrypt, decrypt, sign and verify functions now
have an streaming parameter, to control whether the return value
contains a stream. It can take the values “web”, “node”, or false.
It defaults to the type of stream you passed in, if any.
When streaming, the signatures returned by verify and decrypt have
a verified: Promise<Boolean> property instead of valid: Boolean. The
signature property is also a Promise in that case.
openpgp.{message,key,signature,cleartext}.readArmored() and
openpgp.{message,key,signature}.read() are now asynchronous.
For example, instead of writing let publicKey = openpgp.key.readArmored(publicKeyArmored).keys[0]; write, in an async function: let publicKey = (await openpgp.key.readArmored(publicKeyArmored)).keys[0];
openpgp.encrypt() and openpgp.sign() now take a message
parameter instead of data, dataType and filename. Use
openpgp.message.fromText(), openpgp.message.fromBinary() or
openpgp.cleartext.fromText() to create a message. Note that if you
previously used the date parameter, you should now additionally pass
it to fromText/fromBinary as well.
After calling let keyring = new openpgp.Keyring(), you now have to
call await keyring.load() to read the keys from LocalStorage.
Separate bundle for old browsers
OpenPGPjs has been increasing in size due in part to the many new features (ECC in 3.0, Streaming in 4.0), but also because we supported a wide range of browsers. That meant we had to transpile ES6 to ES5 and include quite a lot of polyfills, both of which increase the library size.
We’ve now eliminated some polyfills from the default openpgp.min.js bundle, so it will now work with only recent versions of Chrome, Firefox, Safari, and Edge. If you need support for Internet Explorer 11 and old versions of Safari, you can use the new compat/openpgp.min.js bundle.
You could even load one or the other depending on which browser the user is using. However, if you’re using the web worker, keep in mind that you also need to pass { path: ‘compat/openpgp.worker.min.js’ } to initWorker whenever you load compat/openpgp.min.js.
Development
You can now do grunt browsertest –dev to debug using a build with a source map and original module names intact. You can also do grunt browsertest –compat to test a build that’s compatible with IE11 and older versions of Safari. Both the –dev and –compat parameters also work for grunt build and other tasks that depend on it.
There’s a new npm run build command to build both compat and non-compat bundles.
The browserify bundles are now cached and built incrementally, speeding up development after the first build.
Other Updates
Armor and packet parsing are now stricter: previously, missing —–END PGP PUBLIC KEY BLOCK—– or truncated packets wouldn’t throw errors, but do now.