sophuwu.site > seks   
              113
            
             package main

import (
	"fmt"
	"os"
	"sophuwu.site/seks"
	"strings"
)

// Private Protected Some Encryption Key Stuff

func hmenu(s *string) {
	u := []string{
		`\|`, `\0|\1`,
		`\1`, "\033[1;38;5;9m",
		`\2`, "\033[1;38;5;10m",
		`{{ argv }}`, fmt.Sprintf(`\3%s\0`, os.Args[0]),
		`\3`, "\033[38;5;11m",
		`\$`, `\4$`,
		`\4`, "\033[38;2;200;30;200m",
		`\0`, "\033[0m",
	}
	for i := 0; i < len(u); i += 2 {
		*s = strings.ReplaceAll(*s, u[i], u[i+1])
	}
	fmt.Print(*s)
	os.Exit(0)
}

var helpLong = `Usage: {{ argv }} \1h\|e\|d\|i\|k\|s\|l\0 <\2option\0> [\1-i\|-o\0 \2file\0]

\1h\0elp	  		   - get help with SEKS, h will show short usage information

protected private secret encryption key string


\1e\0ncrypt	  \2name\0 - encrypt with public key \2name\0 and sign using default key
\1d\0ecrypt	  \2name\0 - verify using public key \2name\0 and decrypt using default key


\1i\0mport	  \2name\0 - import an existing key into the \$SEKSZONE\0 as \2name\0
\1s\0etdefs	  \2name\0 - set \2name\0 as the default key for signing and decrypting
\1k\0eygen	  \2name\0 - create a new pair of PPSEKS (protected private secret encryption key string)
						 
						 Use the  to sign and decrypt.
						 with SEKS (U Shared Encryption Key String)

\1l\0ist	  \2term\0 - print public SEKS keys in the \$SEKSZONE\0 matching \2term\0

\1DisplayPP\0 \2name\0 - detailed information for protected private SEKS key \2name\0
\1DumpPPCatalog\0      - dump all protected \1private\0 SEKS keys cataloged from the \$SEKSZONE\0

The first letter of any command can be used as a shortcut. For example, \1e\0 is the same as \1encrypt\0.
Except the DisplayPP DumpPPCatalog, as they output protected private SEKS key information.  

By default {{ argv }} reads from stdin and writes to stdout. Using a pipe is 
recommended for large files. However, \1-i\0 and \1-o\0 can be used to specify input
and output files. This will overwrite the output file without warning.

By default, {{ argv }} will use \4~/.sekszone\0 for configuration and key storage. This
can be changed by setting the environment variable \$SEKSZONE\0 to an empty directory or 
existing SEKS ZONE . The permissions of this directory can be whatever you like,
but it is a good idea to ensure that only your user can access the SEKS ZONE.

\$PPSEKS\0 can be used to specify a protected private secret encryption key string
to use instead of the default PPSEKS.
`
var shortHelp = `{{ argv }} e|d <\2key\0> [\1-i\|-o\0 \2file\0]
\1e\0ncrypt		\1d\0ecrypt		\1-o\0 overwrites without warning
find full help with "{{ argv }} help"

\$PPSEKS\0 can change the default key for signing and decrypting.

Use {{ argv }} help for more usage information.
`

func init() {
	if len(os.Args) == 1 || os.Args[1] == "-h" || os.Args[1] == "h" {
		hmenu(&shortHelp)
	} else if os.Args[1] == "help" || os.Args[1] == "--help" {
		hmenu(&helpLong)
	}
}

func main() {
	if len(os.Args) == 2 && (os.Args[1] == "g" || os.Args[1] == "keygen") {
		pub, priv := seks.KeyGen()
		fmt.Println(pub)
		fmt.Println(priv)
		return
	}
	if len(os.Args) != 5 {
		return
	}
	keys := make(map[byte]string)
	keys[os.Args[2][0]] = os.Args[2]
	keys[os.Args[3][0]] = os.Args[3]
	b, err := os.ReadFile(os.Args[4])
	if err != nil {
		fmt.Println(err)
		return
	}
	if os.Args[1] == "e" {
		b, err = seks.EncryptArmour(b, keys['p'], keys['S'])
	} else if os.Args[1] == "d" {
		b, err = seks.DecryptArmour(b, keys['p'], keys['S'])
	}
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(b))
}