quinta-feira, maio 10, 2007

Assinatura Eletronica e JavaScript

Documento HTML assinado


O arquivo HTML abaixo contém duas áreas de texto para o documento e a assinatura e uma rotina em javascript que monta o conteúdo a ser exibido: o documento assinado e os assinantes ao rodapé.

Se o cartão de identidade digital estiver inserido, a rotina exibe o conteúdo assinado ou co-assinado, caso o documento já contenha uma outra assinatura.

Também está embutido no código algum tratamento básico de erros.

Código Exemplo


<html>

..<head>

....<title>Documento</title>

..<OBJECT id="oCAPICOM" codeBase="http://download.microsoft.com/download/E/1/8/E18ED994-8005-4377-A7D7-0A8E13025B94/capicom.cab#version=2,0,0,3" classid="clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679" VIEWASTEXT></OBJECT>

..<script language="JavaScript">

....// CAPICOM constants

....var CAPICOM_STORE_OPEN_READ_ONLY = 0;

....var CAPICOM_CURRENT_USER_STORE = 2;

....var CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;

....var CAPICOM_ENCODE_BASE64 = 0;

....var CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE = 1;

....function inicio()

....{

......if (txtAssinou.value=='S') return;

......else txtAssinou.value='S';

......try

......{

......var MyStore = new ActiveXObject("CAPICOM.Store");

......}

......catch(e)

......{

........publica("Sem suporte a ActiveX/CAPICOM: \n" + e.description);

........return;

........alert("alguma coisa terrível está acontecendo.");

......}

......//Suporte CAPICOM ok

......var SignedData = new ActiveXObject("CAPICOM.SignedData");

......var Signer = new ActiveXObject("CAPICOM.Signer");

......var TimeAttribute = new ActiveXObject("CAPICOM.Attribute");

......MyStore.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);

......SignedData.Content = txtDocumento.value;

......if (MyStore.Certificates.Count > 0)

......{

........if (MyStore.Certificates.Count==1) Signer.Certificate = MyStore.Certificates.Item(1)

........else

........try

........{

..........Signer.Certificate = MyStore.Certificates.Select().Item(1);

........}

........catch(e)

........{

..........publica(e.description);

..........return;

........}

........//Data

........var Today = new Date();

........TimeAttribute.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;

........TimeAttribute.Value = Today.getVarDate();

........Today = null;

........Signer.AuthenticatedAttributes.Add(TimeAttribute);

........//Assina ou Co-Assina

........if (txtAssinatura.value.length>0)

........{

..........try

..........{

............SignedData.Verify(txtAssinatura.value,true,CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE);

..........}

..........catch(e)

..........{

............publica('Não foi possível validar a assinatura: \n' + e.description);

............return;

..........}

..........try

..........{

............txtAssinatura.value=SignedData.CoSign(Signer, CAPICOM_ENCODE_BASE64);

..........}

..........catch(e)

..........{

............publica('Não foi possível co-assinar o documento: \n' + e.description);

............return;

..........}

........}

........//Assina

........else

........{

..........try

..........{

............txtAssinatura.value=SignedData.Sign(Signer, true, CAPICOM_ENCODE_BASE64);

..........}

..........catch(e)

..........{

............publica('Não foi possível assinar o documento: \n' + e.description);

............return;

..........}

........}

........txtAssinou.value='S';

......}..

......//Validar Assinatura

......try

......{

........SignedData.Verify(txtAssinatura.value,true,CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE);

......}

......catch(e)

......{

........publica('Não foi possível validar a assinatura: \n' + e.description);

........return;

......}

......//Extrair Signatários

......var i=0;

......var j=0;

......var v_msg="";

......for(i=1;i<=SignedData.Signers.Count;i++)

......{

........v_msg=v_msg+i+'. '+SignedData.Signers.Item(i).Certificate.SubjectName;

........for (j=1;j<=SignedData.Signers.Item(i).AuthenticatedAttributes.Count;j++)

..........v_msg=v_msg+' '+j+'. '+SignedData.Signers.Item(i).AuthenticatedAttributes.Item(j).Value;

........v_msg=v_msg+'\n<br>';

......}

......if (v_msg!="")

......{

........var Today = new Date();

........v_msg='<font size=-5>\n'+v_msg+'Assinatura certificada em '+Today.getVarDate()+'.\n</font>';

........Today = null;

......}

......//Mostra o Documento com os Signatários

......publica(v_msg);

....}

....function publica(p_msg)

....{

......var mywin = window.open('','_self','width=580,height=475,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,copyhistory=no,resizable=yes')

......mywin.document.writeln(txtDocumento.value);

......mywin.document.writeln('<hr>');

......mywin.document.writeln(p_msg);

....}

....</script>

..</head>

<body OnLoad="inicio()">

<p><b>TEXTO DO DOCUMENTO</b><p>

<!-- Início do Documento -->

<textarea disabled cols="80" rows="10" id="txtDocumento">

</textarea>

<!-- Fim do Documento -->

<html>

..<head>

....<title>Documento Teste – Marcos Katsumi Kay</title>

</head>

<body>

</body>

<p><center><b>

..COLOQUE AQUI O CONTEÚDO DO SEU DOCUMENTO HTML

</b></center></p>

<html>

<p><b>ASSINATURA DIGITAL</b><p>

<!-- Início da Assinatura -->

<textarea disabled cols="80" rows="10" id="txtAssinatura">

MIIgCwYJKoZIhvcNAQcCoIIf/DCCH/gCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3

DQEHAaCCG1wwggQ4MIIDIKADAgECAgEVMA0GCSqGSIb3DQEBBQUAMIG0MQswCQYD

VQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsGA1UECxM0SW5zdGl0dXRv

IE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3JtYWNhbyAtIElUSTERMA8G

..SUBSTITUA ISSO AQUI PELA ASSINATURA DO CONTEÚDO DO DOCUMENTO

NTE1MTUyMVowIwYJKoZIhvcNAQkEMRYEFEw5W9eBnVWYLEVqqG1izBwRc6jUMA0G

CSqGSIb3DQEBAQUABIGAjwsfd03Z76ygBlvEEYR2SdtSYGA6fQ8S8gFmkiYzy7o/

Ggss/pM8pskvc3Z5MLao5vx2ZG5YCiodeWIevxX3ljaV3fY0mPk+rFT4M6RRqjxF

IYZvTbN2WdKrTFlLU539C7AbqSYpfJ11qfIBGvPAJWZgNCwWcMpp3hjOJKXXJ28=

</textarea>

<!-- Fim da Assinatura -->

<p><input type="text" style="display:none" id="txtAssinou" size="1" value="N" hash=""/>

</body>

</html>