private void checkQopSupport(byte[] qopInChallenge,byte[] ciphersInChallenge) throws IOException {
  String qopOptions;
  if (qopInChallenge == null) {
    qopOptions="auth";
  }
 else {
    qopOptions=new String(qopInChallenge,encoding);
  }
  String[] serverQopTokens=new String[3];
  byte[] serverQop=parseQop(qopOptions,serverQopTokens,true);
  byte serverAllQop=combineMasks(serverQop);
switch (findPreferredMask(serverAllQop,qop)) {
case 0:
    throw new SaslException("DIGEST-MD5: No common protection " + "layer between client and server");
case NO_PROTECTION:
  negotiatedQop="auth";
break;
case INTEGRITY_ONLY_PROTECTION:
negotiatedQop="auth-int";
integrity=true;
rawSendSize=sendMaxBufSize - 16;
break;
case PRIVACY_PROTECTION:
negotiatedQop="auth-conf";
privacy=integrity=true;
rawSendSize=sendMaxBufSize - 26;
checkStrengthSupport(ciphersInChallenge);
break;
}
if (logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE,"DIGEST61:Raw send size: {0}",new Integer(rawSendSize));
}
}

private void checkQopSupport ( byte [ ] qopInChallenge , byte [ ] ciphersInChallenge ) throws IOException { String qopOptions ; if ( qopInChallenge == null ) { qopOptions = "auth" ; } else { qopOptions = new String ( qopInChallenge , encoding ) ; } String [ ] serverQopTokens = new String [ 3 ] ; byte [ ] serverQop = parseQop ( qopOptions , serverQopTokens , true ) ; byte serverAllQop = combineMasks ( serverQop ) ; switch ( findPreferredMask ( serverAllQop , qop ) ) { case 0 : throw new SaslException ( "DIGEST-MD5: No common protection " + "layer between client and server" ) ; case NO_PROTECTION : negotiatedQop = "auth" ; break ; case INTEGRITY_ONLY_PROTECTION : negotiatedQop = "auth-int" ; integrity = true ; rawSendSize = sendMaxBufSize - 16 ; break ; case PRIVACY_PROTECTION : negotiatedQop = "auth-conf" ; privacy = integrity = true ; rawSendSize = sendMaxBufSize - 26 ; checkStrengthSupport ( ciphersInChallenge ) ; break ; } if ( logger . isLoggable ( Level . FINE ) ) { logger . log ( Level . FINE , "DIGEST61:Raw send size: {0}" , new Integer ( rawSendSize ) ) ; } }
parses the ' qop ' directive . if ' auth - conf ' is specified by the client and offered as a qop option by the server , then a check is client - side supported ciphers is performed .
