ScramPlusMechanism.java

  1. /**
  2.  *
  3.  * Copyright 2016-2020 Florian Schmaus
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *     http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.jivesoftware.smack.sasl.core;

  18. import java.security.NoSuchAlgorithmException;
  19. import java.security.cert.CertificateEncodingException;

  20. import javax.net.ssl.SSLPeerUnverifiedException;

  21. import org.jivesoftware.smack.SmackException.SmackSaslException;
  22. import org.jivesoftware.smack.util.TLSUtils;

  23. /**
  24.  * SCRAM-X-PLUS implementation. Due limitations of the Java API, this mechanism only supports the 'tls-server-end-point'
  25.  * channel binding type. But on the other hand, the other relevant channel binding type 'tls-unique' has some flaws (see
  26.  * 3SHAKE, RFC 7627).
  27.  *
  28.  * @author Florian Schmaus
  29.  */
  30. public abstract class ScramPlusMechanism extends ScramMechanism {

  31.     protected ScramPlusMechanism(ScramHmac scramHmac) {
  32.         super(scramHmac);
  33.     }

  34.     @Override
  35.     public String getName() {
  36.         return super.getName() + "-PLUS";
  37.     }

  38.     @Override
  39.     protected String getGs2CbindFlag() {
  40.         return "p=tls-server-end-point";
  41.     }

  42.     @Override
  43.     protected byte[] getChannelBindingData() throws SmackSaslException {
  44.         byte[] cbData;
  45.         try {
  46.             cbData = TLSUtils.getChannelBindingTlsServerEndPoint(sslSession);
  47.         }
  48.         catch (SSLPeerUnverifiedException | CertificateEncodingException | NoSuchAlgorithmException e) {
  49.             throw new SmackSaslException(e);
  50.         }
  51.         return cbData;
  52.     }
  53. }