diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2015-10-17 23:21:07 +0700 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2015-10-17 23:21:07 +0700 |
commit | a8866af2bf98dd3be651ae853ddf463a313e972a (patch) | |
tree | c013866e5a76a6dab34d0f505cc7bbfe63498dc7 /crypto/src/openpgp/PgpUtilities.cs | |
parent | Fix various warnings from recent commits (diff) | |
download | BouncyCastle.NET-ed25519-a8866af2bf98dd3be651ae853ddf463a313e972a.tar.xz |
https://github.com/bcgit/bc-csharp/issues/37
- Add alternative PGP methods involving passphrases to support UTF8 or caller-defined encodings
Diffstat (limited to 'crypto/src/openpgp/PgpUtilities.cs')
-rw-r--r-- | crypto/src/openpgp/PgpUtilities.cs | 50 |
1 files changed, 42 insertions, 8 deletions
diff --git a/crypto/src/openpgp/PgpUtilities.cs b/crypto/src/openpgp/PgpUtilities.cs index e4551db07..65c07b2e2 100644 --- a/crypto/src/openpgp/PgpUtilities.cs +++ b/crypto/src/openpgp/PgpUtilities.cs @@ -193,13 +193,44 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp return MakeKey(algorithm, keyBytes); } - public static KeyParameter MakeKeyFromPassPhrase( - SymmetricKeyAlgorithmTag algorithm, - S2k s2k, - char[] passPhrase) + internal static byte[] EncodePassPhrase(char[] passPhrase, bool utf8) + { + return passPhrase == null + ? null + : utf8 + ? Encoding.UTF8.GetBytes(passPhrase) + : Strings.ToByteArray(passPhrase); + } + + /// <remarks> + /// Conversion of the passphrase characters to bytes is performed using Convert.ToByte(), which is + /// the historical behaviour of the library (1.7 and earlier). + /// </remarks> + public static KeyParameter MakeKeyFromPassPhrase(SymmetricKeyAlgorithmTag algorithm, S2k s2k, char[] passPhrase) + { + return DoMakeKeyFromPassPhrase(algorithm, s2k, EncodePassPhrase(passPhrase, false), true); + } + + /// <remarks> + /// The passphrase is encoded to bytes using UTF8 (Encoding.UTF8.GetBytes). + /// </remarks> + public static KeyParameter MakeKeyFromPassPhraseUtf8(SymmetricKeyAlgorithmTag algorithm, S2k s2k, char[] passPhrase) + { + return DoMakeKeyFromPassPhrase(algorithm, s2k, EncodePassPhrase(passPhrase, true), true); + } + + /// <remarks> + /// Allows the caller to handle the encoding of the passphrase to bytes. + /// </remarks> + public static KeyParameter MakeKeyFromPassPhraseRaw(SymmetricKeyAlgorithmTag algorithm, S2k s2k, byte[] rawPassPhrase) + { + return DoMakeKeyFromPassPhrase(algorithm, s2k, rawPassPhrase, false); + } + + internal static KeyParameter DoMakeKeyFromPassPhrase(SymmetricKeyAlgorithmTag algorithm, S2k s2k, byte[] rawPassPhrase, bool clearPassPhrase) { int keySize = GetKeySize(algorithm); - byte[] pBytes = Encoding.UTF8.GetBytes(passPhrase); + byte[] pBytes = rawPassPhrase; byte[] keyBytes = new byte[(keySize + 7) / 8]; int generatedBytes = 0; @@ -308,12 +339,15 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp loopCount++; } - Array.Clear(pBytes, 0, pBytes.Length); + if (clearPassPhrase && rawPassPhrase != null) + { + Array.Clear(rawPassPhrase, 0, rawPassPhrase.Length); + } - return MakeKey(algorithm, keyBytes); + return MakeKey(algorithm, keyBytes); } - /// <summary>Write out the passed in file as a literal data packet.</summary> + /// <summary>Write out the passed in file as a literal data packet.</summary> public static void WriteFileToLiteralData( Stream output, char fileType, |