diff options
author | Maxwell Beck <max@rastertail.net> | 2025-05-13 12:11:27 -0500 |
---|---|---|
committer | Maxwell Beck <max@rastertail.net> | 2025-05-13 12:11:27 -0500 |
commit | 8d8f662ca2097866d6f6a7958bf91743ce55fbf5 (patch) | |
tree | ad26d1173c9bc01b36350e2e8fed9f8fbc35cce1 |
Initial commit
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Cargo.lock | 535 | ||||
-rw-r--r-- | Cargo.toml | 14 | ||||
-rw-r--r-- | src/bin/pwp.rs | 8 | ||||
-rw-r--r-- | src/lib.rs | 198 | ||||
-rw-r--r-- | src/orchard-street-medium.txt | 8192 |
6 files changed, 8948 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..d80b081 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,535 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base64ct" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "serde", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "include-lines" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be037b494f74d7bded0680228b3133bc268cbe50282f51c25fa46b890cfedb9" +dependencies = [ + "include-lines-proc", +] + +[[package]] +name = "include-lines-proc" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1ff2792810c5bb1b591ae8ac768bda8b0238a3b61cb546d062709f2a6a4f77" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pawprint" +version = "0.1.0" +dependencies = [ + "aho-corasick", + "crc", + "ed25519-dalek", + "include-lines", + "rand_chacha", + "rmp-serde", + "serde", + "sha3", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..a80f9ae --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "pawprint" +version = "0.1.0" +edition = "2024" + +[dependencies] +aho-corasick = "1.1.3" +crc = "3.3.0" +ed25519-dalek = { version = "2.1.1", features = ["serde"] } +include-lines = "1.1.2" +rand_chacha = { version = "0.9.0", features = ["os_rng"] } +rmp-serde = "1.3.0" +serde = { version = "1.0.219", features = ["derive"] } +sha3 = "0.10.8" diff --git a/src/bin/pwp.rs b/src/bin/pwp.rs new file mode 100644 index 0000000..feaff93 --- /dev/null +++ b/src/bin/pwp.rs @@ -0,0 +1,8 @@ +use pawprint::Keypair; + +fn main() { + let pair = Keypair::new("test"); + let encoded = pair.encode_secret().join(" "); + dbg!(&encoded); + let _pair2 = Keypair::from_encoded(encoded, "test"); +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..5e2affe --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,198 @@ +use aho_corasick::{AhoCorasick, MatchKind}; +use crc::{CRC_4_G_704, Crc}; +use ed25519_dalek::{ + SecretKey, Signature, SigningKey, VerifyingKey, ed25519::signature::SignerMut, +}; +use include_lines::static_include_lines; +use rand_chacha::{ + ChaCha12Rng, + rand_core::{RngCore, SeedableRng}, +}; +use serde::{Deserialize, Serialize}; +use sha3::{Digest, Sha3_256}; + +const CHECKSUM: Crc<u8> = Crc::<u8>::new(&CRC_4_G_704); +static_include_lines!(DICTIONARY, "src/orchard-street-medium.txt"); + +/// A signature verifying an arbitrary message +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct Certificate { + pub key: VerifyingKey, + pub sig: Signature, +} + +impl Certificate { + /// Verify a message against this certificate + pub fn verify(&self, message: &[u8]) -> Result<(), ed25519_dalek::SignatureError> { + self.key.verify_strict(message, &self.sig) + } +} + +/// Errors that may occur during sealed key decoding +#[derive(Clone, Debug)] +pub enum DecodeError { + WrongLength, + CrcMismatch, +} + +/// A secret key, XOR'd with a hashed password as last-resort security +#[derive(Serialize, Deserialize)] +pub struct SealedKey([u8; 32]); + +impl SealedKey { + /// Seal a raw secret key with a given passphrase + pub fn seal(mut key: SecretKey, passphrase: impl AsRef<str>) -> Self { + // Initialize crypto + let mut hasher = Sha3_256::new(); + + // Hash passphrase + hasher.update(passphrase.as_ref()); + let hash = hasher.finalize(); + + // XOR with passphrase hash + for (k, h) in key.iter_mut().zip(hash) { + *k ^= h; + } + + Self(key) + } + + /// Unseal into a raw secret key with a given passphrase + /// + /// No checks are done on if the passphrase was valid or not. + pub fn unseal(&self, passphrase: impl AsRef<str>) -> SecretKey { + // Initialize crypto + let mut hasher = Sha3_256::new(); + + // Hash passphrase + hasher.update(passphrase.as_ref()); + let hash = hasher.finalize(); + + // XOR with passphrase hash + let mut key = self.0.clone(); + for (k, h) in key.iter_mut().zip(hash) { + *k ^= h; + } + + key + } + + /// Encode the key into a list of words suitable for writing down and storing securely + fn encode(&self) -> [&'static str; 20] { + // Compute CRC + let checksum = CHECKSUM.checksum(&self.0); + + // Break into 13-bit indices + let mut indices = [0usize; 20]; + for (i, byte) in self.0.iter().enumerate() { + let bit = i * 8; + let idx = bit / 13; + let shift = (bit as isize) % 13 - 4; + + if shift <= 0 { + indices[idx] |= (*byte as usize) << -shift; + } else { + indices[idx] |= (*byte as usize) >> shift; + indices[idx + 1] |= ((*byte as usize) << (13 - shift)) & 0x1fff; + } + } + indices[19] |= checksum as usize; + + indices.map(|i| DICTIONARY[i]) + } + + pub fn decode(input: impl AsRef<str>) -> Result<Self, DecodeError> { + // Strip any non-alphabetic characters + let alpha = input + .as_ref() + .chars() + .filter(|c| c.is_alphabetic()) + .collect::<String>(); + + // Construct Aho-Corasick automaton + // TODO See if this can be done at compile time + let ac = AhoCorasick::builder() + .match_kind(MatchKind::LeftmostLongest) + .ascii_case_insensitive(true) + .build(DICTIONARY) + .unwrap(); + + // Stream decode the input + let indices = ac + .find_iter(&alpha) + .map(|m| m.pattern().as_usize()) + .collect::<Vec<_>>(); + + // Check length + if indices.len() != 20 { + return Err(DecodeError::WrongLength); + } + + unimplemented!(); + } +} + +/// A public/sealed-secret keypair capable of producing certificates +#[derive(Serialize, Deserialize)] +pub struct Keypair { + public: VerifyingKey, + secret: SealedKey, +} + +impl Keypair { + /// Create a new random keypair with a passphrase + pub fn new(passphrase: impl AsRef<str>) -> Self { + // Initalize crypto + let mut rng = ChaCha12Rng::from_os_rng(); + + // Generate secret key + let mut unsealed = SecretKey::default(); + rng.fill_bytes(&mut unsealed); + + // Derive public key + let public = SigningKey::from_bytes(&unsealed).verifying_key(); + + // Seal secret key + let secret = SealedKey::seal(unsealed, passphrase); + + Self { public, secret } + } + + /// Sign a message with this keypair + pub fn sign(&self, passphrase: impl AsRef<str>, message: &[u8]) -> Certificate { + // Unseal secret key + let unsealed = self.secret.unseal(passphrase); + + // Sign message + let mut signer = SigningKey::from_bytes(&unsealed); + let signature = signer.sign(message); + + Certificate { + key: self.public.clone(), + sig: signature, + } + } + + /// Sign this keypair's public key with itself + pub fn self_sign(&self, passphrase: impl AsRef<str>) -> Certificate { + self.sign(passphrase, self.public.as_bytes()) + } + + /// Encode the secret key into a list of words suitable for writing down and storing securely + pub fn encode_secret(&self) -> [&'static str; 20] { + self.secret.encode() + } + + pub fn from_encoded( + encoded: impl AsRef<str>, + passphrase: impl AsRef<str>, + ) -> Result<Self, DecodeError> { + let sealed = SealedKey::decode(encoded)?; + let unsealed = sealed.unseal(passphrase); + + Ok(Self { + public: SigningKey::from_bytes(&unsealed).verifying_key(), + secret: sealed, + }) + } +} diff --git a/src/orchard-street-medium.txt b/src/orchard-street-medium.txt new file mode 100644 index 0000000..827cd47 --- /dev/null +++ b/src/orchard-street-medium.txt @@ -0,0 +1,8192 @@ +abandon +abandoned +abbey +abbot +abdomen +abdominal +abilities +abnormal +aboard +abolished +abolition +aboriginal +abortion +above +abroad +abruptly +absence +absent +absolute +absolutely +absorb +absorbed +absorption +abstract +absurd +abundance +abundant +abuse +abused +academia +academic +academics +academy +accent +accept +acceptable +acceptance +accepted +accepting +accepts +access +accessed +accessible +accession +accident +accidental +accidents +acclaim +acclaimed +accolades +accompany +accomplish +accord +accordance +according +account +accounted +accounting +accounts +accredited +accuracy +accurate +accurately +accused +accustomed +achieve +achieved +achieving +acid +acids +acoustic +acquainted +acquire +acquired +acquiring +acres +across +acting +activated +activation +actively +activism +activist +activists +activities +activity +actress +actually +acute +adapt +adaptation +adapted +adaptive +add +added +addiction +adding +addition +additional +additions +address +addressed +addresses +addressing +adds +adequately +adherence +adjacent +adjoining +adjust +adjusted +adjusting +adjustment +administer +admiral +admiralty +admiration +admired +admission +admissions +admit +admits +admitted +adolescent +adopt +adopted +adopting +adoption +adult +adulthood +adults +advance +advanced +advances +advancing +advantage +advantages +advent +adventure +adventures +adverse +advice +advise +advised +adviser +advisers +advisory +advocacy +advocate +advocated +advocates +aerial +affair +affairs +affected +affecting +affection +affiliate +affiliated +affinity +affirmed +afford +affordable +afforded +afghan +afraid +aftermath +afternoon +afterward +afterwards +again +against +agencies +agency +agenda +agent +agents +aggregate +aggression +aggressive +agitation +agrarian +agree +agreed +agreement +agreements +agrees +ahead +aided +aim +aimed +aiming +aims +airborne +aircraft +airfield +airing +airline +airlines +airplane +airport +airports +airway +airways +alarm +albeit +album +albums +alcohol +alcoholic +alcoholism +alert +algebra +algorithm +algorithms +alias +alien +alienation +align +aligned +alignment +alike +alive +alleged +allegedly +allegiance +alley +alliance +alliances +allied +allies +allocated +allocation +allowance +allowed +allowing +allows +alloy +alloys +almost +alone +along +alongside +aloud +alpha +alphabet +alpine +already +altar +alter +alteration +altered +alternate +although +altitude +alto +altogether +aluminum +alumni +always +amateur +amazed +amazing +amazon +ambassador +ambiguity +ambiguous +ambition +ambitions +ambitious +ambulance +amended +amendment +amendments +amenities +amid +amino +ammunition +amnesty +among +amounted +amounts +amphibious +amplifier +amplitude +amusement +analog +analogous +analogy +analysis +analyst +analysts +analytic +analytical +analyze +analyzed +analyzing +anatomy +ancestor +ancestors +ancestral +ancestry +anchor +anchored +ancient +android +anemia +anesthesia +angel +angels +angle +angles +angry +angular +animal +animals +animated +animation +anime +ankle +annals +annexation +annexed +announced +announcing +annual +annually +anonymous +answer +answered +answering +answers +antarctic +antenna +anterior +anthem +anthology +antibodies +antibody +anticipate +antigen +antigens +antiquity +anxiety +anxious +anybody +anymore +anyone +anything +anywhere +apart +apartment +apartments +apex +apostles +apostolic +app +apparatus +apparent +apparently +appeal +appealed +appealing +appeals +appear +appearance +appeared +appearing +appears +appendix +appetite +apple +apples +applicable +applicant +applicants +applied +applies +apply +applying +appoint +appointed +appraisal +appreciate +apprentice +approach +approached +approaches +approval +approve +approved +aquatic +arbitrary +arc +arcade +archbishop +archer +architect +architects +archive +archives +area +areas +arena +argue +argued +argues +arguing +argument +arguments +arise +arises +arising +arithmetic +armament +armed +armies +armor +armored +army +arose +around +arrange +arranged +array +arrest +arrested +arrests +arrival +arrive +arrived +arrives +arriving +arrows +arsenal +arteries +artery +arthritis +articulate +artifacts +artificial +artillery +artist +artistic +artists +artwork +ascertain +ashamed +ashes +aside +asking +asleep +aspect +aspects +aspiration +assault +assembled +assembly +assert +asserted +assertion +asserts +assess +assessed +assessing +assessment +asset +assets +assign +assigned +assignment +assistance +assistant +assistants +assisted +assisting +assists +associate +associated +associates +assume +assumed +assumes +assuming +assumption +assurance +assure +assured +asteroid +asthma +astronomer +astronomy +asylum +athlete +athletes +athletic +athletics +atlas +atmosphere +atom +atomic +atoms +atop +attach +attached +attachment +attack +attacked +attacking +attacks +attain +attained +attainment +attempt +attempted +attempting +attempts +attend +attendance +attendant +attended +attending +attention +attested +attitude +attitudes +attorney +attorneys +attract +attracted +attracting +attraction +attractive +attribute +attributed +attributes +auburn +auction +audience +audiences +audio +audit +audition +auditorium +auditory +august +aunt +authentic +author +authored +authority +authorized +authors +auto +automated +automatic +automation +automobile +automotive +autonomous +autonomy +autumn +available +avenue +average +averaged +averaging +aviation +avoid +avoidance +avoided +avoiding +awake +awakening +award +awarded +awards +awareness +away +awful +awkward +axial +axis +babies +baby +bachelor +backed +background +backing +backs +backup +backward +bacon +bacteria +bacterial +bad +badge +badly +badminton +bag +bagel +bags +bail +baker +baking +balance +balanced +balances +balancing +ballad +ballet +balloon +ballot +ballots +banana +band +bands +bandwidth +bang +banjo +bank +banker +banking +bankruptcy +banks +banned +banner +baptism +bar +barber +bare +barely +bargain +bargaining +bark +barker +barn +baron +baronet +baroque +barracks +barrel +barrier +barriers +bars +basal +baseball +based +baseline +basement +basic +basically +basil +basin +basis +basket +basketball +bass +bassist +batch +bath +bathroom +bats +battalion +battalions +batted +batteries +battery +batting +battle +battles +bay +bays +beach +beaches +beads +beam +beams +bean +beans +bear +beard +bearing +bears +beast +beat +beaten +beating +beats +beautiful +beauty +beaver +became +beck +become +becomes +becoming +bedroom +beds +bee +beef +beer +bees +beetle +beetles +beg +began +begin +beginning +beginnings +begins +begun +behalf +behave +behavior +behavioral +behind +behold +being +beings +belief +beliefs +believe +believed +believers +believes +believing +bell +bells +belly +belong +belonged +belonging +belongs +beloved +below +belt +bench +bend +bending +beneath +beneficial +benefit +benefited +benefits +benign +bent +berry +beside +besides +best +beta +betrayed +better +beyond +bias +biased +bible +biblical +bicycle +bid +big +bigger +biggest +bike +bilateral +bilingual +bill +billboard +billion +bills +binary +bind +binding +biographer +biography +biological +biology +biopsy +bird +birds +birth +birthday +births +bishops +bite +bits +bitter +black +bladder +blade +blades +blame +blamed +blank +blanket +blast +bleeding +blend +bless +blessed +blessing +blessings +blew +blimp +blind +block +blockade +blocked +blocking +blocks +blog +blood +bloody +bloom +blow +blowing +blown +blows +blue +blues +boarding +boat +boats +bobby +bodies +bodily +boil +boiling +bold +bolt +bomb +bomber +bombers +bombing +bombs +bond +bonding +bonds +bone +bones +bonus +boom +boost +boot +booth +boots +border +bordered +borders +bore +bored +boring +born +borough +borrow +borrowed +borrowing +boss +botanical +botanist +botany +bother +bottle +bottles +bottom +bought +boulder +boulevard +bound +boundaries +boundary +bounded +bout +bowed +bowl +bowler +bowling +bowls +box +boxer +boxes +boxing +boy +boycott +boyfriend +brain +brains +brake +branch +branches +brand +branded +branding +brands +brass +brave +braves +breach +bread +breadth +breakdown +breakfast +breaking +breaks +breath +breathe +breathing +breed +breeding +breeze +brethren +brewery +brick +bride +bridge +bridges +brief +briefly +brigade +brigades +bright +brilliant +bring +bringing +brings +broadcast +broadcasts +broader +broadly +broke +broken +broker +broncos +bronze +brook +brooks +brother +brothers +brought +brow +brown +browns +browser +brunch +brush +brutal +bubble +buck +buddy +budget +budgets +buffalo +buffer +builder +buildings +builds +bulk +bull +bulldogs +bullet +bulletin +bullets +bulls +bunch +bundle +burden +bureau +burial +burned +burning +burns +burnt +burst +bury +bus +bush +business +businesses +busy +butler +butter +butterfly +button +buttons +buy +buyer +buyers +buying +bye +bypass +cab +cabin +cabinet +cable +cache +cadet +cadets +cage +cake +calcium +calculate +calculated +calendar +calling +calm +calories +cameo +camera +cameras +camp +campaign +campaigned +campaigns +camping +camps +campus +campuses +canal +cancel +canceled +cancer +candidacy +candidate +candidates +candle +candy +cane +cannabis +cannon +cannot +canoe +canon +canvas +canyon +cap +capability +capacities +capacity +capillary +capital +capitalism +capitalist +capitals +capped +caps +captain +captained +captive +captivity +capture +captured +capturing +car +carbon +carbonate +card +cardiac +cardinal +cardinals +cards +career +careers +careful +carefully +cargo +caring +carnival +carol +carpenter +carpet +carriage +carried +carrier +carriers +carries +carry +carrying +cars +cart +cartoon +cartoons +carved +cases +cash +casino +casting +castle +castles +casual +casualties +cat +catalog +catalyst +catch +catches +catching +categories +category +cathedral +cattle +caucus +caught +causal +cause +caused +causes +causing +caution +cautious +cavalry +cave +caves +cavity +cease +cedar +ceiling +celebrate +celebrated +celebrity +cell +cells +cellular +cement +cemetery +censorship +census +centennial +center +centered +centers +central +cents +centuries +century +ceramic +ceramics +cerebral +ceremonial +ceremonies +ceremony +certainly +certainty +certified +chain +chains +chaired +chairman +chairs +challenge +challenged +challenger +challenges +chamber +chambers +champion +champions +chance +chancellor +chances +changing +channel +channels +chaos +chap +chapel +chaplain +chapter +chapters +character +characters +charge +charged +charges +charging +charitable +charities +charity +charm +charming +chart +charted +charter +chartered +charts +chassis +chat +cheap +cheaper +check +checked +checking +checklist +checks +cheek +cheeks +cheerful +cheese +chef +chemical +chemicals +chemist +chemistry +cherry +chess +chest +chicken +chief +chiefly +chiefs +child +childhood +children +chin +china +chip +chips +chloride +chocolate +choice +choices +choir +choose +chooses +choosing +chopped +choral +chord +chorus +chose +chosen +chromosome +chronic +chronicle +chronicles +chuck +churches +cigarette +cigarettes +cinema +circa +circle +circles +circuit +circuits +circular +circus +citadel +cite +cites +cities +citizen +citizens +city +civic +civil +civilian +civilians +civilized +claim +claiming +claims +clamp +clan +clarify +clarity +clash +clashes +class +classes +classic +classical +classics +classified +classroom +classrooms +clause +clauses +clay +clean +cleaned +cleaning +clearance +cleared +clearer +clearing +clearly +clement +clergy +clerical +clerk +clever +click +clicking +client +clients +cliff +cliffs +climate +climatic +climb +climbed +climbing +clinic +clinical +clinically +clip +clock +close +closely +closer +closest +closet +closing +closure +cloth +clothes +clothing +cloud +clouds +clubs +clue +clues +cluster +clusters +coach +coached +coaches +coaching +coal +coalition +coarse +coast +coastal +coastline +coat +coated +coating +code +codes +codex +coffee +cognition +cognitive +coherence +coherent +coil +coin +coined +coins +cold +collapse +collapsed +collar +collateral +colleague +colleagues +collect +collected +collecting +collection +collective +collector +collectors +college +colleges +collegiate +collision +cologne +colon +colonel +colonial +colonies +colonists +colony +color +colors +colt +colts +column +columnist +columns +combat +combine +combined +combines +combining +combustion +comeback +comedian +comedy +comfort +comic +comics +command +commanded +commander +commanders +commanding +commands +commenced +comment +commentary +commented +commenting +comments +commerce +commercial +commission +commit +commitment +committed +committee +committees +commodity +commodore +commonly +commons +communal +commune +communes +communion +communism +communist +communists +community +commuter +compact +companies +companion +companions +company +comparable +compare +compared +compares +comparing +comparison +compassion +compatible +compelled +compelling +compensate +compete +competed +competence +competent +competes +competing +competitor +compiled +complain +complained +complaint +complaints +completed +completely +completing +completion +complex +complexes +complexity +compliance +comply +component +components +composed +composer +composers +composing +composite +compound +compounds +comprehend +compressed +comprise +comprised +comprises +comprising +compromise +compulsory +compute +computed +computer +computers +computing +conceal +concealed +conceive +conceived +concept +conception +concepts +conceptual +concern +concerned +concerning +concerns +concert +concerto +concerts +conclude +concluded +concludes +concluding +conclusion +concrete +concurrent +condemned +condition +conditions +conduct +conducted +conducting +conduction +conductor +cone +conference +conferred +confess +confession +confidence +confident +confined +confirm +confirmed +confirms +conflict +conflicts +confluence +conform +conformity +confront +confronted +confused +confusing +confusion +congenital +congress +connect +connected +connecting +connection +connects +conquered +conquest +conscience +conscious +consensus +consent +consider +considered +considers +consist +consisted +consistent +consisting +consists +console +consortium +conspiracy +constable +constant +constantly +constants +constitute +constraint +construct +constructs +consul +consult +consultant +consulted +consulting +consume +consumed +consumer +consumers +consuming +contact +contacted +contacts +contain +contained +container +containers +containing +contains +contempt +content +contention +contents +contest +contestant +contested +contests +context +contexts +continent +contingent +continual +continue +continued +continues +continuing +continuity +continuous +continuum +contour +contract +contracted +contractor +contracts +contrary +contrast +contrasted +contrasts +contribute +control +controlled +controller +controls +convenient +convent +convention +conversely +conversion +convert +converted +converting +converts +convey +conveyed +convicted +conviction +convince +convinced +convincing +convoy +cook +cooked +cooking +cool +cooling +cooper +cooperate +coordinate +copied +copies +coping +copper +copy +copying +copyright +coral +cork +corn +corner +corners +coronary +coronation +corporate +corps +corpus +corrected +correction +correctly +correlated +correspond +corridor +corrosion +corrupt +corruption +cortex +cosmic +cost +costly +costs +costume +costumes +cottage +cotton +couch +cough +council +councils +counsel +counseling +counselor +count +counted +countess +counties +counting +countless +countries +country +counts +county +coup +couple +coupled +couples +coupling +course +courses +court +courtesy +courthouse +courts +courtyard +cousin +cousins +cove +covenant +coverage +covers +cow +cowboys +cows +crack +cracks +crafts +crane +crash +crashed +crater +crazy +create +created +creates +creating +creative +creativity +creator +creature +creatures +credit +credited +creditor +creditors +credits +creek +crescent +crest +crews +cricket +cricketer +cried +cries +crime +crimes +criminal +criminals +crimson +crises +crisis +criteria +criterion +critic +critical +critically +criticism +criticisms +criticized +critics +critique +crop +crops +crossed +crosses +crossing +crossover +crow +crowd +crowded +crowds +crown +crowned +crucial +crude +cruel +cruelty +cruise +cruiser +crusade +crushed +crust +cry +crying +crystal +crystals +cubic +cubs +cues +cuisine +culminated +cult +cultivated +cultural +culturally +culture +cultures +cumulative +cup +cups +curator +curiosity +curious +curling +currency +currently +currents +curriculum +curse +curtain +curve +curved +curves +custody +custom +customary +customer +customers +customs +cut +cuts +cutting +cycles +cyclic +cycling +cyclist +cyclone +cylinder +dad +daddy +daily +dairy +dam +damage +damaged +damages +damaging +dame +damp +dams +dancer +dancers +dances +dancing +danger +dangerous +dangers +dare +dared +daring +dark +darker +darkness +darling +dash +dashed +data +database +databases +dating +daughter +daughters +dawn +daylight +days +daytime +dead +deadline +deadly +deaf +dealer +dealers +dealing +dealt +dean +dear +death +deaths +debate +debates +debris +debt +debtor +debts +debut +decade +decades +decay +deceased +decent +deception +decide +decided +decides +deciding +decimal +decision +decisions +decisive +deck +declare +declared +declares +declaring +decline +declined +declining +decorated +decoration +decorative +decrease +decreased +decreases +decreasing +decree +dedicated +dedication +deduction +deductions +deeds +deemed +deep +deeper +deepest +deeply +deer +default +defeat +defeating +defeats +defect +defective +defects +defend +defendant +defendants +defended +defender +defenders +defending +defense +defenses +defensive +deferred +deficiency +deficient +deficit +deficits +define +defined +defines +defining +definite +definitely +definition +definitive +defunct +degree +degrees +deities +deity +delay +delayed +delays +delegate +delegates +delegation +delete +deliberate +delicate +delicious +delight +delighted +delightful +deliver +delivered +delivering +delivery +delta +demand +demanded +demanding +demands +dementia +demise +demo +democracy +democrat +democratic +democrats +demolished +demolition +demon +denial +denied +denote +denotes +denounced +dense +densities +density +dental +deny +denying +departed +departing +department +departure +depend +depended +dependence +dependency +dependent +depending +depends +depict +depicted +depicting +depiction +depicts +depletion +deployed +deployment +deported +deposit +deposited +deposition +deposits +depot +depressed +depression +deprived +dept +depth +depths +deputies +deputy +derby +derivative +derive +derived +derives +descendant +descended +descending +descent +describe +described +describes +describing +desert +deserted +deserve +deserved +deserves +design +designated +designed +designer +designers +designing +designs +desirable +desire +desired +desires +desk +desktop +despair +desperate +despite +destined +destiny +destroy +destroyed +destroyer +destroyers +destroying +detached +detachment +detail +detailed +details +detained +detect +detected +detection +detective +detector +detention +determine +determined +determines +devastated +develop +developed +developer +developers +developing +develops +deviation +deviations +device +devices +devil +devils +devised +devote +devoted +devotion +diabetes +diagnosed +diagnosis +diagnostic +diagram +diagrams +dialect +dialects +dialog +diameter +diamond +diamonds +diary +dictated +dictionary +die +died +diesel +diet +dietary +differ +differed +difference +different +differing +differs +difficult +difficulty +diffuse +diffusion +dig +digest +digging +digit +digital +dignity +dilemma +dim +dimension +dimensions +diminish +diminished +dining +dinner +diocese +dioxide +dip +diploma +diplomacy +diplomat +diplomatic +directed +directing +direction +directions +directive +director +directors +directory +dirt +dirty +disability +disabled +disagree +disappear +disaster +disastrous +disbanded +discarded +discharge +discharged +disciples +discipline +disclose +disclosed +disclosure +disco +discomfort +discount +discourse +discourses +discover +discovered +discovers +discovery +discrete +discretion +discuss +discussed +discusses +discussing +discussion +disease +diseases +dish +dishes +disk +disks +dismiss +dismissal +dismissed +disorder +disorders +dispatched +dispersed +dispersion +displaced +display +displayed +displaying +displays +disposal +disposed +dispute +disputed +disputes +disruption +dissent +dissolved +distance +distances +distant +distinct +distinctly +distorted +distortion +distress +distribute +district +districts +disturbed +disturbing +dive +diverse +diversity +divide +dividend +dividends +dividing +divine +diving +division +divisional +divisions +divorce +divorced +dock +doctor +doctoral +doctorate +doctors +doctrine +doctrines +document +documented +documents +dodge +dodgers +dog +doing +doll +dollar +dollars +dolphins +domain +domains +dome +domestic +dominance +dominant +dominate +dominated +domination +dominion +donated +donation +donations +done +donor +donors +doors +doorway +dorsal +dosage +dose +doses +dot +double +doubled +doubles +doubt +doubtful +doubtless +doubts +download +downstairs +downstream +downtown +downward +dozen +dozens +draft +drafted +drag +dragged +dragon +dragons +drain +drainage +drained +drama +dramas +dramatic +drank +draw +drawing +drawings +drawn +draws +dreadful +dream +dreamed +dreaming +dreams +drew +dried +drift +drill +drilling +drink +drinking +drinks +drive +driven +driver +drivers +drives +driving +drop +dropped +dropping +drops +drought +drove +drug +drugs +drum +drummer +drums +drunk +dry +drying +dual +dubbed +duchess +duck +ducks +due +duet +dug +duke +dull +duly +dumb +duo +duration +dust +duties +duty +dwarf +dwell +dwelling +dwellings +dye +dying +dynamic +dynamics +dynamo +dynasty +eager +eagerly +eagle +eagles +earlier +earliest +earnest +earnings +earth +earthly +earthquake +easier +easily +eastern +echo +echoed +echoes +eclipse +ecological +ecology +economic +economics +economies +economist +economists +economy +ecosystem +ecosystems +edge +edges +edit +edited +editing +edition +editions +editor +editorial +editors +educated +education +educator +educators +effect +effected +effective +effects +efficacy +efficiency +efficient +effort +efforts +egg +eggs +ego +eighteen +eighteenth +eighth +eighty +elaborate +elastic +elasticity +elbow +elder +elderly +elders +eldest +elections +electoral +electorate +electric +electrical +electrode +electrodes +electron +electronic +electrons +elegant +element +elementary +elements +elephant +elevated +elevation +elevations +elevator +eleven +eleventh +eligible +eliminate +eliminated +elite +elites +else +elsewhere +email +embarked +embassy +embedded +emblem +embodied +embrace +embraced +embryo +emerge +emerged +emergence +emergency +emerges +emerging +emeritus +emigrated +emigration +eminent +emirates +emission +emissions +emotion +emotional +emotions +emperor +emphasis +emphasize +emphasized +emphasizes +empire +empirical +employ +employee +employees +employer +employers +employing +employment +employs +empress +empty +enable +enabled +enables +enabling +enacted +enclosed +encoded +encoding +encounter +encounters +encourage +encouraged +encourages +endangered +endemic +endless +endorsed +endowment +endurance +endure +enduring +enemies +enemy +energetic +energies +energy +enforce +enforced +engage +engaged +engagement +engaging +engine +engineer +engineers +engines +enhance +enhanced +enhancing +enjoy +enjoyed +enjoying +enjoyment +enlarged +enlisted +enormous +enough +enrolled +enrollment +ensemble +enslaved +ensuing +ensure +ensured +ensures +ensuring +entails +entering +enterprise +enthusiasm +entire +entirely +entirety +entitled +entrance +entrants +entries +entry +envelope +envy +enzyme +enzymes +epic +epidemic +episcopal +episode +episodes +epithet +equally +equals +equation +equations +equipment +equipped +equitable +equity +equivalent +erect +erected +erosion +erotic +errors +escape +escaped +escapes +escort +escorted +especially +essay +essays +essence +essential +establish +estate +estates +esteem +estimate +estimated +estimates +estimating +estimation +estrogen +eternal +eternity +ethic +ethical +ethics +ethnic +ethnicity +etymology +euro +evacuated +evacuation +evaluate +evaluated +evaluating +evaluation +eve +evening +evenly +event +events +eventual +eventually +every +everybody +everyday +everyone +everything +everywhere +evidence +evident +evidently +evoked +evolve +evolved +evolving +exact +exactly +exam +examine +examined +examines +examining +example +examples +excavated +excavation +exceed +exceeded +exceeding +exceeds +excel +excellence +excellent +except +exception +exceptions +excess +excessive +exchange +exchanged +exchanges +excitation +excited +excitement +exciting +exclaimed +exclude +excluded +excluding +exclusion +exclusive +excuse +execute +executive +executives +exempt +exemption +exercise +exercised +exercises +exercising +exert +exerted +exhaust +exhausted +exhibit +exhibited +exhibition +exhibits +exile +exiled +exist +existed +existence +existing +exists +exit +exotic +expand +expanded +expanding +expansion +expect +expecting +expedition +expelled +expense +expenses +expensive +experience +experiment +expert +expertise +experts +expired +explain +explained +explaining +explains +explicit +explicitly +exploit +exploited +explore +explored +explorer +explores +exploring +explosion +explosive +export +exported +exports +expose +exposed +exposition +exposure +express +expressed +expresses +expressing +expression +expressive +expressly +expressway +extant +extend +extended +extending +extends +extension +extensions +extensive +extent +exterior +external +extinct +extinction +extra +extract +extracted +extraction +extracts +extreme +extremely +extremes +eye +eyed +eyes +fabric +facade +faced +facial +facilitate +facilities +facility +facing +fact +faction +factions +factor +factories +factors +factory +facts +factual +faculties +faculty +faded +fail +failed +failing +fails +failure +failures +faint +fairly +fairness +fairy +faith +faithful +fake +falcon +falcons +fallen +falling +falls +false +fame +familial +families +family +famine +famous +fan +fans +fantasies +fantastic +fantasy +far +farewell +farm +farmer +farmers +farming +farmland +farms +farther +fascist +fashion +fashioned +faster +fastest +fat +fatal +fate +father +fathers +fatigue +fatty +faults +fauna +favor +favorable +favored +favorite +fax +fear +feared +fearful +fears +feasible +feast +feathers +feature +featured +features +featuring +fed +federal +federation +fee +feed +feedback +feeding +feeds +feel +feeling +feelings +feels +fees +feet +fell +fellow +fellows +fellowship +felt +female +females +feminine +feminism +feminist +feminists +fence +fencing +ferry +fertile +fertility +fertilizer +festival +festivals +fetal +fetus +feud +feudal +fever +few +fewer +fiber +fibers +fiction +fictional +fields +fierce +fifteen +fifteenth +fifth +fifty +fig +fight +fighter +fighters +fighting +fights +figs +figure +figured +figures +filed +filing +film +filmed +filming +filmmaker +filmmakers +films +filter +filters +fin +finale +finalist +finalists +finally +finance +financed +finances +financial +financing +find +finding +findings +finds +finely +finest +finger +fingers +finish +finished +finishes +finishing +fire +firearms +fired +fires +firing +firmly +fiscal +fisher +fisheries +fishing +fist +fitness +fitted +fitting +five +fix +fixation +fixed +fixing +fixture +fixtures +flag +flags +flagship +flame +flames +flank +flap +flash +flat +flats +flavor +fled +flee +fleeing +fleet +flesh +flew +flexible +flies +flight +flights +flint +float +floating +flood +flooded +flooding +floods +floor +floors +flora +flotilla +flour +flow +flower +flowering +flowers +flowing +flown +flows +fluid +fluids +flute +flux +flying +foam +focal +focus +focused +focuses +focusing +fog +fold +folded +folder +folk +folklore +folks +follow +followed +followers +following +follows +fond +font +food +foods +fool +foolish +foot +footage +football +footballer +forbidden +forces +forcing +forecast +foregoing +forehead +foreign +foreigners +foremost +forensic +forest +forested +forestry +forests +forever +forget +forgive +forgot +forgotten +fork +formally +format +formation +formations +formats +formerly +formidable +formula +formulas +formulate +formulated +forth +fortified +fortress +fortunate +fortune +fortunes +forty +forum +forward +fossil +fossils +foster +fought +foundation +founded +founder +founders +founding +fountain +four +fourteen +fourteenth +fourth +fox +fraction +fractions +fracture +fractures +fragile +fragment +fragments +frame +framed +frames +framework +framing +franchise +frank +fraternity +fraud +free +freed +freedom +freelance +freely +freeman +freestyle +freeway +freeze +freezing +freight +french +frequency +frequent +frequently +fresh +freshman +freshwater +friction +friendly +friends +friendship +frigate +frightened +fringe +frog +frontal +frontier +frost +frozen +fruit +fruits +frustrated +fuel +fuels +fulfill +fulfilled +fulfilling +full +fuller +fun +function +functional +functions +fund +funded +funding +funds +funeral +fungi +fungus +funk +funny +furious +furnace +furnish +furnished +furniture +further +fury +fuselage +future +futures +fuzzy +gable +gains +galaxy +galleries +gallery +gambling +game +games +gaming +gamma +gang +gap +gaps +garage +garbage +garden +gardens +garlic +garrison +gas +gasoline +gastric +gate +gates +gateway +gather +gathered +gathering +gauge +gave +gay +gaze +gazette +gear +gender +gene +general +generally +generals +generate +generated +generates +generating +generation +generator +generic +generous +genes +genesis +genetic +genetics +genius +genocide +genome +genre +genres +gentle +gentleman +gentlemen +gently +genuine +genuinely +genus +geographic +geography +geological +geology +geometric +geometry +gesture +gestures +getting +ghost +giant +giants +gift +gifted +gifts +gill +girl +girlfriend +girls +given +giving +glacier +glad +glance +glanced +gland +glands +glass +glasses +glen +glimpse +global +globally +globe +glorious +glory +gloves +glow +glucose +glue +goal +goalkeeper +goals +goat +god +goddess +gods +gold +golden +golf +gone +good +goodness +goods +gorge +gospel +gossip +govern +governance +governed +governing +government +governor +governors +grab +grabbed +grace +grades +gradient +gradual +gradually +graduate +graduated +graduates +graduating +graduation +graft +grain +grains +grammar +grand +grandson +granite +granted +granting +grape +graphic +graphics +graphs +grasp +grass +grateful +gratitude +grave +gravel +graves +gravity +gray +grazing +great +greater +greatest +greatly +greatness +green +greens +greeted +grew +grid +grief +griffin +grim +grin +grinned +grip +gross +grossed +grounded +grounds +group +grouped +grouping +groups +grove +grow +growing +grown +grows +growth +guarantee +guaranteed +guarantees +guard +guardian +guards +guerrilla +guess +guest +guests +guidance +guide +guided +guidelines +guides +guiding +guild +guilt +guilty +guinea +guitar +guitarist +guitars +gulf +guns +guru +gut +guy +guys +gym +gymnasium +gymnastics +habit +habitat +habitats +habits +halfway +halls +halt +halted +ham +hamlet +hammer +hand +handball +handbook +handed +handful +handicap +handle +handled +handles +handling +hands +handsome +hang +happen +happened +happening +happens +happily +happiness +harassment +harbor +hard +harder +hardly +hardware +hardy +harmful +harmonic +harmony +harry +harsh +harvest +hatch +hate +hated +hatred +haven +having +hawk +hawks +hay +hazard +hazardous +hazards +headache +headed +header +heading +heads +heal +healing +health +healthcare +healthy +heard +hearing +hearings +hears +heart +hearts +heated +heath +heating +heats +heaven +heavenly +heavens +heavier +heavily +heavy +hectares +height +heightened +heights +heir +helicopter +hello +helmet +help +helped +helpful +helping +helpless +helps +hemisphere +hemorrhage +hepatitis +herb +herbs +herd +hereafter +hereditary +heritage +hero +heroes +heroic +hesitated +hiatus +hid +hidden +hide +hiding +hierarchy +high +higher +highest +highland +highlands +highlight +highlights +highly +highway +highways +hiking +hill +hills +hint +hints +hired +hiring +historian +historians +historic +historical +histories +history +hit +hits +hitting +hockey +holder +holders +holding +holdings +holes +holiday +holidays +hollow +holly +holy +homage +home +homeland +homeless +homer +homes +homestead +hometown +homework +honest +honestly +honesty +honey +honor +honorary +honored +honors +hope +hoped +hopes +hoping +horizon +horizontal +hormone +hormones +horn +horns +horrible +horror +horse +horses +hospital +hospitals +hostage +hosted +hostile +hostility +hosting +hosts +hotel +hotels +hour +hours +housed +household +households +houses +housing +however +hub +huge +hull +human +humanities +humanity +humans +humble +humid +humidity +humor +humorous +hundred +hundreds +hung +hunger +hungry +hunt +hunter +hunters +hunting +hurling +hurricane +hurricanes +hurried +hurry +hurt +husband +husbands +hybrid +hydraulic +hydrogen +hygiene +hymn +hypotheses +hypothesis +icon +idea +ideal +ideally +ideals +ideas +identical +identified +identifies +identify +identities +identity +ideologies +ideology +idle +idol +ignorance +ignorant +ignore +ignored +ignoring +illegal +illness +illnesses +illusion +illustrate +image +imagery +images +imaginary +imagine +imagined +imaging +immediate +immense +immigrant +immigrants +immigrated +immune +immunity +impact +impacted +impacts +impaired +impairment +imperative +imperfect +imperial +implement +implicit +implicitly +implied +implies +import +importance +important +imported +imports +impose +imposed +imposing +imposition +impossible +impressed +impression +impressive +imprint +imprisoned +improper +improve +improved +improves +improving +impulse +impulses +inability +inactive +inadequate +inaugural +incapable +incentive +incentives +inception +inch +inches +incidence +incident +incidents +inclined +include +included +includes +including +inclusion +inclusive +income +incomes +incoming +incomplete +incorrect +increase +increased +increases +increasing +incredible +incumbent +incurred +indebted +indeed +index +indexes +indicate +indicated +indicates +indicating +indication +indicative +indicator +indicators +indices +indigenous +indirect +indirectly +individual +indoor +induce +induced +inducted +induction +industrial +industries +industry +inequality +inevitable +inevitably +infancy +infant +infantry +infants +infarction +infected +infection +infections +infectious +inference +inferior +infinite +inflation +influence +influenced +influences +inform +informal +informed +informs +infrared +infusion +inhabited +inherent +inherently +inherited +inhibit +inhibition +initial +initially +initiate +initiated +initiation +initiative +injected +injection +injured +injuries +injury +injustice +inland +inlet +inmates +inn +innate +innocence +innocent +innovation +innovative +input +inputs +inquiries +inquiry +inscribed +insect +insects +insert +inserted +insertion +inside +insight +insights +insignia +insist +insisted +insistence +insists +inspection +inspector +inspired +install +installed +instance +instances +instant +instantly +instead +instinct +institute +instituted +institutes +instructed +instructor +instrument +insulin +insurance +insured +intact +intake +integer +integral +integrate +integrated +integrity +intel +intellect +intend +intended +intense +intensely +intensity +intensive +intent +intention +intentions +interact +interest +interested +interests +interface +interfaces +interfere +interim +interior +internal +internally +internet +interpret +interred +interrupt +interstate +interval +intervals +intervene +interview +interviews +intestinal +intimacy +intimate +intrinsic +introduce +introduced +introduces +intuition +intuitive +invaded +invalid +invariably +invasion +invasive +invented +invention +inventor +inventory +inverse +inversion +invest +invested +investing +investment +investor +investors +invisible +invitation +invite +invited +invoked +involve +involved +involves +involving +inward +iris +iron +ironic +ironically +irony +irrational +irregular +irrelevant +irrigation +island +islander +islanders +islands +isle +isles +isolate +isolated +isolation +issuing +item +items +ivory +ivy +jack +jacket +jail +jam +japan +jar +jaw +jazz +jealous +jealousy +jeans +jersey +jet +jets +jewelry +jimmy +job +jobs +jockey +join +joins +joint +jointly +joints +joke +jokes +josh +journal +journalism +journalist +journals +journey +jubilee +judge +judged +judges +judging +judgment +judgments +judicial +judiciary +judo +juice +jump +jumped +jumping +junction +jungle +junior +justified +justify +juvenile +keen +keep +keeping +keeps +kept +keyboard +keyboards +kick +kicked +kid +kidnapped +kidney +kids +killer +killing +killings +kilometers +kindly +kindness +kinds +kinetic +kingdom +kingdoms +kinship +kiss +kissed +kit +kitchen +knee +knees +knew +knife +knight +knights +knock +knocked +knockout +knowing +knowledge +knows +koala +lab +label +labeling +labels +labor +laboratory +laborers +labs +lacked +lacking +lacks +lacrosse +laden +ladies +lady +lagoon +laid +lake +lakes +lamb +lamps +landed +landing +landlord +landmark +landmarks +landscape +landscapes +language +languages +laps +large +largely +larger +largest +larvae +laser +lasso +lasted +lasting +lately +latent +later +lateral +latest +latitude +latter +lattice +laugh +laughed +laughing +laughter +launch +launched +launching +laurel +lava +law +lawn +laws +lawsuit +lawyer +lawyers +layout +lead +leader +leaders +leadership +leading +leads +leaf +league +leagues +leap +learn +learned +learner +learners +learning +learns +leather +leave +leaves +leaving +lecture +lecturer +lectures +left +leg +legacy +legally +legend +legendary +legends +legion +legitimacy +legitimate +legs +leisure +lemon +lending +lengths +lengthy +lens +lenses +lesbian +lesion +lesions +lesser +lesson +lessons +letter +letters +letting +level +levels +levy +liability +liberal +liberalism +liberals +liberation +liberties +liberty +librarian +libraries +library +license +licensed +licenses +licensing +lie +lifelong +lifestyle +lifetime +lift +lifted +lifting +lighter +lighthouse +lighting +lightning +liked +likelihood +likes +likewise +lily +limbs +lime +limerick +limestone +limit +limitation +limiting +limits +lineage +linear +linebacker +linen +liner +lineup +linguistic +lining +link +linkage +linked +linking +links +lions +lipid +lips +liquid +liquor +listen +listened +listener +listeners +listening +listing +listings +lists +lit +literacy +literal +literally +literary +literature +litigation +little +lived +lively +lives +livestock +living +lizard +loaded +loading +loads +loan +loaned +loans +lobby +local +localities +locality +localized +locally +locals +locate +locations +locomotive +locus +lodge +logging +logic +logical +logically +logistics +logo +logs +loneliness +lonely +longer +longest +longtime +looking +looks +loop +loops +loose +loosely +lords +loses +loss +losses +lost +lottery +lotus +loudly +lounge +love +lovely +lover +lovers +loving +lowered +lowest +lowland +loyal +loyalty +luck +lucky +lumber +lunar +lunch +lung +lungs +luxury +lymph +lyric +lyrical +lyrics +machine +machinery +machines +macro +mad +madame +made +madness +magazine +magazines +magic +magical +magistrate +magnesium +magnetic +magnitude +maid +maiden +mainland +mainly +mainstream +maintain +maintained +maintains +majesty +major +majority +majors +makes +makeup +making +male +males +malignant +mama +mammals +manage +managed +management +manager +managerial +managers +manages +managing +mandate +mandatory +manga +mango +manifest +manifested +manifesto +manipulate +mankind +manner +manners +manning +manor +manpower +mansion +mantle +manual +manuscript +map +maple +mapping +maps +marathon +marble +march +marched +marching +mare +margin +marginal +margins +maria +marijuana +marina +marital +maritime +markedly +marker +markers +market +marketed +marketing +markets +marking +markings +marriage +marriages +married +marrow +marry +mars +marsh +marshal +martial +marvel +mascot +masculine +mask +masks +mason +mass +massacre +masses +massive +master +masters +mastery +mat +matched +matches +matching +material +materials +maternal +math +matrices +matrix +matter +matters +mature +maturity +max +maximal +maximize +maximum +maybe +mayo +mayor +mayoral +mayors +meadows +meal +meals +mean +meaning +meaningful +meanings +means +meant +meantime +meanwhile +measure +measured +measures +measuring +meat +mechanical +mechanics +mechanism +mechanisms +medal +medals +medial +median +mediated +mediation +medical +medication +medicine +medieval +meditation +medium +medley +meet +meeting +meetings +meets +melancholy +melodies +melody +melt +melting +membership +membrane +membranes +memo +memoir +memoirs +memorable +memorandum +memorial +memories +memory +mental +mentally +mention +mentioned +mentions +mentor +menu +merchant +merchants +mercury +mercy +mere +merely +merger +merit +merits +mesh +mess +message +messages +messenger +met +meta +metabolic +metabolism +metal +metallic +metals +metaphor +metaphors +meters +method +methods +metric +metro +mice +microscope +microscopy +microwave +middle +midland +midlands +midnight +midst +midway +might +mighty +mild +militant +military +militia +milk +mill +millennium +miller +million +millions +mills +mineral +minerals +miners +mines +mini +miniature +minimal +minimize +minimum +mining +miniseries +ministers +ministries +ministry +minor +minorities +minority +mint +minute +minutes +miracle +miracles +mirror +mirrors +miserable +misery +misleading +miss +missed +missile +missiles +missing +missionary +mist +mistake +mistaken +mistakes +mistress +mix +mixed +mixing +mixture +mixtures +mob +mobility +mode +model +modeled +modeling +models +modem +moderate +moderately +modernity +modes +modest +modified +modify +modulation +module +modules +moist +moisture +mold +molecular +molecule +molecules +mollusk +mom +moment +moments +momentum +monarch +monarchy +monastery +monetary +money +monitor +monitored +monitoring +monk +monkey +monkeys +monks +monopoly +monster +monsters +month +monthly +months +monument +monumental +monuments +mood +moon +moral +morale +morality +morally +morals +moreover +morning +morocco +mortal +mortality +mortar +mortgage +mosaic +mosque +moss +mostly +moth +mother +mothers +moths +motif +motifs +motivated +motivation +motives +motor +motorcycle +motors +motorway +motto +mound +mountain +mountains +mounting +mourning +mouse +mouth +movement +movements +moves +movie +movies +mud +mug +multi +multimedia +multiple +multiplied +multiply +multitude +municipal +mural +murder +murdered +murders +murmured +muscle +muscles +muscular +museum +museums +music +musical +musician +musicians +mutation +mutations +muttered +mutual +mutually +myself +mysteries +mysterious +mystery +mystical +myth +mythology +myths +naked +name +namely +names +namesake +naming +narrative +narrator +narrow +narrowly +national +nationally +nationals +nations +nationwide +native +natives +natural +naturally +nature +naval +navigation +navy +nearby +nearest +nearly +necessary +necessity +neck +need +needed +needs +negative +negotiate +negotiated +neighbor +neighbors +neon +nephew +nerve +nervous +network +networking +networks +neurons +neutral +never +newer +newly +news +newspaper +newspapers +next +nice +nickname +nicknamed +niece +nightclub +nineteen +nineteenth +ninth +nitrogen +nobility +noble +nobles +nobody +node +nodes +noise +nominal +nominated +nomination +nominee +nominees +none +nonprofit +norm +normally +north +northeast +northern +northwest +nose +notable +notably +notation +noted +nothing +notice +noticed +noting +notion +notorious +noun +novel +novelist +novels +nowadays +nuclear +nucleus +number +numbered +numbering +numbers +numerical +numerous +nurse +nursery +nurses +nursing +nutrition +oak +oaks +oath +obedience +obesity +obey +object +objected +objection +objections +objective +objectives +objects +obligation +obliged +obscure +observe +observed +observer +observers +observes +observing +obsolete +obstacle +obstacles +obtain +obtained +obtaining +obvious +obviously +occasion +occasional +occasions +occupation +occupied +occupies +occupy +occupying +occur +occurred +occurrence +occurring +occurs +ocean +odd +odds +offender +offenders +offense +offensive +offer +offered +offering +offerings +offers +office +officer +officers +offices +officially +officials +offset +offshore +offspring +often +okay +oldest +olive +omitted +oneself +ongoing +onion +online +onset +open +opening +openly +openness +opens +opera +operas +operate +operated +operates +operating +operation +operations +operative +operator +operators +opinion +opinions +opponent +opponents +oppose +opposing +opposite +opposition +oppressed +oppression +optic +optical +optimal +optimism +optimistic +optimum +optional +options +oracle +orange +orbit +orbital +orchestra +orchestral +orchid +ordained +ordering +orderly +ordinance +ordinarily +ordinary +organ +organic +organism +organisms +organize +organized +organizing +organs +oriental +oriented +origin +originally +originated +originates +origins +orthodox +otherwise +ottoman +ottomans +ourselves +outbreak +outcome +outcomes +outdoor +outer +outfit +outlet +outlets +outline +outlined +outlines +outlook +output +outputs +outreach +outright +outset +outside +outsiders +outskirts +outward +oval +overall +overcome +overhead +overlap +overlooked +overly +overnight +oversaw +overseas +oversight +overt +overtime +overview +owe +owner +owners +ownership +oxford +oxidation +oxide +oxygen +ozone +pacific +pack +package +packages +packaging +packed +packers +packet +packets +packing +pad +pagan +page +pageant +pages +paid +pain +painful +pains +paint +painted +painter +painters +painting +paintings +palace +pale +palm +palms +pandemic +panel +panels +panic +panthers +pants +papa +papal +par +parachute +parade +paradigm +paradise +paradox +paragraph +paragraphs +parallel +parallels +parameter +parameters +paramount +pardon +parental +parenting +parents +parish +parishes +parking +parks +parkway +parliament +parody +parsons +partial +partially +particle +particles +particular +parties +partisan +partition +partly +partner +partnered +partners +parts +party +passage +passages +passed +passenger +passengers +passes +passing +passionate +passions +passive +passport +password +past +paste +pastor +pastoral +pat +patch +patches +patent +patents +paternal +path +pathology +paths +pathway +pathways +patience +patient +patients +patriarch +patriotic +patriots +patrol +patrols +patron +patronage +patrons +pattern +patterns +pause +paused +paved +pavilion +pay +payable +paying +payment +payments +pays +peace +peaceful +peaked +pearl +peasant +peasants +peculiar +pedestrian +pediatric +peer +peers +pelvic +penalties +penalty +pencil +penetrate +penguin +peninsula +penny +people +peoples +pepper +perceive +perceived +percent +percentage +perception +perceptual +percussion +perennial +perfection +perfectly +perform +performed +performer +performers +performing +performs +perhaps +period +periodic +periods +peripheral +periphery +permanent +permission +permit +permits +permitted +permitting +perpetual +persist +persisted +persistent +person +personal +personally +personnel +persons +persuade +persuaded +persuasion +persuasive +pertaining +pertinent +pervasive +petroleum +petty +phantom +pharmacy +phase +phases +phenomena +phenomenon +philosophy +phoenix +phone +phones +phosphate +phosphorus +photo +photograph +photon +photos +phrase +phrases +physical +physically +physician +physicians +physicist +physics +physiology +pianist +piano +pick +picked +picking +picks +picture +pictures +pie +piece +pieces +pier +pierce +pig +pigs +pile +pilgrimage +pillars +pillow +pilot +pilots +pink +pioneer +pioneered +pioneering +pioneers +pipe +pipeline +pipes +pirate +pirates +pistol +pit +pitch +pitched +pitcher +pitching +pits +pituitary +pity +placement +places +plague +plainly +plaintiff +plaintiffs +plan +planes +planet +planets +planned +planners +planning +plans +plant +plantation +planted +planting +plants +plaque +plasma +plastic +plateau +plates +platform +platforms +platinum +platoon +plausible +played +player +players +playing +playoff +playoffs +plays +playwright +plaza +plea +pleaded +pleased +pleasure +pleasures +pledged +plenty +plot +plots +plotted +plug +plural +plus +pocket +pockets +podcast +podium +poem +poems +poet +poetic +poetry +poets +pointer +pointing +points +poison +poisoning +poker +polar +pole +poles +police +policies +policy +polish +polished +polite +political +politician +politics +poll +pollen +polling +polls +pollution +polo +polymer +polymers +pond +ponds +pool +pools +poor +poorer +poorly +pop +pope +popular +popularity +popularly +populated +population +porch +pork +portable +portal +portfolio +portions +portrait +portraits +portray +portrayal +portrayed +portraying +positioned +positions +positive +positively +possess +possessed +possesses +possessing +possession +possibly +post +postal +posted +poster +posterior +posters +posting +postmodern +postponed +posts +posture +postwar +potassium +potato +potatoes +potent +potential +potentials +potter +pottery +pour +poured +poverty +powder +powered +powerful +powers +practical +practice +practiced +practices +practicing +pragmatic +prairie +praise +praised +praising +prayed +prayer +prayers +praying +preached +preacher +preaching +preceded +precedent +preceding +precious +precise +precisely +precision +precursor +predators +predicate +predict +predicted +predicting +prediction +preface +prefecture +prefer +preferable +preference +preferred +pregnancy +pregnant +prejudice +premiere +premiered +premise +premises +premium +prepare +prepared +preparing +prescribed +presence +presented +presenter +presenting +presently +preserve +preserved +preserving +presided +presidency +president +presidents +pressure +pressures +prestige +presumably +presumed +pretend +pretty +prevail +prevailed +prevailing +prevalence +prevalent +prevent +prevented +preventing +prevention +preventive +prevents +previous +previously +prey +price +prices +pricing +pride +priest +priests +primarily +primary +prime +primitive +prince +princes +princess +principal +principle +principles +printer +printers +printing +prints +prior +priorities +priority +priory +prison +prisoner +prisoners +prisons +privacy +private +privately +privilege +privileged +privileges +privy +prize +prizes +pro +probable +probably +probe +problem +problems +procedural +procedure +procedures +proceed +proceeded +proceeding +proceeds +process +processed +processes +processing +procession +processor +processors +proclaimed +producer +producers +produces +producing +product +production +productive +products +profession +professor +professors +profile +profiles +profitable +profits +profound +profoundly +prognosis +program +programs +progress +progressed +prohibited +project +projected +projection +projects +prolific +prolonged +prominence +prominent +promised +promises +promising +promote +promoted +promoter +promotes +promoting +promotion +promotions +prompt +prompted +prompting +promptly +prone +pronounced +proof +propaganda +properly +properties +property +prophecy +prophet +prophetic +prophets +proportion +proposal +proposals +propose +proposed +proposes +propulsion +prose +prosecutor +prospect +prospects +prosperity +prosperous +protect +protected +protecting +protection +protective +protein +proteins +protest +protestant +protested +protesters +protests +protocol +protocols +proton +prototype +proud +proven +provide +provided +providence +provider +providers +provides +providing +province +provinces +provincial +provision +provisions +provoked +proximity +proxy +psalm +pseudo +pseudonym +psychiatry +psychic +psychology +pub +publicity +publicly +publish +published +publisher +publishers +publishes +publishing +pull +pulled +pulling +pulmonary +pulp +pump +pumps +punch +punish +punished +punishment +punk +punt +pupil +pupils +puppet +purchase +purchased +purchaser +purchases +purchasing +pure +purely +purified +purity +purple +purpose +purposes +purse +pursuant +pursue +pursued +pursuing +pursuit +push +pushed +pushing +putting +puzzle +puzzled +pyramid +qualified +qualifier +qualifiers +qualify +qualifying +qualities +quantities +quantity +quantum +quarry +quarter +quarterly +quarters +quartet +quartz +quasi +queen +queens +queries +query +question +questioned +questions +queue +quick +quickly +quiet +quietly +quit +quite +quotation +quotations +quote +quoted +quotes +rabbit +racism +radar +radial +radiation +radical +radically +radicals +radio +radius +raiders +raids +railroad +railroads +railway +railways +rainbow +rainfall +raises +ramp +rams +ran +random +randomly +rang +ranges +ranging +ranked +ranking +rankings +ranks +rapid +rapidly +rapids +rapper +rare +rarely +rat +rather +ratings +ratio +rationale +ratios +rats +rays +reaches +react +reaction +reactions +reactive +reactor +reader +readers +readily +readiness +reading +readings +real +realism +realistic +realities +reality +realize +realized +realizes +realizing +realm +rear +reasonable +reasonably +reasoning +reasons +rebel +rebellion +rebels +rebounds +rebuild +rebuilding +rebuilt +recall +recalled +recalls +receipt +receipts +receive +received +receiver +receives +receiving +recent +recently +reception +receptions +receptor +receptors +recession +recipe +recipient +recipients +reciprocal +recognize +recognized +recognizes +recommend +record +recorded +recording +recordings +records +recover +recovered +recovering +recovery +recreation +recruit +recruited +recruiting +recruits +rector +recurrence +recurrent +recurring +redemption +reds +reduce +reduced +reduces +reducing +reduction +reductions +reef +reelection +referee +referenced +references +referendum +referral +referring +refers +refined +reflect +reflected +reflecting +reflection +reflective +reflects +reflex +reform +reformed +reformers +reforms +refrain +refuge +refugee +refugees +refusal +refuse +refused +refuses +refusing +regain +regained +regard +regarded +regarding +regardless +regards +regency +regent +regime +regiment +regiments +regimes +region +regional +regions +register +registered +registers +registry +regression +regret +regularly +regulate +regulated +regulating +regulation +regulatory +reign +reigning +reinforce +reinforced +reissued +reject +rejected +rejecting +rejection +rejoined +relate +relates +relating +relation +relational +relations +relative +relatively +relatives +relax +relaxation +relaxed +relay +release +releases +releasing +relegated +relegation +relevance +reliable +reliance +relic +relied +relief +relies +relieve +relieved +religion +religions +religious +relocated +relocation +reluctance +reluctant +relying +remain +remainder +remained +remaining +remains +remake +remark +remarkable +remarkably +remarked +remarks +rematch +remedies +remedy +remember +remembered +remembers +remind +reminded +reminder +reminds +remnants +remote +removal +remove +removed +removing +renal +renamed +render +rendered +rendering +renewable +renewal +renewed +renovated +renovation +renowned +rented +reopened +rep +repair +repaired +repairs +repeat +repeated +repeatedly +repeating +repertoire +repetition +replace +replaced +replacing +replay +replica +replied +reply +report +reported +reportedly +reporter +reporters +reporting +reports +represent +represents +repression +reprint +reprinted +reproduce +reproduced +republic +republican +reputation +request +requested +requests +require +required +requires +requiring +rescue +rescued +research +researcher +resemble +resembles +resentment +reserves +reservoir +reside +residence +residences +resides +residing +residual +residue +residues +resign +resigned +resin +resist +resistance +resistant +resisted +resolution +resolve +resolved +resolving +resonance +resort +resource +resources +respect +respected +respective +respects +respond +responded +respondent +responding +responds +response +responses +responsive +restaurant +resting +restless +restore +restored +restoring +restraint +restrict +restricted +result +resultant +resulted +resulting +results +resume +retail +retain +retained +retaining +retains +retention +retire +retired +retirement +retiring +retreat +retreated +retrieval +retrieve +retrieved +return +returned +returning +returns +reunion +reunited +reveal +revealed +revealing +reveals +revelation +revenge +revenue +revenues +reverend +reversal +reverse +reversed +reverted +review +reviewed +reviewer +reviewers +reviewing +reviews +revised +revision +revival +revived +revolt +revolution +reward +rewarded +rewards +rhetoric +rhetorical +rhythm +rhythmic +ribbon +ribs +rich +rider +riders +rides +ridiculous +riding +rifle +rifles +righteous +rightly +rights +rigid +rigorous +riot +risen +risk +risks +risky +ritual +rituals +rivalry +rivals +riverside +rob +robbery +robin +robot +robust +rock +rocket +rockets +rocks +rocky +rod +role +roles +roll +roller +rolling +rolls +romance +romantic +rookie +root +rooted +roots +rope +roses +roster +rotating +rotation +rotten +rouge +rough +roughly +route +routes +routine +routinely +routines +routing +rovers +royal +royals +rubbed +rubber +ruby +rugby +ruin +ruined +ruins +rule +ruled +ruler +rulers +rules +ruling +rumors +run +runner +runners +running +runs +runway +rupture +rural +rushing +sacked +sacks +sacred +sacrifice +sacrifices +sad +saddle +sadly +sadness +safe +safely +safer +safety +saga +sail +sailed +sailing +sailor +sailors +saint +saints +salad +salaries +salary +sales +salmon +salon +salt +salts +salvation +sample +samples +sampling +sanction +sanctioned +sanctions +sanctuary +sand +sanders +sands +sandstone +sandy +sang +sank +sat +satellite +satellites +satisfied +satisfy +satisfying +saturated +saturation +sauce +savage +savannah +save +saved +saves +saving +savings +saying +scale +scales +scaling +scan +scandal +scanning +scarce +scarcely +scared +scary +scattered +scattering +scenario +scenarios +scene +scenes +scenic +schedule +scheduled +schedules +scheduling +schema +schematic +scheme +schemes +scholar +scholarly +scholars +school +schooling +schools +sciences +scientific +scientist +scientists +scope +score +scored +scorer +scores +scoring +scout +scouting +scouts +scrapped +scream +screamed +screaming +screen +screened +screening +screenplay +screens +screw +script +scripts +scripture +scriptures +scrutiny +sculptor +sculpture +sculptures +sea +seal +sealed +seals +searched +searches +searching +season +seasonal +seasons +seat +seated +seating +seats +second +secondary +secondly +seconds +secret +secretary +secretion +secretly +secrets +sectional +sections +sector +sectors +secular +secure +secured +securing +securities +security +sediment +sediments +seed +seeded +seeds +seeing +seek +seeking +seeks +seem +seemed +seemingly +seems +seen +sees +segment +segments +seize +seized +seizure +seizures +seldom +select +selected +selecting +selection +selective +selfish +sell +seller +sellers +selling +sells +semantic +semantics +semi +semifinal +semifinals +seminar +seminary +senate +senator +senators +send +sending +sends +senior +sensation +sensations +sense +sensed +senses +sensible +sensing +sensitive +sensor +sensors +sensory +sentence +sentenced +sentences +sentiment +sentiments +separate +separated +separately +separating +separation +sequel +sequence +sequences +sequential +sergeant +serial +serious +seriously +sermon +serum +servant +servants +service +services +session +sessions +setting +settings +settle +settled +settlement +settlers +settling +setup +seven +sevens +seventeen +seventh +seventy +several +severe +severely +severity +sex +sexual +sexuality +shack +shade +shades +shadow +shadows +shaft +shake +shaking +shall +shallow +shame +shanghai +shape +shaped +shapes +shaping +share +shared +shares +sharing +shark +sharks +sharp +sharply +shattered +shear +sheep +sheets +shelf +shell +shells +shelter +shepherd +sheriff +shield +shields +shift +shifted +shifting +shifts +shining +shipped +shipping +shipyard +shire +shirt +shirts +shock +shocked +shoe +shoes +shook +shoot +shooter +shooting +shoots +shopping +shores +short +shortage +shortened +shorter +shortly +shorts +shot +shots +shoulder +shoulders +shout +shouted +shouting +show +showcase +showed +shower +showing +shown +shows +shrine +shrub +shrug +shrugged +shut +shuttle +shy +siblings +sick +sickness +siege +sierra +sigh +sighed +sigma +signal +signaling +signals +signature +signatures +silence +silent +silently +silicon +silk +silly +silver +similar +similarity +similarly +simple +simpler +simplest +simplicity +simplified +simply +simulated +simulation +since +sincere +singer +singers +singing +single +singles +singular +sink +sinking +sins +sinus +sir +sister +sisters +sitcom +sits +sitting +situated +situation +situations +six +sixteen +sixteenth +sixth +sixties +sixty +size +sized +sizes +skating +skeletal +skeleton +sketch +sketches +ski +skiing +skill +skilled +skills +skin +skirt +skull +sky +slam +slavery +slaves +sled +sleeping +slender +slept +slice +slices +slid +slide +slides +sliding +slight +slightest +slightly +slip +slipped +slogan +slope +slot +slow +slowed +slower +slowly +small +smaller +smallest +smart +smell +smile +smiled +smiles +smiling +smith +smoke +smoking +smooth +smoothly +snail +snails +snake +snap +snapped +snow +soap +soccer +social +socialism +socialist +socially +societal +societies +society +sociology +sodium +soft +softball +softly +software +soil +soils +solar +sold +soldier +soldiers +solely +solemn +solid +solidarity +solids +solitary +solo +soluble +solutions +solvent +somebody +somehow +someone +something +sometime +sometimes +somewhat +somewhere +song +songs +songwriter +sonic +soon +sooner +sophomore +soprano +sore +sorrow +sorry +sorting +sorts +sought +soul +souls +sound +sounded +sounding +sounds +soundtrack +soup +south +southeast +southern +southwest +sovereign +soviet +soviets +spa +space +spacecraft +spaces +spacing +spanning +spans +spare +spark +sparked +spatial +speak +speaker +speakers +speaking +speaks +special +specialist +specialty +species +specific +specified +specifies +specify +specifying +specimen +specimens +spectacle +spectator +spectators +spectra +spectral +spectrum +speculated +speech +speeches +speed +speeds +speedway +spell +spelled +spelling +spells +spend +spending +spent +sphere +spheres +spherical +spider +spiders +spike +spill +spin +spinal +spine +spinning +spiral +spirit +spirits +spiritual +splendid +split +splitting +spoke +spoken +spokesman +sponsor +sponsored +sponsors +sporting +sports +spot +spots +spotted +spouse +sprang +spray +spreading +springs +sprint +spur +spy +squad +squadron +squadrons +squads +square +squares +stability +stack +stadium +staff +stage +staged +stages +staging +stain +stained +staircase +stamp +stamps +standard +standards +standing +standings +standpoint +stands +star +stare +stared +staring +stark +starred +starring +stars +start +started +starter +starting +startled +starts +stash +stat +stated +statement +statements +statewide +static +stating +station +stationary +stationed +stations +statistics +statue +statues +status +stay +stayed +staying +stays +steadily +steady +steal +stealing +steals +steam +steel +steep +steering +stein +step +stepped +stepping +steps +sterile +sterling +stick +sticks +stiff +still +stimulate +stimulated +stimuli +stimulus +stint +stir +stirred +stirring +stocks +stoke +stolen +stomach +stones +stop +stopped +stopping +stops +storage +stores +stories +storm +storms +story +stove +straight +strain +strains +strait +strand +strands +strange +strangely +stranger +strangers +strata +strategic +strategies +strategy +straw +stray +streak +streaming +streams +street +streets +strength +strengthen +strengths +stressed +stresses +stretch +stretched +stretches +stretching +strictly +strike +strikeouts +striker +strikes +striking +string +strings +strip +stripes +stripped +strips +strive +stroke +strong +stronger +strongest +strongly +struck +structural +structure +structured +structures +struggle +struggled +struggles +struggling +stuck +stud +student +students +studied +studies +studio +studios +study +studying +stuff +stuffed +stupid +styles +sub +subdivided +subject +subjected +subjective +subjects +submarine +submarines +submerged +submission +submit +submitted +subsection +subsequent +subset +subsidiary +subsidies +subsidy +substance +substances +substitute +substrate +subtle +suburb +suburban +suburbs +subway +succeed +succeeded +succeeding +success +successes +successful +succession +successive +successor +sudden +suddenly +suffer +suffered +suffering +suffers +suffice +sufficient +suffix +suffrage +sugar +suggest +suggested +suggesting +suggestion +suggests +suicide +suitable +suite +suited +suits +sulfur +sultan +sum +summarize +summarized +summary +summer +summers +summit +summoned +sums +sun +sung +sunk +sunlight +sunset +sunshine +super +superior +superman +supervised +supervisor +supper +supplement +supplied +supplier +suppliers +supplies +supply +supplying +support +supported +supporter +supporters +supporting +supportive +supports +suppose +supposed +supposedly +suppress +suppressed +supreme +surely +surface +surfaces +surgeon +surgery +surgical +surname +surpassed +surplus +surprise +surprised +surprising +surrender +surrey +surrounded +survey +surveyed +surveys +survival +survive +survived +survives +surviving +survivor +survivors +suspect +suspected +suspects +suspended +suspension +suspicion +suspicious +sustain +sustained +sustaining +swallow +swallowed +swamp +swan +swear +sweat +sweep +sweeping +sweet +swelling +swept +swift +swim +swimmer +swimming +swing +switch +switched +switches +switching +sword +sworn +swung +symbol +symbolic +symbolism +symbols +symmetry +sympathy +symphony +symposium +symptom +symptoms +synagogue +syndicated +syndrome +synopsis +syntactic +syntax +synthesis +synthetic +system +systematic +systemic +systems +tab +tables +tackle +tackles +tactical +tactics +tag +takeover +taking +tale +talent +talented +talents +tales +talk +talked +talking +talks +tallest +tangible +tank +tanks +tap +tape +tapes +target +targeted +targeting +targets +tariff +tariffs +task +tasked +tasks +taste +tastes +taught +tavern +tax +taxable +taxation +taxes +taxi +taxonomy +taxpayer +tea +teach +teacher +teachers +teaches +teaching +teachings +teamed +teammate +teammates +teams +tear +tears +teaspoon +technical +technique +techniques +technology +teenage +teenager +teenagers +teeth +telegraph +telephone +telescope +televised +television +tell +telling +tells +temper +temperate +template +temple +temples +temporal +temporary +temptation +tenant +tenants +tendencies +tendency +tender +tenderness +tennis +tenor +tentative +tenth +tenure +term +termed +terminal +terminals +terminate +terminated +terminus +terms +terrace +terrain +terrible +terribly +territory +terror +terrorism +terry +tertiary +testament +testified +testify +testimony +testing +textbook +textbooks +textile +textiles +textual +texture +thanks +theater +theaters +theatrical +theft +theme +themes +theology +theorem +theories +theorists +theory +therapist +therapists +therapy +therein +thermal +thesis +thick +thickness +thin +things +think +thinkers +thinking +thinks +third +thirds +thirteen +thirteenth +thirty +thorough +thoroughly +thought +thoughtful +thoughts +thousand +thousands +thread +threads +threat +threaten +threatened +threats +three +threshold +threw +thriller +throat +throne +throughout +throw +throwing +throws +thrust +thumb +thunder +thyroid +ticket +tickets +tidal +tide +tie +tied +tier +tiger +tigers +tight +tightly +tiles +timber +timeline +timely +timing +tin +tip +tips +tissue +tissues +titans +title +titles +titular +tobacco +today +toe +toes +toilet +token +told +tolerance +tolerate +toll +tomato +tomatoes +tomb +tombs +tomorrow +tongue +tonight +tool +tools +tooth +topic +topics +torn +tornado +torpedo +torture +tossed +total +totally +touch +touchdown +touchdowns +touched +touches +touching +tough +toured +touring +tourism +tourist +tourists +tournament +tours +toward +towards +tower +towers +towns +township +townships +toxic +toxicity +toy +toys +trace +traced +traces +tracing +tracking +tracks +trade +traded +trademark +traders +trades +trading +tradition +traditions +traffic +tragedy +tragic +trail +trailer +trails +trained +trainer +training +tram +transfer +transfers +transform +transient +transit +transition +translate +translated +translates +translator +transmit +transport +transverse +trap +trapped +trauma +traumatic +travel +traveling +travels +treason +treasure +treasurer +treasury +treaties +treating +treatise +treatment +treatments +treats +treaty +tree +trees +trek +trembling +tremendous +trench +trend +trends +trial +trials +triangle +triangular +tribal +tribe +tribes +tribunal +tribune +tributary +trick +tricks +tried +trigger +triggered +trilogy +trim +trinity +trio +triple +triumph +trivial +troop +troops +trophy +tropical +trouble +troubled +troubles +troupe +trout +trucks +true +truly +trump +trunk +trust +trusted +trustee +trustees +trusts +truth +truths +trying +tube +tubes +tulip +tumor +tumors +tune +tunes +tunnel +tunnels +turbine +turbulent +turf +turkey +turner +turnout +turnover +turtle +tutor +twelfth +twelve +twentieth +twenty +twice +twin +twins +twist +twisted +twitter +type +types +typhoon +typical +typically +typing +ugly +ultimate +ultimately +ultrasound +umbrella +unable +unanimous +unaware +uncertain +unchanged +uncle +unclear +uncommon +uncovered +undefeated +undergo +undergoing +underlying +undermine +underneath +understand +understood +undertake +undertaken +undertook +underwater +underwent +uneasy +unemployed +unequal +unexpected +unfair +unfamiliar +unhappy +unified +uniform +uniformly +uniforms +unilateral +unions +unique +unit +unite +units +unity +universal +universe +university +unjust +unknown +unless +unlike +unlikely +unlimited +unnamed +unofficial +unopposed +unpleasant +unrelated +unreleased +unrest +unstable +unusual +unusually +unveiled +unwilling +upcoming +update +updated +updates +upgrade +upgraded +upheld +upon +upright +uprising +upset +upstairs +upstream +uptake +upward +uranium +urge +urged +urgency +urgent +urging +urine +usage +useful +usefulness +useless +user +users +using +utilities +utility +utilize +utilized +utilizing +utmost +utterance +utterly +vacancy +vacant +vacated +vacation +vaccine +vacuum +vague +vain +validation +validity +valley +valleys +valuable +value +valued +values +valve +valves +vampire +van +vanished +vapor +variable +variables +variance +variant +variants +variation +variations +varied +varies +varieties +variety +various +varsity +vary +varying +vascular +vast +vault +vector +vectors +vegetable +vegetables +vegetation +vehicle +vehicles +veil +vein +veins +velocity +vendor +vendors +venous +verb +verbal +verbs +verdict +verified +verify +verses +versions +versus +vertical +vessel +vessels +veteran +veterans +veterinary +via +viable +vibration +vicar +vicinity +vicious +victim +victims +victor +victories +victorious +victory +video +videos +viewpoint +vigorous +vigorously +villa +village +villagers +villages +villain +vintage +vinyl +violate +violated +violation +violations +violence +violent +violin +viral +virtual +virtually +virtue +virtues +virus +viruses +visa +viscosity +viscount +visibility +visit +visited +visiting +visitor +visitors +visits +vista +visual +vital +vitality +vitamin +vivid +vocabulary +vocal +vocalist +vocals +vocational +voice +voiced +voices +volatile +volcanic +volcano +volleyball +vols +voltage +volume +volumes +voluntary +volunteer +volunteers +vomiting +voter +voters +votes +voting +vowel +vowels +voyage +vulnerable +wade +wage +wager +wages +wagon +wagons +waist +wait +waited +waiting +waking +walk +walked +walker +walking +walks +wall +walls +wanderers +wandering +wanted +wanting +wants +warehouse +warfare +warm +warming +warmth +warn +warned +warning +warnings +warrant +warren +warrior +warriors +wars +warships +wartime +wash +washed +washing +waste +wasted +wastes +watch +watched +watching +waters +watershed +watts +wave +waved +wavelength +waves +wax +weak +weakened +weaker +weakness +weaknesses +wealth +wealthy +weapon +weapons +wearing +wears +weary +weather +weaver +web +website +websites +wedding +weed +week +weekend +weekends +weekly +weeks +weigh +weighed +weight +weighted +weights +welcome +welcomed +welfare +wells +welsh +western +westward +wet +wetlands +whale +whatever +whatsoever +wheat +wheel +wheelchair +wheeler +wheels +whenever +wherein +wherever +whilst +whisper +whispered +white +whole +wholesale +wicked +wickets +widely +wider +widespread +widow +wife +wild +wildcats +wilderness +wildlife +willow +wills +wind +winding +window +windows +winds +wine +wines +winger +wings +wingspan +winner +winners +winning +winter +winters +wiped +wire +wireless +wires +wisdom +wish +wished +wishes +wishing +wit +withdraw +withdrawal +withdrawn +withdrew +witness +witnessed +witnesses +wives +wizard +woke +wolf +wolves +woman +women +won +wonder +wondered +wonderful +wondering +wonders +wood +wooden +woodland +woods +wool +words +wore +worked +worker +workers +workforce +workplace +worksheet +workshop +workshops +world +worldly +worlds +worldwide +worried +worry +worse +worship +worst +worth +worthwhile +worthy +wound +wounded +wounds +woven +wrap +wrapped +wrath +wreck +wrestler +wrestlers +wrestling +wrist +write +writers +writes +writing +writings +written +wrong +wrote +yacht +yards +year +yearly +years +yeast +yelled +yellow +yesterday +yet +yield +yielded +yielding +yields +yoga +young +younger +youngest +youth +youths +zero +zinc +zones +zoo |