Não, as informações vêm do certificado mantido em seu anel de chave pública (ou baixado de um servidor de chaves). A assinatura contém apenas algumas informações necessárias para encontrar o certificado correto.
Use gpg --list-packets
ou pgpdump
:
$ echo Foo. > foo.txt $ gpg --detach-sign foo.txt $ gpg --list-packets < foo.txt.sig :signature packet: algo 1, keyid D24F6CB2C1B52632 version 4, created 1410762670, md5len 0, sigclass 0x00 digest algo 10, begin of digest 25 58 hashed subpkt 2 len 4 (sig created 2014-09-15) subpkt 16 len 8 (issuer key ID D24F6CB2C1B52632) data: [4091 bits]
Uma assinatura separada possui um pacote "assinatura", contendo os algoritmos, o registro de data e hora de assinatura e o ID da chave de 8 bytes do assinante, que é usado para procurar o certificado do assinante no chaveiro. (Se você não tiver nenhuma chave pública com esse keyid, o GnuPG tentará encontrar uma em servidores de chaves públicos.)
(não sei por que tem o ID da chave duas vezes.)
O GnuPG obtém tudo sobre o signatário procurando pelo keyid - tanto a chave pública para verificar a assinatura, como também os campos userid (nome, endereço, foto) usada para descrever o signatário.
Além de: Observe que o seu exemplo tem um pequeno código de 4 bytes, o que é muito ruim, já que houve algumas centenas de colisões curtas, tanto intencionais quanto acidentais. Usar keyid-format long
no seu ~ / .gnupg / gnupg.conf faria com que ele exibisse keyides mais longos, embora estes ainda sejam fáceis de colidir intencionalmente, então você deve sempre verificar a impressão digital ao importar uma nova chave.
(Os pacotes de assinatura, no entanto, sempre mantêm um keyID de 8 bytes. Algumas pessoas configuram o GnuPG para colocar a impressão digital em um campo personalizado (notação), mas isso infelizmente não é usado pelo próprio software.)
Voltar para assinaturas. Se você fez gpg --list-packets
em uma assinatura regular (inline), verá mais algumas coisas:
:compressed packet: algo=1 :onepass_sig packet: keyid D24F6CB2C1B52632 version 3, sigclass 0x00, digest 10, pubkey 1, last=1 :literal data packet: mode b (62), created 1410762587, name="", raw data: 5 bytes :signature packet: algo 1, keyid D24F6CB2C1B52632 version 4, created 1410762587, md5len 0, sigclass 0x00 digest algo 10, begin of digest eb 31 hashed subpkt 2 len 4 (sig created 2014-09-15) subpkt 16 len 8 (issuer key ID D24F6CB2C1B52632) data: [4095 bits]
A mensagem assinada atual está no pacote "literal data", geralmente compactado usando DEFLATE ( pgpdump
mostraria o algoritmo real sendo usado).
Ele é precedido por um pacote "onepass_sig", cuja única finalidade é fornecer o keyid sem ter que ler até o final da mensagem inteira - assim o GnuPG pode começar a procurar pelo keyid e prosseguir com a verificação da mensagem de uma só vez. (Ao ler de um tubo, por exemplo, cat|gpg
, é impossível procurar para frente e para trás; tudo deve ser lido em uma única passagem.)
Se você quiser, você pode fazer isso com a chave do assinante (certificado) também. Basta exportá-lo para um arquivo primeiro:
# gpg --export D24F6CB2C1B52632 | gpg --list-packets :public key packet: version 4, algo 1, created 1256993643, expires 0 pkey[0]: [4096 bits] pkey[1]: [17 bits] keyid: D24F6CB2C1B52632 :user ID packet: "Mantas Mikul\xc4\x97nas " :signature packet: algo 1, keyid D24F6CB2C1B52632 version 4, created 1256993643, md5len 0, sigclass 0x13 digest algo 10, begin of digest 5a e2 [many more lines]
Os certificados também consistem em pacotes, começando com uma chave pública, userid's (etiquetas de texto) com uma assinatura própria para cada um (para proteger contra alguém anexando userids falsos ao pubkey), então vários pacotes de subchave pública (novamente com auto-assinaturas).