File: Signing\Timestamp\MessageImprint.cs
Web Access
Project: src\src\nuget-client\src\NuGet.Core\NuGet.Packaging\NuGet.Packaging.csproj (NuGet.Packaging)
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System.Security.Cryptography;
using NuGet.Packaging.Signing.DerEncoding;

namespace NuGet.Packaging.Signing
{
    /*
        From RFC 3161 (https://tools.ietf.org/html/rfc3161#section-2.4.2):

            MessageImprint ::= SEQUENCE  {
                hashAlgorithm                AlgorithmIdentifier,
                hashedMessage                OCTET STRING  }
    */
    /// <remarks>This is public only to facilitate testing.</remarks>
    public sealed class MessageImprint
    {
        public AlgorithmIdentifier HashAlgorithm { get; }
        public byte[] HashedMessage { get; }

        private MessageImprint(
            AlgorithmIdentifier hashAlgorithm,
            byte[] hashedMessage)
        {
            HashAlgorithm = hashAlgorithm;
            HashedMessage = hashedMessage;
        }

        public static MessageImprint Read(byte[] bytes)
        {
            var reader = DerSequenceReader.CreateForPayload(bytes);

            return Read(reader);
        }

        internal static MessageImprint Read(DerSequenceReader reader)
        {
            var imprintReader = reader.ReadSequence();
            var hashAlgorithm = AlgorithmIdentifier.Read(imprintReader);
            var hashedMessage = imprintReader.ReadOctetString();

            if (hashedMessage == null || hashedMessage.Length == 0)
            {
                throw new CryptographicException(Strings.InvalidAsn1);
            }

            if (imprintReader.HasData)
            {
                throw new CryptographicException(Strings.InvalidAsn1);
            }

            return new MessageImprint(hashAlgorithm, hashedMessage);
        }
    }
}