Benchmark demonstration program for mbed TLS. The canonical source for this example lives at https://github.com/ARMmbed/mbed-os-example-tls

Mbed TLS Benchmark example on Mbed OS

This application benchmarks the various cryptographic primitives offered by Mbed TLS.

Getting started

Building with Mbed CLI

If you'd like to use Mbed CLI to build this, then you should set up your environment if you have not done so already. For instructions, refer to the main readme. The instructions on this page relate to using the developer.mbed.org Online Compiler

Import the program in to the Online Compiler, select your board from the drop down in the top right hand corner and then compile the application. Once it has built, you can drag and drop the binary onto your device.

Monitoring the application

The output in the terminal window should be similar to this:

terminal output

  SHA-256                  :       1673 Kb/s,         70 cycles/byte
  SHA-512                  :        546 Kb/s,        215 cycles/byte
  AES-CBC-128              :       1428 Kb/s,         82 cycles/byte
  AES-CBC-192              :       1260 Kb/s,         93 cycles/byte
  AES-CBC-256              :       1127 Kb/s,        104 cycles/byte
  AES-GCM-128              :        486 Kb/s,        242 cycles/byte
  AES-GCM-192              :        464 Kb/s,        253 cycles/byte
  AES-GCM-256              :        445 Kb/s,        264 cycles/byte
  AES-CCM-128              :        610 Kb/s,        192 cycles/byte
  AES-CCM-192              :        547 Kb/s,        214 cycles/byte
  AES-CCM-256              :        496 Kb/s,        237 cycles/byte
  CTR_DRBG (NOPR)          :       1139 Kb/s,        102 cycles/byte
  CTR_DRBG (PR)            :        826 Kb/s,        142 cycles/byte
  HMAC_DRBG SHA-256 (NOPR) :        193 Kb/s,        611 cycles/byte
  HMAC_DRBG SHA-256 (PR)   :        170 Kb/s,        695 cycles/byte
  RSA-2048                 :      28 ms/ public
  RSA-2048                 :     953 ms/private
  RSA-4096                 :      93 ms/ public
  RSA-4096                 :    5327 ms/private
  ECDSA-secp384r1          :     451 ms/sign
  ECDSA-secp256r1          :     304 ms/sign
  ECDSA-secp384r1          :     863 ms/verify
  ECDSA-secp256r1          :     594 ms/verify
  ECDHE-secp384r1          :     829 ms/handshake
  ECDHE-secp256r1          :     566 ms/handshake
  ECDHE-Curve25519         :     533 ms/handshake
  ECDH-secp384r1           :     407 ms/handshake
  ECDH-secp256r1           :     281 ms/handshake
  ECDH-Curve25519          :     268 ms/handshake

DONE
Committer:
mbed_official
Date:
Mon Feb 25 16:42:04 2019 +0000
Revision:
88:9be7879f1fb5
Parent:
83:c40c51a46813
Child:
89:2d5255b9d6c5
Merge pull request #235 from adbridge/master

All the CI tests have passed.
Updating mbed-os to mbed-os-5.11.5
.
Commit copied from https://github.com/ARMmbed/mbed-os-example-tls

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Janos Follath 0:1f7c5025e59d 1 /*
Janos Follath 0:1f7c5025e59d 2 * Benchmark demonstration program
Janos Follath 0:1f7c5025e59d 3 *
mbed_official 70:72c865037f5d 4 * Copyright (C) 2006-2018, Arm Limited, All Rights Reserved
Janos Follath 0:1f7c5025e59d 5 * SPDX-License-Identifier: Apache-2.0
Janos Follath 0:1f7c5025e59d 6 *
Janos Follath 0:1f7c5025e59d 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
Janos Follath 0:1f7c5025e59d 8 * not use this file except in compliance with the License.
Janos Follath 0:1f7c5025e59d 9 * You may obtain a copy of the License at
Janos Follath 0:1f7c5025e59d 10 *
Janos Follath 0:1f7c5025e59d 11 * http://www.apache.org/licenses/LICENSE-2.0
Janos Follath 0:1f7c5025e59d 12 *
Janos Follath 0:1f7c5025e59d 13 * Unless required by applicable law or agreed to in writing, software
Janos Follath 0:1f7c5025e59d 14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
Janos Follath 0:1f7c5025e59d 15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Janos Follath 0:1f7c5025e59d 16 * See the License for the specific language governing permissions and
Janos Follath 0:1f7c5025e59d 17 * limitations under the License.
Janos Follath 0:1f7c5025e59d 18 */
Janos Follath 0:1f7c5025e59d 19
Janos Follath 0:1f7c5025e59d 20 #include "mbed.h"
Janos Follath 0:1f7c5025e59d 21
Janos Follath 0:1f7c5025e59d 22 #if !defined(MBEDTLS_CONFIG_FILE)
Janos Follath 0:1f7c5025e59d 23 #include "mbedtls/config.h"
Janos Follath 0:1f7c5025e59d 24 #else
Janos Follath 0:1f7c5025e59d 25 #include MBEDTLS_CONFIG_FILE
mbed_official 78:5f419e0f96dd 26 #endif /* MBEDTLS_CONFIG_FILE */
Janos Follath 0:1f7c5025e59d 27
Janos Follath 0:1f7c5025e59d 28 #include "mbedtls/platform.h"
Janos Follath 0:1f7c5025e59d 29 #include "mbedtls/md4.h"
Janos Follath 0:1f7c5025e59d 30 #include "mbedtls/md5.h"
Janos Follath 0:1f7c5025e59d 31 #include "mbedtls/ripemd160.h"
Janos Follath 0:1f7c5025e59d 32 #include "mbedtls/sha1.h"
Janos Follath 0:1f7c5025e59d 33 #include "mbedtls/sha256.h"
Janos Follath 0:1f7c5025e59d 34 #include "mbedtls/sha512.h"
Janos Follath 0:1f7c5025e59d 35 #include "mbedtls/arc4.h"
Janos Follath 0:1f7c5025e59d 36 #include "mbedtls/des.h"
Janos Follath 0:1f7c5025e59d 37 #include "mbedtls/aes.h"
mbed_official 11:6ccae3ebafd5 38 #include "mbedtls/cmac.h"
Janos Follath 0:1f7c5025e59d 39 #include "mbedtls/blowfish.h"
Janos Follath 0:1f7c5025e59d 40 #include "mbedtls/camellia.h"
Janos Follath 0:1f7c5025e59d 41 #include "mbedtls/gcm.h"
Janos Follath 0:1f7c5025e59d 42 #include "mbedtls/ccm.h"
Janos Follath 0:1f7c5025e59d 43 #include "mbedtls/havege.h"
Janos Follath 0:1f7c5025e59d 44 #include "mbedtls/ctr_drbg.h"
Janos Follath 0:1f7c5025e59d 45 #include "mbedtls/hmac_drbg.h"
Janos Follath 0:1f7c5025e59d 46 #include "mbedtls/rsa.h"
Janos Follath 0:1f7c5025e59d 47 #include "mbedtls/pk.h"
Janos Follath 0:1f7c5025e59d 48 #include "mbedtls/dhm.h"
Janos Follath 0:1f7c5025e59d 49 #include "mbedtls/ecdsa.h"
Janos Follath 0:1f7c5025e59d 50 #include "mbedtls/ecdh.h"
Janos Follath 0:1f7c5025e59d 51 #include "mbedtls/error.h"
Janos Follath 0:1f7c5025e59d 52
mbed_official 76:68ac2a548d58 53 #define RSA_PRIVATE_KEY_2048 \
mbed_official 76:68ac2a548d58 54 "-----BEGIN RSA PRIVATE KEY-----\n" \
mbed_official 76:68ac2a548d58 55 "MIIEogIBAAKCAQEA2dwVr+IMGEtA2/MCP6fA5eb/6B18Bq6e7gw8brNPkm3E6LyR\n" \
mbed_official 76:68ac2a548d58 56 "4DnMJVxZmw3bPDKBDoKzfntkMESi/Yw5UopLtVfjGfWeQWPClqffLZBsZ60BRAsg\n" \
mbed_official 76:68ac2a548d58 57 "/g+ID5tgzxSuxzftypK59uexOVCAm7hCKZHGO3DbI7bLY27j7VAgEP7d/yuaz5Fx\n" \
mbed_official 76:68ac2a548d58 58 "Kl/vu7shqrBoz6ABJVJD3KC8nUiMRUCXRINmxbyUUjA4DnicZv6+xrGKr36r6M8h\n" \
mbed_official 76:68ac2a548d58 59 "VYLa5msKc8WzbnBWzpUsrpb4/r7ML+qp92gdSfVJ8/bLiU7h2C7faDA59uaqrFK9\n" \
mbed_official 76:68ac2a548d58 60 "xmDdx7FaWhGQs3LWW6w1UNgkPS0FDYUslpsnsQIDAQABAoIBAC7IJNwM5V3+IuJY\n" \
mbed_official 76:68ac2a548d58 61 "T35Nzo1PyloUosJokvY5KGz5Ejg2XBdCDu0gXCcVqqQyGIbXrYDpLhQV+RCoXHun\n" \
mbed_official 76:68ac2a548d58 62 "tdN0oQdC5SB47s/J1Uo2qCUHo0+sBd6PqTkFKsl3KxWssk9TQjvCwC412IefMs69\n" \
mbed_official 76:68ac2a548d58 63 "hW+ZvwCanmQP56LleApIr2oW4KLfW8Ry/QfZlua+dizctdN7+H1mWwgZQTY9T27J\n" \
mbed_official 76:68ac2a548d58 64 "6RtGRA5NVkKVPzIHVJfdpKoO7xGg1g06aEbPB/VmGvZaaFWWnaf7uRvFjLZecBLu\n" \
mbed_official 76:68ac2a548d58 65 "QSx2DA/GDjirlDYj99PJb7DtB4xRtKzsyw0o+xapC8w6OtIl/3xFt9moCu2jGrsx\n" \
mbed_official 76:68ac2a548d58 66 "vpjHdfECgYEA7fSACRseIs9gAIVX8wq6gayTpA47DHYWAD6IQfIj35SJ+AgsvbFF\n" \
mbed_official 76:68ac2a548d58 67 "4AmrwDhcJVPmDy1N4nLBfyGAMt/2CfiYkdkW6QFX/ULRMMBL/G7kWV8hYQDICB2g\n" \
mbed_official 76:68ac2a548d58 68 "xaMRN1lPCmFq6BkSWjwIYTnYDFBDWVm1GVT8TMtJoM8Erej9qC0PeFUCgYEA6mF3\n" \
mbed_official 76:68ac2a548d58 69 "bigO3t8f5sig+XepaftEUbkJMzo72TVRnIR2ycdR2ihelPQ+25g9dwV0ZA5XXhBS\n" \
mbed_official 76:68ac2a548d58 70 "DKOABWjMM739Mwmy9v26Dlmu9R01zHQktMvtEAyfz7lk2NF0aMuj8285OJUBf9bz\n" \
mbed_official 76:68ac2a548d58 71 "Cq3MjtMCD+4CZ6iaEqCdUKOuxfpx5cWVJV+qve0CgYBhD1YaYMFOGaBjFgDl1f51\n" \
mbed_official 76:68ac2a548d58 72 "Xltqk5NqZdBbkSYrIAWZ8RDF5y+4wFJsLAWuhk6vuyUgE66tK3nZzWRpXAkT0B8L\n" \
mbed_official 76:68ac2a548d58 73 "fq1lpXKqj1KcvBNCiEkEW1VWJ+dvyAYIF5eyJ++hoFLnETL3M32HivyhKSwPihPg\n" \
mbed_official 76:68ac2a548d58 74 "nVW8TT9fJJIYDe1JZ/fjcQKBgHJfv7UsrR0LSvkG3K8AOtbx+8PZhOjPuRbk0v+L\n" \
mbed_official 76:68ac2a548d58 75 "EKCkuIe5/XW4vtfQMeZb7hFJgk7vrepm+vkoy8VQKDf4urGW3W1VTHBmobM01hi4\n" \
mbed_official 76:68ac2a548d58 76 "DuYvEul+Mf0wMRtWjJolo4m+BO5KiW2jpFfqFm6JmfjVqOIAKOSKC6am8V/MDF0h\n" \
mbed_official 76:68ac2a548d58 77 "kyN9AoGAT9oOiEXMolbkDZw/QCaBiRoAGlGlNYUkJ+58U6OjIZLISw6aFv+Y2uE0\n" \
mbed_official 76:68ac2a548d58 78 "mEImItjuYZtSYKblWikp6ldPoKlt9bwEFe3c6IZ8kJ3+xyEyAGrvjXjEY7PzP6dp\n" \
mbed_official 76:68ac2a548d58 79 "Ajbjp9X9uocEBv9W/KsBLdQ7yizcL/toHwdBO4vQqmqTvAc5IIw=\n" \
mbed_official 76:68ac2a548d58 80 "-----END RSA PRIVATE KEY-----\n"
Janos Follath 0:1f7c5025e59d 81
mbed_official 76:68ac2a548d58 82 #define RSA_PRIVATE_KEY_4096 \
mbed_official 76:68ac2a548d58 83 "-----BEGIN RSA PRIVATE KEY-----\n" \
mbed_official 76:68ac2a548d58 84 "MIIJKgIBAAKCAgEAmkdGjoIshJuOt2NO47qB3Z3yyvmLg2j351isItSNuFQU3qr+\n" \
mbed_official 76:68ac2a548d58 85 "jXHIeANf03yw/K0Zvos8RPd+CqLjoxAQL3QDH4bZAl88bIo29i+SANbNSrKQmc0k\n" \
mbed_official 76:68ac2a548d58 86 "pH+yzw3alDzO0GZaOPZjsbo6AwBrno5msi0vRuC2aY8vGLPsZWSyLai7tneS1j/o\n" \
mbed_official 76:68ac2a548d58 87 "vYW6XIo8Cj61j2Ypy9HhVUW/4Wc+zAT25D/x7jTpkqJLWWT+YzibNbOY48M5eJcB\n" \
mbed_official 76:68ac2a548d58 88 "6/sMyUIeI3/u/wXyMrooNyLiCpedkuHRA0m7u5cWPTUISTunSRlVFij/NHJjuU8e\n" \
mbed_official 76:68ac2a548d58 89 "wA3B29yfZFsUqDEnyc+OxniIueAixTomVszxAaVn8zFEbYhFMPqziiFp99u3jfeG\n" \
mbed_official 76:68ac2a548d58 90 "k1q9mmUi/uCfUC4e2IC5rqq1ZbKSduH7Ug/Vn2bGQahww0sZFRHDXFrnBcotcW+M\n" \
mbed_official 76:68ac2a548d58 91 "bnC290VBDnYgzmdYrIOxuPb2aUwJo4ZlbKh5uBB1PigMuyhLKibQ1a+V5ZJGdpP6\n" \
mbed_official 76:68ac2a548d58 92 "SE9PGIdgYWSmh2QEMuLE6v+wTO2LQ5JgqsvFfi3GIZvkn0s8jTS72Jq2uMkFkMer\n" \
mbed_official 76:68ac2a548d58 93 "UBjPDYaSPy5kpo103KerWs+cMPOJ/3FtZzI++7MoSUTkWVr1ySQFt5i1EIZ/0Thi\n" \
mbed_official 76:68ac2a548d58 94 "jut2jNe8a4AoA3TtC8Rkk/3AIIbg8MVNT4EnT+KHROTMu6gET1oJ3YfBRpUCAwEA\n" \
mbed_official 76:68ac2a548d58 95 "AQKCAgEAhuNSmT7PVZH8kfLOAuYKrY1vvm+4v0iDl048Eqfs0QESziyLK3gUYnnw\n" \
mbed_official 76:68ac2a548d58 96 "yqP2yrU+EQ8Dvvj0xq/sf6GHxTWVlXb9PcmutueRbmXhLcKg83J0Y0StiPXtjIL8\n" \
mbed_official 76:68ac2a548d58 97 "XSddW3Bh6fPi7n14Qy+W6KZwu9AtybanRlvePabyRSRpdOpWVQ7u30w5XZsSed6S\n" \
mbed_official 76:68ac2a548d58 98 "6BI0BBC68m2qqje1sInoqdCdXKtcB31TytUDNEHM+UuAyM8iGeGS2hCNqZlycHTS\n" \
mbed_official 76:68ac2a548d58 99 "jQ9KEsdMH3YLu0lQgRpWtxmg+VL6ROWwmAtKF12EwbDYZ+uoVl69OkQnCpv8pxKa\n" \
mbed_official 76:68ac2a548d58 100 "ec/4m6V+uEA1AOpaAMorHG3fH31IKWC/fTZstovgO/eG2XCtlbcCoWCQ7amFq16l\n" \
mbed_official 76:68ac2a548d58 101 "Gh1UKeBHxMXpDj4oDmIUGUvgzSNnEeSN/v76losWvWYQDjXR/LMDa/CNYsD8BmJR\n" \
mbed_official 76:68ac2a548d58 102 "PZidIjIXdVRlYOhA7ljtySQvp6RBujBfw3tsVMyZw2XzXFwM9O89b1xXC6+M5jf9\n" \
mbed_official 76:68ac2a548d58 103 "DXs/U7Fw+J9qq/YpByABcPCwWdttwdQFRbOxwxaSOKarIqS87TW1JuFcNJ59Ut6G\n" \
mbed_official 76:68ac2a548d58 104 "kMvAg6gC34U+0ktkG/AmI1hgjC+P7ErHCXBR2xARoGzcO/CMZF59S+Z2HFchpTSP\n" \
mbed_official 76:68ac2a548d58 105 "5T2o4mGy3VfHSBidQQrcZRukg8ZP8M1NF3bXjpY6QZpeLHc4oHECggEBAMjdgzzk\n" \
mbed_official 76:68ac2a548d58 106 "xp4mIYFxAEiXYt7tzuUXJk+0UpEJj5uboWLirUZqZmNUPyh6WDnzlREBH++Ms0LO\n" \
mbed_official 76:68ac2a548d58 107 "+AWSfaGPDoMb0NE2j3c4FRWAhe7Vn6lj7nLVpF2RdwRo88yGerZ4uwGMY8NUQCtn\n" \
mbed_official 76:68ac2a548d58 108 "zum3J7eCJ5DojiceRb6uMxTJ8xZmUC4W2f3J/lrR7wlYjyVnnHqH5HcemYUipWSw\n" \
mbed_official 76:68ac2a548d58 109 "sM0/cHp3lrz2VWrbAEu8HVpklvDQpdAgl7cjXt/JHYawY+p426IF/PzQSRROnzgy\n" \
mbed_official 76:68ac2a548d58 110 "4WI8FVYNV2tgu0TOFURbkkEvuj/duDKeooUIF0G0XHzha5oAX/j0iWiHbrOF6wHj\n" \
mbed_official 76:68ac2a548d58 111 "0xeajL9msKBnmD8CggEBAMSgLWmv7G31x4tndJCcXnX4AyVL7KpygAx/ZwCcyTR8\n" \
mbed_official 76:68ac2a548d58 112 "rY1rO07f/ta2noEra/xmEW/BW98qJFCHSU2nSLAQ5FpFSWyuQqrnffrMJnfWyvpr\n" \
mbed_official 76:68ac2a548d58 113 "ceQ0yQ/MiA6/JIOvGAjabcspzZijxzGp+Qk3eTT0yOXLSVOCH9B9XVHLodcy4PQM\n" \
mbed_official 76:68ac2a548d58 114 "KSCxy0vVHhVNl2SdPEwTXRmxk99Q/rw6IHVpQxBq1OhQt05nTKT+rZMD/grSK22e\n" \
mbed_official 76:68ac2a548d58 115 "my2F0DodAJwLo063Zv3RXQZhDYodMmjcp9Hqrtvj9P3HD7J3z6ACiV3SCi8cZumL\n" \
mbed_official 76:68ac2a548d58 116 "bSmnKCcd0bb45+aOWm31ieECJuIcJ9rOREEa/KDYTCsCggEBAMG5WkSVhLWsou37\n" \
mbed_official 76:68ac2a548d58 117 "dUGNuA63nq42SH3gtS0q4nU6gUkkw+dA4ST1cMByVrr1oRQ4WHup4I4TnQOKyF3T\n" \
mbed_official 76:68ac2a548d58 118 "4jQy1I+ipnVeAn+tZ/7zyzwMpEHeqNqRXA9FxbTBEoMAJ6QTqXgOvqDeSqIAQm7r\n" \
mbed_official 76:68ac2a548d58 119 "OYu5rrgtqyh/S8bGCwvUe4ooAfCSKx2ekYMbBVwW9MT8YS09tuS/iHJ3Mt2RTMLg\n" \
mbed_official 76:68ac2a548d58 120 "qeHvVmxrcXqZoFm44Ba7tN/pP0mi9HKyviZT4tmV3IYEbn3JyGGsfkUuVU9wEUfg\n" \
mbed_official 76:68ac2a548d58 121 "MCrgrVxrwfketAzooiHMjkVL2ASjzAJTmEvdAPETYXxzJD9LN0ovY3t8JfAC37IN\n" \
mbed_official 76:68ac2a548d58 122 "sVXS8/MCggEBALByOS59Y4Ktq1rLBQx8djwQyuneP0wZohUVAx7Gk7xZIfklQDyg\n" \
mbed_official 76:68ac2a548d58 123 "v/R4PrcVezstcPpDnykdjScCsGJR+uWc0v667I/ttP/e6utz5hVmmBGu965dPAzE\n" \
mbed_official 76:68ac2a548d58 124 "c1ggaSkOqFfRg/Nr2Qbf+fH0YPnHYSqHe/zSt0OMIvaaeXLcdKhEDSCUBRhE1HWB\n" \
mbed_official 76:68ac2a548d58 125 "kxR046WzgBeYzNQwycz9xwqsctJKGpeR9ute+5ANHPd3X9XtID0fqz8ctI5eZaSw\n" \
mbed_official 76:68ac2a548d58 126 "wApIW01ZQcAF8B+4WkkVuFXnpWW33yCOaRyPVOPHpnclr5WU1fS+3Q85QkW9rkej\n" \
mbed_official 76:68ac2a548d58 127 "97zlkl0QY9AHJqrXnoML1ywAK7ns+MVyNK8CggEAf62xcKZhOb1djeF72Ms+i/i/\n" \
mbed_official 76:68ac2a548d58 128 "WIAq4Q4YpsElgvJTHpNH2v9g4ngSTKe3ws3bGc502sWRlhcoTFMOW2rJNe/iqKkb\n" \
mbed_official 76:68ac2a548d58 129 "3cdeTkseDbpqozmJWz9dJWSVtXas2bZjzBEa//gQ7nHGVeQdqZJQ9rxPsoOAkfpi\n" \
mbed_official 76:68ac2a548d58 130 "qCFrmfUVUqC53e3XMt8+W+aSvKl+JZiB9ozkO9A6Q0vfQLKtjUMdQE3XaCFQT8DI\n" \
mbed_official 76:68ac2a548d58 131 "smaLBlBmeRaBpc02ENeC4ADlWosm1SwgxqMhuh2Alba/GrHOoPlVl4hDs9Fb5a6R\n" \
mbed_official 76:68ac2a548d58 132 "rmpXSt07GAxnG6j9jssA95E4rc1zO0CVKG5bvjVTxwi/sT0/VVX7VsJM4uTAQg==\n" \
mbed_official 76:68ac2a548d58 133 "-----END RSA PRIVATE KEY-----\n"
Janos Follath 0:1f7c5025e59d 134
Janos Follath 0:1f7c5025e59d 135 #define BUFSIZE 1024
Janos Follath 0:1f7c5025e59d 136 #define HEADER_FORMAT " %-24s : "
Janos Follath 0:1f7c5025e59d 137 #define TITLE_LEN 25
Janos Follath 0:1f7c5025e59d 138
Janos Follath 0:1f7c5025e59d 139 #if defined(MBEDTLS_ERROR_C)
mbed_official 78:5f419e0f96dd 140 #define PRINT_ERROR(RET, CODE) \
mbed_official 78:5f419e0f96dd 141 mbedtls_strerror(RET, err_buf, sizeof(err_buf)); \
mbed_official 78:5f419e0f96dd 142 mbedtls_printf("%s returned -0x%04X\n", CODE, -RET); \
mbed_official 78:5f419e0f96dd 143 mbedtls_printf(" ! %s\n", err_buf);
Janos Follath 0:1f7c5025e59d 144 #else
mbed_official 78:5f419e0f96dd 145 #define PRINT_ERROR(RET, CODE) \
mbed_official 78:5f419e0f96dd 146 mbedtls_printf("%s returned -0x%04X\n", CODE, -RET);
mbed_official 78:5f419e0f96dd 147 #endif /* MBEDTLS_ERROR_C */
Janos Follath 0:1f7c5025e59d 148
mbed_official 78:5f419e0f96dd 149 #define BENCHMARK_FUNC_CALL(TITLE, CODE) \
mbed_official 78:5f419e0f96dd 150 do { \
mbed_official 78:5f419e0f96dd 151 unsigned long i; \
mbed_official 78:5f419e0f96dd 152 Timeout t; \
mbed_official 78:5f419e0f96dd 153 \
mbed_official 78:5f419e0f96dd 154 mbedtls_printf(HEADER_FORMAT, TITLE); \
mbed_official 78:5f419e0f96dd 155 fflush(stdout); \
mbed_official 78:5f419e0f96dd 156 \
mbed_official 78:5f419e0f96dd 157 for (i = 1, alarmed = 0, t.attach(alarm, 1.0); !alarmed; i++) \
mbed_official 78:5f419e0f96dd 158 { \
mbed_official 78:5f419e0f96dd 159 ret = CODE; \
mbed_official 78:5f419e0f96dd 160 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) { \
mbed_official 78:5f419e0f96dd 161 mbedtls_printf("Feature unavailable\n"); \
mbed_official 78:5f419e0f96dd 162 break; \
mbed_official 78:5f419e0f96dd 163 } else if (ret != 0) { \
mbed_official 78:5f419e0f96dd 164 PRINT_ERROR(ret, #CODE); \
mbed_official 78:5f419e0f96dd 165 goto exit; \
mbed_official 78:5f419e0f96dd 166 } \
mbed_official 78:5f419e0f96dd 167 } \
mbed_official 78:5f419e0f96dd 168 \
mbed_official 78:5f419e0f96dd 169 if (ret == 0) { \
mbed_official 78:5f419e0f96dd 170 mbedtls_printf("%9lu KB/s\n", i * BUFSIZE / 1024); \
mbed_official 78:5f419e0f96dd 171 } \
mbed_official 78:5f419e0f96dd 172 } while(0)
Janos Follath 0:1f7c5025e59d 173
mbed_official 78:5f419e0f96dd 174 #define BENCHMARK_PUBLIC(TITLE, TYPE, CODE) \
mbed_official 78:5f419e0f96dd 175 do { \
mbed_official 78:5f419e0f96dd 176 unsigned long ms; \
mbed_official 78:5f419e0f96dd 177 Timer t; \
mbed_official 78:5f419e0f96dd 178 \
mbed_official 78:5f419e0f96dd 179 mbedtls_printf(HEADER_FORMAT, TITLE); \
mbed_official 78:5f419e0f96dd 180 fflush(stdout); \
mbed_official 78:5f419e0f96dd 181 \
mbed_official 78:5f419e0f96dd 182 t.start(); \
mbed_official 78:5f419e0f96dd 183 CODE; \
mbed_official 78:5f419e0f96dd 184 t.stop(); \
mbed_official 78:5f419e0f96dd 185 ms = t.read_ms(); \
mbed_official 78:5f419e0f96dd 186 \
mbed_official 78:5f419e0f96dd 187 if (ret != 0) { \
mbed_official 78:5f419e0f96dd 188 PRINT_ERROR(ret, "Public function"); \
mbed_official 78:5f419e0f96dd 189 goto exit; \
mbed_official 78:5f419e0f96dd 190 } else { \
mbed_official 78:5f419e0f96dd 191 mbedtls_printf("%6lu ms/" TYPE, ms); \
mbed_official 78:5f419e0f96dd 192 mbedtls_printf("\n"); \
mbed_official 78:5f419e0f96dd 193 } \
mbed_official 78:5f419e0f96dd 194 } while(0)
mbed_official 78:5f419e0f96dd 195
mbed_official 78:5f419e0f96dd 196 /* Clear some memory that was used to prepare the context */
mbed_official 78:5f419e0f96dd 197 #if defined(MBEDTLS_ECP_C)
mbed_official 78:5f419e0f96dd 198 void ecp_clear_precomputed(mbedtls_ecp_group *grp)
Janos Follath 0:1f7c5025e59d 199 {
mbed_official 78:5f419e0f96dd 200 if (grp->T != NULL) {
Janos Follath 0:1f7c5025e59d 201 size_t i;
mbed_official 78:5f419e0f96dd 202 for (i = 0; i < grp->T_size; i++) {
mbed_official 78:5f419e0f96dd 203 mbedtls_ecp_point_free(&grp->T[i]);
mbed_official 78:5f419e0f96dd 204 }
mbed_official 78:5f419e0f96dd 205 mbedtls_free(grp->T);
Janos Follath 0:1f7c5025e59d 206 }
Janos Follath 0:1f7c5025e59d 207 grp->T = NULL;
Janos Follath 0:1f7c5025e59d 208 grp->T_size = 0;
Janos Follath 0:1f7c5025e59d 209 }
Janos Follath 0:1f7c5025e59d 210 #else
mbed_official 78:5f419e0f96dd 211 #define ecp_clear_precomputed(g)
mbed_official 78:5f419e0f96dd 212 #endif /* MBEDTLS_ECP_C */
Janos Follath 0:1f7c5025e59d 213
mbed_official 78:5f419e0f96dd 214 static unsigned char buf[BUFSIZE];
mbed_official 78:5f419e0f96dd 215 /*
mbed_official 78:5f419e0f96dd 216 * Buffer used to hold various data such as IV, signatures, keys, etc. ECDSA
mbed_official 78:5f419e0f96dd 217 * seems to be the benchmark that uses the most memory from this buffer as it
mbed_official 78:5f419e0f96dd 218 * is holds the output signature
mbed_official 78:5f419e0f96dd 219 */
mbed_official 78:5f419e0f96dd 220 static unsigned char tmp[150];
mbed_official 78:5f419e0f96dd 221 /* The longest error message has 134 characters (including \0) */
mbed_official 78:5f419e0f96dd 222 static char err_buf[134];
mbed_official 78:5f419e0f96dd 223 static char title[TITLE_LEN];
mbed_official 78:5f419e0f96dd 224
mbed_official 78:5f419e0f96dd 225 static volatile int alarmed;
mbed_official 78:5f419e0f96dd 226
mbed_official 78:5f419e0f96dd 227 static void alarm()
mbed_official 78:5f419e0f96dd 228 {
mbed_official 78:5f419e0f96dd 229 alarmed = 1;
mbed_official 78:5f419e0f96dd 230 }
Janos Follath 0:1f7c5025e59d 231
mbed_official 78:5f419e0f96dd 232 static int myrand(void *rng_state, unsigned char *output, size_t len)
mbed_official 78:5f419e0f96dd 233 {
mbed_official 78:5f419e0f96dd 234 size_t use_len;
mbed_official 78:5f419e0f96dd 235 int rnd;
mbed_official 78:5f419e0f96dd 236
mbed_official 78:5f419e0f96dd 237 if (rng_state != NULL) {
mbed_official 78:5f419e0f96dd 238 rng_state = NULL;
mbed_official 78:5f419e0f96dd 239 }
Janos Follath 0:1f7c5025e59d 240
mbed_official 78:5f419e0f96dd 241 while (len > 0) {
mbed_official 78:5f419e0f96dd 242 use_len = len;
mbed_official 78:5f419e0f96dd 243 if (use_len > sizeof(int)) {
mbed_official 78:5f419e0f96dd 244 use_len = sizeof(int);
mbed_official 78:5f419e0f96dd 245 }
mbed_official 78:5f419e0f96dd 246
mbed_official 78:5f419e0f96dd 247 rnd = rand();
mbed_official 78:5f419e0f96dd 248 memcpy(output, &rnd, use_len);
mbed_official 78:5f419e0f96dd 249 output += use_len;
mbed_official 78:5f419e0f96dd 250 len -= use_len;
mbed_official 78:5f419e0f96dd 251 }
mbed_official 78:5f419e0f96dd 252
mbed_official 78:5f419e0f96dd 253 return 0;
mbed_official 78:5f419e0f96dd 254 }
Janos Follath 0:1f7c5025e59d 255
Janos Follath 0:1f7c5025e59d 256 #if defined(MBEDTLS_MD4_C)
mbed_official 78:5f419e0f96dd 257 MBED_NOINLINE static int benchmark_md4()
mbed_official 78:5f419e0f96dd 258 {
mbed_official 78:5f419e0f96dd 259 int ret;
mbed_official 78:5f419e0f96dd 260
mbed_official 78:5f419e0f96dd 261 BENCHMARK_FUNC_CALL("MD4", mbedtls_md4_ret(buf, BUFSIZE, tmp));
mbed_official 78:5f419e0f96dd 262
mbed_official 78:5f419e0f96dd 263 ret = 0;
mbed_official 78:5f419e0f96dd 264
mbed_official 78:5f419e0f96dd 265 exit:
mbed_official 78:5f419e0f96dd 266
mbed_official 78:5f419e0f96dd 267 return ret;
mbed_official 78:5f419e0f96dd 268 }
mbed_official 78:5f419e0f96dd 269 #endif /* MBEDTLS_MD4_C */
Janos Follath 0:1f7c5025e59d 270
Janos Follath 0:1f7c5025e59d 271 #if defined(MBEDTLS_MD5_C)
mbed_official 78:5f419e0f96dd 272 MBED_NOINLINE static int benchmark_md5()
mbed_official 78:5f419e0f96dd 273 {
mbed_official 78:5f419e0f96dd 274 int ret;
mbed_official 78:5f419e0f96dd 275
mbed_official 78:5f419e0f96dd 276 BENCHMARK_FUNC_CALL("MD5", mbedtls_md5_ret(buf, BUFSIZE, tmp));
mbed_official 78:5f419e0f96dd 277
mbed_official 78:5f419e0f96dd 278 ret = 0;
mbed_official 78:5f419e0f96dd 279
mbed_official 78:5f419e0f96dd 280 exit:
mbed_official 78:5f419e0f96dd 281
mbed_official 78:5f419e0f96dd 282 return ret;
mbed_official 78:5f419e0f96dd 283 }
mbed_official 78:5f419e0f96dd 284 #endif /* MBEDTLS_MD5_C */
Janos Follath 0:1f7c5025e59d 285
Janos Follath 0:1f7c5025e59d 286 #if defined(MBEDTLS_RIPEMD160_C)
mbed_official 78:5f419e0f96dd 287 MBED_NOINLINE static int benchmark_ripemd160()
mbed_official 78:5f419e0f96dd 288 {
mbed_official 78:5f419e0f96dd 289 int ret;
mbed_official 78:5f419e0f96dd 290
mbed_official 78:5f419e0f96dd 291 BENCHMARK_FUNC_CALL("RIPEMD160", mbedtls_ripemd160_ret(buf, BUFSIZE, tmp));
mbed_official 78:5f419e0f96dd 292
mbed_official 78:5f419e0f96dd 293 ret = 0;
mbed_official 78:5f419e0f96dd 294
mbed_official 78:5f419e0f96dd 295 exit:
mbed_official 78:5f419e0f96dd 296
mbed_official 78:5f419e0f96dd 297 return ret;
mbed_official 78:5f419e0f96dd 298 }
mbed_official 78:5f419e0f96dd 299 #endif /* MBEDTLS_RIPEMD160_C */
Janos Follath 0:1f7c5025e59d 300
Janos Follath 0:1f7c5025e59d 301 #if defined(MBEDTLS_SHA1_C)
mbed_official 78:5f419e0f96dd 302 MBED_NOINLINE static int benchmark_sha1()
mbed_official 78:5f419e0f96dd 303 {
mbed_official 78:5f419e0f96dd 304 int ret;
mbed_official 78:5f419e0f96dd 305
mbed_official 78:5f419e0f96dd 306 BENCHMARK_FUNC_CALL("SHA-1", mbedtls_sha1_ret(buf, BUFSIZE, tmp));
mbed_official 78:5f419e0f96dd 307
mbed_official 78:5f419e0f96dd 308 ret = 0;
mbed_official 78:5f419e0f96dd 309
mbed_official 78:5f419e0f96dd 310 exit:
mbed_official 78:5f419e0f96dd 311
mbed_official 78:5f419e0f96dd 312 return ret;
mbed_official 78:5f419e0f96dd 313 }
mbed_official 78:5f419e0f96dd 314 #endif /* MBEDTLS_SHA1_C */
Janos Follath 0:1f7c5025e59d 315
Janos Follath 0:1f7c5025e59d 316 #if defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 317 MBED_NOINLINE static int benchmark_sha256()
mbed_official 78:5f419e0f96dd 318 {
mbed_official 78:5f419e0f96dd 319 int ret;
mbed_official 78:5f419e0f96dd 320
mbed_official 78:5f419e0f96dd 321 BENCHMARK_FUNC_CALL("SHA-256", mbedtls_sha256_ret(buf, BUFSIZE, tmp, 0));
mbed_official 78:5f419e0f96dd 322
mbed_official 78:5f419e0f96dd 323 ret = 0;
mbed_official 78:5f419e0f96dd 324
mbed_official 78:5f419e0f96dd 325 exit:
mbed_official 78:5f419e0f96dd 326
mbed_official 78:5f419e0f96dd 327 return ret;
mbed_official 78:5f419e0f96dd 328 }
mbed_official 78:5f419e0f96dd 329 #endif /* MBEDTLS_SHA256_C */
Janos Follath 0:1f7c5025e59d 330
Janos Follath 0:1f7c5025e59d 331 #if defined(MBEDTLS_SHA512_C)
mbed_official 78:5f419e0f96dd 332 MBED_NOINLINE static int benchmark_sha512()
mbed_official 70:72c865037f5d 333 {
mbed_official 78:5f419e0f96dd 334 int ret;
mbed_official 78:5f419e0f96dd 335
mbed_official 78:5f419e0f96dd 336 BENCHMARK_FUNC_CALL("SHA-512", mbedtls_sha512_ret(buf, BUFSIZE, tmp, 0));
mbed_official 78:5f419e0f96dd 337
mbed_official 78:5f419e0f96dd 338 ret = 0;
mbed_official 78:5f419e0f96dd 339
mbed_official 78:5f419e0f96dd 340 exit:
mbed_official 78:5f419e0f96dd 341
mbed_official 78:5f419e0f96dd 342 return ret;
mbed_official 78:5f419e0f96dd 343 }
mbed_official 78:5f419e0f96dd 344 #endif /* MBEDTLS_SHA512_C */
mbed_official 78:5f419e0f96dd 345
Janos Follath 0:1f7c5025e59d 346 #if defined(MBEDTLS_ARC4_C)
mbed_official 78:5f419e0f96dd 347 MBED_NOINLINE static int benchmark_arc4()
mbed_official 78:5f419e0f96dd 348 {
mbed_official 78:5f419e0f96dd 349 int ret = 0;
mbed_official 78:5f419e0f96dd 350 mbedtls_arc4_context arc4;
mbed_official 78:5f419e0f96dd 351
mbed_official 78:5f419e0f96dd 352 mbedtls_arc4_init(&arc4);
mbed_official 78:5f419e0f96dd 353
mbed_official 78:5f419e0f96dd 354 mbedtls_arc4_setup(&arc4, tmp, 32);
mbed_official 78:5f419e0f96dd 355 BENCHMARK_FUNC_CALL("ARC4",
mbed_official 78:5f419e0f96dd 356 mbedtls_arc4_crypt(&arc4, BUFSIZE, buf, buf));
mbed_official 78:5f419e0f96dd 357
mbed_official 78:5f419e0f96dd 358 ret = 0;
mbed_official 78:5f419e0f96dd 359
mbed_official 78:5f419e0f96dd 360 exit:
mbed_official 78:5f419e0f96dd 361 mbedtls_arc4_free(&arc4);
mbed_official 78:5f419e0f96dd 362
mbed_official 78:5f419e0f96dd 363 return ret;
mbed_official 78:5f419e0f96dd 364 }
mbed_official 78:5f419e0f96dd 365 #endif /* MBEDTLS_ARC4_C */
mbed_official 78:5f419e0f96dd 366
mbed_official 78:5f419e0f96dd 367 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 368 MBED_NOINLINE static int benchmark_des3()
mbed_official 78:5f419e0f96dd 369 {
mbed_official 78:5f419e0f96dd 370 int ret = 0;
mbed_official 78:5f419e0f96dd 371 mbedtls_des3_context des3;
mbed_official 78:5f419e0f96dd 372
mbed_official 78:5f419e0f96dd 373 mbedtls_des3_init(&des3);
mbed_official 78:5f419e0f96dd 374
mbed_official 78:5f419e0f96dd 375 if ((ret = mbedtls_des3_set3key_enc(&des3, tmp)) != 0) {
mbed_official 78:5f419e0f96dd 376 PRINT_ERROR(ret, "mbedtls_des3_set3key_enc()");
mbed_official 78:5f419e0f96dd 377 goto exit;
Janos Follath 0:1f7c5025e59d 378 }
mbed_official 78:5f419e0f96dd 379 BENCHMARK_FUNC_CALL("3DES",
mbed_official 78:5f419e0f96dd 380 mbedtls_des3_crypt_cbc(&des3, MBEDTLS_DES_ENCRYPT,
mbed_official 78:5f419e0f96dd 381 BUFSIZE, tmp, buf, buf));
mbed_official 78:5f419e0f96dd 382
mbed_official 78:5f419e0f96dd 383 ret = 0;
mbed_official 78:5f419e0f96dd 384
mbed_official 78:5f419e0f96dd 385 exit:
mbed_official 78:5f419e0f96dd 386 mbedtls_des3_free(&des3);
mbed_official 78:5f419e0f96dd 387
mbed_official 78:5f419e0f96dd 388 return ret;
mbed_official 78:5f419e0f96dd 389 }
mbed_official 78:5f419e0f96dd 390 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC */
Janos Follath 0:1f7c5025e59d 391
Janos Follath 0:1f7c5025e59d 392 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 393 MBED_NOINLINE static int benchmark_des()
mbed_official 78:5f419e0f96dd 394 {
mbed_official 78:5f419e0f96dd 395 int ret = 0;
mbed_official 78:5f419e0f96dd 396 mbedtls_des_context des;
mbed_official 78:5f419e0f96dd 397
mbed_official 78:5f419e0f96dd 398 mbedtls_des_init(&des);
mbed_official 78:5f419e0f96dd 399
mbed_official 78:5f419e0f96dd 400 if ((ret = mbedtls_des_setkey_enc(&des, tmp)) != 0) {
mbed_official 78:5f419e0f96dd 401 PRINT_ERROR(ret, "mbedtls_des_setkey_enc()");
mbed_official 78:5f419e0f96dd 402 goto exit;
mbed_official 78:5f419e0f96dd 403 }
mbed_official 78:5f419e0f96dd 404 BENCHMARK_FUNC_CALL("DES",
mbed_official 78:5f419e0f96dd 405 mbedtls_des_crypt_cbc(&des, MBEDTLS_DES_ENCRYPT,
mbed_official 78:5f419e0f96dd 406 BUFSIZE, tmp, buf, buf));
mbed_official 78:5f419e0f96dd 407
mbed_official 78:5f419e0f96dd 408 ret = 0;
mbed_official 78:5f419e0f96dd 409
mbed_official 78:5f419e0f96dd 410 exit:
mbed_official 78:5f419e0f96dd 411 mbedtls_des_free(&des);
mbed_official 78:5f419e0f96dd 412
mbed_official 78:5f419e0f96dd 413 return ret;
mbed_official 78:5f419e0f96dd 414 }
mbed_official 78:5f419e0f96dd 415 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 416
mbed_official 78:5f419e0f96dd 417 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \
mbed_official 78:5f419e0f96dd 418 defined(MBEDTLS_CMAC_C)
mbed_official 78:5f419e0f96dd 419 MBED_NOINLINE static int benchmark_des3_cmac()
mbed_official 78:5f419e0f96dd 420 {
mbed_official 78:5f419e0f96dd 421 int ret = 0;
mbed_official 78:5f419e0f96dd 422 unsigned char output[8];
mbed_official 78:5f419e0f96dd 423 const mbedtls_cipher_info_t *cipher_info;
mbed_official 78:5f419e0f96dd 424
mbed_official 78:5f419e0f96dd 425 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 426 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 427
mbed_official 78:5f419e0f96dd 428 cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_DES_EDE3_ECB);
mbed_official 78:5f419e0f96dd 429 if (cipher_info == NULL) {
mbed_official 78:5f419e0f96dd 430 mbedtls_printf("mbedtls_cipher_info_from_type() returned NULL\n");
mbed_official 78:5f419e0f96dd 431 return -1;
mbed_official 78:5f419e0f96dd 432 }
mbed_official 78:5f419e0f96dd 433
mbed_official 78:5f419e0f96dd 434 BENCHMARK_FUNC_CALL("3DES-CMAC",
mbed_official 78:5f419e0f96dd 435 mbedtls_cipher_cmac(cipher_info, tmp, 192, buf,
mbed_official 78:5f419e0f96dd 436 BUFSIZE, output));
mbed_official 78:5f419e0f96dd 437
mbed_official 78:5f419e0f96dd 438 ret = 0;
mbed_official 78:5f419e0f96dd 439
mbed_official 78:5f419e0f96dd 440 exit:
mbed_official 78:5f419e0f96dd 441 return ret;
mbed_official 78:5f419e0f96dd 442 }
mbed_official 78:5f419e0f96dd 443 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC && MBEDTLS_CMAC_C */
mbed_official 78:5f419e0f96dd 444
mbed_official 78:5f419e0f96dd 445 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 446 MBED_NOINLINE static int benchmark_aes_cbc()
mbed_official 78:5f419e0f96dd 447 {
mbed_official 78:5f419e0f96dd 448 int ret = 0;
mbed_official 78:5f419e0f96dd 449 int keysize;
mbed_official 78:5f419e0f96dd 450 mbedtls_aes_context aes;
mbed_official 78:5f419e0f96dd 451
mbed_official 78:5f419e0f96dd 452 mbedtls_aes_init(&aes);
mbed_official 78:5f419e0f96dd 453
mbed_official 78:5f419e0f96dd 454 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 455 ret = mbedtls_snprintf(title, sizeof(title), "AES-CBC-%d", keysize);
mbed_official 78:5f419e0f96dd 456 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 457 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 458 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 459 goto exit;
mbed_official 78:5f419e0f96dd 460 }
mbed_official 78:5f419e0f96dd 461
mbed_official 78:5f419e0f96dd 462 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 463 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 464
mbed_official 78:5f419e0f96dd 465 ret = mbedtls_aes_setkey_enc(&aes, tmp, keysize);
mbed_official 78:5f419e0f96dd 466 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) {
mbed_official 78:5f419e0f96dd 467 /* Do not consider this as a failure */
mbed_official 78:5f419e0f96dd 468 mbedtls_printf(HEADER_FORMAT "Feature unavailable\n", title);
mbed_official 78:5f419e0f96dd 469 continue;
mbed_official 78:5f419e0f96dd 470 } else if (ret != 0) {
mbed_official 78:5f419e0f96dd 471 PRINT_ERROR(ret, "mbedtls_aes_setkey_enc()");
mbed_official 78:5f419e0f96dd 472 goto exit;
mbed_official 78:5f419e0f96dd 473 }
mbed_official 78:5f419e0f96dd 474
mbed_official 78:5f419e0f96dd 475 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 476 mbedtls_aes_crypt_cbc(&aes,
mbed_official 78:5f419e0f96dd 477 MBEDTLS_AES_ENCRYPT, BUFSIZE,
mbed_official 78:5f419e0f96dd 478 tmp, buf, buf));
mbed_official 78:5f419e0f96dd 479 }
mbed_official 78:5f419e0f96dd 480
mbed_official 78:5f419e0f96dd 481 ret = 0;
mbed_official 78:5f419e0f96dd 482
mbed_official 78:5f419e0f96dd 483 exit:
mbed_official 78:5f419e0f96dd 484 mbedtls_aes_free(&aes);
mbed_official 78:5f419e0f96dd 485
mbed_official 78:5f419e0f96dd 486 return ret;
mbed_official 78:5f419e0f96dd 487 }
mbed_official 78:5f419e0f96dd 488 #endif /* MBEDTLS_AES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 489
mbed_official 78:5f419e0f96dd 490 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CIPHER_MODE_CTR)
mbed_official 78:5f419e0f96dd 491 MBED_NOINLINE static int benchmark_aes_ctr()
mbed_official 78:5f419e0f96dd 492 {
mbed_official 78:5f419e0f96dd 493 int ret = 0;
mbed_official 78:5f419e0f96dd 494 int keysize;
mbed_official 78:5f419e0f96dd 495 size_t nc_offset = 0;
mbed_official 78:5f419e0f96dd 496 unsigned char stream_block[16];
mbed_official 78:5f419e0f96dd 497 mbedtls_aes_context aes;
mbed_official 78:5f419e0f96dd 498
mbed_official 78:5f419e0f96dd 499 mbedtls_aes_init(&aes);
mbed_official 78:5f419e0f96dd 500
mbed_official 78:5f419e0f96dd 501 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 502 ret = mbedtls_snprintf(title, sizeof(title), "AES-CTR-%d", keysize);
mbed_official 78:5f419e0f96dd 503 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 504 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 505 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 506 goto exit;
mbed_official 78:5f419e0f96dd 507 }
mbed_official 78:5f419e0f96dd 508
mbed_official 78:5f419e0f96dd 509 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 510 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 511
mbed_official 78:5f419e0f96dd 512 ret = mbedtls_aes_setkey_enc(&aes, tmp, keysize);
mbed_official 78:5f419e0f96dd 513 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) {
mbed_official 78:5f419e0f96dd 514 /* Do not consider this as a failure */
mbed_official 78:5f419e0f96dd 515 mbedtls_printf(HEADER_FORMAT "Feature unavailable\n", title);
mbed_official 78:5f419e0f96dd 516 continue;
mbed_official 78:5f419e0f96dd 517 } else if (ret != 0) {
mbed_official 78:5f419e0f96dd 518 PRINT_ERROR(ret, "mbedtls_aes_setkey_enc()");
mbed_official 78:5f419e0f96dd 519 goto exit;
mbed_official 78:5f419e0f96dd 520 }
mbed_official 78:5f419e0f96dd 521
mbed_official 78:5f419e0f96dd 522 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 523 mbedtls_aes_crypt_ctr(&aes, BUFSIZE, &nc_offset,
mbed_official 78:5f419e0f96dd 524 tmp, stream_block, buf,
mbed_official 78:5f419e0f96dd 525 buf));
Janos Follath 0:1f7c5025e59d 526 }
Janos Follath 0:1f7c5025e59d 527
mbed_official 78:5f419e0f96dd 528 ret = 0;
mbed_official 78:5f419e0f96dd 529
mbed_official 78:5f419e0f96dd 530 exit:
mbed_official 78:5f419e0f96dd 531 mbedtls_aes_free(&aes);
mbed_official 78:5f419e0f96dd 532
mbed_official 78:5f419e0f96dd 533 return ret;
mbed_official 78:5f419e0f96dd 534 }
mbed_official 78:5f419e0f96dd 535 #endif /* MBEDTLS_AES_C && MBEDTLS_CIPHER_MODE_CTR */
mbed_official 11:6ccae3ebafd5 536
mbed_official 78:5f419e0f96dd 537 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_GCM_C)
mbed_official 78:5f419e0f96dd 538 MBED_NOINLINE static int benchmark_aes_gcm()
mbed_official 78:5f419e0f96dd 539 {
mbed_official 78:5f419e0f96dd 540 int ret = 0;
mbed_official 78:5f419e0f96dd 541 int keysize;
mbed_official 78:5f419e0f96dd 542 mbedtls_gcm_context gcm;
mbed_official 11:6ccae3ebafd5 543
mbed_official 78:5f419e0f96dd 544 mbedtls_gcm_init(&gcm);
Janos Follath 0:1f7c5025e59d 545
mbed_official 78:5f419e0f96dd 546 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 547 ret = mbedtls_snprintf(title, sizeof(title), "AES-GCM-%d", keysize);
mbed_official 78:5f419e0f96dd 548 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 549 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 550 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 551 goto exit;
Janos Follath 0:1f7c5025e59d 552 }
mbed_official 78:5f419e0f96dd 553
mbed_official 78:5f419e0f96dd 554 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 555 memset(tmp, 0, sizeof(tmp));
mbed_official 30:e0ea8c1ef9f5 556
mbed_official 78:5f419e0f96dd 557 ret = mbedtls_gcm_setkey(&gcm, MBEDTLS_CIPHER_ID_AES, tmp, keysize);
mbed_official 78:5f419e0f96dd 558 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) {
mbed_official 78:5f419e0f96dd 559 /* Do not consider this as a failure */
mbed_official 78:5f419e0f96dd 560 mbedtls_printf(HEADER_FORMAT "Feature unavailable\n", title);
mbed_official 78:5f419e0f96dd 561 continue;
mbed_official 78:5f419e0f96dd 562 } else if (ret != 0) {
mbed_official 78:5f419e0f96dd 563 PRINT_ERROR(ret, "mbedtls_gcm_setkey()");
mbed_official 78:5f419e0f96dd 564 goto exit;
mbed_official 78:5f419e0f96dd 565 }
mbed_official 30:e0ea8c1ef9f5 566
mbed_official 78:5f419e0f96dd 567 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 568 mbedtls_gcm_crypt_and_tag(&gcm,
mbed_official 78:5f419e0f96dd 569 MBEDTLS_GCM_ENCRYPT,
mbed_official 78:5f419e0f96dd 570 BUFSIZE, tmp, 12, NULL,
mbed_official 78:5f419e0f96dd 571 0, buf, buf, 16, tmp));
mbed_official 30:e0ea8c1ef9f5 572 }
mbed_official 30:e0ea8c1ef9f5 573
mbed_official 78:5f419e0f96dd 574 ret = 0;
Janos Follath 0:1f7c5025e59d 575
mbed_official 78:5f419e0f96dd 576 exit:
mbed_official 78:5f419e0f96dd 577 mbedtls_gcm_free(&gcm);
Janos Follath 0:1f7c5025e59d 578
mbed_official 78:5f419e0f96dd 579 return ret;
mbed_official 78:5f419e0f96dd 580 }
mbed_official 78:5f419e0f96dd 581 #endif /* MBEDTLS_AES_C && MBEDTLS_GCM_C */
Janos Follath 0:1f7c5025e59d 582
mbed_official 78:5f419e0f96dd 583 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CCM_C)
mbed_official 78:5f419e0f96dd 584 MBED_NOINLINE static int benchmark_aes_ccm()
mbed_official 78:5f419e0f96dd 585 {
mbed_official 78:5f419e0f96dd 586 int ret = 0;
mbed_official 78:5f419e0f96dd 587 int keysize;
mbed_official 78:5f419e0f96dd 588 mbedtls_ccm_context ccm;
Janos Follath 0:1f7c5025e59d 589
mbed_official 78:5f419e0f96dd 590 mbedtls_ccm_init(&ccm);
mbed_official 11:6ccae3ebafd5 591
mbed_official 78:5f419e0f96dd 592 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 593 ret = mbedtls_snprintf(title, sizeof(title), "AES-CCM-%d", keysize);
mbed_official 78:5f419e0f96dd 594 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 595 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 596 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 597 goto exit;
mbed_official 11:6ccae3ebafd5 598 }
mbed_official 11:6ccae3ebafd5 599
mbed_official 78:5f419e0f96dd 600 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 601 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 602
mbed_official 78:5f419e0f96dd 603 ret = mbedtls_ccm_setkey(&ccm, MBEDTLS_CIPHER_ID_AES, tmp, keysize);
mbed_official 78:5f419e0f96dd 604 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) {
mbed_official 78:5f419e0f96dd 605 /* Do not consider this as a failure */
mbed_official 78:5f419e0f96dd 606 mbedtls_printf(HEADER_FORMAT "Feature unavailable\n", title);
mbed_official 78:5f419e0f96dd 607 continue;
mbed_official 78:5f419e0f96dd 608 } else if (ret != 0) {
mbed_official 78:5f419e0f96dd 609 PRINT_ERROR(ret, "mbedtls_gcm_setkey()");
mbed_official 78:5f419e0f96dd 610 goto exit;
mbed_official 78:5f419e0f96dd 611 }
mbed_official 78:5f419e0f96dd 612
mbed_official 78:5f419e0f96dd 613 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 614 mbedtls_ccm_encrypt_and_tag(&ccm, BUFSIZE, tmp, 12,
mbed_official 78:5f419e0f96dd 615 NULL, 0, buf, buf, tmp,
mbed_official 78:5f419e0f96dd 616 16));
mbed_official 11:6ccae3ebafd5 617 }
mbed_official 78:5f419e0f96dd 618
mbed_official 78:5f419e0f96dd 619 ret = 0;
mbed_official 78:5f419e0f96dd 620
mbed_official 78:5f419e0f96dd 621 exit:
mbed_official 78:5f419e0f96dd 622 mbedtls_ccm_free(&ccm);
mbed_official 78:5f419e0f96dd 623
mbed_official 78:5f419e0f96dd 624 return ret;
mbed_official 78:5f419e0f96dd 625 }
mbed_official 78:5f419e0f96dd 626 #endif /* MBEDTLS_AES_C && MBEDTLS_CCM_C */
mbed_official 78:5f419e0f96dd 627
mbed_official 78:5f419e0f96dd 628 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CMAC_C)
mbed_official 78:5f419e0f96dd 629 MBED_NOINLINE static int benchmark_aes_cmac()
mbed_official 78:5f419e0f96dd 630 {
mbed_official 78:5f419e0f96dd 631 int ret = 0;
mbed_official 78:5f419e0f96dd 632 unsigned char output[16];
mbed_official 78:5f419e0f96dd 633 const mbedtls_cipher_info_t *cipher_info;
mbed_official 78:5f419e0f96dd 634 mbedtls_cipher_type_t cipher_type;
mbed_official 78:5f419e0f96dd 635 int keysize;
mbed_official 78:5f419e0f96dd 636
mbed_official 78:5f419e0f96dd 637 cipher_type = MBEDTLS_CIPHER_AES_128_ECB;
mbed_official 78:5f419e0f96dd 638 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 639 ret = mbedtls_snprintf(title, sizeof(title), "AES-CMAC-%d", keysize);
mbed_official 78:5f419e0f96dd 640 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 641 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 642 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 643 goto exit;
mbed_official 78:5f419e0f96dd 644 }
mbed_official 78:5f419e0f96dd 645
mbed_official 78:5f419e0f96dd 646 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 647 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 648
mbed_official 78:5f419e0f96dd 649 cipher_info = mbedtls_cipher_info_from_type(cipher_type);
mbed_official 78:5f419e0f96dd 650 if (cipher_info == NULL) {
mbed_official 78:5f419e0f96dd 651 mbedtls_printf("mbedtls_cipher_info_from_type() returned NULL\n");
mbed_official 78:5f419e0f96dd 652 goto exit;
mbed_official 78:5f419e0f96dd 653 }
mbed_official 78:5f419e0f96dd 654
mbed_official 78:5f419e0f96dd 655 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 656 mbedtls_cipher_cmac(cipher_info, tmp, keysize,
mbed_official 78:5f419e0f96dd 657 buf, BUFSIZE, output));
mbed_official 78:5f419e0f96dd 658 cipher_type = (mbedtls_cipher_type_t)(cipher_type + 1);
mbed_official 78:5f419e0f96dd 659 }
mbed_official 78:5f419e0f96dd 660
mbed_official 78:5f419e0f96dd 661 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 662 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 663
mbed_official 78:5f419e0f96dd 664 BENCHMARK_FUNC_CALL("AES-CMAC-PRF-128",
mbed_official 78:5f419e0f96dd 665 mbedtls_aes_cmac_prf_128(tmp, 16, buf, BUFSIZE,
mbed_official 78:5f419e0f96dd 666 output));
mbed_official 78:5f419e0f96dd 667
mbed_official 78:5f419e0f96dd 668 ret = 0;
mbed_official 78:5f419e0f96dd 669
mbed_official 78:5f419e0f96dd 670 exit:
mbed_official 78:5f419e0f96dd 671
mbed_official 78:5f419e0f96dd 672 return ret;
mbed_official 78:5f419e0f96dd 673 }
mbed_official 78:5f419e0f96dd 674 #endif /* MBEDTLS_AES_C && MBEDTLS_CMAC_C */
Janos Follath 0:1f7c5025e59d 675
Janos Follath 0:1f7c5025e59d 676 #if defined(MBEDTLS_CAMELLIA_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 677 MBED_NOINLINE static int benchmark_camellia()
mbed_official 78:5f419e0f96dd 678 {
mbed_official 78:5f419e0f96dd 679 int ret = 0;
mbed_official 78:5f419e0f96dd 680 int keysize;
mbed_official 78:5f419e0f96dd 681 mbedtls_camellia_context camellia;
mbed_official 78:5f419e0f96dd 682
mbed_official 78:5f419e0f96dd 683 mbedtls_camellia_init(&camellia);
mbed_official 78:5f419e0f96dd 684
mbed_official 78:5f419e0f96dd 685 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 686 ret = mbedtls_snprintf(title, sizeof(title), "CAMELLIA-CBC-%d",
mbed_official 78:5f419e0f96dd 687 keysize);
mbed_official 78:5f419e0f96dd 688 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 689 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 690 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 691 goto exit;
mbed_official 78:5f419e0f96dd 692 }
mbed_official 78:5f419e0f96dd 693
mbed_official 78:5f419e0f96dd 694 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 695 memset(tmp, 0, sizeof(tmp));
Janos Follath 0:1f7c5025e59d 696
mbed_official 78:5f419e0f96dd 697 ret = mbedtls_camellia_setkey_enc(&camellia, tmp, keysize);
mbed_official 78:5f419e0f96dd 698 if (ret != 0) {
mbed_official 78:5f419e0f96dd 699 PRINT_ERROR(ret, "mbedtls_camellia_setkey_enc()");
mbed_official 78:5f419e0f96dd 700 goto exit;
mbed_official 78:5f419e0f96dd 701 }
Janos Follath 0:1f7c5025e59d 702
mbed_official 78:5f419e0f96dd 703 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 704 mbedtls_camellia_crypt_cbc(&camellia,
mbed_official 78:5f419e0f96dd 705 MBEDTLS_CAMELLIA_ENCRYPT,
mbed_official 78:5f419e0f96dd 706 BUFSIZE, tmp, buf, buf));
Janos Follath 0:1f7c5025e59d 707 }
mbed_official 78:5f419e0f96dd 708
mbed_official 78:5f419e0f96dd 709 ret = 0;
mbed_official 78:5f419e0f96dd 710
mbed_official 78:5f419e0f96dd 711 exit:
mbed_official 78:5f419e0f96dd 712 mbedtls_camellia_free(&camellia);
mbed_official 78:5f419e0f96dd 713
mbed_official 78:5f419e0f96dd 714 return ret;
mbed_official 78:5f419e0f96dd 715 }
mbed_official 78:5f419e0f96dd 716 #endif /* MBEDTLS_CAMELLIA_C && MBEDTLS_CIPHER_MODE_CBC */
Janos Follath 0:1f7c5025e59d 717
Janos Follath 0:1f7c5025e59d 718 #if defined(MBEDTLS_BLOWFISH_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 719 MBED_NOINLINE static int benchmark_blowfish()
mbed_official 78:5f419e0f96dd 720 {
mbed_official 78:5f419e0f96dd 721 int ret = 0;
mbed_official 78:5f419e0f96dd 722 int keysize;
mbed_official 78:5f419e0f96dd 723 mbedtls_blowfish_context *blowfish;
mbed_official 78:5f419e0f96dd 724
mbed_official 78:5f419e0f96dd 725 blowfish = (mbedtls_blowfish_context *)mbedtls_calloc(1,
mbed_official 78:5f419e0f96dd 726 sizeof(mbedtls_blowfish_context));
mbed_official 78:5f419e0f96dd 727 if (blowfish == NULL) {
mbed_official 78:5f419e0f96dd 728 mbedtls_printf("Failed to allocate mbedtls_blowfish_context\n");
mbed_official 78:5f419e0f96dd 729 return -1;
mbed_official 78:5f419e0f96dd 730 }
mbed_official 78:5f419e0f96dd 731
mbed_official 78:5f419e0f96dd 732 mbedtls_blowfish_init(blowfish);
Janos Follath 0:1f7c5025e59d 733
mbed_official 78:5f419e0f96dd 734 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 735 mbedtls_snprintf(title, sizeof(title), "BLOWFISH-CBC-%d", keysize);
mbed_official 78:5f419e0f96dd 736 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 737 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 738 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 739 goto exit;
mbed_official 78:5f419e0f96dd 740 }
Janos Follath 0:1f7c5025e59d 741
mbed_official 78:5f419e0f96dd 742 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 743 memset(tmp, 0, sizeof(tmp));
Janos Follath 0:1f7c5025e59d 744
mbed_official 78:5f419e0f96dd 745 if ((ret = mbedtls_blowfish_setkey(blowfish, tmp, keysize)) != 0) {
mbed_official 78:5f419e0f96dd 746 PRINT_ERROR(ret, "mbedtls_blowfish_setkey()");
mbed_official 78:5f419e0f96dd 747 goto exit;
Janos Follath 0:1f7c5025e59d 748 }
Janos Follath 0:1f7c5025e59d 749
mbed_official 78:5f419e0f96dd 750 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 751 mbedtls_blowfish_crypt_cbc(blowfish,
mbed_official 78:5f419e0f96dd 752 MBEDTLS_BLOWFISH_ENCRYPT,
mbed_official 78:5f419e0f96dd 753 BUFSIZE,
mbed_official 78:5f419e0f96dd 754 tmp, buf, buf));
Janos Follath 0:1f7c5025e59d 755 }
mbed_official 70:72c865037f5d 756
mbed_official 78:5f419e0f96dd 757 ret = 0;
mbed_official 78:5f419e0f96dd 758
mbed_official 78:5f419e0f96dd 759 exit:
mbed_official 78:5f419e0f96dd 760 mbedtls_blowfish_free(blowfish);
mbed_official 78:5f419e0f96dd 761 mbedtls_free(blowfish);
mbed_official 78:5f419e0f96dd 762
mbed_official 78:5f419e0f96dd 763 return ret;
mbed_official 78:5f419e0f96dd 764 }
mbed_official 78:5f419e0f96dd 765 #endif /* MBEDTLS_BLOWFISH_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 70:72c865037f5d 766
Janos Follath 0:1f7c5025e59d 767 #if defined(MBEDTLS_HAVEGE_C)
mbed_official 78:5f419e0f96dd 768 MBED_NOINLINE static int benchmark_havege()
mbed_official 78:5f419e0f96dd 769 {
mbed_official 78:5f419e0f96dd 770 int ret = 0;
mbed_official 78:5f419e0f96dd 771 mbedtls_havege_state hs;
mbed_official 78:5f419e0f96dd 772
mbed_official 78:5f419e0f96dd 773 mbedtls_havege_init(&hs);
mbed_official 78:5f419e0f96dd 774
mbed_official 78:5f419e0f96dd 775 BENCHMARK_FUNC_CALL("HAVEGE", mbedtls_havege_random(&hs, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 776
mbed_official 78:5f419e0f96dd 777 ret = 0;
mbed_official 78:5f419e0f96dd 778
mbed_official 78:5f419e0f96dd 779 exit:
mbed_official 78:5f419e0f96dd 780 mbedtls_havege_free(&hs);
mbed_official 78:5f419e0f96dd 781
mbed_official 78:5f419e0f96dd 782 return ret;
mbed_official 78:5f419e0f96dd 783 }
mbed_official 78:5f419e0f96dd 784 #endif /* MBEDTLS_HAVEGE_C */
Janos Follath 0:1f7c5025e59d 785
Janos Follath 0:1f7c5025e59d 786 #if defined(MBEDTLS_CTR_DRBG_C)
mbed_official 78:5f419e0f96dd 787 MBED_NOINLINE static int benchmark_ctr_drbg()
mbed_official 78:5f419e0f96dd 788 {
mbed_official 78:5f419e0f96dd 789 int ret = 0;
mbed_official 78:5f419e0f96dd 790 const char *nopr_title = "CTR_DRBG (NOPR)";
mbed_official 78:5f419e0f96dd 791 const char *pr_title = "CTR_DRBG (PR)";
mbed_official 78:5f419e0f96dd 792 mbedtls_ctr_drbg_context ctr_drbg;
mbed_official 78:5f419e0f96dd 793
mbed_official 78:5f419e0f96dd 794 mbedtls_ctr_drbg_init(&ctr_drbg);
Janos Follath 0:1f7c5025e59d 795
mbed_official 78:5f419e0f96dd 796 ret = mbedtls_ctr_drbg_seed(&ctr_drbg, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 797 if (ret != 0) {
mbed_official 78:5f419e0f96dd 798 PRINT_ERROR(ret, "mbedtls_ctr_drbg_seed()");
mbed_official 78:5f419e0f96dd 799 goto exit;
mbed_official 78:5f419e0f96dd 800 }
mbed_official 78:5f419e0f96dd 801
mbed_official 78:5f419e0f96dd 802 BENCHMARK_FUNC_CALL(nopr_title,
mbed_official 78:5f419e0f96dd 803 mbedtls_ctr_drbg_random(&ctr_drbg, buf, BUFSIZE));
Janos Follath 0:1f7c5025e59d 804
mbed_official 78:5f419e0f96dd 805 ret = mbedtls_ctr_drbg_seed(&ctr_drbg, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 806 if (ret != 0) {
mbed_official 78:5f419e0f96dd 807 PRINT_ERROR(ret, "mbedtls_ctr_drbg_seed()");
mbed_official 78:5f419e0f96dd 808 goto exit;
mbed_official 78:5f419e0f96dd 809 }
Janos Follath 0:1f7c5025e59d 810
mbed_official 78:5f419e0f96dd 811 mbedtls_ctr_drbg_set_prediction_resistance(&ctr_drbg,
mbed_official 78:5f419e0f96dd 812 MBEDTLS_CTR_DRBG_PR_ON);
mbed_official 78:5f419e0f96dd 813 BENCHMARK_FUNC_CALL(pr_title,
mbed_official 78:5f419e0f96dd 814 mbedtls_ctr_drbg_random(&ctr_drbg, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 815
mbed_official 78:5f419e0f96dd 816 ret = 0;
mbed_official 78:5f419e0f96dd 817
mbed_official 78:5f419e0f96dd 818 exit:
mbed_official 78:5f419e0f96dd 819 mbedtls_ctr_drbg_free(&ctr_drbg);
mbed_official 78:5f419e0f96dd 820
mbed_official 78:5f419e0f96dd 821 return ret;
mbed_official 78:5f419e0f96dd 822 }
mbed_official 78:5f419e0f96dd 823 #endif /* MBEDTLS_CTR_DRBG_C */
Janos Follath 0:1f7c5025e59d 824
Janos Follath 0:1f7c5025e59d 825 #if defined(MBEDTLS_HMAC_DRBG_C)
mbed_official 78:5f419e0f96dd 826 MBED_NOINLINE static int benchmark_hmac_drbg()
mbed_official 78:5f419e0f96dd 827 {
mbed_official 78:5f419e0f96dd 828 int ret = 0;
mbed_official 78:5f419e0f96dd 829 mbedtls_hmac_drbg_context hmac_drbg;
mbed_official 78:5f419e0f96dd 830 const mbedtls_md_info_t *md_info;
Janos Follath 0:1f7c5025e59d 831
mbed_official 78:5f419e0f96dd 832 mbedtls_hmac_drbg_init(&hmac_drbg);
Janos Follath 0:1f7c5025e59d 833
Janos Follath 0:1f7c5025e59d 834 #if defined(MBEDTLS_SHA1_C)
mbed_official 78:5f419e0f96dd 835 md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);
mbed_official 78:5f419e0f96dd 836 if (md_info == NULL) {
mbed_official 78:5f419e0f96dd 837 mbedtls_printf("mbedtls_md_info_from_type() returned NULL\n");
mbed_official 78:5f419e0f96dd 838 ret = -1;
mbed_official 78:5f419e0f96dd 839 goto exit;
mbed_official 78:5f419e0f96dd 840 }
Janos Follath 0:1f7c5025e59d 841
mbed_official 78:5f419e0f96dd 842 ret = mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 843 if (ret != 0) {
mbed_official 78:5f419e0f96dd 844 PRINT_ERROR(ret, "mbedtls_hmac_drbg_seed()");
mbed_official 78:5f419e0f96dd 845 goto exit;
mbed_official 78:5f419e0f96dd 846 }
mbed_official 78:5f419e0f96dd 847 BENCHMARK_FUNC_CALL("HMAC_DRBG SHA-1 (NOPR)",
mbed_official 78:5f419e0f96dd 848 mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 849
mbed_official 78:5f419e0f96dd 850 ret = mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 851 if (ret != 0) {
mbed_official 78:5f419e0f96dd 852 PRINT_ERROR(ret, "mbedtls_hmac_drbg_seed()");
mbed_official 78:5f419e0f96dd 853 goto exit;
mbed_official 78:5f419e0f96dd 854 }
mbed_official 78:5f419e0f96dd 855 mbedtls_hmac_drbg_set_prediction_resistance(&hmac_drbg,
mbed_official 78:5f419e0f96dd 856 MBEDTLS_HMAC_DRBG_PR_ON);
mbed_official 78:5f419e0f96dd 857 BENCHMARK_FUNC_CALL("HMAC_DRBG SHA-1 (PR)",
mbed_official 78:5f419e0f96dd 858 mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 859 #endif /* MBEDTLS_SHA1_C */
Janos Follath 0:1f7c5025e59d 860
Janos Follath 0:1f7c5025e59d 861 #if defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 862 md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
mbed_official 78:5f419e0f96dd 863 if (md_info == NULL) {
mbed_official 78:5f419e0f96dd 864 PRINT_ERROR(ret, "mbedtls_md_info_from_type()");
mbed_official 78:5f419e0f96dd 865 goto exit;
mbed_official 78:5f419e0f96dd 866 }
Janos Follath 0:1f7c5025e59d 867
mbed_official 78:5f419e0f96dd 868 ret = mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 869 if (ret != 0) {
mbed_official 78:5f419e0f96dd 870 PRINT_ERROR(ret, "mbedtls_hmac_drbg_seed()");
mbed_official 78:5f419e0f96dd 871 goto exit;
mbed_official 78:5f419e0f96dd 872 }
mbed_official 78:5f419e0f96dd 873 BENCHMARK_FUNC_CALL("HMAC_DRBG SHA-256 (NOPR)",
mbed_official 78:5f419e0f96dd 874 mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
Janos Follath 0:1f7c5025e59d 875
mbed_official 78:5f419e0f96dd 876 ret = mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 877 if (ret != 0) {
mbed_official 78:5f419e0f96dd 878 PRINT_ERROR(ret, "mbedtls_hmac_drbg_seed()");
mbed_official 78:5f419e0f96dd 879 goto exit;
Janos Follath 0:1f7c5025e59d 880 }
mbed_official 78:5f419e0f96dd 881 mbedtls_hmac_drbg_set_prediction_resistance(&hmac_drbg,
mbed_official 78:5f419e0f96dd 882 MBEDTLS_HMAC_DRBG_PR_ON);
mbed_official 78:5f419e0f96dd 883 BENCHMARK_FUNC_CALL("HMAC_DRBG SHA-256 (PR)",
mbed_official 78:5f419e0f96dd 884 mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 885 #endif /* MBEDTLS_SHA256_C */
mbed_official 70:72c865037f5d 886
mbed_official 78:5f419e0f96dd 887 ret = 0;
mbed_official 78:5f419e0f96dd 888
mbed_official 78:5f419e0f96dd 889 exit:
mbed_official 78:5f419e0f96dd 890 mbedtls_hmac_drbg_free(&hmac_drbg);
mbed_official 78:5f419e0f96dd 891
mbed_official 78:5f419e0f96dd 892 return ret;
mbed_official 78:5f419e0f96dd 893 }
mbed_official 78:5f419e0f96dd 894 #endif /* MBEDTLS_HMAC_DRBG_C */
Janos Follath 0:1f7c5025e59d 895
Janos Follath 0:1f7c5025e59d 896 #if defined(MBEDTLS_RSA_C) && \
Janos Follath 0:1f7c5025e59d 897 defined(MBEDTLS_PEM_PARSE_C) && defined(MBEDTLS_PK_PARSE_C)
mbed_official 78:5f419e0f96dd 898 MBED_NOINLINE static int benchmark_rsa()
mbed_official 78:5f419e0f96dd 899 {
mbed_official 78:5f419e0f96dd 900 int ret = 0;
mbed_official 78:5f419e0f96dd 901 mbedtls_pk_context pk;
mbed_official 78:5f419e0f96dd 902 mbedtls_rsa_context *rsa;
mbed_official 78:5f419e0f96dd 903 const char *rsa_keys[] = {
mbed_official 78:5f419e0f96dd 904 RSA_PRIVATE_KEY_2048,
mbed_official 78:5f419e0f96dd 905 };
mbed_official 78:5f419e0f96dd 906 size_t i;
Janos Follath 0:1f7c5025e59d 907
mbed_official 78:5f419e0f96dd 908 for (i = 0; i < sizeof(rsa_keys) / sizeof(rsa_keys[0]) && ret == 0; i++) {
mbed_official 78:5f419e0f96dd 909 mbedtls_pk_init(&pk);
mbed_official 78:5f419e0f96dd 910
mbed_official 78:5f419e0f96dd 911 ret = mbedtls_pk_parse_key(&pk, (const unsigned char *)rsa_keys[i],
mbed_official 78:5f419e0f96dd 912 strlen(rsa_keys[i]) + 1, NULL, 0);
mbed_official 78:5f419e0f96dd 913 if (ret != 0) {
mbed_official 78:5f419e0f96dd 914 PRINT_ERROR(ret, "mbedtls_pk_parse_key()");
mbed_official 78:5f419e0f96dd 915 goto exit;
mbed_official 78:5f419e0f96dd 916 }
mbed_official 78:5f419e0f96dd 917
mbed_official 78:5f419e0f96dd 918 rsa = mbedtls_pk_rsa(pk);
Janos Follath 0:1f7c5025e59d 919
mbed_official 78:5f419e0f96dd 920 ret = mbedtls_snprintf(title, sizeof(title), "RSA-%d",
mbed_official 78:5f419e0f96dd 921 mbedtls_pk_get_bitlen(&pk));
mbed_official 78:5f419e0f96dd 922 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 923 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 924 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 925 goto exit;
mbed_official 78:5f419e0f96dd 926 }
Janos Follath 0:1f7c5025e59d 927
mbed_official 78:5f419e0f96dd 928 BENCHMARK_PUBLIC(title, " public",
mbed_official 78:5f419e0f96dd 929 buf[0] = 0;
mbed_official 78:5f419e0f96dd 930 ret = mbedtls_rsa_public(rsa, buf, buf));
Janos Follath 0:1f7c5025e59d 931
mbed_official 78:5f419e0f96dd 932 BENCHMARK_PUBLIC(title, "private",
mbed_official 78:5f419e0f96dd 933 buf[0] = 0;
mbed_official 78:5f419e0f96dd 934 ret = mbedtls_rsa_private(rsa, myrand, NULL, buf,
mbed_official 78:5f419e0f96dd 935 buf));
Janos Follath 0:1f7c5025e59d 936
mbed_official 78:5f419e0f96dd 937 exit:
mbed_official 78:5f419e0f96dd 938 mbedtls_pk_free(&pk);
Janos Follath 0:1f7c5025e59d 939 }
mbed_official 78:5f419e0f96dd 940
mbed_official 78:5f419e0f96dd 941 return ret;
mbed_official 78:5f419e0f96dd 942 }
mbed_official 78:5f419e0f96dd 943 #endif /* MBEDTLS_RSA_C && MBEDTLS_PEM_PARSE_C && MBEDTLS_PK_PARSE_C */
Janos Follath 0:1f7c5025e59d 944
Janos Follath 0:1f7c5025e59d 945 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_BIGNUM_C)
mbed_official 78:5f419e0f96dd 946 MBED_NOINLINE static int benchmark_dhm()
mbed_official 78:5f419e0f96dd 947 {
mbed_official 78:5f419e0f96dd 948 int ret = 0;
mbed_official 78:5f419e0f96dd 949 int dhm_sizes[] = {
mbed_official 78:5f419e0f96dd 950 2048,
mbed_official 78:5f419e0f96dd 951 3072,
mbed_official 78:5f419e0f96dd 952 };
mbed_official 78:5f419e0f96dd 953 const char *dhm_P[] = {
mbed_official 78:5f419e0f96dd 954 MBEDTLS_DHM_RFC3526_MODP_2048_P,
mbed_official 78:5f419e0f96dd 955 MBEDTLS_DHM_RFC3526_MODP_3072_P,
mbed_official 78:5f419e0f96dd 956 };
mbed_official 78:5f419e0f96dd 957 const char *dhm_G[] = {
mbed_official 78:5f419e0f96dd 958 MBEDTLS_DHM_RFC3526_MODP_2048_G,
mbed_official 78:5f419e0f96dd 959 MBEDTLS_DHM_RFC3526_MODP_3072_G,
mbed_official 78:5f419e0f96dd 960 };
Janos Follath 0:1f7c5025e59d 961
mbed_official 78:5f419e0f96dd 962 mbedtls_dhm_context dhm;
mbed_official 78:5f419e0f96dd 963 size_t olen;
mbed_official 78:5f419e0f96dd 964 size_t i;
mbed_official 78:5f419e0f96dd 965
mbed_official 78:5f419e0f96dd 966 for (i = 0;
mbed_official 78:5f419e0f96dd 967 i < sizeof(dhm_sizes) / sizeof(dhm_sizes[0]) && ret == 0;
mbed_official 78:5f419e0f96dd 968 i++) {
mbed_official 78:5f419e0f96dd 969 mbedtls_dhm_init(&dhm);
Janos Follath 0:1f7c5025e59d 970
mbed_official 78:5f419e0f96dd 971 ret = mbedtls_mpi_read_string(&dhm.P, 16, dhm_P[i]);
mbed_official 78:5f419e0f96dd 972 if (ret != 0) {
mbed_official 78:5f419e0f96dd 973 PRINT_ERROR(ret, "mbedtls_mpi_read_string()");
mbed_official 78:5f419e0f96dd 974 goto exit;
mbed_official 78:5f419e0f96dd 975 }
mbed_official 78:5f419e0f96dd 976 ret = mbedtls_mpi_read_string(&dhm.G, 16, dhm_G[i]);
mbed_official 78:5f419e0f96dd 977 if (ret != 0) {
mbed_official 78:5f419e0f96dd 978 PRINT_ERROR(ret, "mbedtls_mpi_read_string()");
mbed_official 78:5f419e0f96dd 979 goto exit;
mbed_official 78:5f419e0f96dd 980 }
Janos Follath 0:1f7c5025e59d 981
mbed_official 78:5f419e0f96dd 982 dhm.len = mbedtls_mpi_size(&dhm.P);
mbed_official 78:5f419e0f96dd 983 ret = mbedtls_dhm_make_public(&dhm, (int) dhm.len, buf, dhm.len,
mbed_official 78:5f419e0f96dd 984 myrand, NULL);
mbed_official 78:5f419e0f96dd 985 if (ret != 0) {
mbed_official 78:5f419e0f96dd 986 PRINT_ERROR(ret, "mbedtls_dhm_make_public()");
mbed_official 78:5f419e0f96dd 987 goto exit;
Janos Follath 0:1f7c5025e59d 988 }
Janos Follath 0:1f7c5025e59d 989
mbed_official 78:5f419e0f96dd 990 ret = mbedtls_mpi_copy(&dhm.GY, &dhm.GX);
mbed_official 78:5f419e0f96dd 991 if (ret != 0) {
mbed_official 78:5f419e0f96dd 992 PRINT_ERROR(ret, "mbedtls_mpi_copy()");
mbed_official 78:5f419e0f96dd 993 goto exit;
mbed_official 78:5f419e0f96dd 994 }
Janos Follath 0:1f7c5025e59d 995
mbed_official 78:5f419e0f96dd 996 ret = mbedtls_snprintf(title, sizeof(title), "DHE-%d", dhm_sizes[i]);
mbed_official 78:5f419e0f96dd 997 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 998 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 999 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1000 goto exit;
mbed_official 78:5f419e0f96dd 1001 }
Janos Follath 0:1f7c5025e59d 1002
mbed_official 78:5f419e0f96dd 1003 /*
mbed_official 78:5f419e0f96dd 1004 * Benchmarking this requires two function calls that can fail. We
mbed_official 78:5f419e0f96dd 1005 * add a check in between them to check for any errors. In normal
mbed_official 78:5f419e0f96dd 1006 * operation, the overhead of this check is negligible
mbed_official 78:5f419e0f96dd 1007 */
mbed_official 78:5f419e0f96dd 1008 BENCHMARK_PUBLIC(title, "handshake",
mbed_official 78:5f419e0f96dd 1009 ret = mbedtls_dhm_make_public(&dhm, (int)dhm.len,
mbed_official 78:5f419e0f96dd 1010 buf, dhm.len, myrand,
mbed_official 78:5f419e0f96dd 1011 NULL);
mbed_official 78:5f419e0f96dd 1012 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1013 PRINT_ERROR(ret, "mbedtls_dhm_make_public()");
mbed_official 78:5f419e0f96dd 1014 goto exit;
mbed_official 78:5f419e0f96dd 1015 }
mbed_official 78:5f419e0f96dd 1016 ret = mbedtls_dhm_calc_secret(&dhm, buf, sizeof(buf),
mbed_official 78:5f419e0f96dd 1017 &olen, myrand, NULL));
Janos Follath 0:1f7c5025e59d 1018
mbed_official 78:5f419e0f96dd 1019 ret = mbedtls_snprintf(title, sizeof(title), "DH-%d", dhm_sizes[i]);
mbed_official 78:5f419e0f96dd 1020 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1021 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1022 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1023 goto exit;
Janos Follath 0:1f7c5025e59d 1024 }
Janos Follath 0:1f7c5025e59d 1025
mbed_official 78:5f419e0f96dd 1026 BENCHMARK_PUBLIC(title, "handshake",
mbed_official 78:5f419e0f96dd 1027 ret = mbedtls_dhm_calc_secret(&dhm, buf, sizeof(buf),
mbed_official 78:5f419e0f96dd 1028 &olen, myrand, NULL));
mbed_official 78:5f419e0f96dd 1029
mbed_official 78:5f419e0f96dd 1030 exit:
mbed_official 78:5f419e0f96dd 1031 mbedtls_dhm_free(&dhm);
mbed_official 78:5f419e0f96dd 1032 }
mbed_official 78:5f419e0f96dd 1033
mbed_official 78:5f419e0f96dd 1034 return ret;
mbed_official 78:5f419e0f96dd 1035 }
mbed_official 78:5f419e0f96dd 1036 #endif /* MBEDTLS_DHM_C && MBEDTLS_BIGNUM_C */
Janos Follath 0:1f7c5025e59d 1037
mbed_official 78:5f419e0f96dd 1038 #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 1039 MBED_NOINLINE static int benchmark_ecdsa()
mbed_official 78:5f419e0f96dd 1040 {
mbed_official 78:5f419e0f96dd 1041 int ret = 0;
mbed_official 78:5f419e0f96dd 1042 mbedtls_ecdsa_context ecdsa;
mbed_official 78:5f419e0f96dd 1043 const mbedtls_ecp_curve_info *curve_info;
mbed_official 78:5f419e0f96dd 1044 size_t sig_len;
mbed_official 78:5f419e0f96dd 1045 size_t hash_len;
mbed_official 78:5f419e0f96dd 1046
mbed_official 78:5f419e0f96dd 1047 memset(buf, 0x2A, sizeof(buf));
Janos Follath 0:1f7c5025e59d 1048
mbed_official 78:5f419e0f96dd 1049 for (curve_info = mbedtls_ecp_curve_list();
mbed_official 78:5f419e0f96dd 1050 curve_info->grp_id != MBEDTLS_ECP_DP_NONE && ret == 0;
mbed_official 78:5f419e0f96dd 1051 curve_info++) {
mbed_official 78:5f419e0f96dd 1052 mbedtls_ecdsa_init(&ecdsa);
Janos Follath 0:1f7c5025e59d 1053
mbed_official 78:5f419e0f96dd 1054 ret = mbedtls_ecdsa_genkey(&ecdsa, curve_info->grp_id, myrand, NULL);
mbed_official 78:5f419e0f96dd 1055 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1056 PRINT_ERROR(ret, "mbedtls_ecdsa_genkey()");
mbed_official 78:5f419e0f96dd 1057 goto exit;
Janos Follath 0:1f7c5025e59d 1058 }
mbed_official 78:5f419e0f96dd 1059
mbed_official 78:5f419e0f96dd 1060 ecp_clear_precomputed(&ecdsa.grp);
Janos Follath 0:1f7c5025e59d 1061
mbed_official 78:5f419e0f96dd 1062 ret = mbedtls_snprintf(title, sizeof(title), "ECDSA-%s",
mbed_official 78:5f419e0f96dd 1063 curve_info->name);
mbed_official 78:5f419e0f96dd 1064 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1065 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1066 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1067 goto exit;
mbed_official 78:5f419e0f96dd 1068 }
Janos Follath 0:1f7c5025e59d 1069
mbed_official 78:5f419e0f96dd 1070 hash_len = (curve_info->bit_size + 7) / 8;
mbed_official 78:5f419e0f96dd 1071 BENCHMARK_PUBLIC(title, "sign",
mbed_official 78:5f419e0f96dd 1072 ret = mbedtls_ecdsa_write_signature(&ecdsa,
mbed_official 78:5f419e0f96dd 1073 MBEDTLS_MD_SHA256,
mbed_official 78:5f419e0f96dd 1074 buf, hash_len,
mbed_official 78:5f419e0f96dd 1075 tmp, &sig_len,
mbed_official 78:5f419e0f96dd 1076 myrand, NULL));
mbed_official 78:5f419e0f96dd 1077
mbed_official 78:5f419e0f96dd 1078 mbedtls_ecdsa_free(&ecdsa);
mbed_official 78:5f419e0f96dd 1079 }
mbed_official 78:5f419e0f96dd 1080
mbed_official 78:5f419e0f96dd 1081 for (curve_info = mbedtls_ecp_curve_list();
mbed_official 78:5f419e0f96dd 1082 curve_info->grp_id != MBEDTLS_ECP_DP_NONE && ret == 0;
mbed_official 78:5f419e0f96dd 1083 curve_info++) {
mbed_official 78:5f419e0f96dd 1084 mbedtls_ecdsa_init(&ecdsa);
Janos Follath 0:1f7c5025e59d 1085
mbed_official 78:5f419e0f96dd 1086 ret = mbedtls_ecdsa_genkey(&ecdsa, curve_info->grp_id, myrand, NULL);
mbed_official 78:5f419e0f96dd 1087 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1088 PRINT_ERROR(ret, "mbedtls_ecdsa_genkey()");
mbed_official 78:5f419e0f96dd 1089 goto exit;
mbed_official 78:5f419e0f96dd 1090 }
Janos Follath 0:1f7c5025e59d 1091
mbed_official 78:5f419e0f96dd 1092 hash_len = (curve_info->bit_size + 7) / 8;
mbed_official 78:5f419e0f96dd 1093 ret = mbedtls_ecdsa_write_signature(&ecdsa, MBEDTLS_MD_SHA256, buf,
mbed_official 78:5f419e0f96dd 1094 hash_len, tmp, &sig_len, myrand,
mbed_official 78:5f419e0f96dd 1095 NULL);
mbed_official 78:5f419e0f96dd 1096 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1097 PRINT_ERROR(ret, "mbedtls_ecdsa_write_signature()");
mbed_official 78:5f419e0f96dd 1098 goto exit;
mbed_official 78:5f419e0f96dd 1099 }
mbed_official 78:5f419e0f96dd 1100
mbed_official 78:5f419e0f96dd 1101 ecp_clear_precomputed(&ecdsa.grp);
mbed_official 78:5f419e0f96dd 1102
mbed_official 78:5f419e0f96dd 1103 ret = mbedtls_snprintf(title, sizeof(title), "ECDSA-%s",
mbed_official 78:5f419e0f96dd 1104 curve_info->name);
mbed_official 78:5f419e0f96dd 1105 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1106 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1107 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1108 goto exit;
Janos Follath 0:1f7c5025e59d 1109 }
Janos Follath 0:1f7c5025e59d 1110
mbed_official 78:5f419e0f96dd 1111 BENCHMARK_PUBLIC(title, "verify",
mbed_official 78:5f419e0f96dd 1112 ret = mbedtls_ecdsa_read_signature(&ecdsa, buf,
mbed_official 78:5f419e0f96dd 1113 hash_len, tmp,
mbed_official 78:5f419e0f96dd 1114 sig_len));
mbed_official 78:5f419e0f96dd 1115
mbed_official 78:5f419e0f96dd 1116 exit:
mbed_official 78:5f419e0f96dd 1117 mbedtls_ecdsa_free(&ecdsa);
mbed_official 78:5f419e0f96dd 1118 }
mbed_official 78:5f419e0f96dd 1119
mbed_official 78:5f419e0f96dd 1120 return ret;
mbed_official 78:5f419e0f96dd 1121 }
mbed_official 78:5f419e0f96dd 1122 #endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA2565_C */
mbed_official 78:5f419e0f96dd 1123
mbed_official 78:5f419e0f96dd 1124 #if defined(MBEDTLS_ECDH_C)
mbed_official 78:5f419e0f96dd 1125 MBED_NOINLINE static int benchmark_ecdh()
mbed_official 78:5f419e0f96dd 1126 {
mbed_official 78:5f419e0f96dd 1127 int ret = 0;
mbed_official 78:5f419e0f96dd 1128 mbedtls_ecdh_context ecdh;
mbed_official 78:5f419e0f96dd 1129 const mbedtls_ecp_curve_info *curve_info;
mbed_official 78:5f419e0f96dd 1130 size_t olen;
Janos Follath 0:1f7c5025e59d 1131
mbed_official 78:5f419e0f96dd 1132 for (curve_info = mbedtls_ecp_curve_list();
mbed_official 78:5f419e0f96dd 1133 curve_info->grp_id != MBEDTLS_ECP_DP_NONE && ret == 0;
mbed_official 78:5f419e0f96dd 1134 curve_info++) {
mbed_official 78:5f419e0f96dd 1135 mbedtls_ecdh_init(&ecdh);
mbed_official 78:5f419e0f96dd 1136
mbed_official 78:5f419e0f96dd 1137 ret = mbedtls_ecp_group_load(&ecdh.grp, curve_info->grp_id);
mbed_official 78:5f419e0f96dd 1138 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1139 PRINT_ERROR(ret, "mbedtls_ecp_group_load()");
mbed_official 78:5f419e0f96dd 1140 goto exit;
mbed_official 78:5f419e0f96dd 1141 }
mbed_official 78:5f419e0f96dd 1142
mbed_official 78:5f419e0f96dd 1143 ret = mbedtls_ecdh_make_public(&ecdh, &olen, buf, sizeof(buf),
mbed_official 78:5f419e0f96dd 1144 myrand, NULL);
mbed_official 78:5f419e0f96dd 1145 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1146 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1147 goto exit;
mbed_official 78:5f419e0f96dd 1148 }
mbed_official 78:5f419e0f96dd 1149
mbed_official 78:5f419e0f96dd 1150 ret = mbedtls_ecp_copy(&ecdh.Qp, &ecdh.Q);
mbed_official 78:5f419e0f96dd 1151 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1152 PRINT_ERROR(ret, "mbedtls_ecp_copy()");
mbed_official 78:5f419e0f96dd 1153 goto exit;
Janos Follath 0:1f7c5025e59d 1154 }
Janos Follath 0:1f7c5025e59d 1155
mbed_official 78:5f419e0f96dd 1156 ecp_clear_precomputed(&ecdh.grp);
Janos Follath 0:1f7c5025e59d 1157
mbed_official 78:5f419e0f96dd 1158 ret = mbedtls_snprintf(title, sizeof(title), "ECDHE-%s",
mbed_official 78:5f419e0f96dd 1159 curve_info->name);
mbed_official 78:5f419e0f96dd 1160 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1161 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1162 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1163 goto exit;
Janos Follath 0:1f7c5025e59d 1164 }
Janos Follath 0:1f7c5025e59d 1165
mbed_official 78:5f419e0f96dd 1166 /*
mbed_official 78:5f419e0f96dd 1167 * Benchmarking this requires two function calls that can fail. We
mbed_official 78:5f419e0f96dd 1168 * add a check in between them to check for any errors. In normal
mbed_official 78:5f419e0f96dd 1169 * operation, the overhead of this check is negligible
mbed_official 78:5f419e0f96dd 1170 */
mbed_official 78:5f419e0f96dd 1171 BENCHMARK_PUBLIC(title, "handshake",
mbed_official 78:5f419e0f96dd 1172 ret = mbedtls_ecdh_make_public(&ecdh, &olen, buf,
mbed_official 78:5f419e0f96dd 1173 sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1174 NULL);
mbed_official 78:5f419e0f96dd 1175 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1176 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1177 goto exit;
mbed_official 78:5f419e0f96dd 1178 }
mbed_official 78:5f419e0f96dd 1179 ret = mbedtls_ecdh_calc_secret(&ecdh, &olen, buf,
mbed_official 78:5f419e0f96dd 1180 sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1181 NULL));
mbed_official 78:5f419e0f96dd 1182 mbedtls_ecdh_free(&ecdh);
mbed_official 78:5f419e0f96dd 1183 }
mbed_official 78:5f419e0f96dd 1184
mbed_official 78:5f419e0f96dd 1185 for (curve_info = mbedtls_ecp_curve_list();
mbed_official 78:5f419e0f96dd 1186 curve_info->grp_id != MBEDTLS_ECP_DP_NONE && ret == 0;
mbed_official 78:5f419e0f96dd 1187 curve_info++) {
mbed_official 78:5f419e0f96dd 1188 mbedtls_ecdh_init(&ecdh);
Janos Follath 0:1f7c5025e59d 1189
mbed_official 78:5f419e0f96dd 1190 ret = mbedtls_ecp_group_load(&ecdh.grp, curve_info->grp_id);
mbed_official 78:5f419e0f96dd 1191 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1192 PRINT_ERROR(ret, "mbedtls_ecp_group_load()");
mbed_official 78:5f419e0f96dd 1193 goto exit;
mbed_official 78:5f419e0f96dd 1194 }
mbed_official 78:5f419e0f96dd 1195
mbed_official 78:5f419e0f96dd 1196 ret = mbedtls_ecdh_make_public(&ecdh, &olen, buf, sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1197 NULL);
mbed_official 78:5f419e0f96dd 1198 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1199 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1200 goto exit;
mbed_official 78:5f419e0f96dd 1201 }
mbed_official 78:5f419e0f96dd 1202
mbed_official 78:5f419e0f96dd 1203 ret = mbedtls_ecp_copy(&ecdh.Qp, &ecdh.Q);
mbed_official 78:5f419e0f96dd 1204 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1205 PRINT_ERROR(ret, "mbedtls_ecp_copy()");
mbed_official 78:5f419e0f96dd 1206 goto exit;
mbed_official 78:5f419e0f96dd 1207 }
mbed_official 78:5f419e0f96dd 1208
mbed_official 78:5f419e0f96dd 1209 ret = mbedtls_ecdh_make_public(&ecdh, &olen, buf, sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1210 NULL);
mbed_official 78:5f419e0f96dd 1211 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1212 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1213 goto exit;
Janos Follath 0:1f7c5025e59d 1214 }
Janos Follath 0:1f7c5025e59d 1215
mbed_official 78:5f419e0f96dd 1216 ecp_clear_precomputed(&ecdh.grp);
mbed_official 70:72c865037f5d 1217
mbed_official 78:5f419e0f96dd 1218 ret = mbedtls_snprintf(title, sizeof(title), "ECDH-%s",
mbed_official 78:5f419e0f96dd 1219 curve_info->name);
mbed_official 78:5f419e0f96dd 1220 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1221 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1222 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1223 goto exit;
mbed_official 78:5f419e0f96dd 1224 }
mbed_official 78:5f419e0f96dd 1225 BENCHMARK_PUBLIC(title, "handshake",
mbed_official 78:5f419e0f96dd 1226 ret = mbedtls_ecdh_calc_secret(&ecdh, &olen, buf,
mbed_official 78:5f419e0f96dd 1227 sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1228 NULL));
mbed_official 70:72c865037f5d 1229
mbed_official 78:5f419e0f96dd 1230 exit:
mbed_official 78:5f419e0f96dd 1231 mbedtls_ecdh_free(&ecdh);
mbed_official 70:72c865037f5d 1232 }
mbed_official 78:5f419e0f96dd 1233
mbed_official 78:5f419e0f96dd 1234 return ret;
mbed_official 78:5f419e0f96dd 1235 }
mbed_official 78:5f419e0f96dd 1236 #endif /* MBEDTLS_ECDH_C */
mbed_official 70:72c865037f5d 1237
mbed_official 78:5f419e0f96dd 1238 #if defined(MBEDTLS_ECDH_C) && defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
mbed_official 78:5f419e0f96dd 1239 /* Curve25519 needs to be handled separately */
mbed_official 78:5f419e0f96dd 1240 MBED_NOINLINE static int benchmark_ecdh_curve22519()
mbed_official 78:5f419e0f96dd 1241 {
mbed_official 78:5f419e0f96dd 1242 int ret = 0;
mbed_official 78:5f419e0f96dd 1243 mbedtls_ecdh_context ecdh;
mbed_official 78:5f419e0f96dd 1244 mbedtls_mpi z;
mbed_official 78:5f419e0f96dd 1245
mbed_official 78:5f419e0f96dd 1246 mbedtls_ecdh_init(&ecdh);
mbed_official 78:5f419e0f96dd 1247 mbedtls_mpi_init(&z);
mbed_official 78:5f419e0f96dd 1248
mbed_official 78:5f419e0f96dd 1249 ret = mbedtls_ecp_group_load(&ecdh.grp, MBEDTLS_ECP_DP_CURVE25519);
mbed_official 78:5f419e0f96dd 1250 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1251 PRINT_ERROR(ret, "mbedtls_ecp_group_load()");
mbed_official 78:5f419e0f96dd 1252 goto exit;
mbed_official 78:5f419e0f96dd 1253 }
mbed_official 78:5f419e0f96dd 1254
mbed_official 78:5f419e0f96dd 1255 ret = mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d, &ecdh.Qp, myrand,
mbed_official 78:5f419e0f96dd 1256 NULL);
mbed_official 78:5f419e0f96dd 1257 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1258 PRINT_ERROR(ret, "mbedtls_ecdh_gen_public()");
mbed_official 78:5f419e0f96dd 1259 goto exit;
mbed_official 70:72c865037f5d 1260 }
mbed_official 70:72c865037f5d 1261
mbed_official 78:5f419e0f96dd 1262 /*
mbed_official 78:5f419e0f96dd 1263 * Benchmarking this requires two function calls that can fail. We
mbed_official 78:5f419e0f96dd 1264 * add a check in between them to check for any errors. In normal
mbed_official 78:5f419e0f96dd 1265 * operation, the overhead of this check is negligible
mbed_official 78:5f419e0f96dd 1266 */
mbed_official 78:5f419e0f96dd 1267 BENCHMARK_PUBLIC("ECDHE-Curve25519", "handshake",
mbed_official 78:5f419e0f96dd 1268 ret = mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d,
mbed_official 78:5f419e0f96dd 1269 &ecdh.Q, myrand, NULL);
mbed_official 78:5f419e0f96dd 1270 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1271 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1272 goto exit;
mbed_official 78:5f419e0f96dd 1273 }
mbed_official 78:5f419e0f96dd 1274 ret = mbedtls_ecdh_compute_shared(&ecdh.grp, &z,
mbed_official 78:5f419e0f96dd 1275 &ecdh.Qp, &ecdh.d,
mbed_official 78:5f419e0f96dd 1276 myrand, NULL));
mbed_official 70:72c865037f5d 1277
mbed_official 78:5f419e0f96dd 1278 mbedtls_ecdh_free(&ecdh);
mbed_official 78:5f419e0f96dd 1279 mbedtls_mpi_free(&z);
mbed_official 78:5f419e0f96dd 1280
mbed_official 78:5f419e0f96dd 1281 mbedtls_ecdh_init(&ecdh);
mbed_official 78:5f419e0f96dd 1282 mbedtls_mpi_init(&z);
mbed_official 78:5f419e0f96dd 1283
mbed_official 78:5f419e0f96dd 1284 ret = mbedtls_ecp_group_load(&ecdh.grp, MBEDTLS_ECP_DP_CURVE25519);
mbed_official 78:5f419e0f96dd 1285 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1286 PRINT_ERROR(ret, "mbedtls_ecp_group_load()");
mbed_official 78:5f419e0f96dd 1287 goto exit;
mbed_official 78:5f419e0f96dd 1288 }
Janos Follath 0:1f7c5025e59d 1289
mbed_official 78:5f419e0f96dd 1290 ret = mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d, &ecdh.Qp, myrand, NULL);
mbed_official 78:5f419e0f96dd 1291 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1292 PRINT_ERROR(ret, "mbedtls_ecdh_gen_public()");
mbed_official 78:5f419e0f96dd 1293 goto exit;
mbed_official 78:5f419e0f96dd 1294 }
Janos Follath 0:1f7c5025e59d 1295
mbed_official 78:5f419e0f96dd 1296 ret = mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d, &ecdh.Q, myrand, NULL);
mbed_official 78:5f419e0f96dd 1297 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1298 PRINT_ERROR(ret, "mbedtls_ecdh_gen_public()");
mbed_official 78:5f419e0f96dd 1299 goto exit;
mbed_official 78:5f419e0f96dd 1300 }
Janos Follath 0:1f7c5025e59d 1301
mbed_official 78:5f419e0f96dd 1302 BENCHMARK_PUBLIC("ECDH-Curve25519", "handshake",
mbed_official 78:5f419e0f96dd 1303 ret = mbedtls_ecdh_compute_shared(&ecdh.grp, &z,
mbed_official 78:5f419e0f96dd 1304 &ecdh.Qp, &ecdh.d,
mbed_official 78:5f419e0f96dd 1305 myrand, NULL));
mbed_official 78:5f419e0f96dd 1306
mbed_official 78:5f419e0f96dd 1307 exit:
mbed_official 78:5f419e0f96dd 1308 mbedtls_ecdh_free(&ecdh);
mbed_official 78:5f419e0f96dd 1309 mbedtls_mpi_free(&z);
mbed_official 78:5f419e0f96dd 1310
mbed_official 78:5f419e0f96dd 1311 return ret;
Janos Follath 0:1f7c5025e59d 1312 }
mbed_official 78:5f419e0f96dd 1313 #endif /* MBEDTLS_ECDH_C && MBEDTLS_ECP_DP_CURVE25519_ENABLED */
Janos Follath 0:1f7c5025e59d 1314
mbed_official 78:5f419e0f96dd 1315 int main()
mbed_official 78:5f419e0f96dd 1316 {
mbed_official 78:5f419e0f96dd 1317 int exit_code = MBEDTLS_EXIT_SUCCESS;
mbed_official 63:9f7e5224fc60 1318
mbed_official 78:5f419e0f96dd 1319 memset(buf, 0xAA, sizeof(buf));
mbed_official 78:5f419e0f96dd 1320 memset(tmp, 0xBB, sizeof(tmp));
mbed_official 78:5f419e0f96dd 1321
mbed_official 80:0f7a38bbcebe 1322 if ((exit_code = mbedtls_platform_setup(NULL)) != 0) {
mbed_official 78:5f419e0f96dd 1323 mbedtls_printf("Platform initialization failed with error %d\r\n",
mbed_official 78:5f419e0f96dd 1324 exit_code);
mbed_official 63:9f7e5224fc60 1325 return MBEDTLS_EXIT_FAILURE;
Janos Follath 0:1f7c5025e59d 1326 }
mbed_official 63:9f7e5224fc60 1327
mbed_official 78:5f419e0f96dd 1328 #if defined(MBEDTLS_MD4_C)
mbed_official 78:5f419e0f96dd 1329 if (benchmark_md4() != 0) {
mbed_official 78:5f419e0f96dd 1330 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1331 }
mbed_official 78:5f419e0f96dd 1332 #endif /* MBEDTLS_MD4_C */
mbed_official 78:5f419e0f96dd 1333
mbed_official 78:5f419e0f96dd 1334 #if defined(MBEDTLS_MD5_C)
mbed_official 78:5f419e0f96dd 1335 if (benchmark_md5() != 0) {
mbed_official 78:5f419e0f96dd 1336 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1337 }
mbed_official 78:5f419e0f96dd 1338 #endif /* MBEDTLS_MD5_C */
mbed_official 78:5f419e0f96dd 1339
mbed_official 78:5f419e0f96dd 1340 #if defined(MBEDTLS_RIPEMD160_C)
mbed_official 78:5f419e0f96dd 1341 if (benchmark_ripemd160() != 0) {
mbed_official 78:5f419e0f96dd 1342 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1343 }
mbed_official 78:5f419e0f96dd 1344 #endif /* MBEDTLS_RIPEMD160_C */
mbed_official 78:5f419e0f96dd 1345
mbed_official 78:5f419e0f96dd 1346 #if defined(MBEDTLS_SHA1_C)
mbed_official 78:5f419e0f96dd 1347 if (benchmark_sha1() != 0) {
mbed_official 78:5f419e0f96dd 1348 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1349 }
mbed_official 78:5f419e0f96dd 1350 #endif /* MBEDTLS_SHA1_C */
mbed_official 78:5f419e0f96dd 1351
mbed_official 78:5f419e0f96dd 1352 #if defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 1353 if (benchmark_sha256() != 0) {
mbed_official 78:5f419e0f96dd 1354 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1355 }
mbed_official 78:5f419e0f96dd 1356 #endif /* MBEDTLS_SHA256_C */
mbed_official 78:5f419e0f96dd 1357
mbed_official 78:5f419e0f96dd 1358 #if defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 1359 if (benchmark_sha512() != 0) {
mbed_official 78:5f419e0f96dd 1360 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1361 }
mbed_official 78:5f419e0f96dd 1362 #endif /* MBEDTLS_SHA512_C */
mbed_official 78:5f419e0f96dd 1363
mbed_official 78:5f419e0f96dd 1364 #if defined(MBEDTLS_ARC4_C)
mbed_official 78:5f419e0f96dd 1365 if (benchmark_arc4() != 0) {
mbed_official 78:5f419e0f96dd 1366 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1367 }
mbed_official 78:5f419e0f96dd 1368 #endif /* MBEDTLS_ARC4_C */
mbed_official 78:5f419e0f96dd 1369
mbed_official 78:5f419e0f96dd 1370 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1371 if (benchmark_des3() != 0) {
mbed_official 78:5f419e0f96dd 1372 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1373 }
mbed_official 78:5f419e0f96dd 1374 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1375
mbed_official 78:5f419e0f96dd 1376 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1377 if (benchmark_des() != 0) {
mbed_official 78:5f419e0f96dd 1378 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1379 }
mbed_official 78:5f419e0f96dd 1380 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1381
mbed_official 78:5f419e0f96dd 1382 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \
mbed_official 78:5f419e0f96dd 1383 defined(MBEDTLS_CMAC_C)
mbed_official 78:5f419e0f96dd 1384 if (benchmark_des3_cmac() != 0) {
mbed_official 78:5f419e0f96dd 1385 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1386 }
mbed_official 78:5f419e0f96dd 1387 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC && MBEDTLS_CMAC_C */
mbed_official 78:5f419e0f96dd 1388
mbed_official 78:5f419e0f96dd 1389 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1390 if (benchmark_aes_cbc() != 0) {
mbed_official 78:5f419e0f96dd 1391 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1392 }
mbed_official 78:5f419e0f96dd 1393 #endif /* MBEDTLS_AES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1394
mbed_official 78:5f419e0f96dd 1395 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CIPHER_MODE_CTR)
mbed_official 78:5f419e0f96dd 1396 if (benchmark_aes_ctr() != 0) {
mbed_official 78:5f419e0f96dd 1397 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1398 }
mbed_official 78:5f419e0f96dd 1399 #endif /* MBEDTLS_AES_C && MBEDTLS_CIPHER_MODE_CTR */
mbed_official 78:5f419e0f96dd 1400
mbed_official 78:5f419e0f96dd 1401 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_GCM_C)
mbed_official 78:5f419e0f96dd 1402 if (benchmark_aes_gcm() != 0) {
mbed_official 78:5f419e0f96dd 1403 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1404 }
mbed_official 78:5f419e0f96dd 1405 #endif /* MBEDTLS_AES_C && MBEDTLS_GCM_C */
mbed_official 78:5f419e0f96dd 1406
mbed_official 78:5f419e0f96dd 1407 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CCM_C)
mbed_official 78:5f419e0f96dd 1408 if (benchmark_aes_ccm() != 0) {
mbed_official 78:5f419e0f96dd 1409 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1410 }
mbed_official 78:5f419e0f96dd 1411 #endif /* MBEDTLS_AES_C && MBEDTLS_CCM_C */
mbed_official 78:5f419e0f96dd 1412
mbed_official 78:5f419e0f96dd 1413 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CMAC_C)
mbed_official 78:5f419e0f96dd 1414 if (benchmark_aes_cmac() != 0) {
mbed_official 78:5f419e0f96dd 1415 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1416 }
mbed_official 78:5f419e0f96dd 1417 #endif /* MBEDTLS_AES_C && MBEDTLS_CMAC_C */
mbed_official 78:5f419e0f96dd 1418
mbed_official 78:5f419e0f96dd 1419 #if defined(MBEDTLS_CAMELLIA_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1420 if (benchmark_camellia() != 0) {
mbed_official 78:5f419e0f96dd 1421 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1422 }
mbed_official 78:5f419e0f96dd 1423 #endif /* MBEDTLS_CAMELLIA_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1424
mbed_official 78:5f419e0f96dd 1425 #if defined(MBEDTLS_BLOWFISH_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1426 if (benchmark_blowfish() != 0) {
mbed_official 78:5f419e0f96dd 1427 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1428 }
mbed_official 78:5f419e0f96dd 1429 #endif /* MBEDTLS_BLOWFISH_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1430
mbed_official 78:5f419e0f96dd 1431 #if defined(MBEDTLS_HAVEGE_C)
mbed_official 78:5f419e0f96dd 1432 if (benchmark_havege() != 0) {
mbed_official 78:5f419e0f96dd 1433 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1434 }
mbed_official 78:5f419e0f96dd 1435 #endif /* MBEDTLS_HAVEGE_C */
mbed_official 78:5f419e0f96dd 1436
mbed_official 78:5f419e0f96dd 1437 #if defined(MBEDTLS_CTR_DRBG_C)
mbed_official 78:5f419e0f96dd 1438 if (benchmark_ctr_drbg() != 0) {
mbed_official 78:5f419e0f96dd 1439 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1440 }
mbed_official 78:5f419e0f96dd 1441 #endif /* MBEDTLS_CTR_DRBG_C */
mbed_official 78:5f419e0f96dd 1442
mbed_official 78:5f419e0f96dd 1443 #if defined(MBEDTLS_HMAC_DRBG_C)
mbed_official 78:5f419e0f96dd 1444 if (benchmark_hmac_drbg() != 0) {
mbed_official 78:5f419e0f96dd 1445 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1446 }
mbed_official 78:5f419e0f96dd 1447 #endif /* MBEDTLS_HMAC_DRBG_C */
mbed_official 78:5f419e0f96dd 1448
mbed_official 78:5f419e0f96dd 1449 #if defined(MBEDTLS_RSA_C) && \
mbed_official 78:5f419e0f96dd 1450 defined(MBEDTLS_PEM_PARSE_C) && defined(MBEDTLS_PK_PARSE_C)
mbed_official 78:5f419e0f96dd 1451 if (benchmark_rsa() != 0) {
mbed_official 78:5f419e0f96dd 1452 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1453 }
mbed_official 78:5f419e0f96dd 1454 #endif /* MBEDTLS_RSA_C && MBEDTLS_PEM_PARSE_C && MBEDTLS_PK_PARSE_C */
mbed_official 78:5f419e0f96dd 1455
mbed_official 78:5f419e0f96dd 1456 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_BIGNUM_C)
mbed_official 78:5f419e0f96dd 1457 if (benchmark_dhm() != 0) {
mbed_official 78:5f419e0f96dd 1458 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1459 }
mbed_official 78:5f419e0f96dd 1460 #endif /* MBEDTLS_DHM_C && MBEDTLS_BIGNUM_C */
mbed_official 78:5f419e0f96dd 1461
mbed_official 78:5f419e0f96dd 1462 #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 1463 if (benchmark_ecdsa() != 0) {
mbed_official 78:5f419e0f96dd 1464 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1465 }
mbed_official 78:5f419e0f96dd 1466 #endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA2565_C */
mbed_official 78:5f419e0f96dd 1467
mbed_official 78:5f419e0f96dd 1468 #if defined(MBEDTLS_ECDH_C)
mbed_official 78:5f419e0f96dd 1469 if (benchmark_ecdh() != 0) {
mbed_official 63:9f7e5224fc60 1470 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 63:9f7e5224fc60 1471 }
mbed_official 63:9f7e5224fc60 1472
mbed_official 78:5f419e0f96dd 1473 #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
mbed_official 78:5f419e0f96dd 1474 if (benchmark_ecdh_curve22519() != 0) {
mbed_official 78:5f419e0f96dd 1475 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1476 }
mbed_official 78:5f419e0f96dd 1477 #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */
mbed_official 78:5f419e0f96dd 1478 #endif /* MBEDTLS_ECDH_C */
mbed_official 78:5f419e0f96dd 1479
mbed_official 78:5f419e0f96dd 1480 mbedtls_printf("DONE\n");
mbed_official 78:5f419e0f96dd 1481
mbed_official 80:0f7a38bbcebe 1482 mbedtls_platform_teardown(NULL);
mbed_official 63:9f7e5224fc60 1483 return exit_code;
Janos Follath 0:1f7c5025e59d 1484 }