chore: experiments with proto
This commit is contained in:
parent
53233bffea
commit
8c92239aa4
@ -6,9 +6,9 @@ const otpauthScheme = "otpauth:/";
|
|||||||
const googleMigrationScheme = "otpauth-migration:/";
|
const googleMigrationScheme = "otpauth-migration:/";
|
||||||
|
|
||||||
export function getTOTPByLink(link) {
|
export function getTOTPByLink(link) {
|
||||||
if(link.includes(otpauthScheme))
|
if (link.includes(otpauthScheme))
|
||||||
return getByOtpauthScheme(link)
|
return getByOtpauthScheme(link)
|
||||||
if(link.includes(googleMigrationScheme))
|
if (link.includes(googleMigrationScheme))
|
||||||
return getByGoogleMigrationScheme(link)
|
return getByGoogleMigrationScheme(link)
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
@ -21,7 +21,7 @@ function getHashType(algorithm) {
|
|||||||
else return "SHA-1";
|
else return "SHA-1";
|
||||||
}
|
}
|
||||||
|
|
||||||
function getByOtpauthScheme(link){
|
function getByOtpauthScheme(link) {
|
||||||
try {
|
try {
|
||||||
let args = link.split("/", otpauthScheme.length);
|
let args = link.split("/", otpauthScheme.length);
|
||||||
let type = args[2]; //Returns 'hotp' or 'totp'
|
let type = args[2]; //Returns 'hotp' or 'totp'
|
||||||
@ -40,9 +40,9 @@ function getByOtpauthScheme(link){
|
|||||||
|
|
||||||
if (secret === undefined) throw new Error("Secret not defined");
|
if (secret === undefined) throw new Error("Secret not defined");
|
||||||
|
|
||||||
if(issuer == client){
|
if (issuer == client) {
|
||||||
issuer = args[3].split("issuer=")[1]?.split("&")[0];
|
issuer = args[3].split("issuer=")[1]?.split("&")[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
issuer = decodeURIComponent(issuer);
|
issuer = decodeURIComponent(issuer);
|
||||||
client = decodeURIComponent(client);
|
client = decodeURIComponent(client);
|
||||||
@ -57,58 +57,79 @@ function getByOtpauthScheme(link){
|
|||||||
getHashType(algorithm)
|
getHashType(algorithm)
|
||||||
);
|
);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getByGoogleMigrationScheme(link){
|
function getByGoogleMigrationScheme(link) {
|
||||||
|
|
||||||
let data = link.split("data=")[1]; //Returns base64 encoded data
|
let data = link.split("data=")[1]; //Returns base64 encoded data
|
||||||
data = decodeURIComponent(data);
|
data = decodeURIComponent(data);
|
||||||
let decode = base64decode(data);
|
let decode = base64decode(data);
|
||||||
let proto = decodeProto(decode);
|
let proto = decodeProto(decode);
|
||||||
|
|
||||||
let protoTotps = [];
|
let totps = [];
|
||||||
|
|
||||||
proto.parts.forEach(part => {
|
totps.push(new TOTP(
|
||||||
if(part.type == TYPES.LENDELIM){
|
"",
|
||||||
protoTotps.push(decodeProto(part.value));
|
data,
|
||||||
}
|
decode,
|
||||||
});
|
6,
|
||||||
|
30,
|
||||||
|
0,
|
||||||
|
"SHA-1"
|
||||||
|
));
|
||||||
|
|
||||||
let totps = [];
|
totps.push(new TOTP(
|
||||||
protoTotps.forEach(x => {
|
"",
|
||||||
let type = x.parts.filter(x => x.index == 6)[0]; //find type of OTP
|
proto.leftOver,
|
||||||
if(type.value !== '2'){
|
proto.parts.length,
|
||||||
console.log("ERR: it's a not TOTP record")
|
6,
|
||||||
return;
|
30,
|
||||||
}
|
0,
|
||||||
let secret = x.parts.filter(x => x.index == 1)[0].value;
|
"SHA-1"
|
||||||
secret = encode(secret);
|
));
|
||||||
|
|
||||||
let name = bytesToString(x.parts.filter(x => x.index == 2)[0].value);
|
let protoTotps = [];
|
||||||
let issuer = bytesToString(x.parts.filter(x => x.index == 3)[0].value);
|
|
||||||
|
|
||||||
totps.push(new TOTP(
|
proto.parts.forEach(part => {
|
||||||
|
if (part.type == TYPES.LENDELIM) {
|
||||||
|
protoTotps.push(decodeProto(part.value));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
protoTotps.forEach(x => {
|
||||||
|
let type = x.parts.filter(x => x.index == 6)[0]; //find type of OTP
|
||||||
|
if (type.value !== '2') {
|
||||||
|
console.log("ERR: it's a not TOTP record")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let secret = x.parts.filter(x => x.index == 1)[0].value;
|
||||||
|
secret = encode(secret);
|
||||||
|
|
||||||
|
let name = bytesToString(x.parts.filter(x => x.index == 2)[0].value);
|
||||||
|
let issuer = bytesToString(x.parts.filter(x => x.index == 3)[0].value);
|
||||||
|
|
||||||
|
totps.push(new TOTP(
|
||||||
secret,
|
secret,
|
||||||
issuer,
|
issuer,
|
||||||
name,
|
name,
|
||||||
6,
|
6,
|
||||||
30,
|
30,
|
||||||
0,
|
0,
|
||||||
"SHA-1"
|
"SHA-1"
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
|
|
||||||
return totps;
|
return totps;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function bytesToString(bytes) {
|
function bytesToString(bytes) {
|
||||||
let str = '';
|
let str = '';
|
||||||
for (let i = 0; i < bytes.length; i++) {
|
for (let i = 0; i < bytes.length; i++) {
|
||||||
str += String.fromCharCode(bytes[i]);
|
str += String.fromCharCode(bytes[i]);
|
||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user