BLOBs de chave pública Diffie-Hellman versão 3
Os BLOBs de chave pública Diffie-Hellman versão 3 (tipo PUBLICKEYBLOB) são usados para exportar e importar informações sobre uma chave pública DH. Eles têm o seguinte formato:
BLOBHEADER blobheader;
// As explained under "Data Structures"
DHPUBKEY_VER3 dhpubkeyver3;
BYTE p[dhpubkeyver3.bitlenP/8];
// Where P is the prime modulus
BYTE q[dhpubkeyver3.bitlenQ/8];
// Where Q is a large factor of P-1
BYTE g[dhpubkeyver3.bitlenP/8];
// Where G is the generator parameter
BYTE j[dhpubkeyver3.bitlenJ/8];
// Where J is (P-1)/Q
BYTE y[dhpubkeyver3.bitlenP/8];
// Where Y is (G^X) mod P
Esse formato BLOB é exportado quando o sinalizador CRYPT_BLOB_VER3 é usado com CryptExportKey. Como a versão está no BLOB, não há necessidade de especificar um sinalizador ao usar esse BLOB com CryptImportKey.
Além disso, esse formato BLOB é usado com a função CryptSetKeyParam quando o valor dwParam KP_PUB_PARAMS é usado para definir parâmetros de chave em uma chave DH. Isso é feito quando o sinalizador CRYPT_PREGEN é usado para gerar a chave. Quando usado nessa situação, o valor y é ignorado e, portanto, não deve ser incluído no BLOB.
A tabela a seguir descreve cada componente do BLOB de chave.
Campo | Descrição |
---|---|
Cabeçalho de blob | Uma estrutura BLOBHEADER. O membro bType deve ter um valor de PUBLICKEYBLOB. |
dhpubkeyver3 | Uma estrutura DHPUBKEY_VER3. O membro mágico deve ser definido como 0x33484400 para chaves públicas. Observe que o valor hexadecimal é apenas uma codificação ASCII de "DH3". |
P | O valor P está localizado diretamente após a estrutura DHPUBKEY_VER3 e deve ser sempre o comprimento, em bytes, do campo bitlenP DHPUBKEY_VER3 (comprimento de bit de P) dividido por oito (formato little-endian). |
Q | O valor Q está localizado diretamente após o valor P e deve ser sempre o comprimento, em bytes, do campo bitlenQ DHPUBKEY_VER3 dividido por oito (formato little-endian). Se o valor bitlenQ for 0, o valor estará ausente do BLOB. |
G | O valor G está localizado diretamente após o valor Q e deve ser sempre o comprimento, em bytes, do campo bitlenPDHPUBKEY_VER3 (comprimento de bits de P) dividido por oito. Se o comprimento dos dados for um ou mais bytes menor que P dividido por 8, os dados deverão ser preenchidos com os bytes necessários (de valor zero) para tornar os dados com o comprimento desejado (formato little-endian). |
J | O valor J está localizado diretamente após o valor G e deve ser sempre o comprimento, em bytes, do campo bitlenJ DHPUBKEY_VER3 dividido por oito (formato little-endian). Se o valor bitlenQ for 0, o valor estará ausente do BLOB. |
Y | O valor Y, (G^X) mod P, está localizado diretamente após o valor J e deve ser sempre o comprimento, em bytes, do campo bitlenP DHPUBKEY_VER3 (comprimento de bits de P) dividido por oito. Se o comprimento dos dados que resulta do cálculo de (G^X) mod P for um ou mais bytes menor que P dividido por 8, os dados devem ser preenchidos com os bytes necessários (de valor zero) para tornar os dados o comprimento desejado (formato little-endian). Quando essa estrutura é usada com CryptSetKeyParam com o valor dwParam KP_PUB_PARAMS, esse valor não é incluído no BLOB. |
Observação
Os BLOBs de chave pública não são criptografados, mas contêm chaves públicas em formato de texto simples.