@Test public void decodeBig() { byte[] res = Base64Util.decode( "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwg\n" + "c2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9y\n" + "ZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQg\n" + "YWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCBjbGl0YSBrYXNk\n" + "IGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9y\n" + "IHNpdCBhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNj\n" + "aW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJv\n" + "cmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtIHZvbHVwdHVhLiBBdCB2\n" + "ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0\n" + "IGNsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0g\n" + "aXBzdW0gZG9sb3Igc2l0IGFtZXQuIDEyMzQ1IS84Ly8vMzQ1KiY="); assertEquals( new String(res), "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod " + "tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero " + "eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata " + "sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing " + "elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed " + "diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd " + "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 12345!/8///345*&"); }
/** * Parse to a ProtocolHashedVersion from a given string version/base64-hash combination. * * @param startVersion the starting version * @param base64Hash the base64 hash * @throws IllegalArgumentException on bad data * @return a parsed protobuf object */ private static ProtocolHashedVersion parseFromUnsafe(String startVersion, String base64Hash) throws IllegalArgumentException { return ProtocolHashedVersion.newBuilder() .setVersion(Long.parseLong(startVersion)) .setHistoryHash(Base64Util.decode(base64Hash)) .build(); }
@Test public void testEncode() { final byte[] data = "abcdefg \r\n hijklmn \t opqrst \u3000 uvwxyz".getBytes(); String base64 = Base64Util.encode(data); byte[] restore = Base64Util.decode(base64); assertEquals(data.length, restore.length); for (int i = 0; i < data.length; i++) { assertEquals(data[i], restore[i]); } }
public static String decryptPasswordLDAP(String pwdLdap) throws Exception { String passwordToGenKey = "IDOCLDAP"; byte dPasswordLDAP[] = Base64Util.decode(pwdLdap); // Obtener el texto que va a dar el hash inicial byte buf[] = passwordToGenKey.getBytes("ISO-8859-1"); Security.addProvider(new BouncyCastleProvider()); // Obtener el hash MessageDigest md = MessageDigest.getInstance("MD5", "BC"); md.update(buf); byte hash[] = md.digest(); // Aunque no lo diga en ninguna parte, el cryptoapi usa una clave de 128 // bits con todo ceros // menos los 5 primeros bytes para cifrar.... byte newHash[] = { (byte) hash[0], (byte) hash[1], (byte) hash[2], (byte) hash[3], (byte) hash[4], (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 }; // Obtener la key basada en ese hash SecretKeySpec key = new SecretKeySpec(newHash, "RC4"); // Obtener el objeto Cipher e inicializarlo con la key Cipher cipher = Cipher.getInstance("RC4", "BC"); cipher.init(Cipher.DECRYPT_MODE, key); // descifrar byte bufCipher[] = cipher.doFinal(dPasswordLDAP); String descPwdLdap = new String(bufCipher); return descPwdLdap; }
@Test public void randomTest() { final Random rnd = new Random(); final int cnt = 10; final int maxSize = 1024; for (int i = 0; i < cnt; i++) { for (int j = 0; j < maxSize; j++) { final byte[] data = new byte[j]; rnd.nextBytes(data); final String encstr = Base64Util.encode(data); final byte[] decoded = Base64Util.decode(encstr); Assert.assertArrayEquals(data, decoded); } } }
/** * @param strKey key * @param strIvKey 矢量key * @param strContent 要解密的内容 * @return 解密后的字符串,失败返回null */ public static String decode(String strKey, String strIvKey, String strContent) { byte[] byteMi = Base64Util.decode(strContent); IvParameterSpec zeroIv = new IvParameterSpec(strIvKey.getBytes()); SecretKeySpec key = new SecretKeySpec(strKey.getBytes(), "AES"); Cipher cipher; byte[] decodedData = null; try { cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, key, zeroIv); decodedData = cipher.doFinal(byteMi); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); Log.e(TAG, "无效的矢量key"); } catch (InvalidKeyException e) { e.printStackTrace(); Log.e(TAG, "无效的key"); } String result = null; if (decodedData == null) { return null; } try { result = new String(decodedData, CHARSET); } catch (UnsupportedEncodingException e) { e.printStackTrace(); Log.e(TAG, "无法把解密后的字符数组转化为" + CHARSET + "字符串"); } return result; }
@Test public void boundaryTest() { final byte[][] testcases = { makeArray(0, 0), makeArray(1, 0), makeArray(2, 0), makeArray(1, 127), makeArray(1, 128), makeArray(1, 255), makeArray(2, 127), makeArray(2, 128), makeArray(2, 255), makeArray(3, 127), makeArray(3, 128), makeArray(3, 255), }; for (byte[] data : testcases) { final String encstr = Base64Util.encode(data); final byte[] decoded = Base64Util.decode(encstr); Assert.assertArrayEquals(data, decoded); } }
@Test(expectedExceptions = IllegalArgumentException.class) public void decodeToSmall() { assertEquals(Base64Util.decode("abc").length, 0); }
@Test public void decodeEmpty() { assertEquals(Base64Util.decode("").length, 0); }
@Test(expectedExceptions = IllegalArgumentException.class) public void decodeNull() { Base64Util.decode(null); }
/** * Reads a get signer request off the wire, sends it to the WS with a new callback for returning * the response. * * @param request the get signer request * @param responseCallback the callback to send the response back */ void processGetSignerRequest(final IQ request, final PacketCallback responseCallback) { Element items = request.getChildElement().element("items"); Element signerRequest = items != null ? items.element("signer-request") : null; if (items == null || signerRequest == null || signerRequest.attributeValue("wavelet-name") == null || signerRequest.attributeValue("signer-id") == null || signerRequest.attributeValue("version") == null || signerRequest.attributeValue("history-hash") == null) { manager.sendErrorResponse(request, FederationErrors.badRequest("Malformed signer request")); return; } final ByteString signerId; try { signerId = Base64Util.decode(signerRequest.attributeValue("signer-id")); } catch (IllegalArgumentException e) { responseCallback.error(FederationErrors.badRequest("Malformed signer ID")); return; } final ProtocolHashedVersion deltaEndVersion; try { deltaEndVersion = parseFromUnsafe( signerRequest.attributeValue("version"), signerRequest.attributeValue("history-hash")); } catch (IllegalArgumentException e) { responseCallback.error(FederationErrors.badRequest("Invalid hashed version")); return; } final WaveletName waveletName; try { waveletName = XmppUtil.waveletNameCodec.uriToWaveletName(signerRequest.attributeValue("wavelet-name")); } catch (EncodingException e) { responseCallback.error(FederationErrors.badRequest("Malformed wavelet name")); return; } WaveletFederationProvider.DeltaSignerInfoResponseListener listener = new WaveletFederationProvider.DeltaSignerInfoResponseListener() { @Override public void onFailure(FederationError error) { responseCallback.error(error); } @Override public void onSuccess(ProtocolSignerInfo signerInfo) { IQ response = IQ.createResultIQ(request); Element pubsub = response.setChildElement("pubsub", XmppNamespace.NAMESPACE_PUBSUB); Element items = pubsub.addElement("items"); XmppUtil.protocolSignerInfoToXml(signerInfo, items); responseCallback.run(response); } }; waveletProvider.getDeltaSignerInfo(signerId, waveletName, deltaEndVersion, listener); }
/** * Handles a submit request from a foreign wave remote. Sends it to the wave server, sets up a * callback to send the response. * * @param request the submit request * @param responseCallback the callback to send the response back */ void processSubmitRequest(final IQ request, final PacketCallback responseCallback) { Element item = null, submitRequest = null, deltaElement = null; Element pubsubRequest = request.getElement().element("pubsub"); // TODO: check for correct elements. Element publish = pubsubRequest.element("publish"); if (publish != null) { item = publish.element("item"); if (item != null) { submitRequest = item.element("submit-request"); if (submitRequest != null) { deltaElement = submitRequest.element("delta"); } } } if (publish == null || item == null || submitRequest == null || deltaElement == null || deltaElement.attribute("wavelet-name") == null || deltaElement.getText() == null) { responseCallback.error(FederationErrors.badRequest("Malformed submit request")); return; } final WaveletName waveletName; try { waveletName = XmppUtil.waveletNameCodec.uriToWaveletName(deltaElement.attributeValue("wavelet-name")); } catch (EncodingException e) { responseCallback.error( FederationErrors.badRequest( "Malformed wavelet name: " + deltaElement.attributeValue("wavelet-name"))); return; } final ProtocolSignedDelta delta; try { delta = ProtocolSignedDelta.parseFrom(Base64Util.decode(deltaElement.getText())); } catch (InvalidProtocolBufferException e) { responseCallback.error( FederationErrors.badRequest("Malformed delta, not a valid protocol buffer")); return; } // Construct a submit result listener inline. WaveletFederationProvider.SubmitResultListener listener = new WaveletFederationProvider.SubmitResultListener() { @Override public void onFailure(FederationError error) { responseCallback.error(error); } @Override public void onSuccess(int operations, ProtocolHashedVersion version, long timestamp) { IQ response = IQ.createResultIQ(request); Element pubsub = response.setChildElement("pubsub", XmppNamespace.NAMESPACE_PUBSUB); Element submitResponse = pubsub .addElement("publish") .addElement("item") .addElement("submit-response", XmppNamespace.NAMESPACE_WAVE_SERVER); submitResponse.addAttribute("application-timestamp", String.valueOf(timestamp)); submitResponse.addAttribute("operations-applied", String.valueOf(operations)); Element hashedVersion = submitResponse.addElement("hashed-version"); hashedVersion.addAttribute("history-hash", Base64Util.encode(version.getHistoryHash())); hashedVersion.addAttribute("version", String.valueOf(version.getVersion())); responseCallback.run(response); } }; // Hand off the submit request to the wavelet provider. waveletProvider.submitRequest(waveletName, delta, listener); }
@Test public void testDecodeBadBase64() { final String base64 = "ABCDEFG@@@\u3000\n\n@@..="; assertNull(Base64Util.decode(base64)); }