/* =========================================================================
FmqSasl - work with SASL mechanisms
-------------------------------------------------------------------------
Copyright (c) 1991-2012 iMatix Corporation -- http://www.imatix.com
Copyright other contributors as noted in the AUTHORS file.
This file is part of FILEMQ, see http://filemq.org.
This is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.
This software is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTA-
BILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see http://www.gnu.org/licenses/.
=========================================================================
*/
package org.filemq;
import org.zeromq.ZFrame;
public class FmqSasl
{
// --------------------------------------------------------------------------
// Encode login and password as PLAIN response
//
// Formats a new authentication challenge for a PLAIN login. The protocol
// uses a SASL-style binary data block for authentication. This method is
// a simple way of turning a name and password into such a block. Note
// that plain authentication data is not encrypted and does not provide
// any degree of confidentiality. The SASL PLAIN mechanism is defined here:
// http://www.ietf.org/internet-drafts/draft-ietf-sasl-plain-08.txt.
public static ZFrame plainEncode (String login, String password)
{
// PLAIN format is [null]login[null]password
ZFrame frame = new ZFrame (new byte [login.length () + password.length () + 2]);
byte [] data = frame.getData ();
int pos = 0;
data [pos++] = 0;
System.arraycopy (login.getBytes (), 0, data, pos, login.length ());
pos += login.length ();
data [pos++] = 0;
System.arraycopy (password.getBytes (), 0, data, pos, password.length ());
return frame;
}
// --------------------------------------------------------------------------
// Decode PLAIN response into new login and password
public static boolean plainDecode (ZFrame frame, String [] idpw)
{
int size = frame.size ();
byte [] data = frame.getData ();
if (size < 2 || data [0] != 0 || idpw == null || idpw.length < 2)
return false;
int pos = 1;
for (;pos < size; pos++)
{
if (data [pos] == 0)
break;
}
if (pos < size) {
byte [] login = new byte [pos - 1];
byte [] password = new byte [size - pos - 1];
System.arraycopy (data, 1, login, 0, login.length);
System.arraycopy (data, pos + 1, password, 0, password.length);
idpw [0] = new String (login);
idpw [1] = new String (password);
return true;
}
else
return false;
}
}