package com.jcumulus.server.rtmfp;

/**
 * jCumulus is a Java port of Cumulus OpenRTMP
 *
 * Copyright 2011 OpenRTMFP
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License received along this program for more
 * details (or else see http://www.gnu.org/licenses/).
 *
 *
 * This file is a part of jCumulus.
 */

import com.jcumulus.server.rtmfp.packet.*;

import com.jcumulus.server.rtmfp.pipe.C;
import com.jcumulus.server.rtmfp.pipe.D;
import com.jcumulus.server.rtmfp.stream.B;
import java.io.IOException;
import java.math.BigInteger;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.log4j.Logger;

// Referenced classes of package com.jcumulus.server.rtmfp:
//            K, C

public class N
{

    public static byte A[] = "Adobe Systems 02".getBytes();
    public static int B = 1935;
    public static int C = 12;
    public static int G = 1192;
    private static final Logger E = Logger.getLogger(C.class);
    private static byte D[] = {
        -1, -1, -1, -1, -1, -1, -1, -1, -55, 15,
        -38, -94, 33, 104, -62, 52, -60, -58, 98, -117,
        -128, -36, 28, -47, 41, 2, 78, 8, -118, 103,
        -52, 116, 2, 11, -66, -90, 59, 19, -101, 34,
        81, 74, 8, 121, -114, 52, 4, -35, -17, -107,
        25, -77, -51, 58, 67, 27, 48, 43, 10, 109,
        -14, 95, 20, 55, 79, -31, 53, 109, 109, 81,
        -62, 69, -28, -123, -75, 118, 98, 94, 126, -58,
        -12, 76, 66, -23, -90, 55, -19, 107, 11, -1,
        92, -74, -12, 6, -73, -19, -18, 56, 107, -5,
        90, -119, -97, -91, -82, -97, 36, 17, 124, 75,
        31, -26, 73, 40, 102, 81, -20, -26, 83, -127,
        -1, -1, -1, -1, -1, -1, -1, -1
    };
    public static int F = 128;


    public N()
    {
    }

    public static int A(AudioPacket a)
    {
        int i = 0;
        for(int j = 0; j < 3; j++)
            i ^= a.C();

        a.E(4);
        return i;
    }

    public static void A(B b, int i)
    {
        Packet a = b.G();
        a.E(4);
        b.F(0);
        b.A(a.C() ^ a.C() ^ i);
    }

    public static boolean A(K k, AudioPacket a)
    {
        byte abyte0[] = k.A(a.G(), 0, a.I());
        if(abyte0 == null)
        {
            return false;
        } else
        {
            a.A(abyte0, abyte0.length);
            return B(a);
        }
    }

    public static B A(K k, B b)
    {
        if(k.A())
        {
            int i = (-1 - b.A()) + 5 & 0xf;
            b.F(b.A());
            b.A((byte)-1, i);
        } else
        {
            E.error("AesEncrypt not valid");
        }
        A(b);
        byte abyte0[] = k.A(b.B(), 4, b.A() - 4);
        if(abyte0 != null)
        {
            abyte0 = A(abyte0, 0, 4);
            return new B(abyte0, abyte0.length);
        } else
        {
            return null;
        }
    }

    private static byte[] A(byte abyte0[], int i, int j)
    {
        int k = abyte0.length;
        byte abyte1[] = new byte[k + j];
        System.arraycopy(abyte0, 0, abyte1, 0, i);
        for(int l = 0; l < j; l++)
            abyte1[i + l] = 0;

        System.arraycopy(abyte0, i, abyte1, i + j, k - i);
        return abyte1;
    }

    public static boolean B(AudioPacket a)
    {
        short word0 = a.E();
        short word1 = C(a);
        return word0 == word1;
    }

    public static void A(B b)
    {
        AudioPacket a = b.G();
        a.E(6);
        short word0 = C(a);
        b.F(4);
        b.A(word0);
    }

    public static short C(AudioPacket a)
    {
        int i = 0;
        int j = a.H();
        while(a.I() > 0)
            i += a.I() != 1 ? a.E() & 0xffff : a.L() & 0xff;
        a.E(j);
        i = (i >> 16) + (i & 0xffff);
        i += i >> 16;
        return (short)(~i & 0xffff);
    }

    public static D B()
    {
        BigInteger biginteger = new BigInteger(1, D);
        BigInteger biginteger1 = BigInteger.valueOf(2L);
        byte abyte0[] = new byte[D.length];
        try
        {
            com.jcumulus.server.rtmfp.pipe.C.A().read(abyte0);
            BigInteger biginteger2 = new BigInteger(1, abyte0);
            byte abyte1[] = biginteger1.modPow(biginteger2, biginteger).toByteArray();
            byte abyte2[] = Arrays.copyOfRange(abyte1, abyte1.length - F, abyte1.length);
            return new D(abyte0, abyte2);
        }
        catch(IOException ioexception)
        {
            E.error(ioexception.getMessage(), ioexception);
        }
        return null;
    }

    public static byte[] A(byte abyte0[], byte abyte1[])
    {
        BigInteger biginteger = new BigInteger(1, D);
        byte abyte2[] = (new BigInteger(1, abyte1)).modPow(new BigInteger(1, abyte0), biginteger).toByteArray();
        return Arrays.copyOfRange(abyte2, abyte2.length - F, abyte2.length);
    }

    public static byte[] B(byte abyte0[], byte abyte1[], int i, byte abyte2[])
    {
        try
        {
            SecretKeySpec secretkeyspec = new SecretKeySpec(abyte1, 0, i, "hmacSHA256");
            Mac mac = Mac.getInstance("hmacSHA256");
            mac.init(secretkeyspec);
            byte abyte3[] = mac.doFinal(abyte2);
            secretkeyspec = new SecretKeySpec(abyte0, "hmacSHA256");
            mac = Mac.getInstance("hmacSHA256");
            mac.init(secretkeyspec);
            return mac.doFinal(abyte3);
        }
        catch(NoSuchAlgorithmException nosuchalgorithmexception)
        {
            E.error(nosuchalgorithmexception.getMessage(), nosuchalgorithmexception);
        }
        catch(InvalidKeyException invalidkeyexception)
        {
            E.error(invalidkeyexception.getMessage(), invalidkeyexception);
        }
        return null;
    }

    public static byte[] A(byte abyte0[], byte abyte1[], int i, byte abyte2[])
    {
        try
        {
            SecretKeySpec secretkeyspec = new SecretKeySpec(abyte2, "hmacSHA256");
            Mac mac = Mac.getInstance("hmacSHA256");
            mac.init(secretkeyspec);
            mac.update(abyte1, 0, i);
            byte abyte3[] = mac.doFinal();
            secretkeyspec = new SecretKeySpec(abyte0, "hmacSHA256");
            mac = Mac.getInstance("hmacSHA256");
            mac.init(secretkeyspec);
            return mac.doFinal(abyte3);
        }
        catch(NoSuchAlgorithmException nosuchalgorithmexception)
        {
            E.error(nosuchalgorithmexception.getMessage(), nosuchalgorithmexception);
        }
        catch(InvalidKeyException invalidkeyexception)
        {
            E.error(invalidkeyexception.getMessage(), invalidkeyexception);
        }
        return null;
    }

    public static short A()
    {
        return A((new com.jcumulus.server.rtmfp.pipe.B()).getTime());
    }

    public static short A(long l)
    {
        return (short)(int)(0x13880L / (l * 4L));
    }
}
