/// <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 }); }
/// <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); }