示例#1
0
    public void Unprotect_KeyNotFound_RefreshOnce_ThrowsKeyNotFound()
    {
        // Arrange
        Guid notFoundKeyId = new Guid("654057ab-2491-4471-a72a-b3b114afda38");

        byte[] protectedData = BuildProtectedDataFromCiphertext(
            keyId: notFoundKeyId,
            ciphertext: new byte[0]);

        var mockDescriptor       = new Mock <IAuthenticatedEncryptorDescriptor>();
        var mockEncryptorFactory = new Mock <IAuthenticatedEncryptorFactory>();

        mockEncryptorFactory.Setup(o => o.CreateEncryptorInstance(It.IsAny <IKey>())).Returns(new Mock <IAuthenticatedEncryptor>().Object);
        var encryptorFactory = new AuthenticatedEncryptorFactory(NullLoggerFactory.Instance);

        // the keyring has only one key
        Key key     = new Key(Guid.Empty, DateTimeOffset.Now, DateTimeOffset.Now, DateTimeOffset.Now, mockDescriptor.Object, new[] { mockEncryptorFactory.Object });
        var keyRing = new CacheableKeyRing(CancellationToken.None, DateTimeOffset.MaxValue, key, new[] { key });

        var keyRingProvider = CreateKeyRingProvider(new TestKeyRingProvider(keyRing));

        IDataProtector protector = new KeyRingBasedDataProtector(
            keyRingProvider: keyRingProvider,
            logger: GetLogger(),
            originalPurposes: null,
            newPurpose: "purpose");

        // Act & assert
        var ex = ExceptionAssert2.ThrowsCryptographicException(() => protector.Unprotect(protectedData));

        Assert.Equal(Error.Common_KeyNotFound(notFoundKeyId).Message, ex.Message);
    }
示例#2
0
    public void Protect_NullPlaintext_Throws()
    {
        // Arrange
        IDataProtector protector = new KeyRingBasedDataProtector(
            keyRingProvider: new Mock <IKeyRingProvider>().Object,
            logger: GetLogger(),
            originalPurposes: null,
            newPurpose: "purpose");

        // Act & assert
        ExceptionAssert.ThrowsArgumentNull(() => protector.Protect(plaintext: null), "plaintext");
    }
示例#3
0
    public void Protect_HomogenizesExceptionsToCryptographicException()
    {
        // Arrange
        IDataProtector protector = new KeyRingBasedDataProtector(
            keyRingProvider: new Mock <IKeyRingProvider>(MockBehavior.Strict).Object,
            logger: GetLogger(),
            originalPurposes: null,
            newPurpose: "purpose");

        // Act & assert
        var ex = ExceptionAssert2.ThrowsCryptographicException(() => protector.Protect(new byte[0]));

        Assert.IsAssignableFrom <MockException>(ex.InnerException);
    }
示例#4
0
    public void Unprotect_PayloadHasIncorrectVersionMarker_ThrowsNewerVersion()
    {
        // Arrange
        IDataProtector protector = new KeyRingBasedDataProtector(
            keyRingProvider: new Mock <IKeyRingProvider>().Object,
            logger: GetLogger(),
            originalPurposes: null,
            newPurpose: "purpose");

        byte[] badProtectedPayload = BuildProtectedDataFromCiphertext(Guid.NewGuid(), new byte[0]);
        badProtectedPayload[3]++; // bump the version payload

        // Act & assert
        var ex = ExceptionAssert2.ThrowsCryptographicException(() => protector.Unprotect(badProtectedPayload));

        Assert.Equal(Resources.ProtectionProvider_BadVersion, ex.Message);
    }
示例#5
0
    public void Unprotect_PayloadTooShort_ThrowsBadMagicHeader()
    {
        // Arrange
        IDataProtector protector = new KeyRingBasedDataProtector(
            keyRingProvider: new Mock <IKeyRingProvider>().Object,
            logger: GetLogger(),
            originalPurposes: null,
            newPurpose: "purpose");

        byte[] badProtectedPayload = BuildProtectedDataFromCiphertext(Guid.NewGuid(), new byte[0]);
        badProtectedPayload = badProtectedPayload.Take(badProtectedPayload.Length - 1).ToArray(); // chop off the last byte

        // Act & assert
        var ex = ExceptionAssert2.ThrowsCryptographicException(() => protector.Unprotect(badProtectedPayload));

        Assert.Equal(Resources.ProtectionProvider_BadMagicHeader, ex.Message);
    }
示例#6
0
    public void Protect_EncryptsToDefaultProtector_SinglePurpose()
    {
        // Arrange
        Guid defaultKey = new Guid("ba73c9ce-d322-4e45-af90-341307e11c38");

        byte[] expectedPlaintext     = new byte[] { 0x03, 0x05, 0x07, 0x11, 0x13, 0x17, 0x19 };
        byte[] expectedAad           = BuildAadFromPurposeStrings(defaultKey, "single purpose");
        byte[] expectedProtectedData = BuildProtectedDataFromCiphertext(defaultKey, new byte[] { 0x23, 0x29, 0x31, 0x37 });

        var mockEncryptor = new Mock <IAuthenticatedEncryptor>();

        mockEncryptor
        .Setup(o => o.Encrypt(It.IsAny <ArraySegment <byte> >(), It.IsAny <ArraySegment <byte> >()))
        .Returns <ArraySegment <byte>, ArraySegment <byte> >((actualPlaintext, actualAad) =>
        {
            Assert.Equal(expectedPlaintext, actualPlaintext);
            Assert.Equal(expectedAad, actualAad);
            return(new byte[] { 0x23, 0x29, 0x31, 0x37 });    // ciphertext + tag
        });

        var mockKeyRing = new Mock <IKeyRing>(MockBehavior.Strict);

        mockKeyRing.Setup(o => o.DefaultKeyId).Returns(defaultKey);
        mockKeyRing.Setup(o => o.DefaultAuthenticatedEncryptor).Returns(mockEncryptor.Object);
        var mockKeyRingProvider = new Mock <IKeyRingProvider>();

        mockKeyRingProvider.Setup(o => o.GetCurrentKeyRing()).Returns(mockKeyRing.Object);

        IDataProtector protector = new KeyRingBasedDataProtector(
            keyRingProvider: mockKeyRingProvider.Object,
            logger: GetLogger(),
            originalPurposes: new string[0],
            newPurpose: "single purpose");

        // Act
        byte[] retVal = protector.Protect(expectedPlaintext);

        // Assert
        Assert.Equal(expectedProtectedData, retVal);
    }