Example #1
0
// NewEntity creates a new entity. It doesn't provide an option for comments.
func NewEntity(name, email, outFile string) (ne *openpgp.Entity, err error) {
	ne, err = openpgp.NewEntity(name, "", email, DefaultConfig)
	if err != nil {
		return
	}

	out, err := os.Create(outFile)
	if err != nil {
		ne = nil
		return
	}

	hdr := map[string]string{
		"Version": fmt.Sprintf("Keybase Go client (OpenPGP version %s)", Version),
	}

	keyOut, err := armor.Encode(out, openpgp.PrivateKeyType, hdr)
	if err != nil {
		ne = nil
		return
	}

	defer func() {
		keyOut.Close()
		out.Close()
	}()

	err = ne.SerializePrivate(keyOut, DefaultConfig)
	if err != nil {
		ne = nil
		return
	}

	return
}
// generate creates a GPG keypair and keyring tarballs
func (k *Key) generate() error {
	ent, err := openpgp.NewEntity(k.name, k.comment, k.email, nil)
	if err != nil {
		return err
	}

	//FIXME: how to not have subkeys otherwise?
	ent.Subkeys = nil

	k.entity = ent

	os.MkdirAll(k.dir, 0700)

	pubring, err := os.Create(filepath.Join(k.dir, "pubring.gpg"))
	if err != nil {
		return err
	}

	secring, err := os.Create(filepath.Join(k.dir, "secring.gpg"))
	if err != nil {
		return err
	}

	if err = ent.SerializePrivate(secring, nil); err != nil {
		return err
	}

	if err = ent.Serialize(pubring); err != nil {
		return err
	}
	k.writeKeyringJSON()
	return nil
}
Example #3
0
func loadThisNotaryInfo() {
	var privKeyArmor, pubKeyArmor string
	keyFile := os.Getenv("HOME") + "/.scramble/notary_privkey"
	keyBytes, err := ioutil.ReadFile(keyFile)
	if err != nil {
		log.Printf("Creating new keyfiles for notary at %s\n", keyFile)
		entity, _ := openpgp.NewEntity(
			"Notary",
			"Notary for "+GetConfig().SMTPMxHost+" Scramble Server",
			"support@"+GetConfig().SMTPMxHost,
			nil)
		privKeyArmor, pubKeyArmor, err = SerializeKeys(entity)
		err = ioutil.WriteFile(keyFile, []byte(privKeyArmor+"\n"+pubKeyArmor), 0600)
		if err != nil {
			panic(err)
		}
		hash := ComputePublicHash(pubKeyArmor)
		notaryInfo = &NotaryInfo{entity, pubKeyArmor, hash}
	} else {
		parts := regexKeyFile.FindStringSubmatch(string(keyBytes))
		if parts == nil {
			log.Panicf("Invalid keyfile %s.", keyFile)
		}
		privKeyArmor = parts[1]
		pubKeyArmor = parts[2]
		entity, err := ReadEntity(privKeyArmor)
		if err != nil {
			panic(err)
		}
		hash := ComputePublicHash(pubKeyArmor)
		notaryInfo = &NotaryInfo{entity, pubKeyArmor, hash}
	}

	log.Printf("Notary for this host loaded: %v@%v", GetNotaryInfo().Hash, GetConfig().SMTPMxHost)
}
Example #4
0
func generateNewKey(name, comment, email string, config *packet.Config) (*openpgp.Entity, error) {
	e, err := openpgp.NewEntity(name, comment, email, config)
	if err != nil {
		return nil, err
	}
	addSecretKey(e)
	return e, nil
}
Example #5
0
File: pgp.go Project: Novemburr/mig
func GenerateKeyPair(name, desc, email string) (pubkey, privkey []byte, fp string, err error) {
	defer func() {
		if e := recover(); e != nil {
			err = fmt.Errorf("GenerateKeyPair() -> %v", e)
		}
	}()
	// generate a private key
	ent, err := openpgp.NewEntity(name, desc, email, nil)
	if err != nil {
		panic(err)
	}
	// serialize the private key
	pkbuf := bytes.NewBuffer(nil)
	err = ent.SerializePrivate(pkbuf, nil)
	if err != nil {
		panic(err)
	}
	buf := bytes.NewBuffer(nil)
	ewrbuf, err := armor.Encode(buf, openpgp.PrivateKeyType, nil)
	if err != nil {
		panic(err)
	}
	_, err = ewrbuf.Write(pkbuf.Bytes())
	if err != nil {
		panic(err)
	}
	ewrbuf.Close()
	privkey = buf.Bytes()
	// serialize the public key
	pkbuf = bytes.NewBuffer(nil)
	err = ent.Serialize(pkbuf)
	if err != nil {
		panic(err)
	}
	buf = bytes.NewBuffer(nil)
	ewrbuf, err = armor.Encode(buf, openpgp.PublicKeyType, nil)
	if err != nil {
		panic(err)
	}
	_, err = ewrbuf.Write(pkbuf.Bytes())
	if err != nil {
		panic(err)
	}
	ewrbuf.Close()
	pubkey = buf.Bytes()
	// validate the public key and obtain a fingerprint from it
	fp, err = LoadArmoredPubKey(pubkey)
	if err != nil {
		panic(err)
	}
	return
}
Example #6
0
func main() {

	//openpgp.NewEntity("bussiere", "test", "*****@*****.**", nil)

	var entity *openpgp.Entity
	entity, err := openpgp.NewEntity("bussiere", "test", "*****@*****.**", nil)
	if err != nil {

	}

	var (
		buffer bytes.Buffer
	)

	entity.SerializePrivate(&buffer, nil)
	data := base64.StdEncoding.EncodeToString([]byte(buffer.String()))

	fmt.Printf("%q\n", data)

	buffer = bytes.Buffer
	entity.Serialize(&buffer)
	data2 := base64.StdEncoding.EncodeToString([]byte(buffer.String()))

	fmt.Printf("%q\n", data2)

	buffer = bytes.Buffer
	entity.PrivateKey.Serialize(&buffer)
	data3 := base64.StdEncoding.EncodeToString([]byte(buffer.String()))

	fmt.Printf("%q\n", data3)

	buffer = bytes.Buffer
	entity.PrimaryKey.Serialize(&buffer)
	data4 := base64.StdEncoding.EncodeToString([]byte(buffer.String()))

	fmt.Printf("%q\n", data4)

	//fmt.Printf(buffer.String())

	// "xcLYBFFBjX0BB/9iTV9vRbVIEr8g5/K1QOtDhwrn6S7DWkJwz5K64trO0LbBWHzAThjCb3yeZPMwl92ZyeQAKT4LW7gjXNc6YJeq

	//"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"
	//"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"
	//"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"
	//"xcLYBFFBjaMBCADg3+lpaFMBJGRwRzqaNcmV+JjcgIX+2ioz33XnLimith7WmvgrVtfwDM0rns+9RwD8+mjHkvpNyNxr3mBCGTCpKOEvX42UCp03IQEnI6d802CqEoHpBFCrXakzr245Df6kbbOaG3+5egXzUdHdHbjST0hrmzP58fAZ86Rp6TlgaDU+NR0ZCW1Vu1VB0CRJceSgtJ79yQ1WpP1qFCR3wyUMVrgmcVBQTIM/j9ET7rFjsJl92UIIMJPVCj9Wmq9j/h6vP5BP+AoanWfcXcCd13MZxl1iPmTUp8g1+R82n40+96kiNtTCrTrDI84s+tI1yrJJyOFgNEBk1RPEYUAF3ttRABEBAAEACACfVYgpK8ZEdOjFtXKMebgQD0kgU+Cdpy9n+dmsqETQCYLoRH27F5mBeVCWq7w+POUyWquLXVUFcGDd/X7u1rJn6ZNE4cuLLcofmb8bYGP4Sj2fw+VQmcIe6gpNmOvceVIIZ8JuWzWw0gkNUtgEeF7QhWSm+h1l6Etb2AqTELGa4GcCAmX0s6sDZ7pkn062pWFq/2+0CBNtlZKgFu+P7EbVTfRZfbNozDXpx51RDQIHig+LDJiUEZvQ7MoCUY+KuOdEa3InkvZTqk+yxpAYVfRxoOhnznhOvlf7WqXCeK7n/LSXFilIIuSVGqN1crMQGJaubNfW+Ral91PsXEivpkPBBADj2v51DnWPnDYfDait5+SSVhIO/cPQTUpL5ThAwj1veUW6pDvcoP3KrOle6x/uMXCA1lroU8IsWLSkos6f7OmtDUo3mUoTl0lx6UBmZUZv6IedqoFkb2jjDyW7tuiVs3cYkvSJmM73HW4V5xXfflIduL5h4illnwpegDN2GijOvQQA/KapkZ6aTowObjaon7IKcX4qXXAnxkzZd+kN0RqFTBHWkNcTOPJp1G94E2vELsMhbV8TEfdpqen5DvyXuJnw/t4ULtIKLF8G7+bGc8j+rAu0lTKjtRqQQF7u5zsCfKsVJZv3u/faiJTYLws5eFXkurjCT09gJGizNmG0hRNBgiUEAMJVPbBtRugKQ9zfyk4pSG1LVfdymt/nRyfDsWuUhnwGp9xmaDWZyZ62ojPF6lWnRIhkqgGlhSdWMlZxF4N4crX11upO3n+nFq0NsjJscUiFPWZrMgK+pvLtf6cC5W7ZyfUu8LiKanTOxktodJEregrP+aJo9lSDudASS0IC/P8xRcnNJGJ1c3NpZXJlICh0ZXN0KSA8YnVzc2llcmVAZ21haWwuY29tPsLAYgQTAQgAFgUCUUGNowkQhdJxoIMyCwgCGwMCGQEAAJTkCACDxT3uDLcoc6DZF8t7jOgUi3qxPAqpy/rhnipLCxRWjk+5/WZlkwi2Z4LtWh4IjqpEsuXj+bclPbZeNChM7y5yiCSnngSZGGQzSg5pS//1PsbeZCDvxOU493XL+4TpAFWPWDZRbZ5sBBrw5ut0OX/SBSwgRfkQxLrMp79PV+GlhyagZMhlWnbnVo+HVCaQs4RYTqgBawVWnHS8CY7ObvRBSlCorLDmCU5Pl0i5jF4YjXLPLtQyho7W0MBdh0DyYlvBeXh6vj1GB0TpAYvm6qLyB820QCVAR39+DgTE8rcKfk41/7I1Ben7iibZ7ujTATUbPaH3uPn8QTzl9HSi8Gbex8LYBFFBjaMBB/9n8lGAoZmpyUlLyowlWgCLt5RV4LAUubkF2s1P022LaTp1aSv/vSzXsGOXH+wClPqyRKVc8B2P4M3M4YN62uKVpzlLYUr7+ny24e4xtxGk+5GsJ+jbEAWm4xOcGn1SFPcjCv2VlKz9MlFkHSTBMaK75c5+jgL3H6iPYNbWpk9bo3ad0uqm/ZXOHfIKIUBrYoc6mLDxRHqqR/LrH6gaxKQVp4AkC/48D99g1Ewu1YRPyNrwo2lHz/Rh8sviyy2SJzxo8LRdiyj4an7Sa8RDifQw9aaH02dui2bpfbOqh7qIRcIur8UbfMdleKifchHlqg/tSRuhnJc3J9vyO8voAD5vABEBAAEAB/9TBX+DNY79xP79wfDdhF0bOq0HSkZYx124B2Ikd8Hur0U5sZ6qy/Wc8A0bDyv5g/QXnixVZpK1799v3E6fOWPwE3f3dOXnC9HAYANXQdid5TAcSGP7U3iwKn3nGGEvxf79xjFz3yOrtxy60WwhwfswCAQ9oD9OEcMXgUkWeA66KXeKq8xzX3utxJo/2dDEfrb3hvW2LfvHkuLwkrvvDXOI4z65GnDQKmRwXrJ6/WNI3vh/+JVbdY5Q1PsSEpdtuJEt40OfDPlJDwW31wuNBK5Yg6f7p62OS67ZqbAXTd+G/yegI2KINN+vCgnllPE4aM/pdg12tZ6XCo6mn9B3lAtBBACw8ZV/rqVDiUGpbqwrdUecGHEJ9jEe0LgaXgxDqohqbI7EhLdQQWlQWqyJ4M9k/GOA/JVvLLWDZKpCv2DHlnzUPahWmdhDBjAFaAOoc60TWdOGpxHV60Twm5dmU8i3KKrzc/AOtBqSwnMg0Ghv5MUujeRQ8z7VAElyapl3WEh9PQQAlmN9HnGxpnEmRTh9BXnOGP9X1GFzIQ5FVo7tEO9tKLAlLULy+SCCOjmXItvlB8fSvYicIk6yKZe8XjjUL+jiotOAdxtMbRil/3dVgd8K364op/X2xgeNr1zX0SYVaJtvOmg3xses0asmvmQcz3EExCx2P0CufQRkE8KkrqvJvRsD+wbdu25zcOqWYtl0EURx0I+pKGGIWyYoIxGYu5+UKyS/XYyNXpU5Z/pa2Y1J05LBfJURjyK2lQSKA0YDUtIeQ/xfGtYU1SKVArL1YE80MT7bVHDF2gPIE308cosiUWEy684wfPM8xSmRq4OL6XC5Xs3r35gxvkeBHhP41PYX8JpKQJvCwF8EGAEIABMFAlFBjaMJEIXScaCDMgsIAhsMAAAD+wgAKscCd7akG8+odI+c3FLHI5pmbIgdxL7WezoxoKuWytTuysGfRRJljHBf2tKUu+AppyzZ86guAByD/8qdt7SuXyEBug8gh31cftkSUTiutKGW3l+PxgjIva80gi0U9VamLKtW5sBZBimLRMr75N8jXlr+K6MEpp8fECDyVvHtCKwzEkbBaqB0qQ0A6ITbaj0yZIaHx7UETMsqrY+k80N7ijZbQg42X6BitF0lIsYi2c+Osfu5Dc9WqSQ8XVw9cy24jjiCgifh4GkHBgW/DFIjum4oxKQRRZdqz/HPqbNP562mAZ819qo9yhlqaTYrGMBk1DdFAKPDOKKaRibrIP+sqsbATQRRQY2jAQgA4N/paWhTASRkcEc6mjXJlfiY3ICF/toqM9915y4porYe1pr4K1bX8AzNK57PvUcA/Ppox5L6Tcjca95gQhkwqSjhL1+NlAqdNyEBJyOnfNNgqhKB6QRQq12pM69uOQ3+pG2zmht/uXoF81HR3R240k9Ia5sz+fHwGfOkaek5YGg1PjUdGQltVbtVQdAkSXHkoLSe/ckNVqT9ahQkd8MlDFa4JnFQUEyDP4/RE+6xY7CZfdlCCDCT1Qo/VpqvY/4erz+QT/gKGp1n3F3AnddzGcZdYj5k1KfINfkfNp+NPvepIjbUwq06wyPOLPrSNcqyScjhYDRAZNUTxGFABd7bUQARAQABzSRidXNzaWVyZSAodGVzdCkgPGJ1c3NpZXJlQGdtYWlsLmNvbT7CwGIEEwEIABYFAlFBjaMJEIXScaCDMgsIAhsDAhkBAACU5AgAg8U97gy3KHOg2RfLe4zoFIt6sTwKqcv64Z4qSwsUVo5Puf1mZZMItmeC7VoeCI6qRLLl4/m3JT22XjQoTO8ucogkp54EmRhkM0oOaUv/9T7G3mQg78TlOPd1y/uE6QBVj1g2UW2ebAQa8ObrdDl/0gUsIEX5EMS6zKe/T1fhpYcmoGTIZVp251aPh1QmkLOEWE6oAWsFVpx0vAmOzm70QUpQqKyw5glOT5dIuYxeGI1yzy7UMoaO1tDAXYdA8mJbwXl4er49RgdE6QGL5uqi8gfNtEAlQEd/fg4ExPK3Cn5ONf+yNQXp+4om2e7o0wE1Gz2h97j5/EE85fR0ovBm3s7ATQRRQY2jAQf/Z/JRgKGZqclJS8qMJVoAi7eUVeCwFLm5BdrNT9Nti2k6dWkr/70s17Bjlx/sApT6skSlXPAdj+DNzOGDetrilac5S2FK+/p8tuHuMbcRpPuRrCfo2xAFpuMTnBp9UhT3Iwr9lZSs/TJRZB0kwTGiu+XOfo4C9x+oj2DW1qZPW6N2ndLqpv2Vzh3yCiFAa2KHOpiw8UR6qkfy6x+oGsSkFaeAJAv+PA/fYNRMLtWET8ja8KNpR8/0YfLL4sstkic8aPC0XYso+Gp+0mvEQ4n0MPWmh9Nnbotm6X2zqoe6iEXCLq/FG3zHZXion3IR5aoP7UkboZyXNyfb8jvL6AA+bwARAQABwsBfBBgBCAATBQJRQY2jCRCF0nGggzILCAIbDAAAA/sIACrHAne2pBvPqHSPnNxSxyOaZmyIHcS+1ns6MaCrlsrU7srBn0USZYxwX9rSlLvgKacs2fOoLgAcg//Knbe0rl8hAboPIId9XH7ZElE4rrShlt5fj8YIyL2vNIItFPVWpiyrVubAWQYpi0TK++TfI15a/iujBKafHxAg8lbx7QisMxJGwWqgdKkNAOiE22o9MmSGh8e1BEzLKq2PpPNDe4o2W0IONl+gYrRdJSLGItnPjrH7uQ3PVqkkPF1cPXMtuI44goIn4eBpBwYFvwxSI7puKMSkEUWXas/xz6mzT+etpgGfNfaqPcoZamk2KxjAZNQ3RQCjwziimkYm6yD/rKrFwtgEUUGNowEIAODf6WloUwEkZHBHOpo1yZX4mNyAhf7aKjPfdecuKaK2Htaa+CtW1/AMzSuez71HAPz6aMeS+k3I3GveYEIZMKko4S9fjZQKnTchAScjp3zTYKoSgekEUKtdqTOvbjkN/qRts5obf7l6BfNR0d0duNJPSGubM/nx8BnzpGnpOWBoNT41HRkJbVW7VUHQJElx5KC0nv3JDVak/WoUJHfDJQxWuCZxUFBMgz+P0RPusWOwmX3ZQggwk9UKP1aar2P+Hq8/kE/4ChqdZ9xdwJ3XcxnGXWI+ZNSnyDX5HzafjT73qSI21MKtOsMjziz60jXKsknI4WA0QGTVE8RhQAXe21EAEQEAAQAIAJ9ViCkrxkR06MW1cox5uBAPSSBT4J2nL2f52ayoRNAJguhEfbsXmYF5UJarvD485TJaq4tdVQVwYN39fu7Wsmfpk0Thy4styh+ZvxtgY/hKPZ/D5VCZwh7qCk2Y69x5Ughnwm5bNbDSCQ1S2AR4XtCFZKb6HWXoS1vYCpMQsZrgZwICZfSzqwNnumSfTralYWr/b7QIE22VkqAW74/sRtVN9Fl9s2jMNenHnVENAgeKD4sMmJQRm9DsygJRj4q450RrcieS9lOqT7LGkBhV9HGg6GfOeE6+V/tapcJ4ruf8tJcWKUgi5JUao3VysxAYlq5s19b5FqX3U+xcSK+mQ8EEAOPa/nUOdY+cNh8NqK3n5JJWEg79w9BNSkvlOEDCPW95RbqkO9yg/cqs6V7rH+4xcIDWWuhTwixYtKSizp/s6a0NSjeZShOXSXHpQGZlRm/oh52qgWRvaOMPJbu26JWzdxiS9ImYzvcdbhXnFd9+Uh24vmHiKWWfCl6AM3YaKM69BAD8pqmRnppOjA5uNqifsgpxfipdcCfGTNl36Q3RGoVMEdaQ1xM48mnUb3gTa8QuwyFtXxMR92mp6fkO/Je4mfD+3hQu0gosXwbv5sZzyP6sC7SVMqO1GpBAXu7nOwJ8qxUlm/e799qIlNgvCzl4VeS6uMJPT2AkaLM2YbSFE0GCJQQAwlU9sG1G6ApD3N/KTilIbUtV93Ka3+dHJ8Oxa5SGfAan3GZoNZnJnraiM8XqVadEiGSqAaWFJ1YyVnEXg3hytfXW6k7ef6cWrQ2yMmxxSIU9ZmsyAr6m8u1/pwLlbtnJ9S7wuIpqdM7GS2h0kSt6Cs/5omj2VIO50BJLQgL8/zFFycbATQRRQY2jAQgA4N/paWhTASRkcEc6mjXJlfiY3ICF/toqM9915y4porYe1pr4K1bX8AzNK57PvUcA/Ppox5L6Tcjca95gQhkwqSjhL1+NlAqdNyEBJyOnfNNgqhKB6QRQq12pM69uOQ3+pG2zmht/uXoF81HR3R240k9Ia5sz+fHwGfOkaek5YGg1PjUdGQltVbtVQdAkSXHkoLSe/ckNVqT9ahQkd8MlDFa4JnFQUEyDP4/RE+6xY7CZfdlCCDCT1Qo/VpqvY/4erz+QT/gKGp1n3F3AnddzGcZdYj5k1KfINfkfNp+NPvepIjbUwq06wyPOLPrSNcqyScjhYDRAZNUTxGFABd7bUQARAQAB"

}
Example #7
0
func main() {
	ent, err := openpgp.NewEntity("bob", "Bob's key", "*****@*****.**", nil)
	if err != nil {
		panic(err)
	}
	pkbuf := bytes.NewBuffer(nil)
	err = ent.SerializePrivate(pkbuf, nil)
	if err != nil {
		panic(err)
	}
	buf := bytes.NewBuffer(nil)
	ewrbuf, err := armor.Encode(buf, "PGP PRIVATE KEY BLOCK", nil)
	if err != nil {
		panic(err)
	}
	_, err = ewrbuf.Write(pkbuf.Bytes())
	if err != nil {
		panic(err)
	}
	ewrbuf.Close()
	fmt.Printf("%s\n", buf.Bytes())

	// serialize the public key
	pkbuf = bytes.NewBuffer(nil)
	err = ent.Serialize(pkbuf)
	if err != nil {
		panic(err)
	}
	buf = bytes.NewBuffer(nil)
	ewrbuf, err = armor.Encode(buf, openpgp.PublicKeyType, nil)
	if err != nil {
		panic(err)
	}
	_, err = ewrbuf.Write(pkbuf.Bytes())
	if err != nil {
		panic(err)
	}
	ewrbuf.Close()
	fmt.Printf("%s\n", buf.Bytes())

}
Example #8
0
// NewEntity returns a new OpenPGP entity.
func NewEntity() (*openpgp.Entity, error) {
	name := "" // intentionally empty
	comment := "camlistore"
	email := "" // intentionally empty
	return openpgp.NewEntity(name, comment, email, nil)
}