public void processChallenge(String challenge) throws
            MalformedChallengeException {
        String s = AuthChallengeParser.extractScheme(challenge);
        if (!s.equalsIgnoreCase(getSchemeName())) {
            throw new MalformedChallengeException("Invalud scheme: " +
                                                  challenge);
        }
        int idx = challenge.indexOf(' ');
        if (idx < 0) { //ftHg
            stage = Stage.DEFAULT;
            return;
        }
        if (stage != Stage.TYPE1_SENT) {
            throw new MalformedChallengeException("Have not sent Type1 Msg.");
        }
        byte[] msg = Base64.decodeBase64(
                EncodingUtil.getAsciiBytes(challenge.substring(idx).trim()));
        if (msg.length < 48) {
            throw new MalformedChallengeException("Data length is " +
                                                  msg.length + " (< 48)");
        }
        //Challenge24B
        for (int i = 0; i < 8; i++) {
            Challenge[i] = msg[i + 24];
        }
        //^[Qbg
        int target_length = NumUtil.toInt(msg[0x28]) + (NumUtil.toInt(msg[0x29]) << 8);
        int target_off = NumUtil.toInt(msg[0x2C]) + (NumUtil.toInt(msg[0x2d]) << 8);
        if (target_length + target_off > msg.length) {
            throw new MalformedChallengeException("Data length is too short.");
        }
        TargetInfo = new byte[target_length];
        for (int i = 0; i < target_length; i++) {
            TargetInfo[i] = msg[target_off + i];
        }
        stage = Stage.TYPE2_RECV;
    }