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
3338856d6bd1acc648b18aceb9af4d68e25f314fb6Victor Chang    public static final String SETTINGS_PACKAGE = "com.android.settings";
3438856d6bd1acc648b18aceb9af4d68e25f314fb6Victor Chang
353e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    static byte[] toBytes(Object object) {
363e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        ByteArrayOutputStream baos = new ByteArrayOutputStream();
373e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        try {
383e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            ObjectOutputStream os = new ObjectOutputStream(baos);
393e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            os.writeObject(object);
403e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            os.close();
413e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        } catch (Exception e) {
423e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            Log.w(TAG, "toBytes(): " + e + ": " + object);
433e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        }
443e17f9f04b9f7d153757bfd2f34a5fe60698adcbMohammad Shamsi        return baos.toByteArray();
453e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
463e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
473e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    static <T> T fromBytes(byte[] bytes) {
483e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        if (bytes == null) return null;
493e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        try {
503e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            ObjectInputStream is =
513e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan                    new ObjectInputStream(new ByteArrayInputStream(bytes));
523e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            return (T) is.readObject();
533e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        } catch (Exception e) {
543e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            Log.w(TAG, "fromBytes(): " + e);
553e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            return null;
563e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        }
573e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
583e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
593e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    static String toMd5(byte[] bytes) {
603e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        try {
613e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            MessageDigest algorithm = MessageDigest.getInstance("MD5");
623e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            algorithm.reset();
633e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            algorithm.update(bytes);
643e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            return toHexString(algorithm.digest(), "");
653e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        } catch(NoSuchAlgorithmException e){
663e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            // should not occur
673e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            Log.w(TAG, "toMd5(): " + e);
683e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            throw new RuntimeException(e);
693e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        }
703e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
713e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
723e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    private static String toHexString(byte[] bytes, String separator) {
733e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        StringBuilder hexString = new StringBuilder();
743e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        for (byte b : bytes) {
753e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            hexString.append(Integer.toHexString(0xFF & b)).append(separator);
763e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        }
773e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        return hexString.toString();
783e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
793e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
803e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    static byte[] readFile(File file) {
813e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        try {
823e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            byte[] data = new byte[(int) file.length()];
833e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            FileInputStream fis = new FileInputStream(file);
843e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            fis.read(data);
853e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            fis.close();
863e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            return data;
873e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        } catch (Exception e) {
883e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            Log.w(TAG, "cert file read error: " + e);
893e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            return null;
903e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        }
913e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
923e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
93d674440a49f278793aa2a2bb01c231f8cea7f8c0Hung-ying Tyan    static boolean deleteFile(File file) {
943e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        if ((file != null) && !file.delete()) {
953e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan            Log.w(TAG, "cannot delete cert: " + file);
96d674440a49f278793aa2a2bb01c231f8cea7f8c0Hung-ying Tyan            return false;
97d674440a49f278793aa2a2bb01c231f8cea7f8c0Hung-ying Tyan        } else {
98d674440a49f278793aa2a2bb01c231f8cea7f8c0Hung-ying Tyan            return true;
993e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan        }
1003e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
1013e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan
1023e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    private Util() {
1033e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan    }
1043e722cadf66802194267460fe5de77e6c18530ebHung-ying Tyan}
105