Beruflich Dokumente
Kultur Dokumente
SIDNEY LOYOLA DE S
Niteri
2012
SIDNEY LOYOLA DE S
Orientador:
Jacques Alves da Silva
NITERI
2012
SIDNEY LOYOLA DE S
_________________________________________
Prof. Eyder Franco Sousa Rios, Msc. Avaliador
UFF Universidade Federal Fluminense
Dedico este trabalho a minha me que sonhou com esse dia e essa realizao. Conseguimos.
AGRADECIMENTOS
RESUMO
Atualmente o poder computacional dos dispositivos mveis permite aplicaes sofisticadas e complexas, assim j possvel utiliza-los para aplicaes criptogrficas. O
objetivo deste trabalho desenvolver um aplicativo para Android que permita a realizao de assinaturas digitais, bem como um estudo sobre criptografia e sobre as
tcnicas criptogrficas necessrias para a realizao da Assinatura Digital. O Android foi escolhido por ser uma plataforma livre e de cdigo aberto, ideal para o
aprendizado e para a pesquisa. No final do trabalho apresentamos nossas concluses e sugestes para trabalhos futuros.
Palavras-chaves: Android, Criptografia e Assinatura Digital.
ABSTRACT
Currently the computational power of mobile devices allows sophisticated and complex applications, so it is possible to use them for cryptographic applications. The
objective of this work is to develop an application for Android that allows digital signatures and a study on encryption and cryptographic techniques necessary for the Digital Signature. The Android was chosen because it is a free platform and open source,
ideal for learning and research. At the end of the paper we present our conclusions
and suggestions for future work.
LISTA DE ILUSTRAES
LISTA DE TABELAS
AC - Autoridade Certificadora
ADT Android Development Tools (Ferramentas de Desenvolvimento Android)
AES Advanced
Avanada)
AVD Android Virtual Device (Dispositivo Virtual Android)
API - Application Programming Interface (Interface de Programao de Aplicativos)
DES - Data Encryption Standard (Padro de Criptografia de Dados)
3-DES - Triple Data Encryption Standard (Padro de Criptogtafia de Dados Triplo)
GPS Global Positioning System (Sistema de Posicionamento Global)
IDE Integrated Development Environment (Ambiente de Desenvolvimento Integrado)
MAC Message Authentication Code (Codigo de Autenticao de Mensagem)
PKCS - Public-Key Cryptography Standards (Padres de Criptografia de Chave Pblica)
PKI Public Key-Infrastructure (Infra Estrutura de Chave Pblica)
SDK Software Development Kit (Conjunto de Desenvolvimento de Software)
UML Unified Modeling Language (Linguagem de Modelagem Unificada)
XML Extensible Markup Language (Linguagem de Marcao Extensivel)
SUMRIO
RESUMO
ABSTRACT
LISTA DE ILUSTRAES
LISTA DE TABELAS
10
11
1INTRODUO
14
1.1 MOTIVAO
14
1.2 OBJETIVO
15
15
2 CRIPTOGRAFIA
16
2.1 DEFINIO
16
17
CRIPTOGRAFIA ASSIMTRICA
23
28
30
33
33
35
38
40
40
42
4.3 IMPLEMENTAO
47
49
51
REFERNCIAS BIBLIOGRFICAS
52
54
14
1 INTRODUO
Em um mundo cada vez mais interconectado atravs de sistemas computacionais ningum duvida de que a segurana de computadores importante, mas o
que muitas vezes passa despercebido que tcnicas de segurana possam facilitar
o nosso dia a dia e aumentar a nossa produtividade.
Uma tcnica de segurana computacional capaz de incrementar a produtividade a Assinatura Digital, pois garante a autenticidade e a integridade do documento, alm de acelerar o processo de obteno da assinatura. Um exemplo seria
uma empresa que necessita da assinatura de um gerente de operaes para fechar
um contrato, supondo que este estava sendo negociado h meses pode ocorrer de,
exatamente neste perodo, o gerente encontrar-se viajando.
A soluo para esse problema atravs do processo convencional seria enviar esse documento ao gerente que receberia, assinaria e retornaria o documento,
possivelmente atravs do correio, levando alguns dias para que o negcio pudesse
ser concretizado. Utilizando a Assinatura Digital o gerente receberia o documento e
o assinaria digitalmente, retornando-o atravs de email, dessa forma o negcio seria
fechado no mesmo dia e possivelmente na mesma hora.
1.1
MOTIVAO
15
1.2
OBJETIVO
1.3
ORGANIZAO DO TRABALHO
16
2 CRIPTOGRAFIA
A Criptografia existe h milhares de anos, mas com o avano dos computadores e principalmente da Internet adquiriu importncia vital para a vida cotidiana.
Mesmo pessoas comuns j ouviram algo a respeito de Criptografia, hackers, vrus,
ameaas e fraudes na Internet.
Mesmo com tanta divulgao sobre segurana e criptografia, poucas pessoas conhecem o seu verdadeiro significado, por isso ainda existe tanto receio em
transaes efetuadas na Internet.
Neste captulo ser apresentado o conhecimento terico necessrio para o
entendimento da criptografia e, principalmente, para o entendimento da assinatura
digital.
2.1
DEFINIO
17
2.2
CRIPTOGRAFIA SIMTRICA
2.2.1 FUNCIONAMENTO
18
Onde:
C = texto cifrado
T = texto claro
,e
19
Para obter-se o texto claro usa-se a funo inversa da utilizada para cifrar
o texto. Como a Cifra de Csar usa sempre a mesma substituio (o nmero 3 que
representa o deslocamento) o mesmo texto ser cifrado sempre da mesma maneira,
assim fica fcil descobrir a mensagem original. Para aumentar a segurana da cifra
pode-se introduzir uma chave, que nesse caso ser o nmero de deslocamentos,
assim matematicamente temos:
,e
Onde:
C = texto cifrado
T = texto claro
k = chave
Esse processo de utilizar uma chave aumenta a segurana da cifra, pois existem agora 26 maneiras diferentes de se criptografar a mesma mensagem dependendo da chave utilizada. A Tabela 1 mostra todas as formas cifradas do mesmo
texto dependendo da chave.
O adversrio que quiser tentar adivinhar a cifra, agora ter que descobrir a
chave utilizada para a criptografia.
20
Texto Claro
Chave
Texto Cifrado
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
21
Texto Cifrado
Chave
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
22
tentativas
Tamanho da cha-
N de chaves
ve(bits)
Tempo mdio
1 tentativa /
Tempo mdio
tentativas /
32
35,8 minutos
2,15 milisegundos
56
1142 anos
10,01 horas
128
168
Tabela 3: Tempo mdio para busca de chave [12]
23
Para evitar este tipo de ataque utiliza-se outra tcnica de criptografia, conhecida como transposio [12], que consiste em permutar as letras da mensagem. Assim, por exemplo, a palavra touca poderia ficar : touac,otuca,catou e assim por
diante. Ainda pode-se aplicar a anlise de frequncia, mas se teria mais dificuldade
de encontrar o texto claro.
Os sistemas criptogrficos atuais utilizam combinaes dessas duas tcnicas
para aumentar a eficcia [12]. Outra mudana foi com relao ao segredo dos algoritmos, como visto com o exemplo do tamanho da chave, se as chaves forem suficientemente grandes pode-se deixar o algoritmo conhecido. Essa atitude apresenta
como vantagem permitir que a comunidade de criptoanalistas estude e ataque o algoritmo, divulgando informaes sobre falhas e possveis melhorias mantendo o algoritmo seguro, sendo o ataque de fora bruta a nica maneira de quebr-lo.
A criptografia simtrica ideal para manter a confidencialidade de arquivos e
dados, a grande questo como manter a chave secreta e principalmente como
compartilh-la de uma forma segura.
2.3
CRIPTOGRAFIA ASSIMTRICA
24
( )
( )
2.3.1 FUNCIONAMENTO
25
26
1978,
trs
professores
do
Instituto
MIT,
Ronald
Ri-
2.3.2.1 DESCRIO
Onde:
C = texto cifrado,
M = texto claro,
n = nmero escolhido,
27
( ).
)(
), sendo p e
q nmeros primos, assim o nosso n passa a ser pq, onde lembrando da descrio
de criptografia assimtrica sobre funo unidirecional sabe-se que calcular n = pq
computacionalmente fcil, mas dado um n grande encontrar p e q computacionalmente difcil.
O algoritmo utilizado para a gerao de chaves o seguinte:
1. Selecione p e q primos
2. Calcule n = p x q
3. Calcule ( )
)(
( )
( ( ) )
( )
28
2.4
A autenticao de mensagens e as funes de hash so tcnicas utilizadas para garantir a integridade dos dados da mensagem transmitida, ou seja, que a
mensagem recebida a mensagem original, garantindo que ela no foi alterada de
nenhuma forma [12]. Alm disso, essas tcnicas ainda permitem a autenticao da
origem.
Para entender a importncia da integridade de dados vamos usar como
exemplo a Cifra de Csar com k = 3, ento a mensagem Roma vai dominar o mundo ser criptografada como urpd ydl grplqdu r pxqgr. Decriptografando essa mensagem, recupera-se a mensagem original, mas o que aconteceria se um oponente
interceptasse a mensagem e enviasse uma mensagem aleatria em seu lugar.
Como exemplo, o texto aleatrio xrta hfgrad lsoms fr gadhjs seria decriptografado como uoqx ecdoxa ipljp co dxaegp, usando o portugus fica fcil de ver
que esta mensagem no tem nenhum significado. Muitas vezes as mensagens criptografadas so apenas padres de bits e o reconhecimento se uma mensagem tem
significado ou no difcil de ser automatizado.
Utilizando uma funo de autenticao de mensagem ou uma funo hash
tem-se a confiana necessria de que a mensagem recebida foi a mensagem enviada, como ser visto nas Sees 2.4.1 e 2.4.2.
A autenticao de mensagem usa uma funo de comprimento fixo, chamada MAC (cdigo de autenticao de mensagem), tambm conhecida como soma
de verificao criptogrfica, que se utiliza de uma chave para gerar um pequeno bloco de dados [12]. Este bloco anexado junto mensagem, ento bloco e mensagem so criptografados e enviados ao destinatrio.
29
30
2.5
ASSINATURA DIGITAL
A assinatura digital [12] foi desenvolvida pensando-se em substituir a assinatura de papel e como forma de resolver uma disputa entre duas partes envolvidas,
Stallings afirma: Uma assinatura digital uma tcnica de autenticao que tambm
inclui medidas para impedir a retratao pela origem. [12,p.227].
Possuindo um formato digital ela apresenta algumas caractersticas intrnsecas a esse formato. Os requisitos para uma assinatura digital [12] que ela seja
capaz de:
Verificar o autor.
Garantir a irretratabilidade da assinatura, ou seja, o assinante no pode negar que efetuou a mesma (no-repdio).
II.
III.
IV.
V.
31
VI.
Stallings [12] afirma que: A RFC 2822 (Internet Security Glossary) define
a infra-estrutura de chave pblica (PKI Public Key-Infrastructure) como o conjunto
de hardware, software, pessoas, polticas e procedimentos necessrios para criar,
gerenciar, armazenar, distribuir e revogar certificados digitais com base na criptografia assimtrica. Apesar dessa definio ser bastante completa preciso entender o
significado de certificado digital para uma melhor compreenso do que vem a ser
uma Infra-Estrutura de chave pblica.
O certificado digital um arquivo eletrnico que apresenta a identificao
do seu proprietrio e a sua chave pblica, e utilizado para divulgar a chave pblica
do usurio a todos que necessitem verificar as assinaturas digitais realizadas por
esse usurio [12]. utilizado como garantia de que a chave pblica utilizada na verificao da assinatura no foi alterada por terceiros.
Um exemplo de aplicao desse conceito seria um documento de doao
de A para C, onde esse documento tem de ser apresentado a B para que tenha eficcia. Se C gerar um par de chaves qualquer assinando o documento, C poderia
informar a B que aquela chave pblica gerada pertence a A, falsificando o documento. Para evitar esse tipo de falsificao utilizam-se os certificados digitais.
Como visto no exemplo anterior, a distribuio de chave pblica tem de
ser feita de uma maneira confivel. Para resolver este problema e o problema da
32
33
3 ANDROID
3.1
DESCRIO DA ARQUITETURA
34
35
Android como acesso a internet, banco de dados, cmera, GPS, interfaces grficas e
outros.
No topo da pilha encontram-se as aplicaes que o usurio pode utilizar e
nesta camada que o aplicativo desenvolvido neste trabalho ir se localizar. Um
diferencial do Android para outras plataformas de dispositivos mveis que no h
diferena entre uma aplicao nativa do sistema e outra produzida por desenvolvedores independentes, isso garante que uma aplicao independente pode utilizar
todo o poder computacional do dispositivo.
3.2
AMBIENTE DE DESENVOLVIMENTO
36
37
38
3.3
VISO DE UM APLICATIVO
Ao se criar um projeto Android necessrio especificar o nome do projeto, o nome do pacote, o nome da classe que ser criada, a verso alvo do Android e
a verso mnima do SDK necessrio para executar o aplicativo. Uma estrutura de
diretrios pr-definida ser criada como mostrado na Figura 5, bem como alguns
arquivos essenciais a um aplicativo Android.
Apesar de se utilizar a linguagem JAVA no desenvolvimento de aplicativos Android, existem pequenas diferenas e alguns conceitos novos necessrios
para a criao desses programas. Uma diferena essencial est na aplicao do
paradigma MVC (Modelo Viso Controle ) [1]. Todo aplicativo Android possui um
arquivo XML responsvel pela apresentao visual, uma Activity que a classe responsvel por captar as interaes com o usurio e as outras classes JAVA que correspondem ao modelo da aplicao. A classe Activity criada por padro no Eclipse
exibe o clssico texto Hello World e o nome do projeto.
Todo o layout de uma tela feito atravs de um arquivo XML, quais componentes sero utilizados, seu posicionamento, as cores da tela, as imagens e todos
os detalhes do layout esto nesse arquivo. Para que esta tela seja exibida necessitase de uma Activity que a classe responsvel por definir qual View ser desenhada
na tela e por controlar os eventos desta [7].
39
gen Esta pasta possui uma classe, R.java, gerada automaticamente com a finalidade de permitir o acesso das classes dos projetos aos recursos como arquivos e imagens.
40
4 ASSINADOR DIGITAL
O aplicativo desenvolvido possibilita a assinatura digital, bem como a verificao de uma assinatura utilizando dispositivos mveis que possuam o sistema
Android, essa verificao garante a integridade e a autenticidade do documento. A
assinatura efetuada utilizando o hash SHA1 com o algoritmo de chave assimtrica
RSA.
Este captulo aborda tanto a modelagem e anlise do software, bem como
a sua implementao. Dois casos de uso foram descritos e utilizados para a elicitao dos requisitos funcionais, j os requisitos no funcionais foram obtidos aps diversos testes e pesquisas. Os diagramas UML foram utilizados para um melhor entendimento do sistema.
4.1
O aplicativo desenvolvido deve permitir a Assinatura de documentos eletrnicos e deve ser capaz de verificar a validade de tais Assinaturas. interessante
notar que documento eletrnico pode ser qualquer arquivo digital, como arquivos de
texto, imagens, udio, vdeos, etc.
Para a realizao da Assinatura necessrio que o usurio possua uma
chave privada e o documento a ser assinado, esta chave privada deve estar armazenada num arquivo PKCS#12. PKCS o acrnimo de Public-Key Cryptography
Standards [4] e PKCS#12 um formato de arquivo utilizado para armazenar chaves
privadas com os seus respectivos certificados de chave pblica. O PKCS#12 tambm pode armazenar apenas certificados e o padro utilizado neste trabalho por
ser o mais utilizado em softwares de Assinatura Digital.
41
As assinaturas digitais devem ser geradas utilizando o algoritmo RSA e funo hash SHA1.
As assinaturas geradas devem utilizar a extenso .p7s e no devem estar encapsuladas com o documento original.
42
4.2
MODELAGEM DO SISTEMA
43
Fluxo Alternativo :
1a. Arquivo PKCS#12 invlido :
1. Aplicativo informa que o arquivo invlido.
2. Aplicativo solicita que o Usurio selecione outro arquivo.
3a. Senha Incorreta.
1. Aplicativo informa ao Usurio e aguarda que o mesmo digite
nova senha.
7a. Senha Incorreta.
1. Aplicativo informa ao Usurio e aguarda que o mesmo digite
nova senha.
Para este caso de uso foi desenhado um diagrama de atividades apresentado na figura 7. No diagrama est representado apenas o fluxo principal do caso de
uso.
44
45
Fluxo Alternativo :
2a. Arquivo PKCS#12 invlido :
1. Aplicativo informa que o arquivo invlido.
2. Aplicativo solicita que o Usurio selecione outro arquivo.
4a. Senha Incorreta.
1. Aplicativo informa ao Usurio e aguarda que o mesmo digite
nova senha.
Para o caso de uso Verificar Assinatura foi desenhado o diagrama de atividades da figura 8, como no caso de uso anterior foi representado apenas o fluxo
principal .
46
47
4.3
IMPLEMENTAO
48
O mtodo assinar() est representado no diagrama de sequncia da Figura 9. A classe Signature utiliza o mtodo getInstance(Sha1WithRSA, BC) para
obter uma instncia que ir utilizar o algoritmo de assinatura RSA com o hash SHA 1
utilizando o provider do BouncyCastle.. Aps isso, esta instncia de Signature inicializada para realizar assinaturas com a chave privada escolhida, utilizando o mtodo initSign(chave). O mtodo update(message) informa o documento que ser assinado e, por fim, o mtodo sign() produz um array de bytes que a assinatura digital.
O mtodo verificar() est representado no diagrama de sequncia da Figura 10 e uma instncia de Signature criada da mesma forma que no mtodo assinar(). A inicializao foi feita com o mtodo initVerify(certificado) utilizando o certificado que possui a chave pblica do autor da assinatura. O mtodo update(message)
funciona da mesma forma que no mtodo assinar() e, por fim, a verificao realizada utilizando-se o mtodo verify(assinatura).
49
4.4
TESTES REALIZADOS
50
1 KB 3s
2. Arquivo 10 KB 3s
3. Arquivo 100 KB 3s
4. Arquivo 500 KB 7s
5. Arquivo
1 MB 10s
6. Arquivo
5 MB 30s
7. Arquivo 10 MB 82s
8. Arquivo 15 MB 82s
9. Arquivo 16 MB erro.
Experimentalmente chegou-se ao tamanho de 15 MB, ou seja, arquivos maiores de 15 MB apresentaram erro durante o processo de assinatura.
Revisando o cdigo verificou-se que o motivo de tal restrio a transformao do arquivo em um array de bytes que ser assinado, sendo o array o limitador
do tamanho do arquivo a ser assinado. Criando-se o mesmo array de bytes em um
Desktop encontrou-se o mesmo limitador em relao ao tamanho.
51
Neste trabalho foi desenvolvido um aplicativo para Assinaturas Digitais utilizando Android, uma plataforma poderosa e robusta para aplicativos mveis. Para
facilitar o entendimento das Assinaturas Digitais foi realizado um estudo sobre criptografia e as tcnicas necessrias para a aplicao da Assinatura Digital.
Foi apresentada a plataforma Android, bem como o ambiente de desenvolvimento necessrio para a criao do aplicativo utilizando o Eclipse. O emulador
fornecido por esse ambiente foi de grande importncia para o desenvolvimento deste trabalho.
Conclui-se que o Android permite o desenvolvimento e aplicao de tcnicas criptogrficas complexas, mesmo em dispositivos mveis. A programao em
JAVA facilita o aprendizado do Android, bem como oferece bibliotecas bem estruturadas e robustas. O estudo da criptografia permite verificar as condies necessrias
para se garantir a integridade e autenticidade dos documentos eletrnicos.
O dispositivo virtual do Android (AVD) funciona bem e facilita o desenvolvimento permitindo criar diversas configuraes diferentes para a realizao de testes.
A aplicao do processo e das metodologias de Engenharia de Software
adquiridas ao longo do curso facilitou a modelagem e a implementao do aplicativo,
mesmo numa linguagem totalmente nova, como o Android.
Como trabalho futuro pretende-se implementar melhorias no software para
que ele seja capaz de permitir a leitura e a Assinatura em diferentes formatos proporcionando a interoperabilidade com sistemas profissionais de Assinatura Digital,
bem como dar continuidade a este projeto em cursos de ps-graduao.
52
REFERNCIAS BIBLIOGRFICAS
[1]
[2]
[3]
FILHO,
Marcos
Muniz
Calr.
Kerberos.
<http://www.gta.ufrj.br/grad/99_2/marcos/kerberos.htm>. Acesso em 26
Jun. 2012.
[4]
[5]
[6]
[7]
[8]
[9]
53
acessado
54
TelaInicial.java
package br.cederj.tcc.activity;
import android.app.Activity;
import
import
import
import
import
import
android.content.Intent;
android.os.Bundle;
android.util.Log;
android.view.View;
android.widget.Button;
br.cederj.tcc.R;
/**
* @author Sidney Loyola de S
* @version 1.0 Aplicativo desenvolvido para o Trabalho de Concluso de
Curso
*
submetido ao Curso de Tecnologia em Sistemas de Computao da
*
Universidade Federal Fluminense como requisito parcial para obteno
*
do ttulo de Tecnlogo em Sistemas de Computao
*
*/
public class TelaInicial extends Activity {
/** Called when the activity is first created. */
private String CATEGORIA = "ASSINADOR 1.6";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tela_inicial);
Button botaoAssinar = (Button) findViewById(R.id.botaoAssinar);
botaoAssinar.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
try {
55
Intent intent = new Intent(TelaInicial.this,
TelaAssinaDocumento.class);
startActivity(intent);
} catch (Exception e) {
Log.i(CATEGORIA, "Exceo
Criada " + e.toString());
}
}
});
Button botaoVerificar = (Button) findViewById(R.id.botaoVerificar);
botaoVerificar.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Intent intent = new Intent(TelaInicial.this,
TelaVerificaAssinatura.class);
startActivity(intent);
} catch (Exception e) {
Log.i(CATEGORIA, "Exceo
Criada " + e.toString());
}
}
});
}
}
TelaAssinaDocumento.java
package br.cederj.tcc.activity;
import
import
import
import
import
import
android.app.Activity;
android.content.Intent;
android.os.Bundle;
android.util.Log;
android.view.View;
android.widget.AdapterView;
56
import
import
import
import
import
import
android.widget.AdapterView.OnItemSelectedListener;
android.widget.Button;
android.widget.Toast;
br.cederj.tcc.R;
br.cederj.tcc.assinador.Assinador;
cederj.tcc.FileChooser.FileChooser;
/**
* @author Sidney Loyola de S
* @version 1.0
* Aplicativo desenvolvido para o
* Trabalho de Concluso de Curso submetido ao
* Curso de Tecnologia em Sistemas de Computao da
* Universidade Federal Fluminense
* como requisito parcial para obteno do ttulo de
* Tecnlogo em Sistemas de Computao
*
*/
public class TelaAssinaDocumento extends Activity implements OnItemSelectedListener{
String CATEGORIA = "ASSINADOR 1.6";
String
path,aliasCertificado,tipoAssinatura,senha,pathDocumento,senhaAlias;
int ESCOLHA = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tela_assina_documento);
Button botaoEscolherChave = (Button) findViewById(R.id.botao_escolher_chave);
botaoEscolherChave.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Intent intent =
new Intent(TelaAssinaDocumento.this,FileChooser.class);
intent.putExtra("tipo", "pkcs12");
startActivityForResult(intent, ESCOLHA);
57
}catch (Exception
e) {
Log.i(CATEGORIA, "Exceo Criada "+e.toString());
}
}
});
Button botaoEscolherDocumento = (Button) findViewById(R.id.botaoEscolherDocumento);
botaoEscolherDocumento.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Intent escolherDocumento = new Intent(TelaAssinaDocumento.this,FileChooser.class);
escolherDocumento.putExtra("tipo", "escolherDocumento");
startActivityForResult(escolherDocumento, ESCOLHA);
}catch (Exception
e) {
Log.i(CATEGORIA, "Exceo Criada "+e.toString());
}
}
});
Button botaoAssinaDocumento = (Button) findViewById(R.id.botaoAssinarDocumento);
botaoAssinaDocumento.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
Assinador assinador = new
Assinador(path, senha, aliasCertificado, pathDocumento,senhaAlias);
try {
assinador.assinar();
Toast.makeText(TelaAssinaDocumento.this, "Assinatura Criada com Sucesso!", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
58
Toast.makeText(TelaAssinaDocumento.this, "Ocorreu um Problema e a Assinatura no pode ser efetuada!", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
protected void onActivityResult(int codigo, int resultado,Intent it) {
if (codigo == ESCOLHA) {
if(it != null){
Bundle params =
it.getExtras();
if (params != null) {
if(params.getString("tipo").equals("pkcs12")){
path =
params.getString("path");
if(path.endsWith("p12") || path.endsWith("pfx")){
Intent intent = new Intent(TelaAssinaDocumento.this,TelaSolicitarSenhaPKCS12.class);
intent.putExtra("tipo", "obterSenha");
intent.putExtra("path", path);
startActivityForResult(intent, ESCOLHA);
}else{
Toast.makeText(TelaAssinaDocumento.this, "Arquivo Invlido,
Escolha um arquivo pkcs12 vlido!", Toast.LENGTH_SHORT).show();
//
Intent intent = new Intent(TelaAssinaDocumento.this,FileChooser.class);
59
intent.putExtra("tipo", "pkcs12");
startActivityForResult(intent, ESCOLHA);
}
}
if(params.getString("tipo").equals("obterSenha")){
senha =
params.getString("senha");
Intent
nova = new Intent(TelaAssinaDocumento.this,TelaLeituraPKCS12.class);
nova.putExtra("path", path);
nova.putExtra("tipo", "aliasCertificado");
nova.putExtra("senha", senha);
startActivityForResult(nova,ESCOLHA);
}
if(params.getString("tipo").equals("aliasCertificado")){
aliasCertificado = params.getString("alias");
Intent intent = new Intent(TelaAssinaDocumento.this,TelaSelecionarSenhaChavePrivada.class);
intent.putExtra("tipo", "senhaAlias");
intent.putExtra("path", path);
intent.putExtra("senha", senha);
intent.putExtra("alias", aliasCertificado);
startActivityForResult(intent, ESCOLHA);
}
if(params.getString("tipo").equals("senhaAlias")){
60
senhaAlias = params.getString("senhaAlias");
}
if(params.getString("tipo").equals("escolherDocumento")){
pathDocumento = params.getString("path");
}
}
}
}
}
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int pos,
long id) {
tipoAssinatura = (String) parent.getItemAtPosition(pos);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
tipoAssinatura = "Assinatura Separada";
}
TelaVerificaAssinatura.java
package br.cederj.tcc.activity;
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.content.Intent;
android.os.Bundle;
android.util.Log;
android.view.View;
android.widget.Button;
android.widget.Toast;
br.cederj.tcc.R;
br.cederj.tcc.assinador.Assinador;
61
import cederj.tcc.FileChooser.FileChooser;
/**
* @author Sidney Loyola de S
* @version 1.0
* Aplicativo desenvolvido para o
* Trabalho de Concluso de Curso submetido ao
* Curso de Tecnologia em Sistemas de Computao da
* Universidade Federal Fluminense
* como requisito parcial para obteno do ttulo de
* Tecnlogo em Sistemas de Computao
*
*/
public class TelaVerificaAssinatura extends Activity{
private
private
private
private
private
private
private
String
String
String
String
String
String
String
62
Log.i(CATEGORIA,
"Exceo Criada "+e.toString());
}
}
});
Button botaoEscolherCertificado = (Button) findViewById(R.id.botaoEscolherCertificado);
botaoEscolherCertificado.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Intent escolherPKCS12 =
new Intent(TelaVerificaAssinatura.this,FileChooser.class);
escolherPKCS12.putExtra("tipo", "certificado");
startActivityForResult(escolherPKCS12, ESCOLHA);
}catch (Exception e) {
Log.i(CATEGORIA,
"Exceo Criada "+e.toString());
}
}
});
Button botaoEscolherDocumentoOriginal = (Button) findViewById(R.id.botaoEscolherDocumentoOriginal);
botaoEscolherDocumentoOriginal.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Intent escolherDocumento =
new Intent(TelaVerificaAssinatura.this,FileChooser.class);
escolherDocumento.putExtra("tipo", "escolherDocumento");
startActivityForResult(escolherDocumento, ESCOLHA);
}catch (Exception e) {
Log.i(CATEGORIA,
"Exceo Criada "+e.toString());
}
}
});
63
Button botaoVerificarAssinatura = (Button) findViewById(R.id.botaoVerificaAssinatura);
botaoVerificarAssinatura.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
Assinador assinador = new Assinador(pathPKCS12, senha, aliasCertificado, pathDocumento,senhaAlias);
assinador.atualizar(pathAssinatura);
boolean assinou = assinador.verificar();
if(assinou){
Toast.makeText(TelaVerificaAssinatura.this, "Assinatura Verifica com Sucesso!", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(TelaVerificaAssinatura.this, "Falha na Verificao", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
protected void onActivityResult(int codigo, int resultado,Intent it) {
if (codigo == ESCOLHA) {
if(it != null){
Bundle params =
it.getExtras();
if (params != null) {
if(params.getString("tipo").equals("certificado")){
pathPKCS12 = params.getString("path");
if(pathPKCS12.endsWith("p12")||pathPKCS12.endsWith("pfx")){
Intent intent = new In-
64
tent(TelaVerificaAssinatura.this,TelaSolicitarSenhaPKCS12.class);
intent.putExtra("tipo", "obterSenha");
intent.putExtra("path", pathPKCS12);
startActivityForResult(intent, ESCOLHA);
Log.i(CATEGORIA, " pathPKCS12 = "+pathPKCS12);
}
}
if(params.getString("tipo").equals("assinatura")){
pathAssinatura = params.getString("path");
}
if(params.getString("tipo").equals("escolherDocumento")){
pathDocumento = params.getString("path");
}
if(params.getString("tipo").equals("aliasCertificado")){
aliasCertificado = params.getString("alias");
}
if(params.getString("tipo").equals("obterSenha")){
senha =
params.getString("senha");
Intent
nova = new Intent(TelaVerificaAssinatura.this,TelaLeituraPKCS12.class);
nova.putExtra("path", pathPKCS12);
nova.putExtra("tipo", "aliasCertificado");
nova.putExtra("senha", senha);
startActivityForResult(nova,ESCOLHA);
}
}
}
}
}
65
TelaLeituraPKCS12.java
package br.cederj.tcc.activity;
import
import
import
import
java.security.KeyStore;
java.util.ArrayList;
java.util.Enumeration;
java.util.List;
import
import
import
import
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.content.Intent;
android.os.Bundle;
android.util.Log;
android.view.View;
android.widget.AdapterView;
android.widget.AdapterView.OnItemSelectedListener;
android.widget.ArrayAdapter;
android.widget.Button;
android.widget.Spinner;
android.widget.Toast;
br.cederj.tcc.R;
br.cederj.tcc.ferramentas.Ferramentas;
/**
* @author Sidney Loyola de S
* @version 1.0
* Aplicativo desenvolvido para o
* Trabalho de Concluso de Curso submetido ao
* Curso de Tecnologia em Sistemas de Computao da
* Universidade Federal Fluminense
* como requisito parcial para obteno do ttulo de
* Tecnlogo em Sistemas de Computao
*
*/
public class TelaLeituraPKCS12 extends Activity implements OnItemSelectedListener{
String CATEGORIA = "ASSINADOR 1.6";
String alias = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
66
super.onCreate(savedInstanceState);
setContentView(R.layout.tela_leitura_pkcs12);
Intent it = getIntent();
final String path = it.getExtras().getString("path");
final String tipo = it.getExtras().getString("tipo");
final String senha =
it.getExtras().getString("senha");
Log.i(CATEGORIA, "PATH 2 : "+path);
KeyStore store;
try {
store = KeyStore.getInstance("PKCS12",
"BC");
char[] password = senha.toCharArray();
store.load(Ferramentas.ler(path), password);
List<String>listaAlias = new ArrayList<String>();
Enumeration en = store.aliases();
while (en.hasMoreElements())
{
String alias = (String)en.nextElement();
if(store.isKeyEntry(alias)){
Log.i(CATEGORIA, "Alias : "+alias);
listaAlias.add(alias);
}
}
String[]arrayAlias = transformar(listaAlias);
Log.i(CATEGORIA, "Alias [0] : "+arrayAlias[0]);
67
@Override
public void onClick(View v) {
Intent itNova = new Intent();
itNova.putExtra("path",path);
itNova.putExtra("tipo",tipo);
itNova.putExtra("senha",senha);
itNova.putExtra("alias",alias);
setResult(1, itNova);
finish();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
alias = (String) parent.getItemAtPosition(pos);
Toast.makeText(this, "Alias: "+alias,
Toast.LENGTH_SHORT).show();
}
public void onNothingSelected(AdapterView<?> parent) {
alias = (String) parent.getItemAtPosition(0);
Toast.makeText(this, "Alias: "+alias,
Toast.LENGTH_SHORT).show();
}
private String[] transformar(List<String> listaAlias) {
68
String[]array = new String[listaAlias.size()];
for(int i=0;i<listaAlias.size();i++){
array[i] = listaAlias.get(i);
}
return array;
}
}
TelaSelecionarSenhaChavePrivada.java
package br.cederj.tcc.activity;
import java.security.KeyStore;
import java.security.PrivateKey;
import
import
import
import
import
import
import
import
import
br.cederj.tcc.R;
android.app.Activity;
android.content.Intent;
android.os.Bundle;
android.view.View;
android.widget.Button;
android.widget.EditText;
android.widget.TextView;
android.widget.Toast;
/**
* @author Sidney Loyola de S
* @version 1.0
* Aplicativo desenvolvido para o
* Trabalho de Concluso de Curso submetido ao
* Curso de Tecnologia em Sistemas de Computao da
* Universidade Federal Fluminense
* como requisito parcial para obteno do ttulo de
* Tecnlogo em Sistemas de Computao
*
*/
public class TelaSelecionarSenhaChavePrivada extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tela_obter_senha);
69
TextView titulo = (TextView) findViewById(R.id.titulo);
titulo.setText("Digite a Senha :");
final EditText campoSenha = (EditText) findViewById(R.id.campoSenha);
Button botaoSalvar = (Button) findViewById(R.id.botaoSalvarSenha);
botaoSalvar.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
Intent it = getIntent();
String tipo =
it.getExtras().getString("tipo");
String path =
it.getExtras().getString("path");
String senhaPKCS12 =
it.getExtras().getString("senha");
String alias =
it.getExtras().getString("alias");
String senhaAlias = campoSenha.getText().toString();
boolean senhaCorreta = true;
KeyStore store;
try {
store = KeyStore.getInstance("PKCS12", "BC");
char[] password =
senhaPKCS12.toCharArray();
store.load(br.cederj.tcc.ferramentas.Ferramentas.ler(path), password);
PrivateKey chave = (PrivateKey) store.getKey(alias, password);
}catch (Exception e) {
senhaCorreta =
false;
}
if(senhaCorreta){
Intent senha = new Intent();
senha.putExtra("tipo", tipo);
senha.putExtra("senhaAlias", senhaAlias);
setResult(1, senha);
70
finish();
}else{
Toast.makeText(TelaSelecionarSenhaChavePrivada.this, "Senha Incorreta",
Toast.LENGTH_SHORT).show();
}
}
});
}
}
TelaSolicitarSenhaPKCS12.java
package br.cederj.tcc.activity;
import java.security.KeyStore;
import br.cederj.tcc.R;
import
import
import
import
import
import
import
android.app.Activity;
android.content.Intent;
android.os.Bundle;
android.view.View;
android.widget.Button;
android.widget.EditText;
android.widget.Toast;
/**
* @author Sidney Loyola de S
* @version 1.0
* Aplicativo desenvolvido para o
* Trabalho de Concluso de Curso submetido ao
* Curso de Tecnologia em Sistemas de Computao da
* Universidade Federal Fluminense
* como requisito parcial para obteno do ttulo de
* Tecnlogo em Sistemas de Computao
*
*/
public class TelaSolicitarSenhaPKCS12 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
71
setContentView(R.layout.tela_obter_senha);
final EditText campoSenha = (EditText) findViewById(R.id.campoSenha);
Button botaoSalvar = (Button) findViewById(R.id.botaoSalvarSenha);
botaoSalvar.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
Intent it = getIntent();
String tipo =
it.getExtras().getString("tipo");
String path =
it.getExtras().getString("path");
String senhaPKCS12 = campoSenha.getText().toString();
boolean senhaCorreta = true;
KeyStore store;
try {
store = KeyStore.getInstance("PKCS12", "BC");
char[] password =
senhaPKCS12.toCharArray();
store.load(br.cederj.tcc.ferramentas.Ferramentas.ler(path), password);
}catch (Exception e) {
senhaCorreta =
false;
}
if(senhaCorreta){
Intent senha = new Intent();
senha.putExtra("senha",
senhaPKCS12);
senha.putExtra("tipo",tipo);
senha.putExtra("path",
path);
setResult(1, senha);
finish();
}else{
Toast.makeText(TelaSolicitarSenhaPKCS12.this, "Senha Incorreta", Toast.LENGTH_SHORT).show();
}
72
}
});
}
Assinador.java
package br.cederj.tcc.assinador;
import
import
import
import
import
java.io.File;
java.security.KeyStore;
java.security.PrivateKey;
java.security.Signature;
java.security.cert.Certificate;
import br.cederj.tcc.ferramentas.Ferramentas;
/**
* @author Sidney Loyola de S
* @version 1.0
* Aplicativo desenvolvido para o
* Trabalho de Concluso de Curso submetido ao
* Curso de Tecnologia em Sistemas de Computao da
* Universidade Federal Fluminense
* como requisito parcial para obteno do ttulo de
* Tecnlogo em Sistemas de Computao
*
*/
public class Assinador {
private String path;
private char[]password ;
private String alias;
private String pathDocumento;
private String pathAssinatura;
private String senhaAlias;
private
private
private
private
byte[] message;
byte[] assinatura;
PrivateKey chave;
Certificate cert;
73
public Assinador(String path,String senha,String alias,String
pathDocumento,String senhaAlias){
this.path = path;
this.password = senha.toCharArray();
this.alias = alias;
this.pathDocumento = pathDocumento;
this.senhaAlias = senhaAlias;
}
private void configurar() {
try {
message = Ferramentas.getBytesFromFile(new
File(pathDocumento));
KeyStore store = KeyStore.getInstance("PKCS12", "BC");
store.load(Ferramentas.ler(path), password);
chave = (PrivateKey) store.getKey(alias, senhaAlias.toCharArray());
} catch (Exception e) {
}
}
public boolean assinar() throws Exception, Exception{
configurar();
Signature signer = Signature.getInstance("Sha1WithRSA", "BC");
signer.initSign(chave);
signer.update(message);
byte[]assinatura = signer.sign();
Ferramentas.escrever(assinatura, pathDocumento +
".p7s");
return true;
}
public void atualizar(String pathAssinatura) {
this.pathAssinatura = pathAssinatura;
}
public boolean verificar() {
74
configurarVerificacao();
try {
Signature signer = Signature.getInstance("Sha1WithRSA", "BC");
signer.initVerify(cert);
signer.update(message);
return signer.verify(assinatura);
} catch (Exception e) {
return false;
}
}
private void configurarVerificacao() {
cert = null;
try {
KeyStore store = KeyStore.getInstance("PKCS12", "BC");
store.load(Ferramentas.ler(path), password);
Certificate[] chain =
store.getCertificateChain(alias);
cert = chain[0];
message = Ferramentas.getBytesFromFile(new
File(pathDocumento));
assinatura = Ferramentas.getBytesFromFile(new File(pathAssinatura));
} catch (Exception e) {
}
}
}
Ferramentas.java
package br.cederj.tcc.ferramentas;
75
import
import
import
import
import
import
import
java.io.BufferedOutputStream;
java.io.File;
java.io.FileInputStream;
java.io.FileNotFoundException;
java.io.FileOutputStream;
java.io.IOException;
java.io.InputStream;
/**
* @author Sidney Loyola de S
* @version 1.0
* Aplicativo desenvolvido para o
* Trabalho de Concluso de Curso submetido ao
* Curso de Tecnologia em Sistemas de Computao da
* Universidade Federal Fluminense
* como requisito parcial para obteno do ttulo de
* Tecnlogo em Sistemas de Computao
*
*/
public class Ferramentas {
public static InputStream ler(String path){
try {
File file = new File(path);
InputStream is = new FileInputStream(file);
return is;
} catch (FileNotFoundException ex) {
}
return null;
}
public static byte[] getBytesFromFile(File file) throws IOException {
InputStream is = new FileInputStream(file);
long length = file.length();
if (length > Integer.MAX_VALUE) {
}
byte[] bytes = new byte[(int)length];
int offset = 0;
int numRead = 0;
76
while (offset < bytes.length
&& (numRead=is.read(bytes, offset, bytes.lengthoffset)) >= 0) {
offset += numRead;
}
if (offset < bytes.length) {
throw new IOException("Could not completely read file
"+file.getName());
}
is.close();
return bytes;
}
public static void escrever(byte[] bytes,String path){
try {
File file = new File(path);
BufferedOutputStream bos;
bos = new BufferedOutputStream(new
FileOutputStream(file));
bos.write(bytes);
bos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
FileArrayAdapter.java
package cederj.tcc.FileChooser;
import java.util.List;
77
import
import
import
import
import
import
import
android.content.Context;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.ArrayAdapter;
android.widget.TextView;
br.cederj.tcc.R;
}
public Option getItem(int i)
{
return items.get(i);
}
@Override
public View getView(int position, View convertView, ViewGroup
parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(id, null);
78
}
final Option o = items.get(position);
if (o != null) {
TextView t1 = (TextView) v.findViewById(R.id.TextView01);
TextView t2 = (TextView) v.findViewById(R.id.TextView02);
if(t1!=null)
t1.setText(o.getName());
if(t2!=null)
t2.setText(o.getData());
}
return v;
}
FileChooser.java
package cederj.tcc.FileChooser;
import
import
import
import
java.io.File;
java.util.ArrayList;
java.util.Collections;
java.util.List;
import
import
import
import
import
import
import
android.app.ListActivity;
android.content.Intent;
android.os.Bundle;
android.view.View;
android.widget.ListView;
android.widget.Toast;
br.cederj.tcc.R;
79
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
currentDir = new File("/sdcard/"); //adaptao para
abrir o carto de memria
fill(currentDir);
}
private void fill(File f) {
File[] dirs = f.listFiles();
this.setTitle("Current Dir: " + f.getName());
List<Option> dir = new ArrayList<Option>();
List<Option> fls = new ArrayList<Option>();
try {
for (File ff : dirs)
{
if (ff.isDirectory())
dir.add(new Option(ff.getName(), "Folder", ff
.getAbsolutePath()));
else
{
fls.add(new Option(ff.getName(), "File Size: "
+
ff.length(), ff.getAbsolutePath()));
}
}
} catch (Exception e) {
}
Collections.sort(dir);
Collections.sort(fls);
80
dir.addAll(fls);
if (!f.getName().equalsIgnoreCase("sdcard"))
dir.add(0, new Option("..", "Parent Directory", f.getParent()));
adapter = new FileArrayAdapter(FileChooser.this,R.layout.file_view,dir);
this.setListAdapter(adapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Option o = adapter.getItem(position);
if(o.getData().equalsIgnoreCase("folder")||o.getData().equalsIgnoreCase
("parent directory")){
currentDir = new File(o.getPath());
fill(currentDir);
}else
{
onFileClick(o);
}
}
// este metodo foi adaptado para que a intent gerasse o retorno desejado
private void onFileClick(Option o)
{
Intent it = getIntent();
String tipo = it.getExtras().getString("tipo");
Intent nova = new Intent();
//Seta a mensagem de retorno
nova.putExtra("path",o.getPath());
nova.putExtra("name", o.getName());
nova.putExtra("tipo", tipo);
setResult(1,nova);
81
Option.java
package cederj.tcc.FileChooser;
public class Option implements Comparable<Option> {
private String name;
private String data;
private String path;
public Option(String n, String d, String p)
{
name = n;
data = d;
path = p;
}
public String getName()
{
return name;
}
public String getData()
{
return data;
}
public String getPath()
82
{
return path;
}
@Override
public int compareTo(Option o) {
if(this.name != null)
return
this.name.toLowerCase().compareTo(o.getName().toLowerCase());
else
throw new IllegalArgumentException();
}
}
tela_inicial.xml
83
android:layout_gravity="center"
android:text="@string/sobre" />
</LinearLayout>
tela_assina_documento.xml
<?xml version="1.0" encoding="utf8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/espaco"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/botao_escolher_chave"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="50dp"
android:text="@string/escolher_chave_privada" />
<Button
android:id="@+id/botaoEscolherDocumento"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/escolher_documento" />
<Button
android:id="@+id/botaoAssinarDocumento"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/assinarDocumento" />
</LinearLayout>
tela_verifica_assinatura.xml
<?xml version="1.0" encoding="utf8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
84
android:orientation="vertical" >
<Button
android:id="@+id/botaoEscolherAssinatura"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="50dp"
android:text="@string/escolher_assinatura" />
<Button
android:id="@+id/botaoEscolherCertificado"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/escolher_certificado" />
<Button
android:id="@+id/botaoEscolherDocumentoOriginal"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/escolher_documento" />
<Button
android:id="@+id/botaoVerificaAssinatura"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/verificarAssinatura" />
</LinearLayout>
tela_leitura_pkcs12.xml
<?xml version="1.0" encoding="utf8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/certificados"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Spinner
android:id="@+id/spinnerAlias"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<! Preview: listitem=@android:layout/simple_spinner_item >
</Spinner>
<Button
android:id="@+id/botaoSalvarCertificado"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/salvar" />
</LinearLayout>
tela_obter_senha.xml
85
<?xml version="1.0" encoding="utf8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/titulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/senha"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/campoSenha"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPassword" >
<requestFocus />
</EditText>
<Button
android:id="@+id/botaoSalvarSenha"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/salvar" />
</LinearLayout>
file_view.xml
<?xml version="1.0" encoding="utf8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:orientation="vertical"
android:layout_width="fill_parent">
<TextView android:text="@+id/TextView01" android:id="@+id/TextView01"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:singleLine="true" android:textStyle="bold" android:layout_marginTop="5dip"
android:layout_marginLeft="5dip"></TextView>
<TextView android:text="@+id/TextView02" android:id="@+id/TextView02"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10dip"></TextView>
</LinearLayout>
86
AndroidManifest.xml
<?xml version="1.0" encoding="utf8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.cederj.tcc"
android:versionCode="1"
android:versionName="1.0" >
<usessdk android:minSdkVersion="8" />
<usespermission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<usespermission android:name="android.permission.INSTALL_PACKAGES"/>
<application
android:icon="@drawable/img_cadeado"
android:label="@string/app_name" >
<activity
android:name=".activity.TelaInicial"
android:label="@string/app_name" >
<intentfilter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intentfilter>
</activity>
<useslibrary android:required="true" android:name="android.test.runner"/>
<activity android:name=".activity.TelaAssinaDocumento"></activity>
<activity android:name="cederj.tcc.FileChooser.FileChooser"></activity>
<activity android:name=".activity.TelaSolicitarSenhaPKCS12"></activity>
<activity android:name=".activity.TelaLeituraPKCS12"></activity>
<activity android:name=".activity.TelaVerificaAssinatura"></activity>
<activity android:name=".activity.TelaSelecionarSenhaChavePrivada"></activity>
</application>
</manifest>