public static EncryptedEntity Decode(byte[] encoded, EncryptedVerifier verifier) { try { var bsnkType = Asn1Parser.GetBsnkType(encoded); byte[] signedPayload; Signature signature; switch (bsnkType) { case Constants.EncryptedIdentityName: var encryptedIdentity = Asn1Parser.GetEncryptedEntity <EncryptedIdentity>(encoded, false); return(encryptedIdentity); case Constants.EncryptedPseudonymName: var encryptedPseudonym = Asn1Parser.GetEncryptedEntity <EncryptedPseudonym>(encoded, true); return(encryptedPseudonym); case Constants.SignedEncryptedIdentityName: if (verifier == null) { throw new ParsingException("No verifier for identity found"); } signedPayload = Asn1Parser.GetSignedPayload(encoded); var signedEncryptedIdentity = Asn1Parser.GetEncryptedEntity <EncryptedIdentity>(signedPayload, false); signature = Asn1Parser.GetSignature(encoded); verifier.Verify(signedPayload, signature); return(signedEncryptedIdentity); case Constants.SignedEncryptedPseudonymName: if (verifier == null) { throw new ParsingException("No verifier for pseudonym found"); } signedPayload = Asn1Parser.GetSignedPayload(encoded); var signedEncryptedPseudonym = Asn1Parser.GetEncryptedEntity <EncryptedPseudonym>(signedPayload, true); signature = Asn1Parser.GetSignature(encoded); verifier.Verify(signedPayload, signature); return(signedEncryptedPseudonym); default: throw new ParsingException($"Cannot handle type {bsnkType}"); } } catch (IOException e) { throw new ParsingException("Could not read ASN1", e); } }
private void DecodeSigned(bool isPseudonym, EncryptedVerifier verifier) { try { var payload = parser.ReadObject <DerSequenceParser>().ToAsn1Object().GetDerEncoded(); var payloadParser = new Asn1Parser(payload); payloadParser.ReadObject <DerSequenceParser>(); bsnkType = payloadParser.GetBsnkType(); switch (bsnkType) { case EncryptedIdentityName: if (isPseudonym) { throw new ParsingException("Encrypted identity inside signed encrypted pseudonym"); } DecodePayload(payloadParser, false); break; case EncryptedPseudonymName: if (!isPseudonym) { throw new ParsingException("Encrypted pseudonym inside signed encrypted identity"); } DecodePayload(payloadParser, true); break; default: throw new ParsingException($"Cannot handle type {bsnkType}"); } var signature = DecodeSignature(); verifier.Verify(payload, signature); } catch (IOException e) { throw new ParsingException("ASN1 decode error", e); } }