/* * ==================================================================== * Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.internal.io.svn; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import org.tmatesoft.svn.core.auth.SVNPasswordAuthentication; import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil; import org.tmatesoft.svn.core.internal.util.SVNFormatUtil; /** * @version 1.3 * @author TMate Software Ltd. */ public class CramMD5 { private SVNPasswordAuthentication myCredentials; public void setUserCredentials(SVNPasswordAuthentication credentials) { myCredentials = credentials; } public byte[] buildChallengeResponse(byte[] challenge) throws IOException { byte[] password = SVNEncodingUtil.getBytes(myCredentials.getPasswordValue(), "UTF-8"); byte[] secret = new byte[64]; Arrays.fill(secret, (byte) 0); System.arraycopy(password, 0, secret, 0, Math.min(secret.length, password.length)); MessageDigest digest; try { digest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { return null; } for (int i = 0; i < secret.length; i++) { secret[i] ^= 0x36; } digest.update(secret); digest.update(challenge); byte[] result = digest.digest(); for (int i = 0; i < secret.length; i++) { secret[i] ^= (0x36 ^ 0x5c); } digest.update(secret); digest.update(result); result = digest.digest(); String hexDigest = ""; for (int i = 0; i < result.length; i++) { hexDigest += SVNFormatUtil.getHexNumberFromByte(result[i]); } String response = myCredentials.getUserName() + " " + hexDigest; response = response.getBytes("UTF-8").length + ":" + response + " "; return response.getBytes("UTF-8"); } }