gmsm/pkcs7
2025-01-22 10:28:01 +08:00
..
ber_test.go pkcs7: sync with upstream 2025-01-16 16:04:45 +08:00
ber.go pkcs7: sync with upstream 2025-01-16 16:04:45 +08:00
decrypt_test.go pkcs7: support GetRecipients #252 2024-09-30 08:26:42 +08:00
decrypt.go pkcs7: provide session interface #276 2024-11-21 17:35:23 +08:00
encrypt_test.go pkcs7: support GetRecipients #252 2024-09-30 08:26:42 +08:00
encrypt.go pkcs: refactoring, extract pbes2 from pkcs8 2024-07-04 17:29:44 +08:00
envelope_test.go pkcs7: fallback change 2024-12-09 20:05:39 +08:00
envelope.go zuc: add comments 2024-11-22 08:33:24 +08:00
gm_test.go internal/cryptotest: add tests for the hash.Hash cipher.BlockMode cipher.Block interfaces 2024-08-02 13:02:25 +08:00
LICENSE merge pkcs7 2023-03-09 11:45:39 +08:00
pkcs7_test.go pkcs7: sync with upstream 2025-01-16 16:04:45 +08:00
pkcs7.go pkcs7: provide session interface #276 2024-11-21 17:35:23 +08:00
README.md merge pkcs7 2023-03-09 11:45:39 +08:00
session.go pkcs7: update comments #276 2024-11-21 17:53:35 +08:00
sign_enveloped_test.go pkcs7: code review and refactor 2024-12-20 08:34:32 +08:00
sign_enveloped.go pkcs7: sign precomputed digest #294 2025-01-14 16:41:03 +08:00
sign_test.go improve test coverage and remove deprecated methods 2025-01-22 10:28:01 +08:00
sign.go pkcs7: update comments and document 2025-01-16 10:59:30 +08:00
verify_test.go improve test coverage and remove deprecated methods 2025-01-22 10:28:01 +08:00
verify.go pkcs7: sync with upstream 2025-01-16 16:04:45 +08:00

pkcs7 implements parsing and creating signed and enveloped messages.

package main

import (
	"bytes"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"fmt"
	"os"

    "github.com/emmansun/gmsm/pkcs7"
)

func SignAndDetach(content []byte, cert *x509.Certificate, privkey *rsa.PrivateKey) (signed []byte, err error) {
	toBeSigned, err := NewSignedData(content)
	if err != nil {
		err = fmt.Errorf("Cannot initialize signed data: %s", err)
		return
	}
	if err = toBeSigned.AddSigner(cert, privkey, SignerInfoConfig{}); err != nil {
		err = fmt.Errorf("Cannot add signer: %s", err)
		return
	}

	// Detach signature, omit if you want an embedded signature
	toBeSigned.Detach()

	signed, err = toBeSigned.Finish()
	if err != nil {
		err = fmt.Errorf("Cannot finish signing data: %s", err)
		return
	}

	// Verify the signature
	pem.Encode(os.Stdout, &pem.Block{Type: "PKCS7", Bytes: signed})
	p7, err := pkcs7.Parse(signed)
	if err != nil {
		err = fmt.Errorf("Cannot parse our signed data: %s", err)
		return
	}

	// since the signature was detached, reattach the content here
	p7.Content = content

	if bytes.Compare(content, p7.Content) != 0 {
		err = fmt.Errorf("Our content was not in the parsed data:\n\tExpected: %s\n\tActual: %s", content, p7.Content)
		return
	}
	if err = p7.Verify(); err != nil {
		err = fmt.Errorf("Cannot verify our signed data: %s", err)
		return
	}

	return signed, nil
}

Credits

This is a fork of mozilla-services/pkcs7