2018-04-02 17:10:51 +01:00
/**
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2016
* @license Apache-2.0
*/
import Operation from "../Operation" ;
import Utils from "../Utils" ;
/**
* From Base32 operation
*/
class FromBase32 extends Operation {
/**
* FromBase32 constructor
*/
constructor () {
super ();
this . name = "From Base32" ;
this . module = "Default" ;
this . description = "Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7." ;
2018-08-21 19:07:13 +01:00
this . infoURL = "https://wikipedia.org/wiki/Base32" ;
2018-04-02 17:10:51 +01:00
this . inputType = "string" ;
this . outputType = "byteArray" ;
this . args = [
{
name : "Alphabet" ,
type : "binaryString" ,
value : "A-Z2-7="
},
{
name : "Remove non-alphabet chars" ,
type : "boolean" ,
value : true
}
];
2018-05-20 16:49:42 +01:00
this . patterns = [
{
match : "^(?:[A-Z2-7]{8})+(?:[A-Z2-7]{2}={6}|[A-Z2-7]{4}={4}|[A-Z2-7]{5}={3}|[A-Z2-7]{7}={1})?$" ,
flags : "" ,
args : [ "A-Z2-7=" , false ]
},
];
2018-04-02 17:10:51 +01:00
}
/**
* @param {string} input
* @param {Object[]} args
* @returns {byteArray}
*/
run ( input , args ) {
if ( ! input ) return [];
const alphabet = args [ 0 ] ?
Utils . expandAlphRange ( args [ 0 ]). join ( "" ) : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=" ,
removeNonAlphChars = args [ 1 ],
output = [];
let chr1 , chr2 , chr3 , chr4 , chr5 ,
enc1 , enc2 , enc3 , enc4 , enc5 , enc6 , enc7 , enc8 ,
i = 0 ;
if ( removeNonAlphChars ) {
const re = new RegExp ( "[^" + alphabet . replace ( /[\]\\\-^]/g , "\\$&" ) + "]" , "g" );
input = input . replace ( re , "" );
}
while ( i < input . length ) {
enc1 = alphabet . indexOf ( input . charAt ( i ++ ));
enc2 = alphabet . indexOf ( input . charAt ( i ++ ) || "=" );
enc3 = alphabet . indexOf ( input . charAt ( i ++ ) || "=" );
enc4 = alphabet . indexOf ( input . charAt ( i ++ ) || "=" );
enc5 = alphabet . indexOf ( input . charAt ( i ++ ) || "=" );
enc6 = alphabet . indexOf ( input . charAt ( i ++ ) || "=" );
enc7 = alphabet . indexOf ( input . charAt ( i ++ ) || "=" );
enc8 = alphabet . indexOf ( input . charAt ( i ++ ) || "=" );
chr1 = ( enc1 << 3 ) | ( enc2 >> 2 );
chr2 = (( enc2 & 3 ) << 6 ) | ( enc3 << 1 ) | ( enc4 >> 4 );
chr3 = (( enc4 & 15 ) << 4 ) | ( enc5 >> 1 );
chr4 = (( enc5 & 1 ) << 7 ) | ( enc6 << 2 ) | ( enc7 >> 3 );
chr5 = (( enc7 & 7 ) << 5 ) | enc8 ;
output . push ( chr1 );
if ( enc2 & 3 !== 0 || enc3 !== 32 ) output . push ( chr2 );
if ( enc4 & 15 !== 0 || enc5 !== 32 ) output . push ( chr3 );
if ( enc5 & 1 !== 0 || enc6 !== 32 ) output . push ( chr4 );
if ( enc7 & 7 !== 0 || enc8 !== 32 ) output . push ( chr5 );
}
return output ;
}
}
export default FromBase32 ;