summary refs log tree commit diff
path: root/crypto/src/asn1/x509/KeyUsage.cs
blob: dd69cc63b4a5fdbe7d975f4569594d0a06a80196 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
namespace Org.BouncyCastle.Asn1.X509
{
    /**
     * The KeyUsage object.
     * <pre>
     *    id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }
     *
     *    KeyUsage ::= BIT STRING {
     *         digitalSignature        (0),
     *         nonRepudiation          (1),
     *         keyEncipherment         (2),
     *         dataEncipherment        (3),
     *         keyAgreement            (4),
     *         keyCertSign             (5),
     *         cRLSign                 (6),
     *         encipherOnly            (7),
     *         decipherOnly            (8) }
     * </pre>
     */
    public class KeyUsage
        : DerBitString
    {
        public const int DigitalSignature = (1 << 7);
        public const int NonRepudiation   = (1 << 6);
        public const int KeyEncipherment  = (1 << 5);
        public const int DataEncipherment = (1 << 4);
        public const int KeyAgreement     = (1 << 3);
        public const int KeyCertSign      = (1 << 2);
        public const int CrlSign          = (1 << 1);
        public const int EncipherOnly     = (1 << 0);
        public const int DecipherOnly     = (1 << 15);

		public static new KeyUsage GetInstance(object obj)
		{
			if (obj is KeyUsage keyUsage)
				return keyUsage;
            if (obj is X509Extension x509Extension)
				return GetInstance(X509Extension.ConvertValueToObject(x509Extension));
            if (obj == null)
                return null;
			return new KeyUsage(DerBitString.GetInstance(obj));
		}

        public static KeyUsage FromExtensions(X509Extensions extensions)
        {
            return GetInstance(X509Extensions.GetExtensionParsedValue(extensions, X509Extensions.KeyUsage));
        }

        /**
         * Basic constructor.
         *
         * @param usage - the bitwise OR of the Key Usage flags giving the
         * allowed uses for the key.
         * e.g. (KeyUsage.keyEncipherment | KeyUsage.dataEncipherment)
         */
        public KeyUsage(int usage)
			: base(usage)
        {
        }

		private KeyUsage(
			DerBitString usage)
			: base(usage.GetBytes(), usage.PadBits)
        {
        }

		public override string ToString()
        {
			byte[] data = GetBytes();
            if (data.Length == 1)
            {
				return "KeyUsage: 0x" + (data[0] & 0xff).ToString("X");
            }

			return "KeyUsage: 0x" + ((data[1] & 0xff) << 8 | (data[0] & 0xff)).ToString("X");
        }
    }
}