import * as asn1js from "asn1js"; import * as pvutils from "pvutils"; import { ContentInfo, ContentInfoJson } from "./ContentInfo"; import { SafeContents } from "./SafeContents"; import { EnvelopedData } from "./EnvelopedData"; import { EncryptedData } from "./EncryptedData"; import * as Schema from "./Schema"; import { id_ContentType_Data, id_ContentType_EncryptedData, id_ContentType_EnvelopedData } from "./ObjectIdentifiers"; import { ArgumentError, AsnError, ParameterError } from "./errors"; import { PkiObject, PkiObjectParameters } from "./PkiObject"; import { EMPTY_STRING } from "./constants"; import * as common from "./common";
/** * Represents the AuthenticatedSafe structure described in [RFC7292](https://datatracker.ietf.org/doc/html/rfc7292)
*/
export class AuthenticatedSafe extends PkiObject implements IAuthenticatedSafe {
public safeContents!: ContentInfo[]; public parsedValue: any;
/** * Initializes a new instance of the {@link AuthenticatedSafe} class * @param parameters Initialization parameters
*/
constructor(parameters: AuthenticatedSafeParameters = {}) { super();
this.safeContents = pvutils.getParametersValue(parameters, SAFE_CONTENTS, AuthenticatedSafe.defaultValues(SAFE_CONTENTS)); if (PARSED_VALUE in parameters) { this.parsedValue = pvutils.getParametersValue(parameters, PARSED_VALUE, AuthenticatedSafe.defaultValues(PARSED_VALUE));
}
if (parameters.schema) { this.fromSchema(parameters.schema);
}
}
/** * Returns default values for all class members * @param memberName String name for a class member * @returns Default value
*/ publicstatic override defaultValues(memberName: typeof SAFE_CONTENTS): ContentInfo[]; publicstatic override defaultValues(memberName: typeof PARSED_VALUE): any; publicstatic override defaultValues(memberName: string): any { switch (memberName) { case SAFE_CONTENTS: return []; case PARSED_VALUE: return {}; default: returnsuper.defaultValues(memberName);
}
}
/** * Compare values with default values for all class members * @param memberName String name for a class member * @param memberValue Value to compare with default value
*/ publicstatic compareWithDefault(memberName: string, memberValue: any): boolean { switch (memberName) { case SAFE_CONTENTS: return (memberValue.length === 0); case PARSED_VALUE: return ((memberValue instanceof Object) && (Object.keys(memberValue).length === 0)); default: returnsuper.defaultValues(memberName);
}
}
/** * @inheritdoc * @asn ASN.1 schema * ```asn * AuthenticatedSafe ::= SEQUENCE OF ContentInfo * -- Data if unencrypted * -- EncryptedData if password-encrypted * -- EnvelopedData if public key-encrypted *```
*/ publicstatic override schema(parameters: Schema.SchemaParameters<{
contentInfos?: string;
}> = {}): Schema.SchemaType { const names = pvutils.getParametersValue<NonNullable<typeof parameters.names>>(parameters, "names", {});
// Get internal properties from parsed schema this.safeContents = Array.from(asn1.result.contentInfos, element => new ContentInfo({ schema: element }));
}
public toSchema(): asn1js.Sequence { return (new asn1js.Sequence({
value: Array.from(this.safeContents, o => o.toSchema())
}));
}
public toJSON(): AuthenticatedSafeJson { return {
safeContents: Array.from(this.safeContents, o => o.toJSON())
};
}
public async parseInternalValues(parameters: { safeContents: SafeContent[]; }, crypto = common.getCrypto(true)): Promise<void> { //#region Check input data from "parameters"
ParameterError.assert(parameters, SAFE_CONTENTS);
ArgumentError.assert(parameters.safeContents, SAFE_CONTENTS, "Array"); if (parameters.safeContents.length !== this.safeContents.length) { thrownew ArgumentError("Length of \"parameters.safeContents\" must be equal to \"this.safeContents.length\"");
} //#endregion
//#region Create value for "this.parsedValue.authenticatedSafe" this.parsedValue = {
safeContents: [] as any[],
};
for (const [index, content] of this.safeContents.entries()) { const safeContent = parameters.safeContents[index]; const errorTarget = `parameters.safeContents[${index}]`; switch (content.contentType) { //#region data case id_ContentType_Data:
{ // Check that we do have OCTET STRING as "content"
ArgumentError.assert(content.content, "this.safeContents[j].content", asn1js.OctetString);
//#region Check we have "constructive encoding" for AuthSafe content const authSafeContent = content.content.getValue(); //#endregion
//#region Finally initialize initial values of SAFE_CONTENTS type this.parsedValue.safeContents.push({
privacyMode: 0, // No privacy, clear data
value: SafeContents.fromBER(authSafeContent)
}); //#endregion
} break; //#endregion //#region envelopedData case id_ContentType_EnvelopedData:
{ //#region Initial variables const cmsEnveloped = new EnvelopedData({ schema: content.content }); //#endregion
//#region Initialize internal data this.parsedValue.safeContents.push({
privacyMode: 1, // Password-based privacy mode
value: SafeContents.fromBER(decrypted),
}); //#endregion
} break; //#endregion //#region default default: thrownew Error(`Unknown "contentType"for AuthenticatedSafe: " ${content.contentType}`); //#endregion
}
} //#endregion
} public async makeInternalValues(parameters: {
safeContents: any[];
}, crypto = common.getCrypto(true)): Promise<this> { //#region Check data in PARSED_VALUE if (!(this.parsedValue)) { thrownew Error("Please run \"parseValues\" first or add \"parsedValue\" manually");
}
ArgumentError.assert(this.parsedValue, "this.parsedValue", "object");
ArgumentError.assert(this.parsedValue.safeContents, "this.parsedValue.safeContents", "Array");
//#region Check input data from "parameters"
ArgumentError.assert(parameters, "parameters", "object");
ParameterError.assert(parameters, "safeContents");
ArgumentError.assert(parameters.safeContents, "parameters.safeContents", "Array"); if (parameters.safeContents.length !== this.parsedValue.safeContents.length) { thrownew ArgumentError("Length of \"parameters.safeContents\" must be equal to \"this.parsedValue.safeContents\"");
} //#endregion
for (const [index, content] of this.parsedValue.safeContents.entries()) { //#region Check current "content" value
ParameterError.assert("content", content, "privacyMode", "value");
ArgumentError.assert(content.value, "content.value", SafeContents); //#endregion
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.