/// <summary> /// Retrieve the OId for a parameter set /// </summary> /// /// <param name="Name">The enumeration name</param> /// /// <returns>The parameters 3 byte OId</returns> /// /// <exception cref="NTRUException">Thrown if an invalid name is used</exception> public static byte[] GetID(NTRUParamNames Name) { switch (Name) { case NTRUParamNames.A2011439: return(new byte[] { 0, 7, 101 }); case NTRUParamNames.A2011743: return(new byte[] { 0, 7, 105 }); case NTRUParamNames.E1087EP2: return(new byte[] { 0, 6, 3 }); case NTRUParamNames.E1171EP1: return(new byte[] { 0, 6, 4 }); case NTRUParamNames.E1499EP1: return(new byte[] { 0, 6, 5 }); case NTRUParamNames.FA2011439: return(new byte[] { 0, 7, 101 }); case NTRUParamNames.FA2011743: return(new byte[] { 0, 7, 105 }); case NTRUParamNames.FE1087EP2: return(new byte[] { 0, 6, 3 }); case NTRUParamNames.FE1171EP1: return(new byte[] { 0, 6, 4 }); case NTRUParamNames.FE1499EP1: return(new byte[] { 0, 6, 5 }); case NTRUParamNames.CX1861: return(new byte[] { 0, 7, 7 }); case NTRUParamNames.CX1931: return(new byte[] { 0, 8, 8 }); default: throw new NTRUException("NTRUParameters:FromName", "The enumeration name is unknown!", new ArgumentException()); } }
/// <summary> /// Retrieve a parameter set by its enumeration name /// </summary> /// /// <param name="Name">The enumeration name</param> /// /// <returns>A populated parameter set</returns> /// /// <exception cref="NTRUException">Thrown if an invalid or unknown OId is used</exception> public static NTRUParameters FromName(NTRUParamNames Name) { switch (Name) { case NTRUParamNames.A2011439: return((NTRUParameters)APR2011439.Clone()); case NTRUParamNames.A2011743: return((NTRUParameters)APR2011743.Clone()); case NTRUParamNames.E1087EP2: return((NTRUParameters)EES1087EP2.Clone()); case NTRUParamNames.E1171EP1: return((NTRUParameters)EES1171EP1.Clone()); case NTRUParamNames.E1499EP1: return((NTRUParameters)EES1499EP1.Clone()); case NTRUParamNames.FA2011439: return((NTRUParameters)APR2011439FAST.Clone()); case NTRUParamNames.FA2011743: return((NTRUParameters)APR2011743FAST.Clone()); case NTRUParamNames.FE1087EP2: return((NTRUParameters)EES1087EP2FAST.Clone()); case NTRUParamNames.FE1171EP1: return((NTRUParameters)EES1171EP1FAST.Clone()); case NTRUParamNames.FE1499EP1: return((NTRUParameters)EES1499EP1FAST.Clone()); case NTRUParamNames.CX1861: return((NTRUParameters)CX1861SH512.Clone()); case NTRUParamNames.CX1931: return((NTRUParameters)CX1931SH512.Clone()); default: throw new NTRUException("NTRUParameters:FromName", "The enumeration name is unknown!", new ArgumentException()); } }
/// <summary> /// Retrieve the OId for a parameter set /// </summary> /// /// <param name="ParamName">The enumeration name</param> /// /// <returns>The parameters 4 byte OId</returns> /// /// <exception cref="CryptoAsymmetricException">Thrown if an invalid name is used</exception> public static byte[] GetID(NTRUParamNames ParamName) { switch (ParamName) { case NTRUParamNames.A2011439: return(new byte[] { (byte)AsymmetricEngines.NTRU, 2, 1, 101 }); case NTRUParamNames.A2011743: return(new byte[] { (byte)AsymmetricEngines.NTRU, 2, 1, 105 }); case NTRUParamNames.E1087EP2: return(new byte[] { (byte)AsymmetricEngines.NTRU, 1, 1, 63 }); case NTRUParamNames.E1171EP1: return(new byte[] { (byte)AsymmetricEngines.NTRU, 1, 1, 64 }); case NTRUParamNames.E1499EP1: return(new byte[] { (byte)AsymmetricEngines.NTRU, 1, 1, 65 }); case NTRUParamNames.FA2011439: return(new byte[] { (byte)AsymmetricEngines.NTRU, 2, 2, 101 }); case NTRUParamNames.FA2011743: return(new byte[] { (byte)AsymmetricEngines.NTRU, 2, 2, 105 }); case NTRUParamNames.FE1087EP2: return(new byte[] { (byte)AsymmetricEngines.NTRU, 1, 2, 63 }); case NTRUParamNames.FE1171EP1: return(new byte[] { (byte)AsymmetricEngines.NTRU, 1, 2, 64 }); case NTRUParamNames.FE1499EP1: return(new byte[] { (byte)AsymmetricEngines.NTRU, 1, 2, 65 }); case NTRUParamNames.CX1861: return(new byte[] { (byte)AsymmetricEngines.NTRU, 3, 1, 7 }); case NTRUParamNames.CX1931: return(new byte[] { (byte)AsymmetricEngines.NTRU, 3, 1, 8 }); default: throw new CryptoAsymmetricException("NTRUParameters:FromName", "The enumeration name is unknown!", new ArgumentException()); } }
/// <summary> /// Retrieve a parameter set by its enumeration name /// </summary> /// /// <param name="ParamName">The enumeration name</param> /// /// <returns>A populated parameter set</returns> /// /// <exception cref="CryptoAsymmetricException">Thrown if an invalid or unknown OId is used</exception> public static NTRUParameters FromName(NTRUParamNames ParamName) { switch (ParamName) { case NTRUParamNames.A2011439: return((NTRUParameters)APR2011439.DeepCopy()); case NTRUParamNames.A2011743: return((NTRUParameters)APR2011743.DeepCopy()); case NTRUParamNames.E1087EP2: return((NTRUParameters)EES1087EP2.DeepCopy()); case NTRUParamNames.E1171EP1: return((NTRUParameters)EES1171EP1.DeepCopy()); case NTRUParamNames.E1499EP1: return((NTRUParameters)EES1499EP1.DeepCopy()); case NTRUParamNames.FA2011439: return((NTRUParameters)APR2011439FAST.DeepCopy()); case NTRUParamNames.FA2011743: return((NTRUParameters)APR2011743FAST.DeepCopy()); case NTRUParamNames.FE1087EP2: return((NTRUParameters)EES1087EP2FAST.DeepCopy()); case NTRUParamNames.FE1171EP1: return((NTRUParameters)EES1171EP1FAST.DeepCopy()); case NTRUParamNames.FE1499EP1: return((NTRUParameters)EES1499EP1FAST.DeepCopy()); case NTRUParamNames.CX1861: return((NTRUParameters)CX1861SK512.DeepCopy()); case NTRUParamNames.CX1931: return((NTRUParameters)CX1931SK512.DeepCopy()); default: throw new CryptoAsymmetricException("NTRUParameters:FromName", "The enumeration name is unknown!", new ArgumentException()); } }
/// <summary> /// Retrieve the OId for a parameter set /// </summary> /// /// <param name="Name">The enumeration name</param> /// /// <returns>The parameters 3 byte OId</returns> /// /// <exception cref="NTRUException">Thrown if an invalid name is used</exception> public static byte[] GetID(NTRUParamNames Name) { switch (Name) { case NTRUParamNames.A2011439: return new byte[] { 0, 7, 101 }; case NTRUParamNames.A2011743: return new byte[] { 0, 7, 105 }; case NTRUParamNames.E1087EP2: return new byte[] { 0, 6, 3 }; case NTRUParamNames.E1171EP1: return new byte[] { 0, 6, 4 }; case NTRUParamNames.E1499EP1: return new byte[] { 0, 6, 5 }; case NTRUParamNames.FA2011439: return new byte[] { 0, 7, 101 }; case NTRUParamNames.FA2011743: return new byte[] { 0, 7, 105 }; case NTRUParamNames.FE1087EP2: return new byte[] { 0, 6, 3 }; case NTRUParamNames.FE1171EP1: return new byte[] { 0, 6, 4 }; case NTRUParamNames.FE1499EP1: return new byte[] { 0, 6, 5 }; case NTRUParamNames.CX1861: return new byte[] { 0, 7, 7 }; case NTRUParamNames.CX1931: return new byte[] { 0, 8, 8 }; default: throw new NTRUException("NTRUParameters:FromName", "The enumeration name is unknown!", new ArgumentException()); } }
/// <summary> /// Retrieve a parameter set by its enumeration name /// </summary> /// /// <param name="Name">The enumeration name</param> /// /// <returns>A populated parameter set</returns> /// /// <exception cref="NTRUException">Thrown if an invalid or unknown OId is used</exception> public static NTRUParameters FromName(NTRUParamNames Name) { switch (Name) { case NTRUParamNames.A2011439: return (NTRUParameters)APR2011439.Clone(); case NTRUParamNames.A2011743: return (NTRUParameters)APR2011743.Clone(); case NTRUParamNames.E1087EP2: return (NTRUParameters)EES1087EP2.Clone(); case NTRUParamNames.E1171EP1: return (NTRUParameters)EES1171EP1.Clone(); case NTRUParamNames.E1499EP1: return (NTRUParameters)EES1499EP1.Clone(); case NTRUParamNames.FA2011439: return (NTRUParameters)APR2011439FAST.Clone(); case NTRUParamNames.FA2011743: return (NTRUParameters)APR2011743FAST.Clone(); case NTRUParamNames.FE1087EP2: return (NTRUParameters)EES1087EP2FAST.Clone(); case NTRUParamNames.FE1171EP1: return (NTRUParameters)EES1171EP1FAST.Clone(); case NTRUParamNames.FE1499EP1: return (NTRUParameters)EES1499EP1FAST.Clone(); case NTRUParamNames.CX1861: return (NTRUParameters)CX1861SH512.Clone(); case NTRUParamNames.CX1931: return (NTRUParameters)CX1931SH512.Clone(); default: throw new NTRUException("NTRUParameters:FromName", "The enumeration name is unknown!", new ArgumentException()); } }
/// <summary> /// Retrieve the OId for a parameter set /// </summary> /// /// <param name="Name">The enumeration name</param> /// /// <returns>The parameters 4 byte OId</returns> /// /// <exception cref="CryptoAsymmetricException">Thrown if an invalid name is used</exception> public static byte[] GetID(NTRUParamNames Name) { switch (Name) { case NTRUParamNames.A2011439: return new byte[] { 2, 2, 1, 101 }; case NTRUParamNames.A2011743: return new byte[] { 2, 2, 1, 105 }; case NTRUParamNames.E1087EP2: return new byte[] { 2, 1, 1, 63 }; case NTRUParamNames.E1171EP1: return new byte[] { 2, 1, 1, 64 }; case NTRUParamNames.E1499EP1: return new byte[] { 2, 1, 1, 65 }; case NTRUParamNames.FA2011439: return new byte[] { 2, 2, 2, 101 }; case NTRUParamNames.FA2011743: return new byte[] { 2, 2, 2, 105 }; case NTRUParamNames.FE1087EP2: return new byte[] { 2, 1, 2, 63 }; case NTRUParamNames.FE1171EP1: return new byte[] { 2, 1, 2, 64 }; case NTRUParamNames.FE1499EP1: return new byte[] { 2, 1, 2, 65 }; case NTRUParamNames.CX1861: return new byte[] { 2, 3, 1, 7 }; case NTRUParamNames.CX1931: return new byte[] { 2, 3, 1, 8 }; default: throw new CryptoAsymmetricException("NTRUParameters:FromName", "The enumeration name is unknown!", new ArgumentException()); } }
/// <summary> /// Get a serialized NTRUParameters class from a parameter name. /// <para>Can optionally randomize Db, MinIGFHashCalls, and MinMGFHashCalls fields using the Multiplier parameters.</para> /// </summary> /// /// <param name="ParamName">The NTRU Parameters set name</param> /// /// <param name="DbMaxReductionFactor">If set between <c>0.1</c> and <c>0.4</c>, randomizes the Db field length, if <c>0.0</c> (default), returns the serialized parameter set default value. /// <para>The Db field is set to a ranged random number from the default parameter set <c>value</c> to <c>value - (value * multiplier)</c>. /// The Db field determines how many bytes of random are prepended to the message before encryption. /// Recommended range is minimum 0.1, to a maximum of 0.4.</para></param> /// /// <param name="IgfMaxAccretionFactor">If set between <c>0.1</c> and <c>0.5</c>, the MinIGFHashCalls value is randomized, if <c>0.0</c> (default), returns the parameter set default value. /// <para>The MinIGFHashCalls is set to a random value ranged between the parameter sets default <c>value</c>, up to <c>value + (value * multiplier)</c>. /// The MinIGFHashCalls value determine the number of times the hashing function is cycled during the igf polynomial generation. /// Recommended range is minimum 0.1, to a maximum of 0.2; larger values significantly impact processing times.</para></param> /// /// <param name="MgfMaxAccretionFactor">If set between <c>0.1</c> and <c>0.5</c>, the MinMGFHashCalls value is randomized, if <c>0.0</c> (default), returns the parameter set default value. /// <para>The MinMGFHashCalls is set to a random value ranged between the parameter sets default <c>value</c>, up to <c>value + (value * multiplier)</c>. /// The MinMGFHashCalls value determine the number of times the hashing function is cycled during the igf mask polynomial generation. /// Recommended range is minimum 0.1, to a maximum of 0.2; larger values significantly impact processing times.</para></param> /// /// <returns>The serialized NTRUParameters set</returns> /// /// <exception cref="CryptoAsymmetricException">Thrown if the input value is out of range</exception> public static byte[] GetFormatted(NTRUParamNames ParamName, double DbMaxReductionFactor = 0.0, double IgfMaxAccretionFactor = 0.0, double MgfMaxAccretionFactor = 0.0) { if (DbMaxReductionFactor > 0.4 || DbMaxReductionFactor < 0.0) { throw new CryptoAsymmetricException("NTRUParameters:GetFormatted", "The DbMaxReductionFactor value can not be less than 0.0 and cannot exceed 0.4!", new ArgumentOutOfRangeException()); } if (IgfMaxAccretionFactor > 0.5 || IgfMaxAccretionFactor < 0.0) { throw new CryptoAsymmetricException("NTRUParameters:GetFormatted", "The IgfMaxAccretionFactor value can not be less than 0.0 and cannot exceed 0.5!", new ArgumentOutOfRangeException()); } if (MgfMaxAccretionFactor > 0.5 || MgfMaxAccretionFactor < 0.0) { throw new CryptoAsymmetricException("NTRUParameters:GetFormatted", "The MgfMaxAccretionFactor value can not be less than 0.0 and cannot exceed 0.5!", new ArgumentOutOfRangeException()); } if (DbMaxReductionFactor == 0.0 && IgfMaxAccretionFactor == 0.0 && MgfMaxAccretionFactor == 0.0) { return(FromName(ParamName).ToBytes()); } else { NTRUParameters param = FromName(ParamName); var prng = new Prng.CSPPrng(); int diff; if (DbMaxReductionFactor > 0.0) { diff = (int)Math.Abs(param.Db * DbMaxReductionFactor); // set the db to a random in range of param value, to value - value * DbReduceMultiplier if (diff > 0) { // get a random int int pnum = prng.Next(param.Db - diff, param.Db); // round it, must be divisible by 8 param.Db = pnum - pnum % 8; } } if (IgfMaxAccretionFactor > 0.0) { // raise igf calls to default +* IgfIncreaseThreshold diff = (int)Math.Abs(param.MinIGFHashCalls * IgfMaxAccretionFactor); if (diff > 0) { param.MinIGFHashCalls = prng.Next(param.MinIGFHashCalls, param.MinIGFHashCalls + diff); } } if (MgfMaxAccretionFactor > 0.0) { // raise mgf calls to default +* MgfIncreaseThreshold diff = (int)Math.Abs(param.MinMGFHashCalls * MgfMaxAccretionFactor); if (diff > 0) { param.MinMGFHashCalls = prng.Next(param.MinMGFHashCalls, param.MinMGFHashCalls + diff); } } prng.Dispose(); return(param.ToBytes()); } }