/// <summary>Parses the <see cref="ReadOnlySpan{T}"/> into its <see cref="KeyManagementAlgorithm"/> representation.</summary>
        public static bool TryParse(ReadOnlySpan <byte> value, [NotNullWhen(true)] out KeyManagementAlgorithm?algorithm)
        {
            switch (value.Length)
            {
            case 3 when IntegerMarshal.ReadUInt24(value) == _dir:
                algorithm = Dir;

                goto Found;

            case 6 when IntegerMarshal.ReadUInt16(value, 4) == _KW:
                switch (IntegerMarshal.ReadUInt32(value))
                {
                case _A128:
                    algorithm = A128KW;
                    goto Found;

                case _A192:
                    algorithm = A192KW;
                    goto Found;

                case _A256:
                    algorithm = A256KW;
                    goto Found;
                }

                break;

            case 6 when IntegerMarshal.ReadUInt32(value) == _RSA1 && IntegerMarshal.ReadUInt16(value, 4) == __5:
                algorithm = Rsa1_5;

                goto Found;

            case 7 when IntegerMarshal.ReadUInt56(value) == _ECDH_ES:
                algorithm = EcdhEs;

                goto Found;

            case 8 when IntegerMarshal.ReadUInt64(value) == _RSA_OAEP:
                algorithm = RsaOaep;

                goto Found;

            case 9 when IntegerMarshal.ReadUInt8(value) == (byte) 'A':
                switch (IntegerMarshal.ReadUInt64(value, 1))
                {
                case __128GCMKW:
                    algorithm = A128GcmKW;
                    goto Found;

                case __192GCMKW:
                    algorithm = A192GcmKW;
                    goto Found;

                case __256GCMKW:
                    algorithm = A256GcmKW;
                    goto Found;
                }

                break;

            case 12 when IntegerMarshal.ReadUInt64(value) == _RSA_OAEP:
                switch (IntegerMarshal.ReadUInt32(value, 8))
                {
                case __256:
                    algorithm = RsaOaep256;
                    goto Found;

                case __384:
                    algorithm = RsaOaep384;
                    goto Found;

                case __512:
                    algorithm = RsaOaep512;
                    goto Found;
                }

                break;

            case 14 when IntegerMarshal.ReadUInt64(value) == _ECDH_ES_:
                switch (IntegerMarshal.ReadUInt64(value, 6))
                {
                case _S_A128KW:
                    algorithm = EcdhEsA128KW;
                    goto Found;

                case _S_A192KW:
                    algorithm = EcdhEsA192KW;
                    goto Found;

                case _S_A256KW:
                    algorithm = EcdhEsA256KW;
                    goto Found;
                }

                break;

            // 'PBES2-HS384+A192KW'
            case 18 when IntegerMarshal.ReadUInt64(value) == 6001096197639848528uL &&  /* PBES2-HS 384+A192KW*/
                IntegerMarshal.ReadUInt16(value, 16) == _KW:
                switch (IntegerMarshal.ReadUInt64(value, 8))
                {
                case 4049353170927105330uL:
                    algorithm = Pbes2HS256A128KW;
                    goto Found;

                case 3618977931536382003uL:
                    algorithm = Pbes2HS384A192KW;
                    goto Found;

                case 3906083507292746037:
                    algorithm = Pbes2HS512A256KW;
                    goto Found;
                }

                break;

            // Special case for escaped 'ECDH-ES\u002bAxxxKW'
            case 19 when IntegerMarshal.ReadUInt64(value) == _ECDH_ES_UTF8 /* ECDH-ES\ */:
                switch (IntegerMarshal.ReadUInt64(value, 8) | u002bUpperMask)
                {
                case _u002bA12 when IntegerMarshal.ReadUInt32(value, 15) == __28KW:
                    algorithm = EcdhEsA128KW;

                    goto Found;

                case _u002bA19 when IntegerMarshal.ReadUInt32(value, 15) == __92KW:
                    algorithm = EcdhEsA192KW;

                    goto Found;

                case _u002bA25 when IntegerMarshal.ReadUInt32(value, 15) == __56KW:
                    algorithm = EcdhEsA256KW;

                    goto Found;
                }

                break;
            }

            algorithm = null;
            return(false);

            Found:
            return(true);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Cast the <see cref="ReadOnlySpan{T}"/> into its <see cref="KeyManagementAlgorithm"/> representation.
        /// </summary>
        /// <param name="value"></param>
        /// <param name="algorithm"></param>
        public static bool TryParse(ReadOnlySpan <byte> value, [NotNullWhen(true)] out KeyManagementAlgorithm?algorithm)
        {
            switch (value.Length)
            {
            case 3 when IntegerMarshal.ReadUInt24(value) == dir:
                algorithm = Direct;

                return(true);

            case 6 when IntegerMarshal.ReadUInt16(value, 4) == KW:
                switch (IntegerMarshal.ReadUInt32(value))
                {
                case A128:
                    algorithm = Aes128KW;
                    return(true);

                case A192:
                    algorithm = Aes192KW;
                    return(true);

                case A256:
                    algorithm = Aes256KW;
                    return(true);
                }

                break;

            case 6 when IntegerMarshal.ReadUInt32(value) == RSA1 && IntegerMarshal.ReadUInt16(value, 4) == _5:
                algorithm = RsaPkcs1;

                return(true);

            case 7 when IntegerMarshal.ReadUInt56(value) == ECDH_ES:
                algorithm = EcdhEs;

                return(true);

            case 8 when IntegerMarshal.ReadUInt64(value) == RSA_OAEP:
                algorithm = RsaOaep;

                return(true);

            case 9 when IntegerMarshal.ReadUInt8(value) == (byte) 'A':
                switch (IntegerMarshal.ReadUInt64(value, 1))
                {
                case _128GCMKW:
                    algorithm = Aes128GcmKW;
                    return(true);

                case _192GCMKW:
                    algorithm = Aes192GcmKW;
                    return(true);

                case _256GCMKW:
                    algorithm = Aes256GcmKW;
                    return(true);
                }

                break;

            case 12 when IntegerMarshal.ReadUInt64(value) == RSA_OAEP:
                switch (IntegerMarshal.ReadUInt32(value, 8))
                {
                case _256:
                    algorithm = RsaOaep256;
                    return(true);

                case _384:
                    algorithm = RsaOaep384;
                    return(true);

                case _512:
                    algorithm = RsaOaep512;
                    return(true);
                }

                break;

            case 14 when IntegerMarshal.ReadUInt64(value) == ECDH_ES_:
                switch (IntegerMarshal.ReadUInt64(value, 6))
                {
                case S_A128KW:
                    algorithm = EcdhEsAes128KW;
                    return(true);

                case S_A192KW:
                    algorithm = EcdhEsAes192KW;
                    return(true);

                case S_A256KW:
                    algorithm = EcdhEsAes256KW;
                    return(true);
                }

                break;

            // Special case for escaped 'ECDH-ES\u002bAxxxKW'
            case 19 when IntegerMarshal.ReadUInt64(value) == ECDH_ES_UTF8 /* ECDH-ES\ */:
                switch (IntegerMarshal.ReadUInt64(value, 8))
                {
                case u002bA12 when IntegerMarshal.ReadUInt32(value, 15) == _28KW:
                    algorithm = EcdhEsAes128KW;

                    return(true);

                case u002bA19 when IntegerMarshal.ReadUInt32(value, 15) == _92KW:
                    algorithm = EcdhEsAes192KW;

                    return(true);

                case u002bA25 when IntegerMarshal.ReadUInt32(value, 15) == _56KW:
                    algorithm = EcdhEsAes256KW;

                    return(true);
                }

                break;
            }

            algorithm = null;
            return(false);
        }