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.A;
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.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
public class Handshake extends ServerSession
{
private static final Logger W = Logger.getLogger(Handshake.class);
Map X;
byte V[];
private Sessions Y;
Handshake(Sessions l)
{
super(0, 0, com.jcumulus.server.rtmfp.N.A, com.jcumulus.server.rtmfp.N.A);
X = new HashMap();
V = new byte[77];
Y = l;
I = true;
System.arraycopy(new byte[] {
1, 10, 65, 14
}, 0, V, 0, 4);
try
{
com.jcumulus.server.rtmfp.pipe.C.A().read(V, 4, 64);
}
catch(IOException ioexception)
{
W.error(ioexception.getMessage(), ioexception);
}
System.arraycopy(new byte[] {
2, 21, 2, 2, 21, 5, 2, 21, 14
}, 0, V, 68, 9);
}
void A(B b, I i, byte abyte0[], String s)
{
com.jcumulus.server.rtmfp.C c = i.C;
if(c == null)
{
c = new com.jcumulus.server.rtmfp.C(abyte0, s);
X.put(new String(c.J), c);
i.C = c;
}
b.B((byte)64);
b.A(c.J, 64);
}
protected void B(AudioPacket a)
{
byte byte0 = a.L();
if(byte0 != 11)
{
W.error((new StringBuilder()).append("Marker handshake wrong : should be 0b and not ").append(byte0).toString());
return;
}
a.E();
byte byte1 = a.L();
a.A(a.E());
int i = N.C();
N.E(3);
byte byte2 = A(byte1, a, N);
N.F(i);
if(byte2 > 0)
{
N.B(byte2);
N.A((short)(N.A() - N.C() - 2));
E();
}
D = 0;
}
private byte A(byte byte0, AudioPacket a, B b)
{
switch(byte0)
{
case 48: // '0'
a.L();
int i = (a.L() & 0xff) - 1;
byte byte1 = a.L();
String s = new String(a.F(i));
byte abyte0[] = a.F(16);
b.A(abyte0);
if(byte1 != 15)
{
if(byte1 == 10)
{
I l = A(abyte0);
A(b, l, abyte0, s);
b.A(V, V.length);
return 112;
}
W.error("Unkown handshake first way with 'type' type");
}
break;
case 56: // '8'
case 57: // '9'
D = a.C();
if(a.J() != 64)
{
W.error("Bad handshake cookie its size should be 64 bytes");
return 0;
}
com.jcumulus.server.rtmfp.C c = (com.jcumulus.server.rtmfp.C)X.get(new String(a.B(64)));
if(c == null)
{
if(byte0 != 57)
{
W.error("Handshake cookie unknown");
return 0;
}
c = new com.jcumulus.server.rtmfp.C();
int j = a.H();
c.J = a.F(64);
c.K = new String(a.F(64));
a.E(j);
X.put(new String(c.J), c);
}
Peer p = new Peer();
p.A(M.L());
if(c.B == 0)
{
D d = null;
if(byte0 == 56)
{
a.D(64);
int k = a.J();
try
{
MessageDigest messagedigest = MessageDigest.getInstance("SHA-256");
messagedigest.update(a.B(k));
p.B = messagedigest.digest();
}
catch(NoSuchAlgorithmException nosuchalgorithmexception)
{
W.error(nosuchalgorithmexception.getMessage(), nosuchalgorithmexception);
}
byte abyte1[] = new byte[a.J() - 2];
a.D(2);
abyte1 = a.F(abyte1.length);
k = a.J();
d = c.A(abyte1, a.G(), k);
}
com.jcumulus.server.rtmfp.pipe.C.A(c.K, p);
ServerSession h = Y.A(D, d.B(), d.A(), p);
c.B = h.O;
String s1 = null;
if(byte0 != 57)
s1 = p.L().toString();
p.N().clear();
p.N().add(s1);
c.A();
}
c.A(b);
return c.C;
case 65: // 'A'
case 69: // 'E'
default:
W.error((new StringBuilder()).append("Unkown handshake packet id ").append(byte0).toString());
break;
}
return 0;
}
public void E()
{
A((byte)11, false);
}
}