The draft v0.12 fixes what the review of the implementation of v0.11
found, without changing any format: the names of certificates in the
verdicts, the seal of each signer in the lines of F6 with the warning that
nobody checks who issued it, the holder by givenName and surname before
the commonName that carries the NIF, a profile of the certificate field by
field, identifiers by their bytes, repeated elements of a SET OF, the
edge cases of the token, the addresses and the padding of the locator, and
the errata of 44.1, 55.2, 64, 67 and 76. Section 76 lists each change with
its case. The CDDL fixes the sizes of the locator.
The reader shows the names of certificates between quotes, refuses one of
more than 64 code points or with two spaces in a row, names the authority
of each seal of F6 and adds the warning when a line says before the date,
and writes the result of a foreign signer in Spanish. The records of
format3_signed_cms and format3_sealed follow.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lines[0]="Firmado con un certificado a nombre de "+strings.Join(names,", ")+
". DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial."
before:=false
for_,s:=rangev.Detail.Signers{
when:="no antes de la fecha de apertura"
ifs.Before{
when="antes de la fecha de apertura"
when,before="antes de la fecha de apertura",true
}
lines=append(lines,fmt.Sprintf(" %s (emisor según su certificado: %s), sellado el %s, %s.",s.Holder,s.Issuer,s.SealTime.UTC().Format(time.RFC3339),when))
lines=append(lines,fmt.Sprintf(" %s (emisor según su certificado: %s), sellado por %s el %s, %s.",quoted(s.Holder),quoted(s.Issuer),quoted(s.SealHolder),instant(s.SealTime),when))
}
// §29.7: whoever says that a capsule was signed before the date says
// that it does not check who issued the seal.
ifbefore{
lines=append(lines," DateKeys no comprueba quién emitió los sellos.")
}
}
ifv.Detail!=nil{
for_,s:=rangev.Detail.Foreign{
lines=append(lines,fmt.Sprintf(" Otro firmante, %s: %s. No cuenta.",s.Holder,s.Result))
lines=append(lines,fmt.Sprintf(" Otro firmante, %s: %s. No cuenta.",quoted(s.Holder), resultText[s.Result]))
}
}
switcht:=v.Seal.Text();{
casev.Seal==VerdictSealed&&v.Detail!=nil:
lines=append(lines,"Según un sello a nombre de "+v.Detail.SealHolder+", existía el "+v.Detail.SealTime.UTC().Format(time.RFC3339)+
lines=append(lines,"Según un sello a nombre de "+quoted(v.Detail.SealHolder)+", existía el "+instant(v.Detail.SealTime)+
", antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello.")
// The names between « and », the authority of each seal, and, since the
// lines say "before the date", that DateKeys does not check who issued the
// seals (spec §29.7).
lines:=v.Lines()
if!strings.HasPrefix(lines[0],"Firmado con un certificado a nombre de ")||!strings.Contains(lines[0],"Ana López")||!strings.Contains(lines[0],"Luis Gómez")||
len(lines)!=3||!strings.Contains(lines[1],"antes de la fecha de apertura")||strings.Contains(lines[1],"no antes"){
t.Errorf("lines %q",lines)
at:=signedAt.UTC().Format(time.RFC3339Nano)
want:=[]string{
"Firmado con un certificado a nombre de "+quotedNames(v)+". DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.",
" «"+v.Detail.Signers[0].Holder+"» (emisor según su certificado: «"+v.Detail.Signers[0].Issuer+"»), sellado por «TSA de prueba» el "+at+", antes de la fecha de apertura.",
" «"+v.Detail.Signers[1].Holder+"» (emisor según su certificado: «"+v.Detail.Signers[1].Issuer+"»), sellado por «TSA de prueba» el "+at+", antes de la fecha de apertura.",
" DateKeys no comprueba quién emitió los sellos.",
iff.Signature!=capsule.VerdictSignedComplete||len(f.Detail.Foreign)!=1||f.Detail.Foreign[0].Holder!="Otro"||f.Lines()[len(f.Lines())-1]!=" Otro firmante, «Otro»: válida. No cuenta."{
"Firmado con la clave dkauthor1jtf6s2c7ywr6scx40jhye32sj82rjp8a6cj7f54jsh36rd96vaqqcg54xg. No prueba quién la tiene.",
"Según un sello a nombre de Autoridad de Sellado de prueba, existía el 2023-08-23T15:09:27Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello."
"Según un sello a nombre de «Autoridad de Sellado de prueba», existía el 2023-08-23T15:09:27Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello."
"Firmado con un certificado a nombre de Luis Gómez, Ana López. DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.",
" Luis Gómez (emisor según su certificado: Luis Gómez), sellado el 2023-08-23T15:09:27Z, antes de la fecha de apertura.",
" Ana López (emisor según su certificado: Ana López), sellado el 2023-08-23T15:09:27Z, antes de la fecha de apertura."
"Firmado con un certificado a nombre de «Luis Gómez», «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.",
" «Luis Gómez» (emisor según su certificado: «Luis Gómez»), sellado por «Autoridad de Sellado de prueba» el 2023-08-23T15:09:27Z, antes de la fecha de apertura.",
" «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2023-08-23T15:09:27Z, antes de la fecha de apertura.",