Skip to content

Commit

Permalink
Merge pull request #188 from robmachado/master
Browse files Browse the repository at this point in the history
[UPD] Inclusão do CPF como OID e possibilidade de busca
  • Loading branch information
robmachado committed Jul 1, 2018
2 parents f45b853 + 1ebbe3a commit 1d0bb62
Show file tree
Hide file tree
Showing 8 changed files with 97 additions and 23 deletions.
23 changes: 8 additions & 15 deletions src/Certificate.php
Expand Up @@ -141,24 +141,17 @@ public function isExpired()
*/
public function getCnpj()
{
return $this->publicKey->cnpj;
return $this->publicKey->cnpj();
}

/**
* OID = 2.16.76.1.3.1 e
* conteúdo = nas primeiras 8 (oito) posições,
* a data de nascimento do titular,
* no formato ddmmaaaa;
* nas 11 (onze) posições subseqüentes,
* o Cadastro de Pessoa Física (CPF) do titular;
* nas 11 (onze) posições subseqüentes,
* o número de inscrição do titular no PIS/PASEP;
* nas 11 (onze) posições subseqüentes,
* o número do Registro Geral - RG do titular;
* nas 6 (seis) posições subseqüentes,
* as siglas do órgão expedidor do RG
* e respectiva UF.
* Gets CPF by OID '2.16.76.1.3.1' from ASN.1 certificate struture
* @return string
*/
public function getCpf()
{
return $this->publicKey->cpf();
}

/**
* {@inheritdoc}
Expand Down
14 changes: 12 additions & 2 deletions src/Certificate/Asn1.php
Expand Up @@ -29,7 +29,11 @@ public static function getCNPJ($publickeyUnformated)
{
//CNPJ
//OID = 2.16.76.1.3.3
return self::getOIDdata('2.16.76.1.3.3', $publickeyUnformated);
$cnpj = self::getOIDdata('2.16.76.1.3.3', $publickeyUnformated);
if (empty($cnpj)) {
return "Não existe CNPJ neste certificado.";
}
return $cnpj;
}

/**
Expand Down Expand Up @@ -58,7 +62,13 @@ public static function getCPF($publickeyUnformated)
{
//CPF
//OID = 2.16.76.1.3.1
return self::getOIDdata('2.16.76.1.3.1', $publickeyUnformated);
$resp = self::getOIDdata('2.16.76.1.3.1', $publickeyUnformated);
if (empty($resp)) {
return "Não existe CPF neste certificado.";
}
$dataNascimento = substr($resp, 0, 8);
$cpf = substr($resp, 8, 11);
return $cpf;
}

/**
Expand Down
23 changes: 18 additions & 5 deletions src/Certificate/PublicKey.php
Expand Up @@ -24,10 +24,6 @@ class PublicKey implements VerificationInterface
* @var string
*/
public $commonName;
/**
* @var string
*/
public $cnpj;
/**
* @var \DateTime
*/
Expand Down Expand Up @@ -102,7 +98,6 @@ protected function read()
$this->serialNumber = $detail['serialNumber'];
$this->validFrom = \DateTime::createFromFormat('ymdHis\Z', $detail['validFrom']);
$this->validTo = \DateTime::createFromFormat('ymdHis\Z', $detail['validTo']);
$this->cnpj = Asn1::getCNPJ($this->unFormated());
}

/**
Expand Down Expand Up @@ -150,4 +145,22 @@ public function __toString()
{
return $this->rawKey;
}

/**
* Extract CNPJ number by OID
* @return string
*/
public function cnpj()
{
return Asn1::getCNPJ($this->unFormated());
}

/**
* Extract CPF number by OID
* @return string
*/
public function cpf()
{
return Asn1::getCPF($this->unFormated());
}
}
17 changes: 16 additions & 1 deletion tests/Certificate/PublicKeyTest.php
Expand Up @@ -45,7 +45,22 @@ public function testShouldCreateFromContent()
public function testGetCNPJ()
{
$expected = '99999090910270';
$actual = $this->key->cnpj;
$actual = $this->key->cnpj();
$this->assertEquals($expected, $actual);
}

public function testGetNonExistCPF()
{
$expected = 'Não existe CPF neste certificado.';
$actual = $this->key->cpf();
$this->assertEquals($expected, $actual);
}

public function testGetCPF()
{
$key = new PublicKey(file_get_contents(__DIR__.'/../fixtures/certs/e-CPF_pubkey.pem'));
$expected = '80767940130';
$actual = $key->cpf();
$this->assertEquals($expected, $actual);
}

Expand Down
Binary file added tests/fixtures/certs/e-CPF_123456.pfx
Binary file not shown.
43 changes: 43 additions & 0 deletions tests/fixtures/certs/e-CPF_pubkey.pem
@@ -0,0 +1,43 @@
-----BEGIN CERTIFICATE-----
MIIHkTCCBXmgAwIBAgIJARjtKl5/kUHUMA0GCSqGSIb3DQEBCwUAMHcxCzAJBgNV
BAYTAkJSMRMwEQYDVQQKEwpJQ1AtQnJhc2lsMTYwNAYDVQQLEy1TZWNyZXRhcmlh
IGRhIFJlY2VpdGEgRmVkZXJhbCBkbyBCcmFzaWwgLSBSRkIxGzAZBgNVBAMTEkFD
IERJR0lUQUxTSUdOIFJGQjAeFw0xNTA2MjkxNDA1NDVaFw0xNjA2MjkxNDA1NDVa
MIHHMQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE2MDQGA1UECxMt
U2VjcmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRUw
EwYDVQQLEwxSRkIgZS1DUEYgQTExFDASBgNVBAsTCyhFTSBCUkFOQ08pMRIwEAYD
VQQLEwlBUiBTRU1QUkUxKjAoBgNVBAMTIUFERU1JUiBBTFZFUyBIRU5SSVFVRTo4
MDc2Nzk0MDEzMDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6QqH+9
43giT3idiLD3/rYsbupQ/KPyA4eCRB0njjXeV6K4R9mx3tO8pu4ewRnlb9E84QZa
smrcfOJtFoxuTjk1i/zBkGq/p2oRZ0l5fQkoEgybu5eNU+qetiy08Ur1X7h5mBDP
F5Y12ydF/JpoceLqSJ1VEdcS396RrSPSJT4TM8Ay6VCqKwI5fOsKT2xy7ugh+ZrR
YwCDpbrbdQbLGwiiEFPvLbW3F3yrQrT0zlYeIO1m3xZR3AebpSobsPcLdSEsIjwu
O9l++0vJlHPXeibiy8ApJpgFO1UbQl52SFxK06t4oMn4gtPqR+Ax0sKNdhpf1Xja
Lx6AZPN3tc+psbMCAwEAAaOCAs0wggLJMA4GA1UdDwEB/wQEAwIF4DBdBgNVHSAE
VjBUMFIGBmBMAQIBLDBIMEYGCCsGAQUFBwIBFjpodHRwOi8vd3d3LmRpZ2l0YWxz
aWduY2VydGlmaWNhZG9yYS5jb20uYnIvcmVwb3NpdG9yaW8vcmZiMIH9BgNVHR8E
gfUwgfIwVaBToFGGT2h0dHA6Ly93d3cuZGlnaXRhbHNpZ25jZXJ0aWZpY2Fkb3Jh
LmNvbS5ici9yZXBvc2l0b3Jpby9yZmIvQUNESUdJVEFMU0lHTlJGQi5jcmwwSaBH
oEWGQ2h0dHA6Ly93d3cuZGlnaXRhbHRydXN0LmNvbS5ici9yZXBvc2l0b3Jpby9y
ZmIvQUNESUdJVEFMU0lHTlJGQi5jcmwwTqBMoEqGSGh0dHA6Ly9yZXBvc2l0b3Jp
by5pY3BicmFzaWwuZ292LmJyL2xjci9EaWdpdGFsU2lnbi9BQ0RJR0lUQUxTSUdO
UkZCLmNybDBrBggrBgEFBQcBAQRfMF0wWwYIKwYBBQUHMAKGT2h0dHA6Ly93d3cu
ZGlnaXRhbHNpZ25jZXJ0aWZpY2Fkb3JhLmNvbS5ici9yZXBvc2l0b3Jpby9yZmIv
QUNESUdJVEFMU0lHTlJGQi5wN2IwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF
BwMEMAkGA1UdEwQCMAAwgZ8GA1UdEQSBlzCBlIEfYWRlbWlyQHNhYmVkb3JpYWNv
bnRhYmlsLmNvbS5icqA4BgVgTAEDAaAvBC0xMDEyMTk3ODgwNzY3OTQwMTMwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDCgHgYFYEwBAwWgFQQTMDAwMDAwMDAwMDAw
MDAwMDAwMKAXBgVgTAEDBqAOBAwwMDAwMDAwMDAwMDAwHwYDVR0jBBgwFoAU52U0
dGgRjgLhhAU2vypHgIoJXf4wDQYJKoZIhvcNAQELBQADggIBAGGPGrvMjDQa1/gT
M8ztlHaThxlzwE8xPNsckkdsldsrh7Q9GySekDDB77LBQOv+ypkMOOUVtvoCKWMy
6hBRTq5D0dxuGDXuV9psh8MWcLyjLGhf1C2kYIlrwYYrT4jhRTccqe80KJpD/unl
CsNq+R4t8xPLfDxQrFgKvOGpDjHV10r/rBrmAMA+XkrHSejMHieJf8BkptYeX6/m
Cm2jyK+1VM8Ddg5QVnSXtEZcZjsaaX5pzYhl/iCGKn7l7DNDYsi68SlSgYZLuvbF
zJXDjDVUOv0vbB2/uXY9kxOl5JQBuWE8j3Tsx+T83PzyyPXVRkCkmkz82XAJQ7RD
uEF1/jrvXwZWYbo9ITI59etqG1ZVlwZQX+wm0KrorT6yXoPBlImLD4SRw6yUY978
8jVnVsErkER0rBaeMF0Y832crcZv7l5EnoQQ3EFgkU3iJoXER6siAL56epBRRAzs
7d3SlS9+L3WHSjw9BUyClC3KfswBqmp1VTw/3F7Ml9Pu1uaxLwt6/l+UTC/5ZPF5
2PhM54YOPLkjpmxCzBQ+3WzzfExkd6hmZXsYEYgUjoEBlItC3WX16t5KfhYd4B1N
q/x3R6aE6iFwk0dtOUIGMDaV5Frrn1l7PRYvQekUJj+WT//nwTNiO6i6xwGalCfA
X3vSQJ3iabaarQP0huAMJOOP0gGk
-----END CERTIFICATE-----
Empty file modified tests/fixtures/xml/NFe/2017signedDigestFail.xml 100644 → 100755
Empty file.
Empty file modified tests/fixtures/xml/NFe/2017signedSignatureFail.xml 100644 → 100755
Empty file.

0 comments on commit 1d0bb62

Please sign in to comment.