From 8ed6c8a8f41c09a33a71e4a2d814773bb309fb8c Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Sun, 16 Jan 2011 16:22:31 +0100 Subject: [PATCH] more parsing: from private key file - not finished --- TODO | 4 ++-- dnssec_test.go | 2 ++ keygen.go | 37 ++++++++++++++++++++++++++++++++++++- parse_test.go | 25 +++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/TODO b/TODO index b8c8a851..96a7cf7d 100644 --- a/TODO +++ b/TODO @@ -1,9 +1,9 @@ Todo: Short term: * NSEC3 - need base32 for Nsec3 -* Parsing from strings, going with goyacc and own lexer -* Testsuite - make it slightly better - put multiple tests inside 1 file * Cleanup the code +* Tsig testing +* Parsing from strings, going with goyacc and own lexer Issues: * escaped dots in names \. diff --git a/dnssec_test.go b/dnssec_test.go index 1472ec43..a7051fb0 100644 --- a/dnssec_test.go +++ b/dnssec_test.go @@ -210,6 +210,8 @@ func TestTag(t *testing.T) { } func TestKeyGenRSA(t *testing.T) { + + return // Tijdelijk uit TODO(mg) key := new(RR_DNSKEY) key.Hdr.Name = "miek.nl." key.Hdr.Rrtype = TypeDNSKEY diff --git a/keygen.go b/keygen.go index 779ad9a9..d91c166c 100644 --- a/keygen.go +++ b/keygen.go @@ -2,8 +2,9 @@ package dns import ( "os" - "strconv" "big" + "fmt" + "strconv" "crypto/rsa" "crypto/rand" ) @@ -105,3 +106,37 @@ func (r *RR_DNSKEY) PrivateKeyString(p PrivateKey) (s string) { } return } + +// Read a private key file and create a public key and +// return a private key +func (r *RR_DNSKEY) PrivateKeySetString(s string) (PrivateKey, os.Error) { + p := new(rsa.PrivateKey) + var left, right string + // Do we care about the order of things? + n, err := fmt.Sscanf(s, "%s %s\n", &left, &right) + n = n + err = err + switch left { + case "Private-key-format:": + if right != "v1.3" { + return nil, &Error{Error: "v1.3 supported"} + } + case "Algorithm:": + // simple switch on the string + case "Modulus:": + modulus, err := packBase64([]byte(right)) + if err != nil { + return nil, err + } + p.PublicKey.N.SetBytes(modulus) + /* + case "PublicExponent": + publicExponent, err := packBase64([]byte(right)) + if err != nil { + return nil,err + } + t.PublicKey.E = int(publicExponent) + */ + } + return p, nil +} diff --git a/parse_test.go b/parse_test.go index d2d975b2..a823930c 100644 --- a/parse_test.go +++ b/parse_test.go @@ -22,3 +22,28 @@ func TestConversion(t *testing.T) { println(SecondsToString(60)) // 1m println(SecondsToString(59)) // 59 } + +func TestPrivateKeyRead(t *testing.T) { +a:=`Private-key-format: v1.3 +Algorithm: 5 (RSASHA1) +Modulus: vyVjCzz87g3rg9vDj1NJ1tlFP7lEY2pEQLkWGXAFuZM6Fw/bNmEH/z3ybDfsJqx4QQ6YZXN8V2kbzY7oX+tExf6AMiMIcKYzEGwg5xBYFh33du4G+6kE/VzG906ubp +aIEnrZOMTdGqE7OwptAqrqXe4uGXY99ZqNdqutOKQyIzs= +PublicExponent: AQAB +PrivateExponent: PFg/RoMAjt8SJVSyDoOK4itBs3Z34rLfzVchZPJ6vDWAt1soJ6jGb4xNBmE5SpRUeqVy80RcUvQ59NFTB0UtNo/zAXhC1RfKiFCNRFTyV3k6a9CMLPAU9g +4peW91lw87HXnYALTC9bTiTAoMU3vKvNx80F5qfK7qY/N28S1PMeE= +Prime1: +vPWyp37iUa7/LbhejOX/KdkhfwECUCdJF0uEePjaBCSf85xceEBzU89JFk9dCojtVqcI8xLKnRKRixg07Rc+Q== +Prime2: wv2aVWr13Cq2vRkKiHlqqP9vihGuDN/kWfmXb7slJH3s2i9+yI7vepAlow9SY8lNHOqXibEaAFsP3aj5OAAS0w== +Exponent1: sChCenBzhWV1yGvH0zQsWFpYogTKAISuyjvufvhtRTt82uJbmAjObwRUcxOBo+2Aq2kzeZ2Klf6TtLaqMXHGYQ== +Exponent2: hXiKeAWrHXWveGj3qMtTkzKl6uCHPxDSgjQy0KxNlFkOE5uHMUmF62NYH/GQ9/UG79A0wm+T2MJ8bcIINaj3OQ== +Coefficient: xzZBvs2/IT7+iRQdn9I4slRTg9ryIecx7oKEKYTOEeyL2qq7rfY/FwZGy3EqyA/3lrkfFLx76qOeqAmCTUaU4w== +Created: 20101221142359 +Publish: 20101221142359 +Activate: 20101221142359` + + a = a + b := "Private-key-format: v1.3" + + k := new(RR_DNSKEY) + p,_ := k.PrivateKeySetString(b) + p = p +}