github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/pkg/crypto/ed25519_test.go (about)

     1  // Copyright 2017-2021 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package crypto
     6  
     7  import (
     8  	"os"
     9  	"path"
    10  	"testing"
    11  
    12  	"golang.org/x/crypto/ed25519"
    13  )
    14  
    15  const (
    16  	// publicKeyDERFile is a RSA public key in DER format
    17  	publicKeyDERFile string = "tests/public_key.der"
    18  	// publicKeyPEMFile is a RSA public key in PEM format
    19  	publicKeyPEMFile string = "tests/public_key.pem"
    20  	// privateKeyPEMFile is a RSA public key in PEM format
    21  	privateKeyPEMFile string = "tests/private_key.pem"
    22  	// testDataFile which should be verified by the good signature
    23  	testDataFile string = "tests/data"
    24  	// signatureGoodFile is a good signature of testDataFile
    25  	signatureGoodFile string = "tests/verify_rsa_pkcs15_sha256.signature"
    26  	// signatureBadFile is a bad signature which does not work with testDataFile
    27  	signatureBadFile string = "tests/verify_rsa_pkcs15_sha256.signature2"
    28  )
    29  
    30  // password is a PEM encrypted passphrase
    31  var password = []byte{'k', 'e', 'i', 'n', 's'}
    32  
    33  func TestLoadDERPublicKey(t *testing.T) {
    34  	if _, err := LoadPublicKeyFromFile(publicKeyDERFile); err == nil {
    35  		t.Errorf(`LoadPublicKeyFromFile(publicKeyDERFile) = _, %v, want not nil`, err)
    36  	}
    37  }
    38  
    39  func TestLoadPEMPublicKey(t *testing.T) {
    40  	if _, err := LoadPublicKeyFromFile(publicKeyPEMFile); err != nil {
    41  		t.Errorf(`LoadPublicKeyFromFile(publicKeyPEMFile) = _, %v, want nil`, err)
    42  	}
    43  }
    44  
    45  func TestLoadPEMPrivateKey(t *testing.T) {
    46  	if _, err := LoadPrivateKeyFromFile(privateKeyPEMFile, password); err != nil {
    47  		t.Errorf(`LoadPublicKeyFromFile(privateKeyPEMFile) = _, %v, want nil`, err)
    48  	}
    49  }
    50  
    51  func TestLoadBadPEMPrivateKey(t *testing.T) {
    52  	if _, err := LoadPrivateKeyFromFile(privateKeyPEMFile, []byte{}); err == nil {
    53  		t.Errorf(`LoadPrivateKeyFromFile(privateKeyPEMFile, []byte{}) = _, %v, want not nil`, err)
    54  	}
    55  }
    56  
    57  func TestSignVerifyData(t *testing.T) {
    58  	privateKey, err := LoadPrivateKeyFromFile(privateKeyPEMFile, password)
    59  	if err != nil {
    60  		t.Errorf(`LoadPrivateKeyFromFile(privateKeyPEMFile, password) = _, %v, want nil`, err)
    61  	}
    62  
    63  	publicKey, err := LoadPublicKeyFromFile(publicKeyPEMFile)
    64  	if err != nil {
    65  		t.Errorf(`LoadPublicKeyFromFile(publicKeyPEMFile) = _, %v, want nil`, err)
    66  	}
    67  
    68  	testData, err := os.ReadFile(testDataFile)
    69  	if err != nil {
    70  		t.Errorf(`os.ReadFile(testDataFile) = _, %v, want nil`, err)
    71  	}
    72  
    73  	signature := ed25519.Sign(privateKey, testData)
    74  	if verified := ed25519.Verify(publicKey, testData, signature); !verified {
    75  		t.Errorf(`ed25519.Verify(publicKey, testData, signature) = %t, want "true"`, verified)
    76  	}
    77  }
    78  
    79  func TestGoodSignature(t *testing.T) {
    80  	publicKey, err := LoadPublicKeyFromFile(publicKeyPEMFile)
    81  	if err != nil {
    82  		t.Errorf(`LoadPublicKeyFromFile(publicKeyPEMFile) = _, %v, want nil`, err)
    83  	}
    84  
    85  	testData, err := os.ReadFile(testDataFile)
    86  	if err != nil {
    87  		t.Errorf(`os.ReadFile(testDataFile) = _, %v, want nil`, err)
    88  	}
    89  
    90  	signatureGood, err := os.ReadFile(signatureGoodFile)
    91  	if err != nil {
    92  		t.Errorf(`os.ReadFile(signatureGoodFile) = _, %v, want nil`, err)
    93  	}
    94  
    95  	if verified := ed25519.Verify(publicKey, testData, signatureGood); !verified {
    96  		t.Errorf(`ed25519.Verify(publicKey, testData, signatureGood) = %t, want "true"`, verified)
    97  	}
    98  }
    99  
   100  func TestBadSignature(t *testing.T) {
   101  	publicKey, err := LoadPublicKeyFromFile(publicKeyPEMFile)
   102  	if err != nil {
   103  		t.Errorf(`LoadPublicKeyFromFile(publicKeyPEMFile) = _, %v, want nil`, err)
   104  	}
   105  
   106  	testData, err := os.ReadFile(testDataFile)
   107  	if err != nil {
   108  		t.Errorf(`os.ReadFile(testDataFile) = _, %v, want nil`, err)
   109  	}
   110  
   111  	signatureBad, err := os.ReadFile(signatureBadFile)
   112  	if err != nil {
   113  		t.Errorf(`os.ReadFile(signatureBadFile) = _, %v, want nil`, err)
   114  	}
   115  
   116  	if verified := ed25519.Verify(publicKey, testData, signatureBad); verified {
   117  		t.Errorf(`ed25519.Verify(publicKey, testData, signatureBad) = %t, want "false"`, verified)
   118  	}
   119  }
   120  
   121  func TestGenerateKeys(t *testing.T) {
   122  	tmpdir := t.TempDir()
   123  	if err := GeneratED25519Key(password, path.Join(tmpdir, "private_key.pem"), path.Join(tmpdir, "public_key.pem")); err != nil {
   124  		t.Errorf(`GeneratED25519Key(password, path.Join(tmpdir, "private_key.pem"), path.Join(tmpdir, "public_key.pem")) = %v, want nil`, err)
   125  	}
   126  }
   127  
   128  func TestGenerateUnprotectedKeys(t *testing.T) {
   129  	tmpdir := t.TempDir()
   130  	if err := GeneratED25519Key(nil, path.Join(tmpdir, "private_key.pem"), path.Join(tmpdir, "public_key.pem")); err != nil {
   131  		t.Errorf(`GeneratED25519Key(nil, path.Join(tmpdir, "private_key.pem"), path.Join(tmpdir, "public_key.pem")) = %v, want nil`, err)
   132  	}
   133  }