package test;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.security.DigestOutputStream;
import java.security.GeneralSecurityException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.MessageDigest;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.SignatureException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Enumeration;
import java.util.Map;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import javax.crypto.Cipher;
import javax.crypto.EncryptedPrivateKeyInfo;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import org.bouncycastle.util.encoders.Base64;
import sun.misc.BASE64Encoder;
import sun.security.pkcs.ContentInfo;
import sun.security.pkcs.PKCS7;
import sun.security.pkcs.SignerInfo;
import sun.security.x509.AlgorithmId;
import sun.security.x509.X500Name;
import ccit.security.PrivateKeyFromDER;
public class SignApk {
private static X509Certificate readPublicKey(File
file) throws IOException,
GeneralSecurityException{
FileInputStream input = new
FileInputStream(file);
try {
CertificateFactory
cf = CertificateFactory.getInstance("X.509");
return
(X509Certificate) cf.generateCertificate(input);
} finally {
input.close();
}
}
private static String readPassword(File keyFile)
{
// TODO: use
Console.readPassword() when it's available.
System.out.print("Enter
password for " + keyFile
+
" (password will not be hidden): ");
System.out.flush();
BufferedReader stdin = new
BufferedReader(new InputStreamReader(
System.in));
try {
return
stdin.readLine();
} catch (IOException ex)
{
return
null;
}
}
private static KeySpec decryptPrivateKey(byte[]
encryptedPrivateKey,
File keyFile)
throws GeneralSecurityException{
EncryptedPrivateKeyInfo
epkInfo;
try {
epkInfo = new
EncryptedPrivateKeyInfo(encryptedPrivateKey);
} catch (IOException ex)
{
// Probably
not an encrypted key.
return
null;
}
char[] password =
readPassword(keyFile).toCharArray();
SecretKeyFactory skFactory =
SecretKeyFactory.getInstance(epkInfo
.getAlgName());
Ke