github.com/AntonOrnatskyi/goproxy@v0.0.0-20190205095733-4526a9fa18b4/services/keygen/keygen.go (about)

     1  package keygen
     2  
     3  import (
     4  	"fmt"
     5  	logger "log"
     6  	"os"
     7  	"strings"
     8  
     9  	"github.com/AntonOrnatskyi/goproxy/services"
    10  	"github.com/AntonOrnatskyi/goproxy/utils"
    11  	"github.com/AntonOrnatskyi/goproxy/utils/cert"
    12  )
    13  
    14  type KeygenArgs struct {
    15  	CaName     *string
    16  	CertName   *string
    17  	Sign       *bool
    18  	SignDays   *int
    19  	CommonName *string
    20  }
    21  
    22  type Keygen struct {
    23  	cfg KeygenArgs
    24  	log *logger.Logger
    25  }
    26  
    27  func NewKeygen() services.Service {
    28  	return &Keygen{}
    29  }
    30  func (s *Keygen) CheckArgs() (err error) {
    31  	if *s.cfg.Sign && (*s.cfg.CertName == "" || *s.cfg.CaName == "") {
    32  		err = fmt.Errorf("ca name and cert name required for signin")
    33  		return
    34  	}
    35  	if !*s.cfg.Sign && *s.cfg.CaName == "" {
    36  		err = fmt.Errorf("ca name required")
    37  		return
    38  	}
    39  	if *s.cfg.CommonName == "" {
    40  		domainSubfixList := []string{".com", ".edu", ".gov", ".int", ".mil", ".net", ".org", ".biz", ".info", ".pro", ".name", ".museum", ".coop", ".aero", ".xxx", ".idv", ".ac", ".ad", ".ae", ".af", ".ag", ".ai", ".al", ".am", ".an", ".ao", ".aq", ".ar", ".as", ".at", ".au", ".aw", ".az", ".ba", ".bb", ".bd", ".be", ".bf", ".bg", ".bh", ".bi", ".bj", ".bm", ".bn", ".bo", ".br", ".bs", ".bt", ".bv", ".bw", ".by", ".bz", ".ca", ".cc", ".cd", ".cf", ".cg", ".ch", ".ci", ".ck", ".cl", ".cm", ".cn", ".co", ".cr", ".cu", ".cv", ".cx", ".cy", ".cz", ".de", ".dj", ".dk", ".dm", ".do", ".dz", ".ec", ".ee", ".eg", ".eh", ".er", ".es", ".et", ".eu", ".fi", ".fj", ".fk", ".fm", ".fo", ".fr", ".ga", ".gd", ".ge", ".gf", ".gg", ".gh", ".gi", ".gl", ".gm", ".gn", ".gp", ".gq", ".gr", ".gs", ".gt", ".gu", ".gw", ".gy", ".hk", ".hm", ".hn", ".hr", ".ht", ".hu", ".id", ".ie", ".il", ".im", ".in", ".io", ".iq", ".ir", ".is", ".it", ".je", ".jm", ".jo", ".jp", ".ke", ".kg", ".kh", ".ki", ".km", ".kn", ".kp", ".kr", ".kw", ".ky", ".kz", ".la", ".lb", ".lc", ".li", ".lk", ".lr", ".ls", ".lt", ".lu", ".lv", ".ly", ".ma", ".mc", ".md", ".mg", ".mh", ".mk", ".ml", ".mm", ".mn", ".mo", ".mp", ".mq", ".mr", ".ms", ".mt", ".mu", ".mv", ".mw", ".mx", ".my", ".mz", ".na", ".nc", ".ne", ".nf", ".ng", ".ni", ".nl", ".no", ".np", ".nr", ".nu", ".nz", ".om", ".pa", ".pe", ".pf", ".pg", ".ph", ".pk", ".pl", ".pm", ".pn", ".pr", ".ps", ".pt", ".pw", ".py", ".qa", ".re", ".ro", ".ru", ".rw", ".sa", ".sb", ".sc", ".sd", ".se", ".sg", ".sh", ".si", ".sj", ".sk", ".sl", ".sm", ".sn", ".so", ".sr", ".st", ".sv", ".sy", ".sz", ".tc", ".td", ".tf", ".tg", ".th", ".tj", ".tk", ".tl", ".tm", ".tn", ".to", ".tp", ".tr", ".tt", ".tv", ".tw", ".tz", ".ua", ".ug", ".uk", ".um", ".us", ".uy", ".uz", ".va", ".vc", ".ve", ".vg", ".vi", ".vn", ".vu", ".wf", ".ws", ".ye", ".yt", ".yu", ".yr", ".za", ".zm", ".zw"}
    41  		CN := strings.ToLower(utils.RandString(int(utils.RandInt(4)%10)) + domainSubfixList[int(utils.RandInt(4))%len(domainSubfixList)])
    42  		*s.cfg.CommonName = CN
    43  	}
    44  	return
    45  }
    46  func (s *Keygen) Start(args interface{}, log *logger.Logger) (err error) {
    47  	s.log = log
    48  	s.cfg = args.(KeygenArgs)
    49  	if err = s.CheckArgs(); err != nil {
    50  		return
    51  	}
    52  	if *s.cfg.Sign {
    53  		caCert, caKey, err := cert.ParseCertAndKey(*s.cfg.CaName+".crt", *s.cfg.CaName+".key")
    54  		if err != nil {
    55  			return err
    56  		}
    57  		err = cert.CreateSignCertToFile(caCert, caKey, *s.cfg.CommonName, *s.cfg.SignDays, *s.cfg.CertName)
    58  	} else {
    59  		err = cert.CreateCaToFile(*s.cfg.CaName, *s.cfg.CommonName, *s.cfg.SignDays)
    60  	}
    61  	if err != nil {
    62  		return
    63  	}
    64  	s.log.Println("success")
    65  	os.Exit(0)
    66  	return
    67  }
    68  
    69  func (s *Keygen) Clean() {
    70  
    71  }