// 
// Decompiled by Procyon v0.6.0
// 

package com.google.crypto.tink.internal;

import java.io.IOException;
import com.google.crypto.tink.util.SecretBytes;
import com.google.crypto.tink.SecretKeyAccess;
import java.io.InputStream;
import javax.annotation.Nullable;
import java.util.Objects;
import com.google.crypto.tink.util.Bytes;
import java.security.GeneralSecurityException;
import java.nio.charset.Charset;

public final class Util
{
    public static final Charset UTF_8;
    
    public static int randKeyId() {
        int result;
        byte[] rand;
        for (result = 0; result == 0; result = ((rand[0] & 0xFF) << 24 | (rand[1] & 0xFF) << 16 | (rand[2] & 0xFF) << 8 | (rand[3] & 0xFF))) {
            rand = Random.randBytes(4);
        }
        return result;
    }
    
    private static final byte toByteFromPrintableAscii(final char c) {
        if (c < '!' || c > '~') {
            throw new TinkBugException("Not a printable ASCII character: " + c);
        }
        return (byte)c;
    }
    
    private static final byte checkedToByteFromPrintableAscii(final char c) throws GeneralSecurityException {
        if (c < '!' || c > '~') {
            throw new GeneralSecurityException("Not a printable ASCII character: " + c);
        }
        return (byte)c;
    }
    
    public static final Bytes toBytesFromPrintableAscii(final String s) {
        final byte[] result = new byte[s.length()];
        for (int i = 0; i < s.length(); ++i) {
            result[i] = toByteFromPrintableAscii(s.charAt(i));
        }
        return Bytes.copyFrom(result);
    }
    
    public static final Bytes checkedToBytesFromPrintableAscii(final String s) throws GeneralSecurityException {
        final byte[] result = new byte[s.length()];
        for (int i = 0; i < s.length(); ++i) {
            result[i] = checkedToByteFromPrintableAscii(s.charAt(i));
        }
        return Bytes.copyFrom(result);
    }
    
    public static boolean isAndroid() {
        return Objects.equals(System.getProperty("java.vendor"), "The Android Project");
    }
    
    @Nullable
    public static Integer getAndroidApiLevel() {
        if (!isAndroid()) {
            return null;
        }
        return BuildDispatchedCode.getApiLevel();
    }
    
    public static boolean isPrefix(final byte[] prefix, final byte[] complete) {
        if (complete.length < prefix.length) {
            return false;
        }
        for (int i = 0; i < prefix.length; ++i) {
            if (complete[i] != prefix[i]) {
                return false;
            }
        }
        return true;
    }
    
    public static SecretBytes readIntoSecretBytes(final InputStream input, final int length, final SecretKeyAccess access) throws GeneralSecurityException {
        final byte[] output = new byte[length];
        try {
            int read;
            for (int len = output.length, readTotal = 0; readTotal < len; readTotal += read) {
                read = input.read(output, readTotal, len - readTotal);
                if (read == -1) {
                    throw new GeneralSecurityException("Not enough pseudorandomness provided");
                }
            }
        }
        catch (final IOException e) {
            throw new GeneralSecurityException("Reading pseudorandomness failed");
        }
        return SecretBytes.copyFrom(output, access);
    }
    
    private Util() {
    }
    
    static {
        UTF_8 = Charset.forName("UTF-8");
    }
}
