public PwProfile CloneDeep() { PwProfile p = new PwProfile(); p.m_strName = m_strName; p.m_type = m_type; p.m_bUserEntropy = m_bUserEntropy; p.m_uLength = m_uLength; p.m_pwCharSet = new PwCharSet(m_pwCharSet.ToString()); p.m_strCharSetRanges = m_strCharSetRanges; p.m_strCharSetAdditional = m_strCharSetAdditional; p.m_strPattern = m_strPattern; p.m_bPatternPermute = m_bPatternPermute; p.m_bNoLookAlike = m_bNoLookAlike; p.m_bNoRepeat = m_bNoRepeat; p.m_strExclude = m_strExclude; p.m_strCustomID = m_strCustomID; p.m_strCustomOpt = m_strCustomOpt; return(p); }
private void UpdateCharSet(bool bSetXml) { if (bSetXml) { PwCharSet pcs = new PwCharSet(m_pwCharSet.ToString()); m_strCharSetRanges = pcs.PackAndRemoveCharRanges(); m_strCharSetAdditional = pcs.ToString(); } else { PwCharSet pcs = new PwCharSet(m_strCharSetAdditional); pcs.UnpackCharRanges(m_strCharSetRanges); m_pwCharSet = pcs; } }
private void Initialize(bool bFullInitialize) { Clear(); if (!bFullInitialize) { return; } if (m_strHighAnsi == null) { StringBuilder sbHighAnsi = new StringBuilder(); // [U+0080, U+009F] are C1 control characters, // U+00A0 is non-breaking space for (char ch = '\u00A1'; ch <= '\u00AC'; ++ch) { sbHighAnsi.Append(ch); } // U+00AD is soft hyphen (format character) for (char ch = '\u00AE'; ch < '\u00FF'; ++ch) { sbHighAnsi.Append(ch); } sbHighAnsi.Append('\u00FF'); m_strHighAnsi = sbHighAnsi.ToString(); } if (m_strSpecial == null) { PwCharSet pcs = new PwCharSet(false); pcs.AddRange('!', '/'); pcs.AddRange(':', '@'); pcs.AddRange('[', '`'); pcs.Add(@"|~"); pcs.Remove(@"-_ "); pcs.Remove(PwCharSet.Brackets); m_strSpecial = pcs.ToString(); } }
internal static PwgError Generate(out ProtectedString psOut, PwProfile pwProfile, CryptoRandomStream crsRandomSource) { psOut = ProtectedString.Empty; LinkedList <char> vGenerated = new LinkedList <char>(); PwCharSet pcsCurrent = new PwCharSet(); PwCharSet pcsCustom = new PwCharSet(); PwCharSet pcsUsed = new PwCharSet(); bool bInCharSetDef = false; string strPattern = ExpandPattern(pwProfile.Pattern); if (strPattern.Length == 0) { return(PwgError.Success); } CharStream csStream = new CharStream(strPattern); char ch = csStream.ReadChar(); while (ch != char.MinValue) { pcsCurrent.Clear(); bool bGenerateChar = false; if (ch == '\\') { ch = csStream.ReadChar(); if (ch == char.MinValue) // Backslash at the end { vGenerated.AddLast('\\'); break; } if (bInCharSetDef) { pcsCustom.Add(ch); } else { vGenerated.AddLast(ch); pcsUsed.Add(ch); } } else if (ch == '^') { ch = csStream.ReadChar(); if (ch == char.MinValue) // ^ at the end { vGenerated.AddLast('^'); break; } if (bInCharSetDef) { pcsCustom.Remove(ch); } } else if (ch == '[') { pcsCustom.Clear(); bInCharSetDef = true; } else if (ch == ']') { pcsCurrent.Add(pcsCustom.ToString()); bInCharSetDef = false; bGenerateChar = true; } else if (bInCharSetDef) { if (pcsCustom.AddCharSet(ch) == false) { pcsCustom.Add(ch); } } else if (pcsCurrent.AddCharSet(ch) == false) { vGenerated.AddLast(ch); pcsUsed.Add(ch); } else { bGenerateChar = true; } if (bGenerateChar) { PwGenerator.PrepareCharSet(pcsCurrent, pwProfile); if (pwProfile.NoRepeatingCharacters) { pcsCurrent.Remove(pcsUsed.ToString()); } char chGen = PwGenerator.GenerateCharacter(pwProfile, pcsCurrent, crsRandomSource); if (chGen == char.MinValue) { return(PwgError.TooFewCharacters); } vGenerated.AddLast(chGen); pcsUsed.Add(chGen); } ch = csStream.ReadChar(); } if (vGenerated.Count == 0) { return(PwgError.Success); } char[] vArray = new char[vGenerated.Count]; vGenerated.CopyTo(vArray, 0); if (pwProfile.PatternPermutePassword) { PwGenerator.ShufflePassword(vArray, crsRandomSource); } byte[] pbUtf8 = StrUtil.Utf8.GetBytes(vArray); psOut = new ProtectedString(true, pbUtf8); MemUtil.ZeroByteArray(pbUtf8); Array.Clear(vArray, 0, vArray.Length); vGenerated.Clear(); return(PwgError.Success); }