Exemplo PHP

Pré requisitos:

  • PHP instalado.

  • Composer instalado.

Com tudo preparado, precisamos instalar as dependencias do projeto, para isso execute os seguintes comandos:

composer require phpseclib/phpseclib
composer require guzzlehttp/guzzle

Estes comandos acima irão gerar uma pasta vendor com todas as dependencias, e os arquivos composer.json e composer.lock.

Com as dependencias instaladas, crie um arquivo PHP, e inclua o seguinte código:

<?php

require_once 'vendor/autoload.php'; // Inclui o autoload do Composer

use phpseclib3\File\ASN1;
use GuzzleHttp\Client;


// URL da Autoridade de Carimbo de Tempo (ACT)
$act_url = 'https://gateway-act.hom.vaultid.com.br/api/act';

// Usuário e senha forncecidos pela equipe de integração
$username = 'usuario';
$password = 'senha';

// Dados a serem carimbados
$data_to_stamp = 'Hello, world!';

// Montar a solicitação TSQ em ASN.1
// Mapeamento ASN.1
$tsq_mapping = [
    'type' => ASN1::TYPE_SEQUENCE,
    'children' => [
        'version' => ['type' => ASN1::TYPE_INTEGER, 'value' => 1],
        'messageImprint' => [
            'type' => ASN1::TYPE_SEQUENCE,
            'children' => [
                'hashAlgorithm' => [
                    'type' => ASN1::TYPE_SEQUENCE,
                    'children' => [
                        'algorithm' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER, 'value' => 'sha256'],
                        'parameters' => ['type' => ASN1::TYPE_NULL],
                    ],
                ],
                'hashedMessage' => ['type' => ASN1::TYPE_OCTET_STRING, 'value' => hash('sha256', $data_to_stamp)],
            ],
        ],
        'certReq' => ['type' => ASN1::TYPE_BOOLEAN, 'value' => true],
    ],
];

$tsq_content = $request = [
            'version' => 1,
            'messageImprint' => [
                'hashAlgorithm' => [
                    'algorithm' => '2.16.840.1.101.3.4.2.1',
                    'parameters' => ['null' => '']
                ],
                'hashedMessage' => base64_encode(hex2bin(hash('sha256', $data_to_stamp))),
            ],
            'certReq' => true,
];


// Codificar o mapeamento ASN.1 e o conteúdo
$tsq_der = ASN1::encodeDER($tsq_content,$tsq_mapping);


// Criar uma instância do cliente http Guzzle
$client = new Client();

    // Enviar a solicitação POST para a ACT
    $response = $client->post($act_url, [
        'headers' => [
            'Content-Type' => 'application/timestamp-query',
            'Authorization' => 'Basic ' . base64_encode("$username:$password") //Autenticação Basic Authentication
        ],
        'body' => $tsq_der,
    ]);

    // Obter o corpo da resposta da ACT
    $tsr = $response->getBody()->getContents();

    //Este é o Carimbo de Tempo (TSR):
    $tsr;

    // Aqui será feito o decode para visualizar o conteúdo do carimbo de tempo
    $tsr_decoded = ASN1::decodeBER($tsr);
    
    if (!$tsr_decoded) {
        echo 'Erro ao decodificar a resposta TSR.';
    } else {
        echo 'Resposta TSR: '.PHP_EOL; print_r($tsr_decoded[0]['content']); PHP_EOL;
    }

?>

Execute o código de exemplo, será exibido um array com o parse do carimbo de tempo enviado pela ACT.

Neste exemplo não é feito nenhuma validação do carimbo de tempo (TSR), mas é importante fazer todas as validações necessárias após receber o carimbo, conforme o DOC-ICP-12, sessão 4.3.

Referencia:

https://www.gov.br/iti/pt-br/assuntos/legislacao/resolucoes/resolucoes-old/DOCICP12v2.1CompiladaRes_188.pdf

Last updated