+
+type PrivateKeyReverseDigest struct {
+ Prv *PrivateKey
+}
+
+func (prv *PrivateKeyReverseDigest) Public() crypto.PublicKey {
+ return prv.Prv.Public()
+}
+
+func (prv *PrivateKeyReverseDigest) Sign(
+ rand io.Reader, digest []byte, opts crypto.SignerOpts,
+) ([]byte, error) {
+ dgst := make([]byte, len(digest))
+ for i := 0; i < len(digest); i++ {
+ dgst[i] = digest[len(digest)-i-1]
+ }
+ return prv.Prv.Sign(rand, dgst, opts)
+}
+
+type PrivateKeyReverseDigestAndSignature struct {
+ Prv *PrivateKey
+}
+
+func (prv *PrivateKeyReverseDigestAndSignature) Public() crypto.PublicKey {
+ return prv.Prv.Public()
+}
+
+func (prv *PrivateKeyReverseDigestAndSignature) Sign(
+ rand io.Reader, digest []byte, opts crypto.SignerOpts,
+) ([]byte, error) {
+ dgst := make([]byte, len(digest))
+ for i := 0; i < len(digest); i++ {
+ dgst[i] = digest[len(digest)-i-1]
+ }
+ sign, err := prv.Prv.Sign(rand, dgst, opts)
+ if err != nil {
+ return sign, err
+ }
+ reverse(sign)
+ return sign, err
+}