All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.xnio.sasl.SaslWrapper Maven / Gradle / Ivy

/*
 * JBoss, Home of Professional Open Source
 *
 * Copyright 2011 Red Hat, Inc. and/or its affiliates, and individual
 * contributors as indicated by the @author tags.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.xnio.sasl;

import java.nio.ByteBuffer;

import javax.security.sasl.SaslClient;
import javax.security.sasl.SaslException;
import javax.security.sasl.SaslServer;

/**
 * A wrapper delegation class for SASL that presents the same wrap/unwrap API regardless of whether it is
 * dealing with a SASL client or server.
 *
 * @author David M. Lloyd
 */
public abstract class SaslWrapper {

    /**
     * Wrap a message.
     *
     * @param bytes the incoming message
     * @param off the offset into the byte array
     * @param len the length of the byte array to wrap
     * @return the wrap result
     * @throws SaslException if a problem occurs
     */
    public abstract byte[] wrap(byte[] bytes, int off, int len) throws SaslException;

    /**
     * Wrap a message.
     *
     * @param bytes the incoming message
     * @return the wrap result
     * @throws SaslException if a problem occurs
     */
    public final byte[] wrap(byte[] bytes) throws SaslException {
        return unwrap(bytes, 0, bytes.length);
    }

    /**
     * Wrap a message.
     *
     * @param source the buffer from which bytes should be read
     * @return the wrap result
     * @throws SaslException if a problem occurs
     */
    public abstract byte[] wrap(ByteBuffer source) throws SaslException;

    /**
     * Unwrap a message.
     *
     * @param bytes the incoming message
     * @param off the offset into the byte array
     * @param len the length of the byte array to wrap
     * @return the unwrap result
     * @throws SaslException if a problem occurs
     */
    public abstract byte[] unwrap(byte[] bytes, int off, int len) throws SaslException;

    /**
     * Unwrap a message.
     *
     * @param bytes the incoming message
     * @return the unwrap result
     * @throws SaslException if a problem occurs
     */
    public final byte[] unwrap(byte[] bytes) throws SaslException {
        return unwrap(bytes, 0, bytes.length);
    }

    /**
     * Unwrap a message.
     *
     * @param source the buffer from which bytes should be read
     * @return the unwrap result
     * @throws SaslException if a problem occurs
     */
    public abstract byte[] unwrap(ByteBuffer source) throws SaslException;

    /**
     * Wrap a message.  Wrapping occurs from the source buffer to the destination idea.
     * 

* The {@code source} buffer should have its position and remaining length set to encompass exactly one SASL message * (without the length field). The SASL message itself does not encode any length information so it is up to the * protocol implementer to ensure that the message is properly framed. * * @param destination the buffer into which bytes should be written * @param source the buffers from which bytes should be read * * @throws SaslException if a SASL error occurs * @see SaslClient#wrap(byte[], int, int) * @see SaslServer#wrap(byte[], int, int) */ public final void wrap(ByteBuffer destination, ByteBuffer source) throws SaslException { destination.put(wrap(source)); } /** * Unwrap a message. Unwrapping occurs from the source buffer to the destination idea. *

* The {@code source} buffer should have its position and remaining length set to encompass exactly one SASL * message (without the length field). The SASL message itself does not encode any length information so it is up * to the protocol implementer to ensure that the message is properly framed. * * @param destination the buffer into which bytes should be written * @param source the buffers from which bytes should be read * @throws SaslException if a SASL error occurs * @see SaslClient#unwrap(byte[], int, int) */ public final void unwrap(ByteBuffer destination, ByteBuffer source) throws SaslException { destination.put(wrap(source)); } /** * Create a SASL wrapper for a SASL client. * * @param saslClient the SASL client * @return the wrapper */ public static SaslWrapper create(SaslClient saslClient) { return new SaslClientWrapper(saslClient); } /** * Create a SASL wrapper for a SASL server. * * @param saslServer the SASL server * @return the wrapper */ public static SaslWrapper create(SaslServer saslServer) { return new SaslServerWrapper(saslServer); } } final class SaslClientWrapper extends SaslWrapper { private final SaslClient saslClient; SaslClientWrapper(final SaslClient saslClient) { this.saslClient = saslClient; } public byte[] wrap(final byte[] bytes, final int off, final int len) throws SaslException { return saslClient.wrap(bytes, off, len); } public byte[] unwrap(final byte[] bytes, final int off, final int len) throws SaslException { return saslClient.unwrap(bytes, off, len); } public byte[] wrap(final ByteBuffer source) throws SaslException { return SaslUtils.wrap(saslClient, source); } public byte[] unwrap(final ByteBuffer source) throws SaslException { return SaslUtils.unwrap(saslClient, source); } } final class SaslServerWrapper extends SaslWrapper { private final SaslServer saslServer; SaslServerWrapper(final SaslServer saslServer) { this.saslServer = saslServer; } public byte[] wrap(final byte[] bytes, final int off, final int len) throws SaslException { return saslServer.wrap(bytes, off, len); } public byte[] unwrap(final byte[] bytes, final int off, final int len) throws SaslException { return saslServer.unwrap(bytes, off, len); } public byte[] wrap(final ByteBuffer source) throws SaslException { return SaslUtils.wrap(saslServer, source); } public byte[] unwrap(final ByteBuffer source) throws SaslException { return SaslUtils.unwrap(saslServer, source); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy