Check S/MIME signatures, and remember who signed
A signed message now says whether that holds up, as it is read. This is
verification only: nothing here signs, encrypts or decrypts, and the
private-key question that blocks those is untouched. Verifying needed
none of it, because the certificate travels inside the message -- which
is why this is the half that could be built.
What it checks. For multipart/signed carrying PKCS#7, the exact bytes of
the signed part -- headers included, canonicalised to CRLF -- are hashed
against the messageDigest attribute, and the signature over the signed
attributes is verified with WebCrypto against the certificate inside the
message. RSA PKCS#1 v1.5 and ECDSA over P-256/384/521, with SHA-256, 384
or 512.
The trust model is the design, and it is deliberately small. A browser
has no system trust store, and the certificate arrives inside the
message, so anyone can self-sign as anyone: on its own a good signature
shows only that the sender held the key they attached. So the word
"verified" is never rendered, and the reassuring case is not the loud
one. What carries the weight is remembering -- the first signed message
from an address pins its fingerprint, later ones are compared, and a
signer that changed is reported with both names and told to check by
another route. Trust on first use, no certificate authority anywhere.
The pins live in the account's settings rather than the browser: one
that only a single device knew would greet the same correspondent as new
everywhere else, which is how people are trained to click past the one
warning that matters. A pin records the message that created it, so the
message that established a signer keeps saying so instead of appearing
to be corroborated by itself -- without that, the very first signed
message anybody receives reads as "the same signer as before", where
before is itself. A changed, mismatched or expired signer is never
pinned, since writing the anomaly into the baseline makes every later
message agree with it.
Three things are declined rather than attempted, and all three say
"could not check" rather than "does not check out", because ignorance
and an accusation are different claims:
- OpenPGP, by name. The signature carries no key and there is nowhere
to get the sender's: x:PublicKey is the account's OWN registry, and
a keyserver or WKD lookup would tell a third party who you
correspond with -- the leak the image proxy exists to close.
- SHA-1. Not forgeable in practice today, still not something to put a
tick beside.
- RSA-PSS, whose salt length lives in parameters this does not read.
Guessing wrong would report a good signature as bad.
Nothing validates a chain: no CA bundle is shipped and revocation is not
checked. "Issued by" reports what the certificate claims, and a
self-signed one claims itself.
The DER, CMS, X.509 and MIME readers are hand-written and deliberately
narrow -- no new dependency, and the whole verifier is a lazily imported
8.6 kB chunk that a reader of unsigned mail never downloads. The one
place this is easy to get quietly wrong has its own function and its own
test: signed attributes are signed as a SET OF, not as the [0] IMPLICIT
they arrive as, and hashing the message instead would make every
signature "pass".
Tested against real `openssl smime -sign` output rather than hand-built
fixtures -- RSA, ECDSA, a tampered copy, and a valid signature by a
certificate for somebody else -- because a signed message written by
hand only agrees with whatever its author believed the format to be.
Also driven in a browser against the mock, which now serves three real
signed messages so every branch of the banner is reachable.
Translations: 34 new strings in all nine catalogues, 306 entries.
Falling back to English is unchanged at 24 per language.
This commit is contained in:
@@ -1331,6 +1331,41 @@ export const catalog: Catalog = {
|
||||
"Empty “{name}”?": "„{name}“ leeren?",
|
||||
"Delete them": "Alle löschen",
|
||||
"Nothing was deleted": "Es wurde nichts gelöscht",
|
||||
// ── Checking an S/MIME signature, and what may be said about it ──
|
||||
"Certificate covers": "Zertifikat gilt für",
|
||||
"Details": "Details",
|
||||
"Earlier messages from this address were signed by {previous}. This one is signed by {current}.": "Frühere Nachrichten von dieser Adresse wurden von {previous} signiert. Diese ist von {current} signiert.",
|
||||
"Fingerprint": "Fingerabdruck",
|
||||
"Hide details": "Details ausblenden",
|
||||
"Issued by": "Ausgestellt von",
|
||||
"It is signed with OpenPGP, and ihasmail has no way to fetch the sender's public key.": "Sie ist mit OpenPGP signiert, und ihasmail hat keine Möglichkeit, den öffentlichen Schlüssel des Absenders zu beschaffen.",
|
||||
"It uses a signature algorithm ihasmail cannot check yet.": "Sie verwendet ein Signaturverfahren, das ihasmail noch nicht prüfen kann.",
|
||||
"It was made with a certificate belonging to {name}, which does not cover this address.": "Sie wurde mit einem Zertifikat von {name} erstellt, das diese Adresse nicht abdeckt.",
|
||||
"Previous fingerprint": "Vorheriger Fingerabdruck",
|
||||
"Signed at": "Signiert am",
|
||||
"Signed by {name} — the same signer as before.": "Signiert von {name} — derselbe Unterzeichner wie zuvor.",
|
||||
"Signed by {name}, seen here for the first time.": "Signiert von {name}, hier zum ersten Mal gesehen.",
|
||||
"Signer": "Unterzeichner",
|
||||
"That can mean a renewed certificate, and it can mean somebody else. Check with them by some other route before trusting it.": "Das kann ein erneuertes Zertifikat bedeuten, und es kann jemand anderes sein. Fragen Sie auf einem anderen Weg nach, bevor Sie dem vertrauen.",
|
||||
"The certificate has expired.": "Das Zertifikat ist abgelaufen.",
|
||||
"The certificate is not valid yet.": "Das Zertifikat ist noch nicht gültig.",
|
||||
"The message does not match what was signed — it was altered after signing, or damaged on the way.": "Die Nachricht stimmt nicht mit dem Signierten überein — sie wurde nach dem Signieren verändert oder unterwegs beschädigt.",
|
||||
"The signature carries no certificate that can be read.": "Die Signatur enthält kein lesbares Zertifikat.",
|
||||
"The signature could not be read.": "Die Signatur konnte nicht gelesen werden.",
|
||||
"The signature does not match the certificate sent with it.": "Die Signatur passt nicht zum mitgesendeten Zertifikat.",
|
||||
"The signature is not for this sender.": "Die Signatur gehört nicht zu diesem Absender.",
|
||||
"The signed part is missing either the message or the signature.": "Im signierten Teil fehlt entweder die Nachricht oder die Signatur.",
|
||||
"The signer has changed.": "Der Unterzeichner hat gewechselt.",
|
||||
"This message is signed, and ihasmail could not check the signature.": "Diese Nachricht ist signiert, und ihasmail konnte die Signatur nicht prüfen.",
|
||||
"This signature does not check out.": "Diese Signatur stimmt nicht.",
|
||||
"Valid until": "Gültig bis",
|
||||
"a different certificate": "einem anderen Zertifikat",
|
||||
"an unnamed signer": "einem unbenannten Unterzeichner",
|
||||
"as claimed by the signer": "laut Angabe des Unterzeichners",
|
||||
"first seen {date}": "zuerst gesehen {date}",
|
||||
"ihasmail will tell you if a later message from this address is signed by anybody else.": "ihasmail weist Sie darauf hin, wenn eine spätere Nachricht von dieser Adresse von jemand anderem signiert ist.",
|
||||
"itself, or an issuer it does not name": "sich selbst, oder einem nicht genannten Aussteller",
|
||||
"no address": "keine Adresse",
|
||||
},
|
||||
plurals: {
|
||||
// ── Third pass ─────────────────────────────────────────────────────
|
||||
|
||||
@@ -1304,6 +1304,41 @@ export const catalog: Catalog = {
|
||||
"Empty “{name}”?": "¿Vaciar «{name}»?",
|
||||
"Delete them": "Eliminarlos",
|
||||
"Nothing was deleted": "No se ha eliminado nada",
|
||||
// ── Checking an S/MIME signature, and what may be said about it ──
|
||||
"Certificate covers": "El certificado cubre",
|
||||
"Details": "Detalles",
|
||||
"Earlier messages from this address were signed by {previous}. This one is signed by {current}.": "Los mensajes anteriores de esta dirección los firmaba {previous}. Este lo firma {current}.",
|
||||
"Fingerprint": "Huella digital",
|
||||
"Hide details": "Ocultar detalles",
|
||||
"Issued by": "Emitido por",
|
||||
"It is signed with OpenPGP, and ihasmail has no way to fetch the sender's public key.": "Está firmado con OpenPGP, y ihasmail no tiene forma de obtener la clave pública del remitente.",
|
||||
"It uses a signature algorithm ihasmail cannot check yet.": "Usa un algoritmo de firma que ihasmail todavía no puede comprobar.",
|
||||
"It was made with a certificate belonging to {name}, which does not cover this address.": "Se hizo con un certificado de {name}, que no cubre esta dirección.",
|
||||
"Previous fingerprint": "Huella digital anterior",
|
||||
"Signed at": "Firmado el",
|
||||
"Signed by {name} — the same signer as before.": "Firmado por {name}: el mismo firmante que antes.",
|
||||
"Signed by {name}, seen here for the first time.": "Firmado por {name}, visto aquí por primera vez.",
|
||||
"Signer": "Firmante",
|
||||
"That can mean a renewed certificate, and it can mean somebody else. Check with them by some other route before trusting it.": "Puede tratarse de un certificado renovado, y puede tratarse de otra persona. Compruébelo con ella por otra vía antes de confiar.",
|
||||
"The certificate has expired.": "El certificado ha caducado.",
|
||||
"The certificate is not valid yet.": "El certificado aún no es válido.",
|
||||
"The message does not match what was signed — it was altered after signing, or damaged on the way.": "El mensaje no coincide con lo que se firmó: se alteró después de firmarlo, o se dañó por el camino.",
|
||||
"The signature carries no certificate that can be read.": "La firma no lleva ningún certificado que se pueda leer.",
|
||||
"The signature could not be read.": "No se ha podido leer la firma.",
|
||||
"The signature does not match the certificate sent with it.": "La firma no coincide con el certificado enviado con ella.",
|
||||
"The signature is not for this sender.": "La firma no corresponde a este remitente.",
|
||||
"The signed part is missing either the message or the signature.": "A la parte firmada le falta el mensaje o la firma.",
|
||||
"The signer has changed.": "El firmante ha cambiado.",
|
||||
"This message is signed, and ihasmail could not check the signature.": "Este mensaje está firmado, y ihasmail no ha podido comprobar la firma.",
|
||||
"This signature does not check out.": "Esta firma no cuadra.",
|
||||
"Valid until": "Válido hasta",
|
||||
"a different certificate": "un certificado distinto",
|
||||
"an unnamed signer": "un firmante sin nombre",
|
||||
"as claimed by the signer": "según declara el firmante",
|
||||
"first seen {date}": "visto por primera vez el {date}",
|
||||
"ihasmail will tell you if a later message from this address is signed by anybody else.": "ihasmail le avisará si un mensaje posterior de esta dirección lo firma otra persona.",
|
||||
"itself, or an issuer it does not name": "sí mismo, o un emisor que no nombra",
|
||||
"no address": "ninguna dirección",
|
||||
},
|
||||
plurals: {
|
||||
// ── Third pass ─────────────────────────────────────────────────────
|
||||
|
||||
@@ -1309,6 +1309,41 @@ export const catalog: Catalog = {
|
||||
"Empty “{name}”?": "Vider « {name} » ?",
|
||||
"Delete them": "Les supprimer",
|
||||
"Nothing was deleted": "Rien n’a été supprimé",
|
||||
// ── Checking an S/MIME signature, and what may be said about it ──
|
||||
"Certificate covers": "Le certificat couvre",
|
||||
"Details": "Détails",
|
||||
"Earlier messages from this address were signed by {previous}. This one is signed by {current}.": "Les messages précédents de cette adresse étaient signés par {previous}. Celui-ci est signé par {current}.",
|
||||
"Fingerprint": "Empreinte",
|
||||
"Hide details": "Masquer les détails",
|
||||
"Issued by": "Délivré par",
|
||||
"It is signed with OpenPGP, and ihasmail has no way to fetch the sender's public key.": "Il est signé avec OpenPGP, et ihasmail n'a aucun moyen de récupérer la clé publique de l'expéditeur.",
|
||||
"It uses a signature algorithm ihasmail cannot check yet.": "Il utilise un algorithme de signature qu'ihasmail ne sait pas encore vérifier.",
|
||||
"It was made with a certificate belonging to {name}, which does not cover this address.": "Elle a été faite avec un certificat appartenant à {name}, qui ne couvre pas cette adresse.",
|
||||
"Previous fingerprint": "Empreinte précédente",
|
||||
"Signed at": "Signé le",
|
||||
"Signed by {name} — the same signer as before.": "Signé par {name} — le même signataire que précédemment.",
|
||||
"Signed by {name}, seen here for the first time.": "Signé par {name}, vu ici pour la première fois.",
|
||||
"Signer": "Signataire",
|
||||
"That can mean a renewed certificate, and it can mean somebody else. Check with them by some other route before trusting it.": "Cela peut signifier un certificat renouvelé, comme cela peut être quelqu'un d'autre. Vérifiez avec la personne par un autre moyen avant de faire confiance.",
|
||||
"The certificate has expired.": "Le certificat a expiré.",
|
||||
"The certificate is not valid yet.": "Le certificat n'est pas encore valide.",
|
||||
"The message does not match what was signed — it was altered after signing, or damaged on the way.": "Le message ne correspond pas à ce qui a été signé : il a été modifié après signature, ou abîmé en chemin.",
|
||||
"The signature carries no certificate that can be read.": "La signature ne contient aucun certificat lisible.",
|
||||
"The signature could not be read.": "La signature n'a pas pu être lue.",
|
||||
"The signature does not match the certificate sent with it.": "La signature ne correspond pas au certificat envoyé avec elle.",
|
||||
"The signature is not for this sender.": "La signature ne correspond pas à cet expéditeur.",
|
||||
"The signed part is missing either the message or the signature.": "Il manque à la partie signée soit le message, soit la signature.",
|
||||
"The signer has changed.": "Le signataire a changé.",
|
||||
"This message is signed, and ihasmail could not check the signature.": "Ce message est signé, et ihasmail n'a pas pu vérifier la signature.",
|
||||
"This signature does not check out.": "Cette signature ne tient pas.",
|
||||
"Valid until": "Valable jusqu'au",
|
||||
"a different certificate": "un certificat différent",
|
||||
"an unnamed signer": "un signataire sans nom",
|
||||
"as claimed by the signer": "selon le signataire",
|
||||
"first seen {date}": "vu pour la première fois le {date}",
|
||||
"ihasmail will tell you if a later message from this address is signed by anybody else.": "ihasmail vous préviendra si un message ultérieur de cette adresse est signé par quelqu'un d'autre.",
|
||||
"itself, or an issuer it does not name": "lui-même, ou un émetteur qu'il ne nomme pas",
|
||||
"no address": "aucune adresse",
|
||||
},
|
||||
plurals: {
|
||||
// ── Third pass ─────────────────────────────────────────────────────
|
||||
|
||||
@@ -1312,6 +1312,41 @@ export const catalog: Catalog = {
|
||||
"Empty “{name}”?": "「{name}」を空にしますか?",
|
||||
"Delete them": "削除する",
|
||||
"Nothing was deleted": "何も削除されませんでした",
|
||||
// ── Checking an S/MIME signature, and what may be said about it ──
|
||||
"Certificate covers": "証明書の対象",
|
||||
"Details": "詳細",
|
||||
"Earlier messages from this address were signed by {previous}. This one is signed by {current}.": "このアドレスからの以前のメールは {previous} が署名していました。このメールの署名者は {current} です。",
|
||||
"Fingerprint": "フィンガープリント",
|
||||
"Hide details": "詳細を隠す",
|
||||
"Issued by": "発行者",
|
||||
"It is signed with OpenPGP, and ihasmail has no way to fetch the sender's public key.": "OpenPGP で署名されており、ihasmail には送信者の公開鍵を取得する手段がありません。",
|
||||
"It uses a signature algorithm ihasmail cannot check yet.": "ihasmail がまだ検証できない署名アルゴリズムが使われています。",
|
||||
"It was made with a certificate belonging to {name}, which does not cover this address.": "{name} の証明書で署名されており、この証明書はこのアドレスを対象にしていません。",
|
||||
"Previous fingerprint": "以前のフィンガープリント",
|
||||
"Signed at": "署名日時",
|
||||
"Signed by {name} — the same signer as before.": "{name} による署名です。以前と同じ署名者です。",
|
||||
"Signed by {name}, seen here for the first time.": "{name} による署名です。ここで見るのは初めてです。",
|
||||
"Signer": "署名者",
|
||||
"That can mean a renewed certificate, and it can mean somebody else. Check with them by some other route before trusting it.": "証明書を更新しただけの場合もあれば、別人の場合もあります。信頼する前に、別の手段で本人に確認してください。",
|
||||
"The certificate has expired.": "証明書の有効期限が切れています。",
|
||||
"The certificate is not valid yet.": "証明書はまだ有効ではありません。",
|
||||
"The message does not match what was signed — it was altered after signing, or damaged on the way.": "メールが署名された内容と一致しません。署名後に変更されたか、途中で壊れています。",
|
||||
"The signature carries no certificate that can be read.": "署名に読み取れる証明書が含まれていません。",
|
||||
"The signature could not be read.": "署名を読み取れませんでした。",
|
||||
"The signature does not match the certificate sent with it.": "署名が、一緒に送られた証明書と一致しません。",
|
||||
"The signature is not for this sender.": "この署名はこの送信者のものではありません。",
|
||||
"The signed part is missing either the message or the signature.": "署名された部分に、本文か署名のどちらかが欠けています。",
|
||||
"The signer has changed.": "署名者が変わりました。",
|
||||
"This message is signed, and ihasmail could not check the signature.": "このメールには署名がありますが、ihasmail は署名を検証できませんでした。",
|
||||
"This signature does not check out.": "この署名は正しくありません。",
|
||||
"Valid until": "有効期限",
|
||||
"a different certificate": "別の証明書",
|
||||
"an unnamed signer": "名前のない署名者",
|
||||
"as claimed by the signer": "署名者の申告による",
|
||||
"first seen {date}": "初回は {date}",
|
||||
"ihasmail will tell you if a later message from this address is signed by anybody else.": "このアドレスからの以降のメールが別の人の署名だった場合、ihasmail がお知らせします。",
|
||||
"itself, or an issuer it does not name": "自分自身、または名前のない発行者",
|
||||
"no address": "アドレスなし",
|
||||
},
|
||||
plurals: {
|
||||
// ── Third pass ─────────────────────────────────────────────────────
|
||||
|
||||
@@ -1300,6 +1300,41 @@ export const catalog: Catalog = {
|
||||
"Empty “{name}”?": "„{name}” leegmaken?",
|
||||
"Delete them": "Verwijderen",
|
||||
"Nothing was deleted": "Er is niets verwijderd",
|
||||
// ── Checking an S/MIME signature, and what may be said about it ──
|
||||
"Certificate covers": "Certificaat geldt voor",
|
||||
"Details": "Details",
|
||||
"Earlier messages from this address were signed by {previous}. This one is signed by {current}.": "Eerdere berichten van dit adres waren ondertekend door {previous}. Dit bericht is ondertekend door {current}.",
|
||||
"Fingerprint": "Vingerafdruk",
|
||||
"Hide details": "Details verbergen",
|
||||
"Issued by": "Uitgegeven door",
|
||||
"It is signed with OpenPGP, and ihasmail has no way to fetch the sender's public key.": "Het is ondertekend met OpenPGP, en ihasmail kan de openbare sleutel van de afzender niet ophalen.",
|
||||
"It uses a signature algorithm ihasmail cannot check yet.": "Het gebruikt een ondertekeningsalgoritme dat ihasmail nog niet kan controleren.",
|
||||
"It was made with a certificate belonging to {name}, which does not cover this address.": "Hij is gemaakt met een certificaat van {name}, dat dit adres niet dekt.",
|
||||
"Previous fingerprint": "Vorige vingerafdruk",
|
||||
"Signed at": "Ondertekend op",
|
||||
"Signed by {name} — the same signer as before.": "Ondertekend door {name} — dezelfde ondertekenaar als eerder.",
|
||||
"Signed by {name}, seen here for the first time.": "Ondertekend door {name}, hier voor het eerst gezien.",
|
||||
"Signer": "Ondertekenaar",
|
||||
"That can mean a renewed certificate, and it can mean somebody else. Check with them by some other route before trusting it.": "Dat kan een vernieuwd certificaat betekenen, en het kan iemand anders zijn. Vraag het langs een andere weg na voordat u erop vertrouwt.",
|
||||
"The certificate has expired.": "Het certificaat is verlopen.",
|
||||
"The certificate is not valid yet.": "Het certificaat is nog niet geldig.",
|
||||
"The message does not match what was signed — it was altered after signing, or damaged on the way.": "Het bericht komt niet overeen met wat er is ondertekend — het is na ondertekening gewijzigd, of onderweg beschadigd.",
|
||||
"The signature carries no certificate that can be read.": "De handtekening bevat geen leesbaar certificaat.",
|
||||
"The signature could not be read.": "De handtekening kon niet worden gelezen.",
|
||||
"The signature does not match the certificate sent with it.": "De handtekening hoort niet bij het meegestuurde certificaat.",
|
||||
"The signature is not for this sender.": "De handtekening is niet van deze afzender.",
|
||||
"The signed part is missing either the message or the signature.": "In het ondertekende deel ontbreekt het bericht of de handtekening.",
|
||||
"The signer has changed.": "De ondertekenaar is veranderd.",
|
||||
"This message is signed, and ihasmail could not check the signature.": "Dit bericht is ondertekend, en ihasmail kon de handtekening niet controleren.",
|
||||
"This signature does not check out.": "Deze handtekening klopt niet.",
|
||||
"Valid until": "Geldig tot",
|
||||
"a different certificate": "een ander certificaat",
|
||||
"an unnamed signer": "een naamloze ondertekenaar",
|
||||
"as claimed by the signer": "volgens de ondertekenaar",
|
||||
"first seen {date}": "voor het eerst gezien op {date}",
|
||||
"ihasmail will tell you if a later message from this address is signed by anybody else.": "ihasmail laat het weten als een later bericht van dit adres door iemand anders is ondertekend.",
|
||||
"itself, or an issuer it does not name": "zichzelf, of een uitgever die het niet noemt",
|
||||
"no address": "geen adres",
|
||||
},
|
||||
plurals: {
|
||||
// ── Third pass ─────────────────────────────────────────────────────
|
||||
|
||||
@@ -1307,6 +1307,41 @@ export const catalog: Catalog = {
|
||||
"Empty “{name}”?": "Esvaziar “{name}”?",
|
||||
"Delete them": "Excluir todos",
|
||||
"Nothing was deleted": "Nada foi excluído",
|
||||
// ── Checking an S/MIME signature, and what may be said about it ──
|
||||
"Certificate covers": "O certificado cobre",
|
||||
"Details": "Detalhes",
|
||||
"Earlier messages from this address were signed by {previous}. This one is signed by {current}.": "As mensagens anteriores deste endereço eram assinadas por {previous}. Esta é assinada por {current}.",
|
||||
"Fingerprint": "Impressão digital",
|
||||
"Hide details": "Ocultar detalhes",
|
||||
"Issued by": "Emitido por",
|
||||
"It is signed with OpenPGP, and ihasmail has no way to fetch the sender's public key.": "Está assinada com OpenPGP, e o ihasmail não tem como obter a chave pública do remetente.",
|
||||
"It uses a signature algorithm ihasmail cannot check yet.": "Usa um algoritmo de assinatura que o ihasmail ainda não consegue conferir.",
|
||||
"It was made with a certificate belonging to {name}, which does not cover this address.": "Foi feita com um certificado de {name}, que não cobre este endereço.",
|
||||
"Previous fingerprint": "Impressão digital anterior",
|
||||
"Signed at": "Assinado em",
|
||||
"Signed by {name} — the same signer as before.": "Assinado por {name} — o mesmo signatário de antes.",
|
||||
"Signed by {name}, seen here for the first time.": "Assinado por {name}, visto aqui pela primeira vez.",
|
||||
"Signer": "Signatário",
|
||||
"That can mean a renewed certificate, and it can mean somebody else. Check with them by some other route before trusting it.": "Isso pode ser um certificado renovado, e pode ser outra pessoa. Confirme com ela por outro caminho antes de confiar.",
|
||||
"The certificate has expired.": "O certificado expirou.",
|
||||
"The certificate is not valid yet.": "O certificado ainda não é válido.",
|
||||
"The message does not match what was signed — it was altered after signing, or damaged on the way.": "A mensagem não corresponde ao que foi assinado — ela foi alterada depois da assinatura, ou danificada no caminho.",
|
||||
"The signature carries no certificate that can be read.": "A assinatura não traz nenhum certificado que possa ser lido.",
|
||||
"The signature could not be read.": "Não foi possível ler a assinatura.",
|
||||
"The signature does not match the certificate sent with it.": "A assinatura não corresponde ao certificado enviado com ela.",
|
||||
"The signature is not for this sender.": "A assinatura não é deste remetente.",
|
||||
"The signed part is missing either the message or the signature.": "Falta à parte assinada ou a mensagem ou a assinatura.",
|
||||
"The signer has changed.": "O signatário mudou.",
|
||||
"This message is signed, and ihasmail could not check the signature.": "Esta mensagem está assinada, e o ihasmail não conseguiu conferir a assinatura.",
|
||||
"This signature does not check out.": "Esta assinatura não confere.",
|
||||
"Valid until": "Válido até",
|
||||
"a different certificate": "um certificado diferente",
|
||||
"an unnamed signer": "um signatário sem nome",
|
||||
"as claimed by the signer": "conforme declarado pelo signatário",
|
||||
"first seen {date}": "visto pela primeira vez em {date}",
|
||||
"ihasmail will tell you if a later message from this address is signed by anybody else.": "O ihasmail avisará você se uma mensagem posterior deste endereço for assinada por outra pessoa.",
|
||||
"itself, or an issuer it does not name": "ele mesmo, ou um emissor que ele não nomeia",
|
||||
"no address": "nenhum endereço",
|
||||
},
|
||||
plurals: {
|
||||
// ── Third pass ─────────────────────────────────────────────────────
|
||||
|
||||
@@ -1306,6 +1306,41 @@ export const catalog: Catalog = {
|
||||
"Empty “{name}”?": "Очистить «{name}»?",
|
||||
"Delete them": "Удалить их",
|
||||
"Nothing was deleted": "Ничего не удалено",
|
||||
// ── Checking an S/MIME signature, and what may be said about it ──
|
||||
"Certificate covers": "Сертификат распространяется на",
|
||||
"Details": "Подробности",
|
||||
"Earlier messages from this address were signed by {previous}. This one is signed by {current}.": "Прежние письма с этого адреса подписывал {previous}. Это подписано {current}.",
|
||||
"Fingerprint": "Отпечаток",
|
||||
"Hide details": "Скрыть подробности",
|
||||
"Issued by": "Кем выдан",
|
||||
"It is signed with OpenPGP, and ihasmail has no way to fetch the sender's public key.": "Письмо подписано OpenPGP, а ihasmail не может получить открытый ключ отправителя.",
|
||||
"It uses a signature algorithm ihasmail cannot check yet.": "Использован алгоритм подписи, который ihasmail пока не умеет проверять.",
|
||||
"It was made with a certificate belonging to {name}, which does not cover this address.": "Подпись сделана сертификатом, принадлежащим {name}, который не покрывает этот адрес.",
|
||||
"Previous fingerprint": "Прежний отпечаток",
|
||||
"Signed at": "Подписано",
|
||||
"Signed by {name} — the same signer as before.": "Подписано {name} — тот же подписавший, что и раньше.",
|
||||
"Signed by {name}, seen here for the first time.": "Подписано {name}, встречается здесь впервые.",
|
||||
"Signer": "Подписавший",
|
||||
"That can mean a renewed certificate, and it can mean somebody else. Check with them by some other route before trusting it.": "Это может быть обновлённый сертификат, а может быть и другой человек. Прежде чем доверять, свяжитесь с отправителем другим способом.",
|
||||
"The certificate has expired.": "Срок действия сертификата истёк.",
|
||||
"The certificate is not valid yet.": "Сертификат ещё не действителен.",
|
||||
"The message does not match what was signed — it was altered after signing, or damaged on the way.": "Письмо не совпадает с тем, что было подписано — его изменили после подписания или повредили в пути.",
|
||||
"The signature carries no certificate that can be read.": "В подписи нет сертификата, который удалось бы прочитать.",
|
||||
"The signature could not be read.": "Подпись не удалось прочитать.",
|
||||
"The signature does not match the certificate sent with it.": "Подпись не соответствует приложенному сертификату.",
|
||||
"The signature is not for this sender.": "Подпись не принадлежит этому отправителю.",
|
||||
"The signed part is missing either the message or the signature.": "В подписанной части не хватает либо письма, либо подписи.",
|
||||
"The signer has changed.": "Подписавший изменился.",
|
||||
"This message is signed, and ihasmail could not check the signature.": "Это письмо подписано, и ihasmail не смог проверить подпись.",
|
||||
"This signature does not check out.": "Эта подпись не сходится.",
|
||||
"Valid until": "Действует до",
|
||||
"a different certificate": "другим сертификатом",
|
||||
"an unnamed signer": "неназванным подписавшим",
|
||||
"as claimed by the signer": "по словам подписавшего",
|
||||
"first seen {date}": "впервые замечен {date}",
|
||||
"ihasmail will tell you if a later message from this address is signed by anybody else.": "ihasmail сообщит, если следующее письмо с этого адреса подпишет кто-то другой.",
|
||||
"itself, or an issuer it does not name": "самим собой или неназванным издателем",
|
||||
"no address": "нет адреса",
|
||||
},
|
||||
plurals: {
|
||||
// ── Third pass ─────────────────────────────────────────────────────
|
||||
|
||||
@@ -1300,6 +1300,41 @@ export const catalog: Catalog = {
|
||||
"Empty “{name}”?": "Очистити «{name}»?",
|
||||
"Delete them": "Видалити їх",
|
||||
"Nothing was deleted": "Нічого не видалено",
|
||||
// ── Checking an S/MIME signature, and what may be said about it ──
|
||||
"Certificate covers": "Сертифікат поширюється на",
|
||||
"Details": "Подробиці",
|
||||
"Earlier messages from this address were signed by {previous}. This one is signed by {current}.": "Попередні листи з цієї адреси підписував {previous}. Цей підписаний {current}.",
|
||||
"Fingerprint": "Відбиток",
|
||||
"Hide details": "Сховати подробиці",
|
||||
"Issued by": "Ким видано",
|
||||
"It is signed with OpenPGP, and ihasmail has no way to fetch the sender's public key.": "Лист підписано OpenPGP, а ihasmail не може отримати відкритий ключ відправника.",
|
||||
"It uses a signature algorithm ihasmail cannot check yet.": "Використано алгоритм підпису, який ihasmail поки не вміє перевіряти.",
|
||||
"It was made with a certificate belonging to {name}, which does not cover this address.": "Підпис зроблено сертифікатом, що належить {name} і не покриває цю адресу.",
|
||||
"Previous fingerprint": "Попередній відбиток",
|
||||
"Signed at": "Підписано",
|
||||
"Signed by {name} — the same signer as before.": "Підписано {name} — той самий підписувач, що й раніше.",
|
||||
"Signed by {name}, seen here for the first time.": "Підписано {name}, трапляється тут уперше.",
|
||||
"Signer": "Підписувач",
|
||||
"That can mean a renewed certificate, and it can mean somebody else. Check with them by some other route before trusting it.": "Це може бути оновлений сертифікат, а може бути й інша людина. Перш ніж довіряти, зв'яжіться з відправником іншим шляхом.",
|
||||
"The certificate has expired.": "Термін дії сертифіката минув.",
|
||||
"The certificate is not valid yet.": "Сертифікат ще не чинний.",
|
||||
"The message does not match what was signed — it was altered after signing, or damaged on the way.": "Лист не збігається з тим, що було підписано — його змінили після підписання або пошкодили в дорозі.",
|
||||
"The signature carries no certificate that can be read.": "У підписі немає сертифіката, який вдалося б прочитати.",
|
||||
"The signature could not be read.": "Підпис не вдалося прочитати.",
|
||||
"The signature does not match the certificate sent with it.": "Підпис не відповідає надісланому з ним сертифікату.",
|
||||
"The signature is not for this sender.": "Підпис не належить цьому відправникові.",
|
||||
"The signed part is missing either the message or the signature.": "У підписаній частині бракує або листа, або підпису.",
|
||||
"The signer has changed.": "Підписувач змінився.",
|
||||
"This message is signed, and ihasmail could not check the signature.": "Цей лист підписано, і ihasmail не зміг перевірити підпис.",
|
||||
"This signature does not check out.": "Цей підпис не сходиться.",
|
||||
"Valid until": "Чинний до",
|
||||
"a different certificate": "іншим сертифікатом",
|
||||
"an unnamed signer": "неназваним підписувачем",
|
||||
"as claimed by the signer": "за словами підписувача",
|
||||
"first seen {date}": "уперше побачено {date}",
|
||||
"ihasmail will tell you if a later message from this address is signed by anybody else.": "ihasmail повідомить, якщо наступний лист із цієї адреси підпише хтось інший.",
|
||||
"itself, or an issuer it does not name": "самим собою або неназваним видавцем",
|
||||
"no address": "немає адреси",
|
||||
},
|
||||
plurals: {
|
||||
// ── Third pass ─────────────────────────────────────────────────────
|
||||
|
||||
@@ -1311,6 +1311,41 @@ export const catalog: Catalog = {
|
||||
"Empty “{name}”?": "清空“{name}”?",
|
||||
"Delete them": "删除",
|
||||
"Nothing was deleted": "未删除任何内容",
|
||||
// ── Checking an S/MIME signature, and what may be said about it ──
|
||||
"Certificate covers": "证书适用于",
|
||||
"Details": "详情",
|
||||
"Earlier messages from this address were signed by {previous}. This one is signed by {current}.": "此地址以前的邮件由 {previous} 签名,而这封由 {current} 签名。",
|
||||
"Fingerprint": "指纹",
|
||||
"Hide details": "隐藏详情",
|
||||
"Issued by": "颁发者",
|
||||
"It is signed with OpenPGP, and ihasmail has no way to fetch the sender's public key.": "该邮件使用 OpenPGP 签名,而 ihasmail 无法获取发件人的公钥。",
|
||||
"It uses a signature algorithm ihasmail cannot check yet.": "它使用了 ihasmail 尚不能校验的签名算法。",
|
||||
"It was made with a certificate belonging to {name}, which does not cover this address.": "签名使用的是 {name} 的证书,该证书并不包含此地址。",
|
||||
"Previous fingerprint": "以前的指纹",
|
||||
"Signed at": "签名时间",
|
||||
"Signed by {name} — the same signer as before.": "由 {name} 签名——与此前是同一签名者。",
|
||||
"Signed by {name}, seen here for the first time.": "由 {name} 签名,这是首次在此见到。",
|
||||
"Signer": "签名者",
|
||||
"That can mean a renewed certificate, and it can mean somebody else. Check with them by some other route before trusting it.": "这可能只是更换了证书,也可能是另一个人。信任之前,请通过其他途径向对方核实。",
|
||||
"The certificate has expired.": "证书已过期。",
|
||||
"The certificate is not valid yet.": "证书尚未生效。",
|
||||
"The message does not match what was signed — it was altered after signing, or damaged on the way.": "邮件与所签名的内容不一致——它在签名后被改动,或在传输中损坏。",
|
||||
"The signature carries no certificate that can be read.": "签名中没有可读取的证书。",
|
||||
"The signature could not be read.": "无法读取签名。",
|
||||
"The signature does not match the certificate sent with it.": "签名与随附的证书不匹配。",
|
||||
"The signature is not for this sender.": "该签名不属于此发件人。",
|
||||
"The signed part is missing either the message or the signature.": "签名部分缺少邮件正文或签名。",
|
||||
"The signer has changed.": "签名者已更换。",
|
||||
"This message is signed, and ihasmail could not check the signature.": "此邮件带有签名,但 ihasmail 无法校验该签名。",
|
||||
"This signature does not check out.": "此签名不成立。",
|
||||
"Valid until": "有效期至",
|
||||
"a different certificate": "另一份证书",
|
||||
"an unnamed signer": "未具名的签名者",
|
||||
"as claimed by the signer": "据签名者声称",
|
||||
"first seen {date}": "首次见于 {date}",
|
||||
"ihasmail will tell you if a later message from this address is signed by anybody else.": "如果此地址之后的邮件由他人签名,ihasmail 会提醒您。",
|
||||
"itself, or an issuer it does not name": "其自身,或一个未具名的颁发者",
|
||||
"no address": "无地址",
|
||||
},
|
||||
plurals: {
|
||||
// ── Third pass ─────────────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user