Exemplo de cópia de um conjunto de shadows M de N entre cartões Smart-card Dinamo: leitura das shadows, reconstrução do segredo via HSM e regravação em novos cartões.
package doxy.examples;
import java.util.Scanner;
import com.dinamonetworks.Dinamo;
import com.dinamonetworks.SvmkShadow;
import br.com.trueaccess.TacException;
import br.com.trueaccess.TacNDJavaLib;
public class SmartCardCopySet {
public static void main(String[] args) throws Exception {
String ip = "127.0.0.1";
String user = "master";
String password = "12345678";
String pin = "12345678";
int M = 2;
int N = 2;
Dinamo api = new Dinamo();
api.openSession(ip, user, password);
Scanner scanner = new Scanner(System.in);
try {
SvmkShadow[] shadows = new SvmkShadow[N];
System.out.println("Iniciando leitura das shadows...");
for (int i = 0; i < N; i++) {
System.out.printf("Insira o cartão %d e pressione Enter...%n", i + 1);
scanner.nextLine();
shadows[i] = api.scReadShadow(pin);
System.out.printf("Shadow [%d] lida. Versão=%d%n", i, shadows[i].getVersion());
System.out.println("Remova o cartão.");
}
SvmkShadow[] subset = new SvmkShadow[M];
System.arraycopy(shadows, 0, subset, 0, M);
byte[] key = api.recoverSVMK(subset);
System.out.println("Segredo M de N recuperado com sucesso.");
SvmkShadow[] newShadows = api.generateSVMK(
shadows[0].getVersion(), key, M, N);
System.out.println("Segredo dividido em novas shadows.");
System.out.println("Iniciando gravação das shadows...");
for (int i = 0; i < N; i++) {
System.out.printf("Insira o novo cartão %d e pressione Enter...%n", i + 1);
scanner.nextLine();
api.scWriteShadow(newShadows[i], pin, true);
System.out.printf("Shadow [%d] gravada.%n", i);
System.out.println("Remova o cartão.");
}
System.out.println("Cópia do conjunto M de N concluída.");
} finally {
api.closeSession();
}
}
}