crypto.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. package sprig
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "crypto/dsa"
  7. "crypto/ecdsa"
  8. "crypto/elliptic"
  9. "crypto/hmac"
  10. "crypto/rand"
  11. "crypto/rsa"
  12. "crypto/sha1"
  13. "crypto/sha256"
  14. "crypto/x509"
  15. "crypto/x509/pkix"
  16. "encoding/asn1"
  17. "encoding/base64"
  18. "encoding/binary"
  19. "encoding/hex"
  20. "encoding/pem"
  21. "errors"
  22. "fmt"
  23. "io"
  24. "hash/adler32"
  25. "math/big"
  26. "net"
  27. "time"
  28. "github.com/google/uuid"
  29. "golang.org/x/crypto/scrypt"
  30. )
  31. func sha256sum(input string) string {
  32. hash := sha256.Sum256([]byte(input))
  33. return hex.EncodeToString(hash[:])
  34. }
  35. func sha1sum(input string) string {
  36. hash := sha1.Sum([]byte(input))
  37. return hex.EncodeToString(hash[:])
  38. }
  39. func adler32sum(input string) string {
  40. hash := adler32.Checksum([]byte(input))
  41. return fmt.Sprintf("%d", hash)
  42. }
  43. // uuidv4 provides a safe and secure UUID v4 implementation
  44. func uuidv4() string {
  45. return fmt.Sprintf("%s", uuid.New())
  46. }
  47. var master_password_seed = "com.lyndir.masterpassword"
  48. var password_type_templates = map[string][][]byte{
  49. "maximum": {[]byte("anoxxxxxxxxxxxxxxxxx"), []byte("axxxxxxxxxxxxxxxxxno")},
  50. "long": {[]byte("CvcvnoCvcvCvcv"), []byte("CvcvCvcvnoCvcv"), []byte("CvcvCvcvCvcvno"), []byte("CvccnoCvcvCvcv"), []byte("CvccCvcvnoCvcv"),
  51. []byte("CvccCvcvCvcvno"), []byte("CvcvnoCvccCvcv"), []byte("CvcvCvccnoCvcv"), []byte("CvcvCvccCvcvno"), []byte("CvcvnoCvcvCvcc"),
  52. []byte("CvcvCvcvnoCvcc"), []byte("CvcvCvcvCvccno"), []byte("CvccnoCvccCvcv"), []byte("CvccCvccnoCvcv"), []byte("CvccCvccCvcvno"),
  53. []byte("CvcvnoCvccCvcc"), []byte("CvcvCvccnoCvcc"), []byte("CvcvCvccCvccno"), []byte("CvccnoCvcvCvcc"), []byte("CvccCvcvnoCvcc"),
  54. []byte("CvccCvcvCvccno")},
  55. "medium": {[]byte("CvcnoCvc"), []byte("CvcCvcno")},
  56. "short": {[]byte("Cvcn")},
  57. "basic": {[]byte("aaanaaan"), []byte("aannaaan"), []byte("aaannaaa")},
  58. "pin": {[]byte("nnnn")},
  59. }
  60. var template_characters = map[byte]string{
  61. 'V': "AEIOU",
  62. 'C': "BCDFGHJKLMNPQRSTVWXYZ",
  63. 'v': "aeiou",
  64. 'c': "bcdfghjklmnpqrstvwxyz",
  65. 'A': "AEIOUBCDFGHJKLMNPQRSTVWXYZ",
  66. 'a': "AEIOUaeiouBCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz",
  67. 'n': "0123456789",
  68. 'o': "@&%?,=[]_:-+*$#!'^~;()/.",
  69. 'x': "AEIOUaeiouBCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz0123456789!@#$%^&*()",
  70. }
  71. func derivePassword(counter uint32, password_type, password, user, site string) string {
  72. var templates = password_type_templates[password_type]
  73. if templates == nil {
  74. return fmt.Sprintf("cannot find password template %s", password_type)
  75. }
  76. var buffer bytes.Buffer
  77. buffer.WriteString(master_password_seed)
  78. binary.Write(&buffer, binary.BigEndian, uint32(len(user)))
  79. buffer.WriteString(user)
  80. salt := buffer.Bytes()
  81. key, err := scrypt.Key([]byte(password), salt, 32768, 8, 2, 64)
  82. if err != nil {
  83. return fmt.Sprintf("failed to derive password: %s", err)
  84. }
  85. buffer.Truncate(len(master_password_seed))
  86. binary.Write(&buffer, binary.BigEndian, uint32(len(site)))
  87. buffer.WriteString(site)
  88. binary.Write(&buffer, binary.BigEndian, counter)
  89. var hmacv = hmac.New(sha256.New, key)
  90. hmacv.Write(buffer.Bytes())
  91. var seed = hmacv.Sum(nil)
  92. var temp = templates[int(seed[0])%len(templates)]
  93. buffer.Truncate(0)
  94. for i, element := range temp {
  95. pass_chars := template_characters[element]
  96. pass_char := pass_chars[int(seed[i+1])%len(pass_chars)]
  97. buffer.WriteByte(pass_char)
  98. }
  99. return buffer.String()
  100. }
  101. func generatePrivateKey(typ string) string {
  102. var priv interface{}
  103. var err error
  104. switch typ {
  105. case "", "rsa":
  106. // good enough for government work
  107. priv, err = rsa.GenerateKey(rand.Reader, 4096)
  108. case "dsa":
  109. key := new(dsa.PrivateKey)
  110. // again, good enough for government work
  111. if err = dsa.GenerateParameters(&key.Parameters, rand.Reader, dsa.L2048N256); err != nil {
  112. return fmt.Sprintf("failed to generate dsa params: %s", err)
  113. }
  114. err = dsa.GenerateKey(key, rand.Reader)
  115. priv = key
  116. case "ecdsa":
  117. // again, good enough for government work
  118. priv, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  119. default:
  120. return "Unknown type " + typ
  121. }
  122. if err != nil {
  123. return fmt.Sprintf("failed to generate private key: %s", err)
  124. }
  125. return string(pem.EncodeToMemory(pemBlockForKey(priv)))
  126. }
  127. type DSAKeyFormat struct {
  128. Version int
  129. P, Q, G, Y, X *big.Int
  130. }
  131. func pemBlockForKey(priv interface{}) *pem.Block {
  132. switch k := priv.(type) {
  133. case *rsa.PrivateKey:
  134. return &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(k)}
  135. case *dsa.PrivateKey:
  136. val := DSAKeyFormat{
  137. P: k.P, Q: k.Q, G: k.G,
  138. Y: k.Y, X: k.X,
  139. }
  140. bytes, _ := asn1.Marshal(val)
  141. return &pem.Block{Type: "DSA PRIVATE KEY", Bytes: bytes}
  142. case *ecdsa.PrivateKey:
  143. b, _ := x509.MarshalECPrivateKey(k)
  144. return &pem.Block{Type: "EC PRIVATE KEY", Bytes: b}
  145. default:
  146. return nil
  147. }
  148. }
  149. type certificate struct {
  150. Cert string
  151. Key string
  152. }
  153. func buildCustomCertificate(b64cert string, b64key string) (certificate, error) {
  154. crt := certificate{}
  155. cert, err := base64.StdEncoding.DecodeString(b64cert)
  156. if err != nil {
  157. return crt, errors.New("unable to decode base64 certificate")
  158. }
  159. key, err := base64.StdEncoding.DecodeString(b64key)
  160. if err != nil {
  161. return crt, errors.New("unable to decode base64 private key")
  162. }
  163. decodedCert, _ := pem.Decode(cert)
  164. if decodedCert == nil {
  165. return crt, errors.New("unable to decode certificate")
  166. }
  167. _, err = x509.ParseCertificate(decodedCert.Bytes)
  168. if err != nil {
  169. return crt, fmt.Errorf(
  170. "error parsing certificate: decodedCert.Bytes: %s",
  171. err,
  172. )
  173. }
  174. decodedKey, _ := pem.Decode(key)
  175. if decodedKey == nil {
  176. return crt, errors.New("unable to decode key")
  177. }
  178. _, err = x509.ParsePKCS1PrivateKey(decodedKey.Bytes)
  179. if err != nil {
  180. return crt, fmt.Errorf(
  181. "error parsing prive key: decodedKey.Bytes: %s",
  182. err,
  183. )
  184. }
  185. crt.Cert = string(cert)
  186. crt.Key = string(key)
  187. return crt, nil
  188. }
  189. func generateCertificateAuthority(
  190. cn string,
  191. daysValid int,
  192. ) (certificate, error) {
  193. ca := certificate{}
  194. template, err := getBaseCertTemplate(cn, nil, nil, daysValid)
  195. if err != nil {
  196. return ca, err
  197. }
  198. // Override KeyUsage and IsCA
  199. template.KeyUsage = x509.KeyUsageKeyEncipherment |
  200. x509.KeyUsageDigitalSignature |
  201. x509.KeyUsageCertSign
  202. template.IsCA = true
  203. priv, err := rsa.GenerateKey(rand.Reader, 2048)
  204. if err != nil {
  205. return ca, fmt.Errorf("error generating rsa key: %s", err)
  206. }
  207. ca.Cert, ca.Key, err = getCertAndKey(template, priv, template, priv)
  208. if err != nil {
  209. return ca, err
  210. }
  211. return ca, nil
  212. }
  213. func generateSelfSignedCertificate(
  214. cn string,
  215. ips []interface{},
  216. alternateDNS []interface{},
  217. daysValid int,
  218. ) (certificate, error) {
  219. cert := certificate{}
  220. template, err := getBaseCertTemplate(cn, ips, alternateDNS, daysValid)
  221. if err != nil {
  222. return cert, err
  223. }
  224. priv, err := rsa.GenerateKey(rand.Reader, 2048)
  225. if err != nil {
  226. return cert, fmt.Errorf("error generating rsa key: %s", err)
  227. }
  228. cert.Cert, cert.Key, err = getCertAndKey(template, priv, template, priv)
  229. if err != nil {
  230. return cert, err
  231. }
  232. return cert, nil
  233. }
  234. func generateSignedCertificate(
  235. cn string,
  236. ips []interface{},
  237. alternateDNS []interface{},
  238. daysValid int,
  239. ca certificate,
  240. ) (certificate, error) {
  241. cert := certificate{}
  242. decodedSignerCert, _ := pem.Decode([]byte(ca.Cert))
  243. if decodedSignerCert == nil {
  244. return cert, errors.New("unable to decode certificate")
  245. }
  246. signerCert, err := x509.ParseCertificate(decodedSignerCert.Bytes)
  247. if err != nil {
  248. return cert, fmt.Errorf(
  249. "error parsing certificate: decodedSignerCert.Bytes: %s",
  250. err,
  251. )
  252. }
  253. decodedSignerKey, _ := pem.Decode([]byte(ca.Key))
  254. if decodedSignerKey == nil {
  255. return cert, errors.New("unable to decode key")
  256. }
  257. signerKey, err := x509.ParsePKCS1PrivateKey(decodedSignerKey.Bytes)
  258. if err != nil {
  259. return cert, fmt.Errorf(
  260. "error parsing prive key: decodedSignerKey.Bytes: %s",
  261. err,
  262. )
  263. }
  264. template, err := getBaseCertTemplate(cn, ips, alternateDNS, daysValid)
  265. if err != nil {
  266. return cert, err
  267. }
  268. priv, err := rsa.GenerateKey(rand.Reader, 2048)
  269. if err != nil {
  270. return cert, fmt.Errorf("error generating rsa key: %s", err)
  271. }
  272. cert.Cert, cert.Key, err = getCertAndKey(
  273. template,
  274. priv,
  275. signerCert,
  276. signerKey,
  277. )
  278. if err != nil {
  279. return cert, err
  280. }
  281. return cert, nil
  282. }
  283. func getCertAndKey(
  284. template *x509.Certificate,
  285. signeeKey *rsa.PrivateKey,
  286. parent *x509.Certificate,
  287. signingKey *rsa.PrivateKey,
  288. ) (string, string, error) {
  289. derBytes, err := x509.CreateCertificate(
  290. rand.Reader,
  291. template,
  292. parent,
  293. &signeeKey.PublicKey,
  294. signingKey,
  295. )
  296. if err != nil {
  297. return "", "", fmt.Errorf("error creating certificate: %s", err)
  298. }
  299. certBuffer := bytes.Buffer{}
  300. if err := pem.Encode(
  301. &certBuffer,
  302. &pem.Block{Type: "CERTIFICATE", Bytes: derBytes},
  303. ); err != nil {
  304. return "", "", fmt.Errorf("error pem-encoding certificate: %s", err)
  305. }
  306. keyBuffer := bytes.Buffer{}
  307. if err := pem.Encode(
  308. &keyBuffer,
  309. &pem.Block{
  310. Type: "RSA PRIVATE KEY",
  311. Bytes: x509.MarshalPKCS1PrivateKey(signeeKey),
  312. },
  313. ); err != nil {
  314. return "", "", fmt.Errorf("error pem-encoding key: %s", err)
  315. }
  316. return string(certBuffer.Bytes()), string(keyBuffer.Bytes()), nil
  317. }
  318. func getBaseCertTemplate(
  319. cn string,
  320. ips []interface{},
  321. alternateDNS []interface{},
  322. daysValid int,
  323. ) (*x509.Certificate, error) {
  324. ipAddresses, err := getNetIPs(ips)
  325. if err != nil {
  326. return nil, err
  327. }
  328. dnsNames, err := getAlternateDNSStrs(alternateDNS)
  329. if err != nil {
  330. return nil, err
  331. }
  332. serialNumberUpperBound := new(big.Int).Lsh(big.NewInt(1), 128)
  333. serialNumber, err := rand.Int(rand.Reader, serialNumberUpperBound)
  334. if err != nil {
  335. return nil, err
  336. }
  337. return &x509.Certificate{
  338. SerialNumber: serialNumber,
  339. Subject: pkix.Name{
  340. CommonName: cn,
  341. },
  342. IPAddresses: ipAddresses,
  343. DNSNames: dnsNames,
  344. NotBefore: time.Now(),
  345. NotAfter: time.Now().Add(time.Hour * 24 * time.Duration(daysValid)),
  346. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
  347. ExtKeyUsage: []x509.ExtKeyUsage{
  348. x509.ExtKeyUsageServerAuth,
  349. x509.ExtKeyUsageClientAuth,
  350. },
  351. BasicConstraintsValid: true,
  352. }, nil
  353. }
  354. func getNetIPs(ips []interface{}) ([]net.IP, error) {
  355. if ips == nil {
  356. return []net.IP{}, nil
  357. }
  358. var ipStr string
  359. var ok bool
  360. var netIP net.IP
  361. netIPs := make([]net.IP, len(ips))
  362. for i, ip := range ips {
  363. ipStr, ok = ip.(string)
  364. if !ok {
  365. return nil, fmt.Errorf("error parsing ip: %v is not a string", ip)
  366. }
  367. netIP = net.ParseIP(ipStr)
  368. if netIP == nil {
  369. return nil, fmt.Errorf("error parsing ip: %s", ipStr)
  370. }
  371. netIPs[i] = netIP
  372. }
  373. return netIPs, nil
  374. }
  375. func getAlternateDNSStrs(alternateDNS []interface{}) ([]string, error) {
  376. if alternateDNS == nil {
  377. return []string{}, nil
  378. }
  379. var dnsStr string
  380. var ok bool
  381. alternateDNSStrs := make([]string, len(alternateDNS))
  382. for i, dns := range alternateDNS {
  383. dnsStr, ok = dns.(string)
  384. if !ok {
  385. return nil, fmt.Errorf(
  386. "error processing alternate dns name: %v is not a string",
  387. dns,
  388. )
  389. }
  390. alternateDNSStrs[i] = dnsStr
  391. }
  392. return alternateDNSStrs, nil
  393. }
  394. func encryptAES(password string, plaintext string) (string, error) {
  395. if plaintext == "" {
  396. return "", nil
  397. }
  398. key := make([]byte, 32)
  399. copy(key, []byte(password))
  400. block, err := aes.NewCipher(key)
  401. if err != nil {
  402. return "", err
  403. }
  404. content := []byte(plaintext)
  405. blockSize := block.BlockSize()
  406. padding := blockSize - len(content)%blockSize
  407. padtext := bytes.Repeat([]byte{byte(padding)}, padding)
  408. content = append(content, padtext...)
  409. ciphertext := make([]byte, aes.BlockSize+len(content))
  410. iv := ciphertext[:aes.BlockSize]
  411. if _, err := io.ReadFull(rand.Reader, iv); err != nil {
  412. return "", err
  413. }
  414. mode := cipher.NewCBCEncrypter(block, iv)
  415. mode.CryptBlocks(ciphertext[aes.BlockSize:], content)
  416. return base64.StdEncoding.EncodeToString(ciphertext), nil
  417. }
  418. func decryptAES(password string, crypt64 string) (string, error) {
  419. if crypt64 == "" {
  420. return "", nil
  421. }
  422. key := make([]byte, 32)
  423. copy(key, []byte(password))
  424. crypt, err := base64.StdEncoding.DecodeString(crypt64)
  425. if err != nil {
  426. return "", err
  427. }
  428. block, err := aes.NewCipher(key)
  429. if err != nil {
  430. return "", err
  431. }
  432. iv := crypt[:aes.BlockSize]
  433. crypt = crypt[aes.BlockSize:]
  434. decrypted := make([]byte, len(crypt))
  435. mode := cipher.NewCBCDecrypter(block, iv)
  436. mode.CryptBlocks(decrypted, crypt)
  437. return string(decrypted[:len(decrypted)-int(decrypted[len(decrypted)-1])]), nil
  438. }