/// <summary>
        /// Converts a WebKey of type RSA or RSAHSM to a RSA parameter object
        /// </summary>
        /// <param name="parameters"></param>
        /// <param name="includePrivateParameters">Tells if private material
        /// must be included.</param>
        /// <returns>An RSA parameter</returns>
        public static RSAParameters ToRSAParameters(this RsaParams parameters,
                                                    bool includePrivateParameters = true)
        {
            KeyEx.VerifyNonZero(parameters.N);
            KeyEx.VerifyNonZero(parameters.E);
            if (!includePrivateParameters)
            {
                return(new RSAParameters {
                    Modulus = KeyEx.RemoveLeadingZeros(parameters.N),
                    Exponent = KeyEx.ForceLength(parameters.E, 4)
                });
            }
            var num = KeyEx.RemoveLeadingZeros(parameters.N).Length * 8;

            return(new RSAParameters {
                Modulus = KeyEx.RemoveLeadingZeros(parameters.N),
                Exponent = KeyEx.ForceLength(parameters.E, 4),
                D = KeyEx.ForceLength(parameters.D, num / 8),
                DP = KeyEx.ForceLength(parameters.DP, num / 16),
                DQ = KeyEx.ForceLength(parameters.DQ, num / 16),
                InverseQ = KeyEx.ForceLength(parameters.QI, num / 16),
                P = KeyEx.ForceLength(parameters.P, num / 16),
                Q = KeyEx.ForceLength(parameters.Q, num / 16)
            });
        }
 /// <summary>
 /// Returns the public part of the key
 /// </summary>
 /// <param name="key"></param>
 /// <returns></returns>
 public static Key GetPublicKey(this RsaParams key)
 {
     return(new Key {
         Type = KeyType.RSA,
         Parameters = new RsaParams {
             E = key.E,
             N = key.N,
             T = key.T
         }
     });
 }
 /// <summary>
 /// Remove leading zeros from all RSA parameters.
 /// </summary>
 public static RsaParams Canonicalize(this RsaParams parameters)
 {
     return(new RsaParams {
         N = KeyEx.RemoveLeadingZeros(parameters.N),
         E = KeyEx.RemoveLeadingZeros(parameters.E),
         D = KeyEx.RemoveLeadingZeros(parameters.D),
         DP = KeyEx.RemoveLeadingZeros(parameters.DP),
         DQ = KeyEx.RemoveLeadingZeros(parameters.DQ),
         QI = KeyEx.RemoveLeadingZeros(parameters.QI),
         P = KeyEx.RemoveLeadingZeros(parameters.P),
         Q = KeyEx.RemoveLeadingZeros(parameters.Q),
         T = parameters.T
     });
 }
Esempio n. 4
0
        /// <summary>
        /// Convert to public key
        /// </summary>
        /// <param name="rsa"></param>
        /// <returns></returns>
        public static PublicKey ToPublicKey(this RsaParams rsa)
        {
            using (var writer = new AsnWriter(AsnEncodingRules.DER)) {
                writer.PushSequence();
                writer.WriteKeyParameterInteger(rsa.N);
                writer.WriteKeyParameterInteger(rsa.E);
                writer.PopSequence();
                var key = writer.Encode();

                var oid = new Oid(Oids.Rsa);
                return(new PublicKey(oid,
                                     new AsnEncodedData(oid, new byte[] { 0x05, 0x00 }),
                                     new AsnEncodedData(oid, key)));
            }
        }
 /// <summary>
 /// Compare params
 /// </summary>
 /// <param name="parameters"></param>
 /// <param name="other"></param>
 /// <returns></returns>
 public static bool SameAs(this RsaParams parameters, RsaParams other)
 {
     if (parameters == null)
     {
         return(other == null);
     }
     if (other == null)
     {
         return(false);
     }
     if (!KeyEx.SameNoLeadingZeros(other.D, parameters.D))
     {
         return(false);
     }
     if (!KeyEx.SameNoLeadingZeros(other.DP, parameters.DP))
     {
         return(false);
     }
     if (!KeyEx.SameNoLeadingZeros(other.DQ, parameters.DQ))
     {
         return(false);
     }
     if (!KeyEx.SameNoLeadingZeros(other.E, parameters.E))
     {
         return(false);
     }
     if (!KeyEx.SameNoLeadingZeros(other.N, parameters.N))
     {
         return(false);
     }
     if (!KeyEx.SameNoLeadingZeros(other.P, parameters.P))
     {
         return(false);
     }
     if (!KeyEx.SameNoLeadingZeros(other.Q, parameters.Q))
     {
         return(false);
     }
     if (!KeyEx.SameNoLeadingZeros(other.QI, parameters.QI))
     {
         return(false);
     }
     if (!KeyEx.SameNoLeadingZeros(other.T, parameters.T))
     {
         return(false);
     }
     return(true);
 }
 /// <summary>
 /// Clone params
 /// </summary>
 /// <param name="parameters"></param>
 /// <returns></returns>
 public static RsaParams Clone(this RsaParams parameters)
 {
     if (parameters == null)
     {
         return(null);
     }
     return(new RsaParams {
         D = parameters.D,
         DP = parameters.DP,
         DQ = parameters.DQ,
         E = parameters.E,
         N = parameters.N,
         P = parameters.P,
         Q = parameters.Q,
         QI = parameters.QI,
         T = parameters.T
     });
 }
 /// <summary>
 /// Verifies whether this object has a private key
 /// </summary>
 /// <returns> True if the object has private key; false otherwise.</returns>
 public static bool HasPrivateKey(this RsaParams key)
 {
     return(key.D != null && key.DP != null && key.DQ != null &&
            key.QI != null && key.P != null && key.Q != null);
 }