001/* 002 * The contents of this file are subject to the terms of the Common Development and 003 * Distribution License (the License). You may not use this file except in compliance with the 004 * License. 005 * 006 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the 007 * specific language governing permission and limitations under the License. 008 * 009 * When distributing Covered Software, include this CDDL Header Notice in each file and include 010 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL 011 * Header, with the fields enclosed by brackets [] replaced by your own identifying 012 * information: "Portions copyright [year] [name of copyright owner]". 013 * 014 * Copyright 2015-2016 ForgeRock AS. 015 */ 016 017package org.forgerock.util.encode; 018 019/** 020 * Makes use of the very fast and memory efficient Base64 class to encode and 021 * decode to and from BASE64 in full accordance with RFC 2045. And then replaces 022 * + and / for - and _ respectively and removes the padding character = to be in 023 * accordance with RFC 4648. 024 */ 025public final class Base64url { 026 /** 027 * Decodes the given Base64url encoded String into a byte array. 028 * 029 * @param content 030 * The Base64url encoded String to decode. 031 * @return The decoded byte[] array. 032 */ 033 public static byte[] decode(final String content) { 034 final StringBuilder builder = 035 new StringBuilder(content.replaceAll("-", "+").replaceAll("_", "/")); 036 final int modulus = builder.length() % 4; 037 final int numberOfPaddingChars = 4 - modulus; 038 if (modulus != 0) { 039 for (int i = 0; i < numberOfPaddingChars; i++) { 040 builder.append('='); 041 } 042 } 043 return Base64.decode(builder.toString()); 044 } 045 046 /** 047 * Encodes the given byte array into a Base64url encoded String. 048 * 049 * @param content 050 * The byte array to encode. 051 * @return The Base64url encoded byte array. 052 */ 053 public static String encode(final byte[] content) { 054 return Base64.encode(content).replaceAll("\\+", "-").replaceAll("/", "_").replaceAll("=", 055 ""); 056 } 057 058 private Base64url() { 059 // No impl. 060 } 061}