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; 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)); } }