github.com/zntrio/harp/v2@v2.0.9/pkg/sdk/security/crypto/paseto/v4/helpers_test.go (about)

     1  // Licensed to Elasticsearch B.V. under one or more contributor
     2  // license agreements. See the NOTICE file distributed with
     3  // this work for additional information regarding copyright
     4  // ownership. Elasticsearch B.V. licenses this file to you under
     5  // the Apache License, Version 2.0 (the "License"); you may
     6  // not use this file except in compliance with the License.
     7  // You may obtain a copy of the License at
     8  //
     9  //     http://www.apache.org/licenses/LICENSE-2.0
    10  //
    11  // Unless required by applicable law or agreed to in writing,
    12  // software distributed under the License is distributed on an
    13  // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    14  // KIND, either express or implied.  See the License for the
    15  // specific language governing permissions and limitations
    16  // under the License.
    17  
    18  package v4
    19  
    20  import (
    21  	"crypto/ed25519"
    22  	"crypto/rand"
    23  	"encoding/hex"
    24  	"testing"
    25  
    26  	"github.com/stretchr/testify/assert"
    27  )
    28  
    29  // https://github.com/paseto-standard/test-vectors/blob/master/v4.json
    30  func Test_Paseto_LocalVector(t *testing.T) {
    31  	testCases := []struct {
    32  		name              string
    33  		expectFail        bool
    34  		key               string
    35  		nonce             string
    36  		token             string
    37  		payload           string
    38  		footer            string
    39  		implicitAssertion string
    40  	}{
    41  		{
    42  			name:              "4-E-1",
    43  			expectFail:        false,
    44  			key:               "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f",
    45  			nonce:             "0000000000000000000000000000000000000000000000000000000000000000",
    46  			token:             "v4.local.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAr68PS4AXe7If_ZgesdkUMvSwscFlAl1pk5HC0e8kApeaqMfGo_7OpBnwJOAbY9V7WU6abu74MmcUE8YWAiaArVI8XJ5hOb_4v9RmDkneN0S92dx0OW4pgy7omxgf3S8c3LlQg",
    47  			payload:           "{\"data\":\"this is a secret message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}",
    48  			footer:            "",
    49  			implicitAssertion: "",
    50  		},
    51  		{
    52  			name:              "4-E-2",
    53  			expectFail:        false,
    54  			key:               "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f",
    55  			nonce:             "0000000000000000000000000000000000000000000000000000000000000000",
    56  			token:             "v4.local.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAr68PS4AXe7If_ZgesdkUMvS2csCgglvpk5HC0e8kApeaqMfGo_7OpBnwJOAbY9V7WU6abu74MmcUE8YWAiaArVI8XIemu9chy3WVKvRBfg6t8wwYHK0ArLxxfZP73W_vfwt5A",
    57  			payload:           "{\"data\":\"this is a hidden message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}",
    58  			footer:            "",
    59  			implicitAssertion: "",
    60  		},
    61  		{
    62  			name:              "4-E-3",
    63  			expectFail:        false,
    64  			nonce:             "df654812bac492663825520ba2f6e67cf5ca5bdc13d4e7507a98cc4c2fcc3ad8",
    65  			key:               "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f",
    66  			token:             "v4.local.32VIErrEkmY4JVILovbmfPXKW9wT1OdQepjMTC_MOtjA4kiqw7_tcaOM5GNEcnTxl60WkwMsYXw6FSNb_UdJPXjpzm0KW9ojM5f4O2mRvE2IcweP-PRdoHjd5-RHCiExR1IK6t6-tyebyWG6Ov7kKvBdkrrAJ837lKP3iDag2hzUPHuMKA",
    67  			payload:           "{\"data\":\"this is a secret message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}",
    68  			footer:            "",
    69  			implicitAssertion: "",
    70  		},
    71  		{
    72  			name:              "4-E-4",
    73  			expectFail:        false,
    74  			nonce:             "df654812bac492663825520ba2f6e67cf5ca5bdc13d4e7507a98cc4c2fcc3ad8",
    75  			key:               "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f",
    76  			token:             "v4.local.32VIErrEkmY4JVILovbmfPXKW9wT1OdQepjMTC_MOtjA4kiqw7_tcaOM5GNEcnTxl60WiA8rd3wgFSNb_UdJPXjpzm0KW9ojM5f4O2mRvE2IcweP-PRdoHjd5-RHCiExR1IK6t4gt6TiLm55vIH8c_lGxxZpE3AWlH4WTR0v45nsWoU3gQ",
    77  			payload:           "{\"data\":\"this is a hidden message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}",
    78  			footer:            "",
    79  			implicitAssertion: "",
    80  		},
    81  		{
    82  			name:              "4-E-5",
    83  			expectFail:        false,
    84  			nonce:             "df654812bac492663825520ba2f6e67cf5ca5bdc13d4e7507a98cc4c2fcc3ad8",
    85  			key:               "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f",
    86  			token:             "v4.local.32VIErrEkmY4JVILovbmfPXKW9wT1OdQepjMTC_MOtjA4kiqw7_tcaOM5GNEcnTxl60WkwMsYXw6FSNb_UdJPXjpzm0KW9ojM5f4O2mRvE2IcweP-PRdoHjd5-RHCiExR1IK6t4x-RMNXtQNbz7FvFZ_G-lFpk5RG3EOrwDL6CgDqcerSQ.eyJraWQiOiJ6VmhNaVBCUDlmUmYyc25FY1Q3Z0ZUaW9lQTlDT2NOeTlEZmdMMVc2MGhhTiJ9",
    87  			payload:           "{\"data\":\"this is a secret message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}",
    88  			footer:            "{\"kid\":\"zVhMiPBP9fRf2snEcT7gFTioeA9COcNy9DfgL1W60haN\"}",
    89  			implicitAssertion: "",
    90  		},
    91  		{
    92  			name:              "4-E-6",
    93  			expectFail:        false,
    94  			nonce:             "df654812bac492663825520ba2f6e67cf5ca5bdc13d4e7507a98cc4c2fcc3ad8",
    95  			key:               "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f",
    96  			token:             "v4.local.32VIErrEkmY4JVILovbmfPXKW9wT1OdQepjMTC_MOtjA4kiqw7_tcaOM5GNEcnTxl60WiA8rd3wgFSNb_UdJPXjpzm0KW9ojM5f4O2mRvE2IcweP-PRdoHjd5-RHCiExR1IK6t6pWSA5HX2wjb3P-xLQg5K5feUCX4P2fpVK3ZLWFbMSxQ.eyJraWQiOiJ6VmhNaVBCUDlmUmYyc25FY1Q3Z0ZUaW9lQTlDT2NOeTlEZmdMMVc2MGhhTiJ9",
    97  			payload:           "{\"data\":\"this is a hidden message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}",
    98  			footer:            "{\"kid\":\"zVhMiPBP9fRf2snEcT7gFTioeA9COcNy9DfgL1W60haN\"}",
    99  			implicitAssertion: "",
   100  		},
   101  		{
   102  			name:              "4-E-7",
   103  			expectFail:        false,
   104  			nonce:             "df654812bac492663825520ba2f6e67cf5ca5bdc13d4e7507a98cc4c2fcc3ad8",
   105  			key:               "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f",
   106  			token:             "v4.local.32VIErrEkmY4JVILovbmfPXKW9wT1OdQepjMTC_MOtjA4kiqw7_tcaOM5GNEcnTxl60WkwMsYXw6FSNb_UdJPXjpzm0KW9ojM5f4O2mRvE2IcweP-PRdoHjd5-RHCiExR1IK6t40KCCWLA7GYL9KFHzKlwY9_RnIfRrMQpueydLEAZGGcA.eyJraWQiOiJ6VmhNaVBCUDlmUmYyc25FY1Q3Z0ZUaW9lQTlDT2NOeTlEZmdMMVc2MGhhTiJ9",
   107  			payload:           "{\"data\":\"this is a secret message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}",
   108  			footer:            "{\"kid\":\"zVhMiPBP9fRf2snEcT7gFTioeA9COcNy9DfgL1W60haN\"}",
   109  			implicitAssertion: "{\"test-vector\":\"4-E-7\"}",
   110  		},
   111  		{
   112  			name:              "4-E-8",
   113  			expectFail:        false,
   114  			nonce:             "df654812bac492663825520ba2f6e67cf5ca5bdc13d4e7507a98cc4c2fcc3ad8",
   115  			key:               "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f",
   116  			token:             "v4.local.32VIErrEkmY4JVILovbmfPXKW9wT1OdQepjMTC_MOtjA4kiqw7_tcaOM5GNEcnTxl60WiA8rd3wgFSNb_UdJPXjpzm0KW9ojM5f4O2mRvE2IcweP-PRdoHjd5-RHCiExR1IK6t5uvqQbMGlLLNYBc7A6_x7oqnpUK5WLvj24eE4DVPDZjw.eyJraWQiOiJ6VmhNaVBCUDlmUmYyc25FY1Q3Z0ZUaW9lQTlDT2NOeTlEZmdMMVc2MGhhTiJ9",
   117  			payload:           "{\"data\":\"this is a hidden message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}",
   118  			footer:            "{\"kid\":\"zVhMiPBP9fRf2snEcT7gFTioeA9COcNy9DfgL1W60haN\"}",
   119  			implicitAssertion: "{\"test-vector\":\"4-E-8\"}",
   120  		},
   121  		{
   122  			name:              "4-E-9",
   123  			expectFail:        false,
   124  			nonce:             "df654812bac492663825520ba2f6e67cf5ca5bdc13d4e7507a98cc4c2fcc3ad8",
   125  			key:               "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f",
   126  			token:             "v4.local.32VIErrEkmY4JVILovbmfPXKW9wT1OdQepjMTC_MOtjA4kiqw7_tcaOM5GNEcnTxl60WiA8rd3wgFSNb_UdJPXjpzm0KW9ojM5f4O2mRvE2IcweP-PRdoHjd5-RHCiExR1IK6t6tybdlmnMwcDMw0YxA_gFSE_IUWl78aMtOepFYSWYfQA.YXJiaXRyYXJ5LXN0cmluZy10aGF0LWlzbid0LWpzb24",
   127  			payload:           "{\"data\":\"this is a hidden message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}",
   128  			footer:            "arbitrary-string-that-isn't-json",
   129  			implicitAssertion: "{\"test-vector\":\"4-E-9\"}",
   130  		},
   131  	}
   132  
   133  	// For each testcase
   134  	for _, tc := range testCases {
   135  		testCase := tc
   136  		t.Run(testCase.name, func(t *testing.T) {
   137  			// Decode input
   138  			key, err := hex.DecodeString(testCase.key)
   139  			assert.NoError(t, err)
   140  			n, err := hex.DecodeString(testCase.nonce)
   141  			assert.NoError(t, err)
   142  
   143  			// Encrypt
   144  			token, err := encrypt(key, n, []byte(testCase.payload), testCase.footer, testCase.implicitAssertion)
   145  			if (err != nil) != testCase.expectFail {
   146  				t.Errorf("error during the encrypt call, error = %v, wantErr %v", err, testCase.expectFail)
   147  				return
   148  			}
   149  			assert.Equal(t, testCase.token, string(token))
   150  
   151  			// Decrypt
   152  			message, err := Decrypt(key, []byte(testCase.token), testCase.footer, testCase.implicitAssertion)
   153  			if (err != nil) != testCase.expectFail {
   154  				t.Errorf("error during the decrypt call, error = %v, wantErr %v", err, testCase.expectFail)
   155  				return
   156  			}
   157  			assert.Equal(t, testCase.payload, string(message))
   158  		})
   159  	}
   160  }
   161  
   162  // https://github.com/paseto-standard/test-vectors/blob/master/v4.json
   163  func Test_Paseto_PublicVector(t *testing.T) {
   164  	testCases := []struct {
   165  		name              string
   166  		expectFail        bool
   167  		publicKey         string
   168  		secretKey         string
   169  		secretKeySeed     string
   170  		secretKeyPem      string
   171  		publicKeyPem      string
   172  		token             string
   173  		payload           string
   174  		footer            string
   175  		implicitAssertion string
   176  	}{
   177  		{
   178  			name:              "4-S-1",
   179  			expectFail:        false,
   180  			publicKey:         "1eb9dbbbbc047c03fd70604e0071f0987e16b28b757225c11f00415d0e20b1a2",
   181  			secretKey:         "b4cbfb43df4ce210727d953e4a713307fa19bb7d9f85041438d9e11b942a37741eb9dbbbbc047c03fd70604e0071f0987e16b28b757225c11f00415d0e20b1a2",
   182  			secretKeySeed:     "b4cbfb43df4ce210727d953e4a713307fa19bb7d9f85041438d9e11b942a3774",
   183  			secretKeyPem:      "-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEILTL+0PfTOIQcn2VPkpxMwf6Gbt9n4UEFDjZ4RuUKjd0\n-----END PRIVATE KEY-----",
   184  			publicKeyPem:      "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAHrnbu7wEfAP9cGBOAHHwmH4Wsot1ciXBHwBBXQ4gsaI=\n-----END PUBLIC KEY-----",
   185  			token:             "v4.public.eyJkYXRhIjoidGhpcyBpcyBhIHNpZ25lZCBtZXNzYWdlIiwiZXhwIjoiMjAyMi0wMS0wMVQwMDowMDowMCswMDowMCJ9bg_XBBzds8lTZShVlwwKSgeKpLT3yukTw6JUz3W4h_ExsQV-P0V54zemZDcAxFaSeef1QlXEFtkqxT1ciiQEDA",
   186  			payload:           "{\"data\":\"this is a signed message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}",
   187  			footer:            "",
   188  			implicitAssertion: "",
   189  		},
   190  		{
   191  			name:              "4-S-2",
   192  			expectFail:        false,
   193  			publicKey:         "1eb9dbbbbc047c03fd70604e0071f0987e16b28b757225c11f00415d0e20b1a2",
   194  			secretKey:         "b4cbfb43df4ce210727d953e4a713307fa19bb7d9f85041438d9e11b942a37741eb9dbbbbc047c03fd70604e0071f0987e16b28b757225c11f00415d0e20b1a2",
   195  			secretKeySeed:     "b4cbfb43df4ce210727d953e4a713307fa19bb7d9f85041438d9e11b942a3774",
   196  			secretKeyPem:      "-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEILTL+0PfTOIQcn2VPkpxMwf6Gbt9n4UEFDjZ4RuUKjd0\n-----END PRIVATE KEY-----",
   197  			publicKeyPem:      "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAHrnbu7wEfAP9cGBOAHHwmH4Wsot1ciXBHwBBXQ4gsaI=\n-----END PUBLIC KEY-----",
   198  			token:             "v4.public.eyJkYXRhIjoidGhpcyBpcyBhIHNpZ25lZCBtZXNzYWdlIiwiZXhwIjoiMjAyMi0wMS0wMVQwMDowMDowMCswMDowMCJ9v3Jt8mx_TdM2ceTGoqwrh4yDFn0XsHvvV_D0DtwQxVrJEBMl0F2caAdgnpKlt4p7xBnx1HcO-SPo8FPp214HDw.eyJraWQiOiJ6VmhNaVBCUDlmUmYyc25FY1Q3Z0ZUaW9lQTlDT2NOeTlEZmdMMVc2MGhhTiJ9",
   199  			payload:           "{\"data\":\"this is a signed message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}",
   200  			footer:            "{\"kid\":\"zVhMiPBP9fRf2snEcT7gFTioeA9COcNy9DfgL1W60haN\"}",
   201  			implicitAssertion: "",
   202  		},
   203  		{
   204  			name:              "4-S-3",
   205  			expectFail:        false,
   206  			publicKey:         "1eb9dbbbbc047c03fd70604e0071f0987e16b28b757225c11f00415d0e20b1a2",
   207  			secretKey:         "b4cbfb43df4ce210727d953e4a713307fa19bb7d9f85041438d9e11b942a37741eb9dbbbbc047c03fd70604e0071f0987e16b28b757225c11f00415d0e20b1a2",
   208  			secretKeySeed:     "b4cbfb43df4ce210727d953e4a713307fa19bb7d9f85041438d9e11b942a3774",
   209  			secretKeyPem:      "-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEILTL+0PfTOIQcn2VPkpxMwf6Gbt9n4UEFDjZ4RuUKjd0\n-----END PRIVATE KEY-----",
   210  			publicKeyPem:      "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAHrnbu7wEfAP9cGBOAHHwmH4Wsot1ciXBHwBBXQ4gsaI=\n-----END PUBLIC KEY-----",
   211  			token:             "v4.public.eyJkYXRhIjoidGhpcyBpcyBhIHNpZ25lZCBtZXNzYWdlIiwiZXhwIjoiMjAyMi0wMS0wMVQwMDowMDowMCswMDowMCJ9NPWciuD3d0o5eXJXG5pJy-DiVEoyPYWs1YSTwWHNJq6DZD3je5gf-0M4JR9ipdUSJbIovzmBECeaWmaqcaP0DQ.eyJraWQiOiJ6VmhNaVBCUDlmUmYyc25FY1Q3Z0ZUaW9lQTlDT2NOeTlEZmdMMVc2MGhhTiJ9",
   212  			payload:           "{\"data\":\"this is a signed message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}",
   213  			footer:            "{\"kid\":\"zVhMiPBP9fRf2snEcT7gFTioeA9COcNy9DfgL1W60haN\"}",
   214  			implicitAssertion: "{\"test-vector\":\"4-S-3\"}",
   215  		},
   216  	}
   217  
   218  	// For each testcase
   219  	for _, tc := range testCases {
   220  		testCase := tc
   221  		t.Run(testCase.name, func(t *testing.T) {
   222  			// Decode input
   223  			publicKey, err := hex.DecodeString(testCase.publicKey)
   224  			assert.NoError(t, err)
   225  			secretKey, err := hex.DecodeString(testCase.secretKey)
   226  			assert.NoError(t, err)
   227  			secretKeySeed, err := hex.DecodeString(testCase.secretKeySeed)
   228  			assert.NoError(t, err)
   229  
   230  			// Generate ed25519 key pair
   231  			sk := ed25519.NewKeyFromSeed(secretKeySeed)
   232  			assert.Equal(t, secretKey, []byte(sk))
   233  			pk := sk.Public().(ed25519.PublicKey)
   234  			assert.Equal(t, publicKey, []byte(pk))
   235  
   236  			// Sign
   237  			token, err := Sign([]byte(testCase.payload), sk, testCase.footer, testCase.implicitAssertion)
   238  			if (err != nil) != testCase.expectFail {
   239  				t.Errorf("error during the sign call, error = %v, wantErr %v", err, testCase.expectFail)
   240  				return
   241  			}
   242  			assert.Equal(t, testCase.token, string(token))
   243  
   244  			// Verify
   245  			message, err := Verify([]byte(testCase.token), pk, testCase.footer, testCase.implicitAssertion)
   246  			if (err != nil) != testCase.expectFail {
   247  				t.Errorf("error during the verify call, error = %v, wantErr %v", err, testCase.expectFail)
   248  				return
   249  			}
   250  			assert.Equal(t, testCase.payload, string(message))
   251  		})
   252  	}
   253  }
   254  
   255  func Test_Paseto_Local_EncryptDecrypt(t *testing.T) {
   256  	key, err := hex.DecodeString("707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f")
   257  	assert.NoError(t, err)
   258  
   259  	m := []byte("{\"data\":\"this is a signed message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}")
   260  	f := "{\"kid\":\"zVhMiPBP9fRf2snEcT7gFTioeA9COcNy9DfgL1W60haN\"}"
   261  	i := "{\"test-vector\":\"4-S-3\"}"
   262  
   263  	token1, err := Encrypt(rand.Reader, key, m, f, i)
   264  	assert.NoError(t, err)
   265  	assert.NotEmpty(t, token1)
   266  
   267  	token2, err := Encrypt(rand.Reader, key, m, f, i)
   268  	assert.NoError(t, err)
   269  	assert.NotEmpty(t, token2)
   270  
   271  	assert.NotEqual(t, token1, token2)
   272  
   273  	p, err := Decrypt(key, token1, f, i)
   274  	assert.NoError(t, err)
   275  	assert.Equal(t, m, p)
   276  }
   277  
   278  // -----------------------------------------------------------------------------
   279  
   280  func benchmarkEncrypt(key, m []byte, f, i string, b *testing.B) {
   281  	for n := 0; n < b.N; n++ {
   282  		_, err := Encrypt(rand.Reader, key, m, f, i)
   283  		if err != nil {
   284  			b.Fatal(err)
   285  		}
   286  	}
   287  }
   288  
   289  func Benchmark_Paseto_Encrypt(b *testing.B) {
   290  	key, err := hex.DecodeString("707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f")
   291  	assert.NoError(b, err)
   292  
   293  	m := []byte("{\"data\":\"this is a signed message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}")
   294  	f := "{\"kid\":\"zVhMiPBP9fRf2snEcT7gFTioeA9COcNy9DfgL1W60haN\"}"
   295  	i := "{\"test-vector\":\"4-S-3\"}"
   296  
   297  	b.ReportAllocs()
   298  	b.ResetTimer()
   299  
   300  	benchmarkEncrypt(key, m, f, i, b)
   301  }
   302  
   303  func benchmarkDecrypt(key, m []byte, f, i string, b *testing.B) {
   304  	for n := 0; n < b.N; n++ {
   305  		_, err := Decrypt(key, m, f, i)
   306  		if err != nil {
   307  			b.Fatal(err)
   308  		}
   309  	}
   310  }
   311  
   312  func Benchmark_Paseto_Decrypt(b *testing.B) {
   313  	key, err := hex.DecodeString("707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f")
   314  	assert.NoError(b, err)
   315  
   316  	m := []byte("v4.local.32VIErrEkmY4JVILovbmfPXKW9wT1OdQepjMTC_MOtjA4kiqw7_tcaOM5GNEcnTxl60WiA8rd3wgFSNb_UdJPXjpzm0KW9ojM5f4O2mRvE2IcweP-PRdoHjd5-RHCiExR1IK6t5uvqQbMGlLLNYBc7A6_x7oqnpUK5WLvj24eE4DVPDZjw.eyJraWQiOiJ6VmhNaVBCUDlmUmYyc25FY1Q3Z0ZUaW9lQTlDT2NOeTlEZmdMMVc2MGhhTiJ9")
   317  	f := "{\"kid\":\"zVhMiPBP9fRf2snEcT7gFTioeA9COcNy9DfgL1W60haN\"}"
   318  	i := "{\"test-vector\":\"4-E-8\"}"
   319  
   320  	b.ReportAllocs()
   321  	b.ResetTimer()
   322  
   323  	benchmarkDecrypt(key, m, f, i, b)
   324  }
   325  
   326  func benchmarkSign(m []byte, sk ed25519.PrivateKey, f, i string, b *testing.B) {
   327  	for n := 0; n < b.N; n++ {
   328  		_, err := Sign(m, sk, f, i)
   329  		if err != nil {
   330  			b.Fatal(err)
   331  		}
   332  	}
   333  }
   334  
   335  func Benchmark_Paseto_Sign(b *testing.B) {
   336  	sk, err := hex.DecodeString("b4cbfb43df4ce210727d953e4a713307fa19bb7d9f85041438d9e11b942a37741eb9dbbbbc047c03fd70604e0071f0987e16b28b757225c11f00415d0e20b1a2")
   337  	assert.NoError(b, err)
   338  
   339  	m := []byte("{\"data\":\"this is a signed message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}")
   340  	f := "{\"kid\":\"zVhMiPBP9fRf2snEcT7gFTioeA9COcNy9DfgL1W60haN\"}"
   341  	i := "{\"test-vector\":\"4-S-3\"}"
   342  
   343  	b.ReportAllocs()
   344  	b.ResetTimer()
   345  
   346  	benchmarkSign(m, sk, f, i, b)
   347  }
   348  
   349  func benchmarkVerify(m []byte, pk ed25519.PublicKey, f, i string, b *testing.B) {
   350  	for n := 0; n < b.N; n++ {
   351  		_, err := Verify(m, pk, f, i)
   352  		if err != nil {
   353  			b.Fatal(err)
   354  		}
   355  	}
   356  }
   357  
   358  func Benchmark_Paseto_Verify(b *testing.B) {
   359  	pk, err := hex.DecodeString("1eb9dbbbbc047c03fd70604e0071f0987e16b28b757225c11f00415d0e20b1a2")
   360  	assert.NoError(b, err)
   361  
   362  	token := []byte("v4.public.eyJkYXRhIjoidGhpcyBpcyBhIHNpZ25lZCBtZXNzYWdlIiwiZXhwIjoiMjAyMi0wMS0wMVQwMDowMDowMCswMDowMCJ9NPWciuD3d0o5eXJXG5pJy-DiVEoyPYWs1YSTwWHNJq6DZD3je5gf-0M4JR9ipdUSJbIovzmBECeaWmaqcaP0DQ.eyJraWQiOiJ6VmhNaVBCUDlmUmYyc25FY1Q3Z0ZUaW9lQTlDT2NOeTlEZmdMMVc2MGhhTiJ9")
   363  	f := "{\"kid\":\"zVhMiPBP9fRf2snEcT7gFTioeA9COcNy9DfgL1W60haN\"}"
   364  	i := "{\"test-vector\":\"4-S-3\"}"
   365  
   366  	b.ReportAllocs()
   367  	b.ResetTimer()
   368  
   369  	benchmarkVerify(token, pk, f, i, b)
   370  }