* @param I_C client key exchange initialization string
* @return kex proposals or null if failure to guess
* @throws KexException if algorithm negotiation fails
*/
static KexProposal createProposal(final byte[] I_S, final byte[] I_C) throws KexException {
Buffer serverBuffer = new Buffer(I_S); // Wrap in Buffers to easily
Buffer clientBuffer = new Buffer(I_C); // read Strings
serverBuffer.setOffSet(17); // Skip over message code and 16 bytes of
clientBuffer.setOffSet(17); // random padding for each buffer
List<String> serverProposals, clientProposals;
KexProposal proposal = new KexProposal();
for( Proposal p : Proposal.values() ) {
// Parse out server and client proposal lists
serverProposals = Arrays.asList(Util.split(Util.byte2str(serverBuffer.getString()), ","));
clientProposals = Arrays.asList(Util.split(Util.byte2str(clientBuffer.getString()), ","));
if( JSch.getLogger().isEnabled(Level.DEBUG) ) {
JSch.getLogger().log(Level.DEBUG, "Kex: S proposes "+p+" -> "+serverProposals);
JSch.getLogger().log(Level.DEBUG, "Kex: C proposes "+p+" -> "+clientProposals);
}