func (c *Certificate) MarshalJSON() ([]byte, error) { // Fill out the certificate jc := new(jsonCertificate) jc.Version = c.Version jc.SerialNumber = c.SerialNumber.String() jc.SignatureAlgorithm = c.SignatureAlgorithm jc.Issuer = c.Issuer jc.IssuerDN = c.Issuer.String() jc.Validity.NotBefore = c.NotBefore jc.Validity.NotAfter = c.NotAfter jc.Subject = c.Subject jc.SubjectDN = c.Subject.String() jc.SubjectKeyInfo.KeyAlgorithm = c.PublicKeyAlgorithm // Pull out the key keyMap := make(map[string]interface{}) switch key := c.PublicKey.(type) { case *rsa.PublicKey: rsaKey := new(keys.RSAPublicKey) rsaKey.PublicKey = key jc.SubjectKeyInfo.RSAPublicKey = rsaKey case *dsa.PublicKey: keyMap["p"] = key.P.Bytes() keyMap["q"] = key.Q.Bytes() keyMap["g"] = key.G.Bytes() keyMap["y"] = key.Y.Bytes() jc.SubjectKeyInfo.DSAPublicKey = keyMap case *ecdsa.PublicKey: params := key.Params() keyMap["p"] = params.P.Bytes() keyMap["n"] = params.N.Bytes() keyMap["b"] = params.B.Bytes() keyMap["gx"] = params.Gx.Bytes() keyMap["gy"] = params.Gy.Bytes() keyMap["x"] = key.X.Bytes() keyMap["y"] = key.Y.Bytes() jc.SubjectKeyInfo.ECDSAPublicKey = keyMap } jc.Extensions, jc.UnknownExtensions = c.jsonifyExtensions() // TODO: Handle the fact this might not match jc.Signature.SignatureAlgorithm = jc.SignatureAlgorithm jc.Signature.Value = c.Signature jc.Signature.Valid = c.validSignature if c.Subject.CommonName == c.Issuer.CommonName { jc.Signature.SelfSigned = true } jc.FingerprintMD5 = c.FingerprintMD5 jc.FingerprintSHA1 = c.FingerprintSHA1 jc.FingerprintSHA256 = c.FingerprintSHA256 return json.Marshal(jc) }
func (ka *rsaKeyAgreement) RSAParams() *keys.RSAPublicKey { out := new(keys.RSAPublicKey) out.PublicKey = ka.publicKey return out }