示例#1
0
        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);
            }
        }
示例#2
0
        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);
            }
        }