1 // Copyright 2014 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // Package internal contains support packages for oauth2 package.
19 // ParseKey converts the binary contents of a private key file
20 // to an *rsa.PrivateKey. It detects whether the private key is in a
21 // PEM container or not. If so, it extracts the the private key
22 // from PEM container before conversion. It only supports PEM
23 // containers with no passphrase.
24 func ParseKey(key []byte) (*rsa.PrivateKey, error) {
25 block, _ := pem.Decode(key)
29 parsedKey, err := x509.ParsePKCS8PrivateKey(key)
31 parsedKey, err = x509.ParsePKCS1PrivateKey(key)
33 return nil, fmt.Errorf("private key should be a PEM or plain PKSC1 or PKCS8; parse error: %v", err)
36 parsed, ok := parsedKey.(*rsa.PrivateKey)
38 return nil, errors.New("private key is invalid")
43 func ParseINI(ini io.Reader) (map[string]map[string]string, error) {
44 result := map[string]map[string]string{
45 "": map[string]string{}, // root section
47 scanner := bufio.NewScanner(ini)
50 line := strings.TrimSpace(scanner.Text())
51 if strings.HasPrefix(line, ";") {
55 if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") {
56 currentSection = strings.TrimSpace(line[1 : len(line)-1])
57 result[currentSection] = map[string]string{}
60 parts := strings.SplitN(line, "=", 2)
61 if len(parts) == 2 && parts[0] != "" {
62 result[currentSection][strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
65 if err := scanner.Err(); err != nil {
66 return nil, fmt.Errorf("error scanning ini: %v", err)
71 func CondVal(v string) []string {