Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package util
- import (
- "fmt"
- "math/big"
- "crypto/dsa"
- "encoding/asn1"
- "encoding/pem"
- "crypto/rand"
- "encoding/base64"
- "crypto/sha1"
- "bytes"
- )
- var privateKeyDer = []byte(`-----BEGIN DSA PRIVATE KEY-----
- MIIBugIBAAKBgQCKBzr2/ImJNThK0ZrknfaqtObYC8ydpto8sZxxw8BWmUlyFApj
- OyVFQjdZMKp9dG5NelAv+XkS+03D49Bnzbc2TT10mPjbGzjhye4hIFJpPB61Zicg
- IDlgJq5GB9GwxH8fEeYfzEaO7igEfkS0xHsAubm7hCML4Wbd6Fk28NuhqQIVANRR
- 6z8MpieRWDR+AhS7CMjxuCJvAoGATJFGrtkHbfy1bXLs1/+z/ejlRWkFnx9Hok6e
- cXCO1lvIatkJsF8IdlbjYje8TMg2YV5Js31bsv7l1Lr9g5g8FWc938FjCxpF8mQ+
- TfSsNyzQhbFSAXopSZg8Zq5w3pxqwvS2e3MRzBTCvf7JL4ixQQJOzZSoJTiXUB1W
- 8l6vwq0CgYA7ubVqw68ojJ7UWdvtSfFJbN4YOoU0NF3XmWjZhFJAFEbkExt6ued/
- z7wbMp/l9Dmx41Of6f7El2pTSAWdYx2ARaNZoIpegPBkpN2gq1jZAMDUpx9oPklV
- 8Dvft4B+Kd74aCytE+r0V9nvRhEj7m6UHVj9lXtKhE0wVuWM4Dgt6AIUXKeEnhac
- F6s91KUB/iAuMjAIehc=
- -----END DSA PRIVATE KEY-----`)
- var publicKeyDer = []byte(`-----BEGIN PUBLIC KEY-----
- MIIBtjCCASsGByqGSM44BAEwggEeAoGBAIoHOvb8iYk1OErRmuSd9qq05tgLzJ2m
- 2jyxnHHDwFaZSXIUCmM7JUVCN1kwqn10bk16UC/5eRL7TcPj0GfNtzZNPXSY+Nsb
- OOHJ7iEgUmk8HrVmJyAgOWAmrkYH0bDEfx8R5h/MRo7uKAR+RLTEewC5ubuEIwvh
- Zt3oWTbw26GpAhUA1FHrPwymJ5FYNH4CFLsIyPG4Im8CgYBMkUau2Qdt/LVtcuzX
- /7P96OVFaQWfH0eiTp5xcI7WW8hq2QmwXwh2VuNiN7xMyDZhXkmzfVuy/uXUuv2D
- mDwVZz3fwWMLGkXyZD5N9Kw3LNCFsVIBeilJmDxmrnDenGrC9LZ7cxHMFMK9/skv
- iLFBAk7NlKglOJdQHVbyXq/CrQOBhAACgYA7ubVqw68ojJ7UWdvtSfFJbN4YOoU0
- NF3XmWjZhFJAFEbkExt6ued/z7wbMp/l9Dmx41Of6f7El2pTSAWdYx2ARaNZoIpe
- gPBkpN2gq1jZAMDUpx9oPklV8Dvft4B+Kd74aCytE+r0V9nvRhEj7m6UHVj9lXtK
- hE0wVuWM4Dgt6A==
- -----END PUBLIC KEY-----`)
- var privateKey *dsa.PrivateKey
- var publicKey *dsa.PublicKey
- var println = fmt.Println
- func init() {
- block, _ := pem.Decode(privateKeyDer)
- // initialize keypair
- privateKey, _ = ParsePKCS8PrivateKey(block.Bytes)
- publicKey = &privateKey.PublicKey
- println(privateKey)
- println(publicKey)
- }
- func Sign(data []byte) (signature string) {
- _, _, signatureByte := sign(data, privateKey)
- return base64.StdEncoding.EncodeToString(signatureByte)
- }
- func putLength(buf *bytes.Buffer, len int) {
- if len < 128 {
- buf.WriteByte(byte(len))
- } else if len < 256 {
- buf.WriteRune(rune(-127))
- buf.WriteByte(byte(len))
- } else if len < 65536 {
- buf.WriteRune(rune(-126))
- buf.WriteByte(byte(len >> 8))
- buf.WriteByte(byte(len))
- } else if len < 16777216 {
- buf.WriteRune(rune(-125))
- buf.WriteByte(byte(len >> 16))
- buf.WriteByte(byte(len >> 8))
- buf.WriteByte(byte(len))
- } else {
- buf.WriteRune(rune(-124))
- buf.WriteByte(byte(len >> 24))
- buf.WriteByte(byte(len >> 16))
- buf.WriteByte(byte(len >> 8))
- buf.WriteByte(byte(len))
- }
- }
- // golang cannot parse PKCS8 DSA private key right now
- // we need to make an struct for unmarshal
- type PKCS8DSAPrivateKey struct {
- E1, P, Q, G, Y, X *big.Int
- }
- func ParsePKCS8PrivateKey(der []byte) (privateKey *dsa.PrivateKey, err error) {
- myPrivateKey := PKCS8DSAPrivateKey{}
- asn1.Unmarshal(der, &myPrivateKey)
- privateKey = new(dsa.PrivateKey)
- dsaPublicKey := new(dsa.PublicKey)
- dsaParameter := new(dsa.Parameters)
- dsaParameter.G = myPrivateKey.G
- dsaParameter.P = myPrivateKey.P
- dsaParameter.Q = myPrivateKey.Q
- dsaPublicKey.Y = myPrivateKey.Y
- dsaPublicKey.Parameters = *dsaParameter
- privateKey.X = myPrivateKey.X
- privateKey.PublicKey = *dsaPublicKey
- return
- }
- func sign(data []byte, privatekey *dsa.PrivateKey) (r *big.Int, s *big.Int, signstr []byte) {
- sha1 := sha1.New()
- sha1.Write(data)
- signhash := sha1.Sum(nil)
- r, s, err := dsa.Sign(rand.Reader, privatekey, signhash[:])
- if err != nil {
- fmt.Println(err)
- }
- der := genDerValueFromRS(r, s)
- return r, s, der
- }
- func genDerValueFromRS(r, s *big.Int) (derValue []byte) {
- rsBuf := bytes.NewBuffer(make([]byte, 0))
- rsBuf.WriteRune(2)
- putLength(rsBuf, len(r.Bytes()))
- rsBuf.Write(r.Bytes())
- rsBuf.WriteRune(2)
- putLength(rsBuf, len(s.Bytes()))
- rsBuf.Write(s.Bytes())
- buf := bytes.NewBuffer([]byte{})
- buf.WriteRune(48)
- putLength(buf, len(rsBuf.Bytes()))
- buf.Write(rsBuf.Bytes())
- fmt.Println("6666: ", base64.StdEncoding.EncodeToString(buf.Bytes()))
- return buf.Bytes()
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement