13e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan/*
23e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan * Copyright (C) 2009 The Android Open Source Project
33e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan *
43e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan * Licensed under the Apache License, Version 2.0 (the "License");
53e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan * you may not use this file except in compliance with the License.
63e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan * You may obtain a copy of the License at
73e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan *
83e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan *      http://www.apache.org/licenses/LICENSE-2.0
93e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan *
103e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan * Unless required by applicable law or agreed to in writing, software
113e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan * distributed under the License is distributed on an "AS IS" BASIS,
123e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan * See the License for the specific language governing permissions and
143e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan * limitations under the License.
153e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan */
163e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
173e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyanpackage com.android.certinstaller;
183e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
193e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyanimport android.util.Log;
203e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
213e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyanimport java.io.ByteArrayInputStream;
223e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyanimport java.io.ByteArrayOutputStream;
233e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyanimport java.io.File;
243e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyanimport java.io.FileInputStream;
253e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyanimport java.io.ObjectInputStream;
263e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyanimport java.io.ObjectOutputStream;
273e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyanimport java.security.MessageDigest;
283e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyanimport java.security.NoSuchAlgorithmException;
293e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
303e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyanclass Util {
313e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    private static final String TAG = "certinstaller.Util";
323e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
333e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    static byte[] toBytes(Object object) {
343e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        ByteArrayOutputStream baos = new ByteArrayOutputStream();
353e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        try {
363e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            ObjectOutputStream os = new ObjectOutputStream(baos);
373e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            os.writeObject(object);
383e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            os.close();
393e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        } catch (Exception e) {
403e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            Log.w(TAG, "toBytes(): " + e + ": " + object);
413e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        }
423e17f9f04b9f7d153757bfd2f34a5fe60698adcbMohammad Shamsi        return baos.toByteArray();
433e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
443e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
453e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    static <T> T fromBytes(byte[] bytes) {
463e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        if (bytes == null) return null;
473e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        try {
483e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            ObjectInputStream is =
493e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan                    new ObjectInputStream(new ByteArrayInputStream(bytes));
503e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            return (T) is.readObject();
513e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        } catch (Exception e) {
523e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            Log.w(TAG, "fromBytes(): " + e);
533e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            return null;
543e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        }
553e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
563e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
573e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    static String toMd5(byte[] bytes) {
583e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        try {
593e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            MessageDigest algorithm = MessageDigest.getInstance("MD5");
603e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            algorithm.reset();
613e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            algorithm.update(bytes);
623e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            return toHexString(algorithm.digest(), "");
633e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        } catch(NoSuchAlgorithmException e){
643e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            // should not occur
653e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            Log.w(TAG, "toMd5(): " + e);
663e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            throw new RuntimeException(e);
673e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        }
683e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
693e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
703e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    private static String toHexString(byte[] bytes, String separator) {
713e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        StringBuilder hexString = new StringBuilder();
723e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        for (byte b : bytes) {
733e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            hexString.append(Integer.toHexString(0xFF & b)).append(separator);
743e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        }
753e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        return hexString.toString();
763e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
773e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
783e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    static byte[] readFile(File file) {
793e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        try {
803e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            byte[] data = new byte[(int) file.length()];
813e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            FileInputStream fis = new FileInputStream(file);
823e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            fis.read(data);
833e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            fis.close();
843e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            return data;
853e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        } catch (Exception e) {
863e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            Log.w(TAG, "cert file read error: " + e);
873e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            return null;
883e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        }
893e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
903e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
91d674440a49f278793aa2a2bb01c231f8cea7f8c0Hung-ying Tyan    static boolean deleteFile(File file) {
923e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        if ((file != null) && !file.delete()) {
933e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            Log.w(TAG, "cannot delete cert: " + file);
94d674440a49f278793aa2a2bb01c231f8cea7f8c0Hung-ying Tyan            return false;
95d674440a49f278793aa2a2bb01c231f8cea7f8c0Hung-ying Tyan        } else {
96d674440a49f278793aa2a2bb01c231f8cea7f8c0Hung-ying Tyan            return true;
973e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        }
983e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
993e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
1003e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    private Util() {
1013e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
1023e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan}
103