dns/kparse.rl

82 lines
2.6 KiB
Plaintext
Raw Normal View History

2011-07-14 21:59:12 +00:00
package dns
// Parse private key files
import (
"os"
"strings"
)
%%{
machine k;
write data;
}%%
2011-07-23 06:59:58 +00:00
// PrivateKey parses a private key file as defined in XXX.
2011-07-23 21:32:42 +00:00
// A map[string]string is returned with the values. All the keys are
// converted to lowercase. All values are returned as-is, except
// the algorithm [e.g. 5 (RSASHA1)] is returned as: m[algorithm] = "RSASHA1"
func (kp *Parser) PrivateKey() (m map[string]string, err os.Error) {
2011-07-15 15:41:26 +00:00
m = make(map[string]string)
2011-07-23 06:59:58 +00:00
var (
k, data string
cs, p, pe int
)
lines := strings.SplitAfter(string(kp.buf), "\n", -1)
for _, data := range lines {
2011-07-23 06:59:58 +00:00
cs, p, pe = 0, 0, len(data)
mark := 0
%%{
action mark { mark = p }
action setKey { k = strings.ToLower(data[mark:p]) }
action setValue { m[k] = data[mark:p] }
2011-07-17 13:47:03 +00:00
action setAlg { m[k] = strings.ToUpper(data[mark:p-1]) }
2011-07-15 15:41:26 +00:00
bl = [ \t]+;
base64any = [a-zA-Z0-9.\\/+=() ]+ >mark;
algorithm = ( 'RSASHA1'i | 'RSASHA256'i ) >mark;
2011-07-17 13:47:03 +00:00
comment = /^;/;
key = (
('Private-key-format'i)
| ('Algorithm'i)
2011-07-15 15:41:26 +00:00
| ('Modulus'i)
| ('PublicExponent'i)
| ('PrivateExponent'i) # RSA, RFC ....?
2011-07-15 15:55:25 +00:00
| ('GostAsn1'i) # GOST, RFC 5933
| ('PrivateKey'i) # ECDSA, RFC xxxx (TBA)
| ('Prime1'i)
| ('Prime2'i)
| ('Exponent1'i)
| ('Exponent2'i)
| ('Coefficient'i)
| ('Created'i)
| ('Publish'i)
| ('Activate'i)
2011-07-15 15:41:26 +00:00
) >mark %setKey;
value = ( base64any %setValue | digit+ bl '(' algorithm ')' %setAlg );
2011-07-17 13:47:03 +00:00
line = ( key ': ' value | comment );
2011-07-15 15:41:26 +00:00
main := ( line '\n' )*;
write init;
write exec;
}%%
}
2011-07-23 06:59:58 +00:00
if cs < k_first_final {
if p == pe {
//return nil, os.ErrorString("unexpected eof")
2011-07-15 15:41:26 +00:00
println("err unexp eof")
return m, nil
} else {
//return nil, os.ErrorString(fmt.Sprintf("error at position %d", p))
2011-07-23 06:59:58 +00:00
println("err ", p, "data:", data[p])
return nil, nil
}
}
2011-07-15 15:41:26 +00:00
return m, nil
}