2018-04-02 18:10:51 +02:00
/ * *
* @ author n1474335 [ n1474335 @ gmail . com ]
* @ copyright Crown Copyright 2016
* @ license Apache - 2.0
* /
2019-07-09 13:23:59 +02:00
import Operation from "../Operation.mjs" ;
import Utils from "../Utils.mjs" ;
2018-04-02 18:10:51 +02:00
/ * *
* 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 20:07:13 +02:00
this . infoURL = "https://wikipedia.org/wiki/Base32" ;
2018-04-02 18:10:51 +02: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
}
] ;
2020-03-24 12:06:37 +01:00
this . checks = [
2018-05-20 17:49:42 +02:00
{
2020-03-24 12:06:37 +01:00
pattern : "^(?:[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 ]
2020-02-25 12:27:03 +01:00
}
2020-03-24 12:06:37 +01:00
] ;
2018-04-02 18:10:51 +02: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 ;