// MarshalPKIXPublicKey serialises a public key to DER-encoded PKIX format. func MarshalPKIXPublicKey(pub interface{}) ([]byte, os.Error) { var pubBytes []byte switch pub := pub.(type) { case *rsa.PublicKey: pubBytes, _ = asn1.Marshal(rsaPublicKey{ N: pub.N, E: pub.E, }) default: return nil, os.NewError("MarshalPKIXPublicKey: unknown public key type") } pkix := pkixPublicKey{ Algo: pkix.AlgorithmIdentifier{ Algorithm: []int{1, 2, 840, 113549, 1, 1, 1}, // This is a NULL parameters value which is technically // superfluous, but most other code includes it and, by // doing this, we match their public key hashes. Parameters: asn1.RawValue{ Tag: 5, }, }, BitString: asn1.BitString{ Bytes: pubBytes, BitLength: 8 * len(pubBytes), }, } ret, _ := asn1.Marshal(pkix) return ret, nil }
// CreateCRL returns a DER encoded CRL, signed by this Certificate, that // contains the given list of revoked certificates. func (c *Certificate) CreateCRL(rand io.Reader, priv *rsa.PrivateKey, revokedCerts []pkix.RevokedCertificate, now, expiry *time.Time) (crlBytes []byte, err os.Error) { tbsCertList := pkix.TBSCertificateList{ Version: 2, Signature: pkix.AlgorithmIdentifier{ Algorithm: oidSignatureSHA1WithRSA, }, Issuer: c.Subject.ToRDNSequence(), ThisUpdate: now, NextUpdate: expiry, RevokedCertificates: revokedCerts, } tbsCertListContents, err := asn1.Marshal(tbsCertList) if err != nil { return } h := sha1.New() h.Write(tbsCertListContents) digest := h.Sum() signature, err := rsa.SignPKCS1v15(rand, priv, crypto.SHA1, digest) if err != nil { return } return asn1.Marshal(pkix.CertificateList{ TBSCertList: tbsCertList, SignatureAlgorithm: pkix.AlgorithmIdentifier{ Algorithm: oidSignatureSHA1WithRSA, }, SignatureValue: asn1.BitString{Bytes: signature, BitLength: len(signature) * 8}, }) }
func GetStringValue(oid asn1.ObjectIdentifier, community string, addr net.UDPAddr) (string, os.Error) { conn, err := net.DialUDP("udp", nil, &addr) if err != nil { return "", err } defer conn.Close() r := PDU{ RequestId: 199, ErrorStatus: 0, ErrorIndex: 0, VarBindList: []VarBind{ VarBind{ Name: oid, Value: Null(), }, }, } data, err := asn1.Marshal(r) if err != nil { return "", err } m := Message{ Version: 1, Community: NewOctetString(community), Data: Any(data), } data, err = asn1.Marshal(m) if err != nil { return "", err } _, err = conn.Write(data) if err != nil { return "", err } data = make([]byte, 1500) read, err := conn.Read(data) if err != nil { return "", err } pdu, err := decode(data[:read]) if err != nil { return "", err } switch response := pdu.(type) { case *PDU: s, ok := response.VarBindList[0].Value.([]byte) if !ok { return "", fmt.Errorf("Invalid value returned") } return string(s), nil } return "", nil }
// CreateSelfSignedCertificate creates a new certificate based on // a template. The following members of template are used: SerialNumber, // Subject, NotBefore, NotAfter, KeyUsage, BasicConstraintsValid, IsCA, // MaxPathLen, SubjectKeyId, DNSNames, PermittedDNSDomainsCritical, // PermittedDNSDomains. // // The certificate is signed by parent. If parent is equal to template then the // certificate is self-signed. The parameter pub is the public key of the // signee and priv is the private key of the signer. // // The returned slice is the certificate in DER encoding. func CreateCertificate(rand io.Reader, template, parent *Certificate, pub *rsa.PublicKey, priv *rsa.PrivateKey) (cert []byte, err os.Error) { asn1PublicKey, err := asn1.Marshal(rsaPublicKey{ N: asn1.RawValue{Tag: 2, Bytes: pub.N.Bytes()}, E: pub.E, }) if err != nil { return } if len(parent.SubjectKeyId) > 0 { template.AuthorityKeyId = parent.SubjectKeyId } extensions, err := buildExtensions(template) if err != nil { return } encodedPublicKey := asn1.BitString{BitLength: len(asn1PublicKey) * 8, Bytes: asn1PublicKey} c := tbsCertificate{ Version: 2, SerialNumber: asn1.RawValue{Bytes: template.SerialNumber, Tag: 2}, SignatureAlgorithm: algorithmIdentifier{Algorithm: oidSHA1WithRSA}, Issuer: parent.Subject.toRDNSequence(), Validity: validity{template.NotBefore, template.NotAfter}, Subject: template.Subject.toRDNSequence(), PublicKey: publicKeyInfo{nil, algorithmIdentifier{Algorithm: oidRSA}, encodedPublicKey}, Extensions: extensions, } tbsCertContents, err := asn1.Marshal(c) if err != nil { return } c.Raw = tbsCertContents h := sha1.New() h.Write(tbsCertContents) digest := h.Sum() signature, err := rsa.SignPKCS1v15(rand, priv, crypto.SHA1, digest) if err != nil { return } cert, err = asn1.Marshal(certificate{ nil, c, algorithmIdentifier{Algorithm: oidSHA1WithRSA}, asn1.BitString{Bytes: signature, BitLength: len(signature) * 8}, }) return }
// MarshalPKCS1PrivateKey converts a private key to ASN.1 DER encoded form. func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte { key.Precompute() version := 0 if len(key.Primes) > 2 { version = 1 } priv := pkcs1PrivateKey{ Version: version, N: key.N, E: key.PublicKey.E, D: key.D, P: key.Primes[0], Q: key.Primes[1], Dp: key.Precomputed.Dp, Dq: key.Precomputed.Dq, Qinv: key.Precomputed.Qinv, } priv.AdditionalPrimes = make([]pkcs1AdditionalRSAPrime, len(key.Precomputed.CRTValues)) for i, values := range key.Precomputed.CRTValues { priv.AdditionalPrimes[i].Prime = key.Primes[2+i] priv.AdditionalPrimes[i].Exp = values.Exp priv.AdditionalPrimes[i].Coeff = values.Coeff } b, _ := asn1.Marshal(priv) return b }
// MarshalPKCS1PrivateKey converts a private key to ASN.1 DER encoded form. func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte { key.Precompute() version := 0 if len(key.Primes) > 2 { version = 1 } priv := pkcs1PrivateKey{ Version: version, N: rawValueForBig(key.N), E: key.PublicKey.E, D: rawValueForBig(key.D), P: rawValueForBig(key.Primes[0]), Q: rawValueForBig(key.Primes[1]), Dp: rawValueForBig(key.Precomputed.Dp), Dq: rawValueForBig(key.Precomputed.Dq), Qinv: rawValueForBig(key.Precomputed.Qinv), } priv.AdditionalPrimes = make([]pkcs1AdditionalRSAPrime, len(key.Precomputed.CRTValues)) for i, values := range key.Precomputed.CRTValues { priv.AdditionalPrimes[i].Prime = rawValueForBig(key.Primes[2+i]) priv.AdditionalPrimes[i].Exp = rawValueForBig(values.Exp) priv.AdditionalPrimes[i].Coeff = rawValueForBig(values.Coeff) } b, _ := asn1.Marshal(priv) return b }
func TestSNMPGetNextRequest(t *testing.T) { r := PDU{ RequestId: 199, ErrorStatus: 0, ErrorIndex: 0, VarBindList: []VarBind{ VarBind{ Name: []int{1, 3, 6, 1, 2, 1, 1, 1, 0}, Value: Null(), }, }, } data, err := asn1.Marshal(r) if err != nil { t.Error(err) } m := Message{ Version: 1, Community: NewOctetString("timer"), Data: Any(data), } data, err = asn1.Marshal(m) if err != nil { t.Error(err) } addr := net.UDPAddr{net.IPv4(192, 168, 1, 254), 161} conn, err := net.DialUDP("udp4", nil, &addr) if err != nil { t.Error(err) } defer conn.Close() written, err := conn.Write(data) if err != nil { t.Error(err) } if written != len(data) { t.Errorf("did not write the full data %d", written) } }
// MarshalPKCS1PrivateKey converts a private key to ASN.1 DER encoded form. func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte { priv := pkcs1PrivateKey{ Version: 1, N: asn1.RawValue{Tag: 2, Bytes: key.PublicKey.N.Bytes()}, E: key.PublicKey.E, D: asn1.RawValue{Tag: 2, Bytes: key.D.Bytes()}, P: asn1.RawValue{Tag: 2, Bytes: key.P.Bytes()}, Q: asn1.RawValue{Tag: 2, Bytes: key.Q.Bytes()}, } b, _ := asn1.Marshal(priv) return b }
func buildExtensions(template *Certificate) (ret []extension, err os.Error) { ret = make([]extension, 6 /* maximum number of elements. */) n := 0 if template.KeyUsage != 0 { ret[n].Id = oidExtensionKeyUsage ret[n].Critical = true var a [2]byte a[0] = reverseBitsInAByte(byte(template.KeyUsage)) a[1] = reverseBitsInAByte(byte(template.KeyUsage >> 8)) l := 1 if a[1] != 0 { l = 2 } ret[n].Value, err = asn1.Marshal(asn1.BitString{Bytes: a[0:l], BitLength: l * 8}) if err != nil { return } n++ } if template.BasicConstraintsValid { ret[n].Id = oidExtensionBasicConstraints ret[n].Value, err = asn1.Marshal(basicConstraints{template.IsCA, template.MaxPathLen}) ret[n].Critical = true if err != nil { return } n++ } if len(template.SubjectKeyId) > 0 { ret[n].Id = oidExtensionSubjectKeyId ret[n].Value, err = asn1.Marshal(template.SubjectKeyId) if err != nil { return } n++ } if len(template.AuthorityKeyId) > 0 { ret[n].Id = oidExtensionAuthorityKeyId ret[n].Value, err = asn1.Marshal(authKeyId{template.AuthorityKeyId}) if err != nil { return } n++ } if len(template.DNSNames) > 0 { ret[n].Id = oidExtensionSubjectAltName rawValues := make([]asn1.RawValue, len(template.DNSNames)) for i, name := range template.DNSNames { rawValues[i] = asn1.RawValue{Tag: 2, Class: 2, Bytes: []byte(name)} } ret[n].Value, err = asn1.Marshal(rawValues) if err != nil { return } n++ } if len(template.PolicyIdentifiers) > 0 { ret[n].Id = oidExtensionCertificatePolicies policies := make([]policyInformation, len(template.PolicyIdentifiers)) for i, policy := range template.PolicyIdentifiers { policies[i].Policy = policy } ret[n].Value, err = asn1.Marshal(policies) if err != nil { return } n++ } // Adding another extension here? Remember to update the maximum number // of elements in the make() at the top of the function. return ret[0:n], nil }