public void Decode(EncryptedVerifiers verifiers) { try { BsnkType = parser.CheckHeader(); switch (BsnkType.ObjectIdentifier) { case BsnkType.EncryptedIdentityName: DecodePayload(parser, false); return; case BsnkType.EncryptedPseudonymName: DecodePayload(parser, true); return; case BsnkType.SignedEncryptedIdentityName: if (verifiers?.IdentityVerifier == null) { throw new ParsingException("No verifier for identity found"); } DecodeSigned(false, verifiers.IdentityVerifier); return; case BsnkType.SignedEncryptedPseudonymName: if (verifiers?.PseudonymVerifier == null) { throw new ParsingException("No verifier for pseudonym found"); } DecodeSigned(true, verifiers.PseudonymVerifier); return; default: throw new ParsingException($"Cannot handle type {BsnkType.ObjectIdentifier}"); } } 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.CheckHeader(); switch (BsnkType.ObjectIdentifier) { case BsnkType.EncryptedIdentityName: if (isPseudonym) { throw new ParsingException("Encrypted identity inside signed encrypted pseudonym"); } DecodePayload(payloadParser, false); break; case BsnkType.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); } }