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:
Janos Follath
Date:
Wed Jul 27 14:26:30 2016 +0100
Revision:
0:1f7c5025e59d
Child:
11:6ccae3ebafd5
Update example home repo at 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 *
Janos Follath 0:1f7c5025e59d 4 * Copyright (C) 2006-2016, 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 #if DEBUG_LEVEL > 0
Janos Follath 0:1f7c5025e59d 22 #include "mbedtls/debug.h"
Janos Follath 0:1f7c5025e59d 23 #endif
Janos Follath 0:1f7c5025e59d 24
Janos Follath 0:1f7c5025e59d 25 #if !defined(MBEDTLS_CONFIG_FILE)
Janos Follath 0:1f7c5025e59d 26 #include "mbedtls/config.h"
Janos Follath 0:1f7c5025e59d 27 #else
Janos Follath 0:1f7c5025e59d 28 #include MBEDTLS_CONFIG_FILE
Janos Follath 0:1f7c5025e59d 29 #endif
Janos Follath 0:1f7c5025e59d 30
Janos Follath 0:1f7c5025e59d 31 #include "mbedtls/platform.h"
Janos Follath 0:1f7c5025e59d 32
Janos Follath 0:1f7c5025e59d 33 #include <string.h>
Janos Follath 0:1f7c5025e59d 34
Janos Follath 0:1f7c5025e59d 35 #include "mbedtls/md4.h"
Janos Follath 0:1f7c5025e59d 36 #include "mbedtls/md5.h"
Janos Follath 0:1f7c5025e59d 37 #include "mbedtls/ripemd160.h"
Janos Follath 0:1f7c5025e59d 38 #include "mbedtls/sha1.h"
Janos Follath 0:1f7c5025e59d 39 #include "mbedtls/sha256.h"
Janos Follath 0:1f7c5025e59d 40 #include "mbedtls/sha512.h"
Janos Follath 0:1f7c5025e59d 41 #include "mbedtls/arc4.h"
Janos Follath 0:1f7c5025e59d 42 #include "mbedtls/des.h"
Janos Follath 0:1f7c5025e59d 43 #include "mbedtls/aes.h"
Janos Follath 0:1f7c5025e59d 44 #include "mbedtls/blowfish.h"
Janos Follath 0:1f7c5025e59d 45 #include "mbedtls/camellia.h"
Janos Follath 0:1f7c5025e59d 46 #include "mbedtls/gcm.h"
Janos Follath 0:1f7c5025e59d 47 #include "mbedtls/ccm.h"
Janos Follath 0:1f7c5025e59d 48 #include "mbedtls/havege.h"
Janos Follath 0:1f7c5025e59d 49 #include "mbedtls/ctr_drbg.h"
Janos Follath 0:1f7c5025e59d 50 #include "mbedtls/hmac_drbg.h"
Janos Follath 0:1f7c5025e59d 51 #include "mbedtls/rsa.h"
Janos Follath 0:1f7c5025e59d 52 #include "mbedtls/pk.h"
Janos Follath 0:1f7c5025e59d 53 #include "mbedtls/dhm.h"
Janos Follath 0:1f7c5025e59d 54 #include "mbedtls/ecdsa.h"
Janos Follath 0:1f7c5025e59d 55 #include "mbedtls/ecdh.h"
Janos Follath 0:1f7c5025e59d 56 #include "mbedtls/error.h"
Janos Follath 0:1f7c5025e59d 57
Janos Follath 0:1f7c5025e59d 58 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
Janos Follath 0:1f7c5025e59d 59 #include "mbedtls/memory_buffer_alloc.h"
Janos Follath 0:1f7c5025e59d 60 #endif
Janos Follath 0:1f7c5025e59d 61
Janos Follath 0:1f7c5025e59d 62 #define RSA_PRIVATE_KEY_2048 \
Janos Follath 0:1f7c5025e59d 63 "-----BEGIN RSA PRIVATE KEY-----\r\n" \
Janos Follath 0:1f7c5025e59d 64 "MIIEogIBAAKCAQEA2dwVr+IMGEtA2/MCP6fA5eb/6B18Bq6e7gw8brNPkm3E6LyR\r\n" \
Janos Follath 0:1f7c5025e59d 65 "4DnMJVxZmw3bPDKBDoKzfntkMESi/Yw5UopLtVfjGfWeQWPClqffLZBsZ60BRAsg\r\n" \
Janos Follath 0:1f7c5025e59d 66 "/g+ID5tgzxSuxzftypK59uexOVCAm7hCKZHGO3DbI7bLY27j7VAgEP7d/yuaz5Fx\r\n" \
Janos Follath 0:1f7c5025e59d 67 "Kl/vu7shqrBoz6ABJVJD3KC8nUiMRUCXRINmxbyUUjA4DnicZv6+xrGKr36r6M8h\r\n" \
Janos Follath 0:1f7c5025e59d 68 "VYLa5msKc8WzbnBWzpUsrpb4/r7ML+qp92gdSfVJ8/bLiU7h2C7faDA59uaqrFK9\r\n" \
Janos Follath 0:1f7c5025e59d 69 "xmDdx7FaWhGQs3LWW6w1UNgkPS0FDYUslpsnsQIDAQABAoIBAC7IJNwM5V3+IuJY\r\n" \
Janos Follath 0:1f7c5025e59d 70 "T35Nzo1PyloUosJokvY5KGz5Ejg2XBdCDu0gXCcVqqQyGIbXrYDpLhQV+RCoXHun\r\n" \
Janos Follath 0:1f7c5025e59d 71 "tdN0oQdC5SB47s/J1Uo2qCUHo0+sBd6PqTkFKsl3KxWssk9TQjvCwC412IefMs69\r\n" \
Janos Follath 0:1f7c5025e59d 72 "hW+ZvwCanmQP56LleApIr2oW4KLfW8Ry/QfZlua+dizctdN7+H1mWwgZQTY9T27J\r\n" \
Janos Follath 0:1f7c5025e59d 73 "6RtGRA5NVkKVPzIHVJfdpKoO7xGg1g06aEbPB/VmGvZaaFWWnaf7uRvFjLZecBLu\r\n" \
Janos Follath 0:1f7c5025e59d 74 "QSx2DA/GDjirlDYj99PJb7DtB4xRtKzsyw0o+xapC8w6OtIl/3xFt9moCu2jGrsx\r\n" \
Janos Follath 0:1f7c5025e59d 75 "vpjHdfECgYEA7fSACRseIs9gAIVX8wq6gayTpA47DHYWAD6IQfIj35SJ+AgsvbFF\r\n" \
Janos Follath 0:1f7c5025e59d 76 "4AmrwDhcJVPmDy1N4nLBfyGAMt/2CfiYkdkW6QFX/ULRMMBL/G7kWV8hYQDICB2g\r\n" \
Janos Follath 0:1f7c5025e59d 77 "xaMRN1lPCmFq6BkSWjwIYTnYDFBDWVm1GVT8TMtJoM8Erej9qC0PeFUCgYEA6mF3\r\n" \
Janos Follath 0:1f7c5025e59d 78 "bigO3t8f5sig+XepaftEUbkJMzo72TVRnIR2ycdR2ihelPQ+25g9dwV0ZA5XXhBS\r\n" \
Janos Follath 0:1f7c5025e59d 79 "DKOABWjMM739Mwmy9v26Dlmu9R01zHQktMvtEAyfz7lk2NF0aMuj8285OJUBf9bz\r\n" \
Janos Follath 0:1f7c5025e59d 80 "Cq3MjtMCD+4CZ6iaEqCdUKOuxfpx5cWVJV+qve0CgYBhD1YaYMFOGaBjFgDl1f51\r\n" \
Janos Follath 0:1f7c5025e59d 81 "Xltqk5NqZdBbkSYrIAWZ8RDF5y+4wFJsLAWuhk6vuyUgE66tK3nZzWRpXAkT0B8L\r\n" \
Janos Follath 0:1f7c5025e59d 82 "fq1lpXKqj1KcvBNCiEkEW1VWJ+dvyAYIF5eyJ++hoFLnETL3M32HivyhKSwPihPg\r\n" \
Janos Follath 0:1f7c5025e59d 83 "nVW8TT9fJJIYDe1JZ/fjcQKBgHJfv7UsrR0LSvkG3K8AOtbx+8PZhOjPuRbk0v+L\r\n" \
Janos Follath 0:1f7c5025e59d 84 "EKCkuIe5/XW4vtfQMeZb7hFJgk7vrepm+vkoy8VQKDf4urGW3W1VTHBmobM01hi4\r\n" \
Janos Follath 0:1f7c5025e59d 85 "DuYvEul+Mf0wMRtWjJolo4m+BO5KiW2jpFfqFm6JmfjVqOIAKOSKC6am8V/MDF0h\r\n" \
Janos Follath 0:1f7c5025e59d 86 "kyN9AoGAT9oOiEXMolbkDZw/QCaBiRoAGlGlNYUkJ+58U6OjIZLISw6aFv+Y2uE0\r\n" \
Janos Follath 0:1f7c5025e59d 87 "mEImItjuYZtSYKblWikp6ldPoKlt9bwEFe3c6IZ8kJ3+xyEyAGrvjXjEY7PzP6dp\r\n" \
Janos Follath 0:1f7c5025e59d 88 "Ajbjp9X9uocEBv9W/KsBLdQ7yizcL/toHwdBO4vQqmqTvAc5IIw=\r\n" \
Janos Follath 0:1f7c5025e59d 89 "-----END RSA PRIVATE KEY-----\r\n"
Janos Follath 0:1f7c5025e59d 90
Janos Follath 0:1f7c5025e59d 91 #define RSA_PRIVATE_KEY_4096 \
Janos Follath 0:1f7c5025e59d 92 "-----BEGIN RSA PRIVATE KEY-----\r\n" \
Janos Follath 0:1f7c5025e59d 93 "MIIJKgIBAAKCAgEAmkdGjoIshJuOt2NO47qB3Z3yyvmLg2j351isItSNuFQU3qr+\r\n" \
Janos Follath 0:1f7c5025e59d 94 "jXHIeANf03yw/K0Zvos8RPd+CqLjoxAQL3QDH4bZAl88bIo29i+SANbNSrKQmc0k\r\n" \
Janos Follath 0:1f7c5025e59d 95 "pH+yzw3alDzO0GZaOPZjsbo6AwBrno5msi0vRuC2aY8vGLPsZWSyLai7tneS1j/o\r\n" \
Janos Follath 0:1f7c5025e59d 96 "vYW6XIo8Cj61j2Ypy9HhVUW/4Wc+zAT25D/x7jTpkqJLWWT+YzibNbOY48M5eJcB\r\n" \
Janos Follath 0:1f7c5025e59d 97 "6/sMyUIeI3/u/wXyMrooNyLiCpedkuHRA0m7u5cWPTUISTunSRlVFij/NHJjuU8e\r\n" \
Janos Follath 0:1f7c5025e59d 98 "wA3B29yfZFsUqDEnyc+OxniIueAixTomVszxAaVn8zFEbYhFMPqziiFp99u3jfeG\r\n" \
Janos Follath 0:1f7c5025e59d 99 "k1q9mmUi/uCfUC4e2IC5rqq1ZbKSduH7Ug/Vn2bGQahww0sZFRHDXFrnBcotcW+M\r\n" \
Janos Follath 0:1f7c5025e59d 100 "bnC290VBDnYgzmdYrIOxuPb2aUwJo4ZlbKh5uBB1PigMuyhLKibQ1a+V5ZJGdpP6\r\n" \
Janos Follath 0:1f7c5025e59d 101 "SE9PGIdgYWSmh2QEMuLE6v+wTO2LQ5JgqsvFfi3GIZvkn0s8jTS72Jq2uMkFkMer\r\n" \
Janos Follath 0:1f7c5025e59d 102 "UBjPDYaSPy5kpo103KerWs+cMPOJ/3FtZzI++7MoSUTkWVr1ySQFt5i1EIZ/0Thi\r\n" \
Janos Follath 0:1f7c5025e59d 103 "jut2jNe8a4AoA3TtC8Rkk/3AIIbg8MVNT4EnT+KHROTMu6gET1oJ3YfBRpUCAwEA\r\n" \
Janos Follath 0:1f7c5025e59d 104 "AQKCAgEAhuNSmT7PVZH8kfLOAuYKrY1vvm+4v0iDl048Eqfs0QESziyLK3gUYnnw\r\n" \
Janos Follath 0:1f7c5025e59d 105 "yqP2yrU+EQ8Dvvj0xq/sf6GHxTWVlXb9PcmutueRbmXhLcKg83J0Y0StiPXtjIL8\r\n" \
Janos Follath 0:1f7c5025e59d 106 "XSddW3Bh6fPi7n14Qy+W6KZwu9AtybanRlvePabyRSRpdOpWVQ7u30w5XZsSed6S\r\n" \
Janos Follath 0:1f7c5025e59d 107 "6BI0BBC68m2qqje1sInoqdCdXKtcB31TytUDNEHM+UuAyM8iGeGS2hCNqZlycHTS\r\n" \
Janos Follath 0:1f7c5025e59d 108 "jQ9KEsdMH3YLu0lQgRpWtxmg+VL6ROWwmAtKF12EwbDYZ+uoVl69OkQnCpv8pxKa\r\n" \
Janos Follath 0:1f7c5025e59d 109 "ec/4m6V+uEA1AOpaAMorHG3fH31IKWC/fTZstovgO/eG2XCtlbcCoWCQ7amFq16l\r\n" \
Janos Follath 0:1f7c5025e59d 110 "Gh1UKeBHxMXpDj4oDmIUGUvgzSNnEeSN/v76losWvWYQDjXR/LMDa/CNYsD8BmJR\r\n" \
Janos Follath 0:1f7c5025e59d 111 "PZidIjIXdVRlYOhA7ljtySQvp6RBujBfw3tsVMyZw2XzXFwM9O89b1xXC6+M5jf9\r\n" \
Janos Follath 0:1f7c5025e59d 112 "DXs/U7Fw+J9qq/YpByABcPCwWdttwdQFRbOxwxaSOKarIqS87TW1JuFcNJ59Ut6G\r\n" \
Janos Follath 0:1f7c5025e59d 113 "kMvAg6gC34U+0ktkG/AmI1hgjC+P7ErHCXBR2xARoGzcO/CMZF59S+Z2HFchpTSP\r\n" \
Janos Follath 0:1f7c5025e59d 114 "5T2o4mGy3VfHSBidQQrcZRukg8ZP8M1NF3bXjpY6QZpeLHc4oHECggEBAMjdgzzk\r\n" \
Janos Follath 0:1f7c5025e59d 115 "xp4mIYFxAEiXYt7tzuUXJk+0UpEJj5uboWLirUZqZmNUPyh6WDnzlREBH++Ms0LO\r\n" \
Janos Follath 0:1f7c5025e59d 116 "+AWSfaGPDoMb0NE2j3c4FRWAhe7Vn6lj7nLVpF2RdwRo88yGerZ4uwGMY8NUQCtn\r\n" \
Janos Follath 0:1f7c5025e59d 117 "zum3J7eCJ5DojiceRb6uMxTJ8xZmUC4W2f3J/lrR7wlYjyVnnHqH5HcemYUipWSw\r\n" \
Janos Follath 0:1f7c5025e59d 118 "sM0/cHp3lrz2VWrbAEu8HVpklvDQpdAgl7cjXt/JHYawY+p426IF/PzQSRROnzgy\r\n" \
Janos Follath 0:1f7c5025e59d 119 "4WI8FVYNV2tgu0TOFURbkkEvuj/duDKeooUIF0G0XHzha5oAX/j0iWiHbrOF6wHj\r\n" \
Janos Follath 0:1f7c5025e59d 120 "0xeajL9msKBnmD8CggEBAMSgLWmv7G31x4tndJCcXnX4AyVL7KpygAx/ZwCcyTR8\r\n" \
Janos Follath 0:1f7c5025e59d 121 "rY1rO07f/ta2noEra/xmEW/BW98qJFCHSU2nSLAQ5FpFSWyuQqrnffrMJnfWyvpr\r\n" \
Janos Follath 0:1f7c5025e59d 122 "ceQ0yQ/MiA6/JIOvGAjabcspzZijxzGp+Qk3eTT0yOXLSVOCH9B9XVHLodcy4PQM\r\n" \
Janos Follath 0:1f7c5025e59d 123 "KSCxy0vVHhVNl2SdPEwTXRmxk99Q/rw6IHVpQxBq1OhQt05nTKT+rZMD/grSK22e\r\n" \
Janos Follath 0:1f7c5025e59d 124 "my2F0DodAJwLo063Zv3RXQZhDYodMmjcp9Hqrtvj9P3HD7J3z6ACiV3SCi8cZumL\r\n" \
Janos Follath 0:1f7c5025e59d 125 "bSmnKCcd0bb45+aOWm31ieECJuIcJ9rOREEa/KDYTCsCggEBAMG5WkSVhLWsou37\r\n" \
Janos Follath 0:1f7c5025e59d 126 "dUGNuA63nq42SH3gtS0q4nU6gUkkw+dA4ST1cMByVrr1oRQ4WHup4I4TnQOKyF3T\r\n" \
Janos Follath 0:1f7c5025e59d 127 "4jQy1I+ipnVeAn+tZ/7zyzwMpEHeqNqRXA9FxbTBEoMAJ6QTqXgOvqDeSqIAQm7r\r\n" \
Janos Follath 0:1f7c5025e59d 128 "OYu5rrgtqyh/S8bGCwvUe4ooAfCSKx2ekYMbBVwW9MT8YS09tuS/iHJ3Mt2RTMLg\r\n" \
Janos Follath 0:1f7c5025e59d 129 "qeHvVmxrcXqZoFm44Ba7tN/pP0mi9HKyviZT4tmV3IYEbn3JyGGsfkUuVU9wEUfg\r\n" \
Janos Follath 0:1f7c5025e59d 130 "MCrgrVxrwfketAzooiHMjkVL2ASjzAJTmEvdAPETYXxzJD9LN0ovY3t8JfAC37IN\r\n" \
Janos Follath 0:1f7c5025e59d 131 "sVXS8/MCggEBALByOS59Y4Ktq1rLBQx8djwQyuneP0wZohUVAx7Gk7xZIfklQDyg\r\n" \
Janos Follath 0:1f7c5025e59d 132 "v/R4PrcVezstcPpDnykdjScCsGJR+uWc0v667I/ttP/e6utz5hVmmBGu965dPAzE\r\n" \
Janos Follath 0:1f7c5025e59d 133 "c1ggaSkOqFfRg/Nr2Qbf+fH0YPnHYSqHe/zSt0OMIvaaeXLcdKhEDSCUBRhE1HWB\r\n" \
Janos Follath 0:1f7c5025e59d 134 "kxR046WzgBeYzNQwycz9xwqsctJKGpeR9ute+5ANHPd3X9XtID0fqz8ctI5eZaSw\r\n" \
Janos Follath 0:1f7c5025e59d 135 "wApIW01ZQcAF8B+4WkkVuFXnpWW33yCOaRyPVOPHpnclr5WU1fS+3Q85QkW9rkej\r\n" \
Janos Follath 0:1f7c5025e59d 136 "97zlkl0QY9AHJqrXnoML1ywAK7ns+MVyNK8CggEAf62xcKZhOb1djeF72Ms+i/i/\r\n" \
Janos Follath 0:1f7c5025e59d 137 "WIAq4Q4YpsElgvJTHpNH2v9g4ngSTKe3ws3bGc502sWRlhcoTFMOW2rJNe/iqKkb\r\n" \
Janos Follath 0:1f7c5025e59d 138 "3cdeTkseDbpqozmJWz9dJWSVtXas2bZjzBEa//gQ7nHGVeQdqZJQ9rxPsoOAkfpi\r\n" \
Janos Follath 0:1f7c5025e59d 139 "qCFrmfUVUqC53e3XMt8+W+aSvKl+JZiB9ozkO9A6Q0vfQLKtjUMdQE3XaCFQT8DI\r\n" \
Janos Follath 0:1f7c5025e59d 140 "smaLBlBmeRaBpc02ENeC4ADlWosm1SwgxqMhuh2Alba/GrHOoPlVl4hDs9Fb5a6R\r\n" \
Janos Follath 0:1f7c5025e59d 141 "rmpXSt07GAxnG6j9jssA95E4rc1zO0CVKG5bvjVTxwi/sT0/VVX7VsJM4uTAQg==\r\n" \
Janos Follath 0:1f7c5025e59d 142 "-----END RSA PRIVATE KEY-----\r\n"
Janos Follath 0:1f7c5025e59d 143
Janos Follath 0:1f7c5025e59d 144 /*
Janos Follath 0:1f7c5025e59d 145 * For heap usage estimates, we need an estimate of the overhead per allocated
Janos Follath 0:1f7c5025e59d 146 * block. ptmalloc2/3 (used in gnu libc for instance) uses 2 size_t per block,
Janos Follath 0:1f7c5025e59d 147 * so use that as our baseline.
Janos Follath 0:1f7c5025e59d 148 */
Janos Follath 0:1f7c5025e59d 149 #define MEM_BLOCK_OVERHEAD ( 2 * sizeof( size_t ) )
Janos Follath 0:1f7c5025e59d 150
Janos Follath 0:1f7c5025e59d 151 /*
Janos Follath 0:1f7c5025e59d 152 * Size to use for the malloc buffer if MEMORY_BUFFER_ALLOC_C is defined.
Janos Follath 0:1f7c5025e59d 153 */
Janos Follath 0:1f7c5025e59d 154 #define HEAP_SIZE (1u << 16) // 64k
Janos Follath 0:1f7c5025e59d 155
Janos Follath 0:1f7c5025e59d 156 #define BUFSIZE 1024
Janos Follath 0:1f7c5025e59d 157 #define HEADER_FORMAT " %-24s : "
Janos Follath 0:1f7c5025e59d 158 #define TITLE_LEN 25
Janos Follath 0:1f7c5025e59d 159
Janos Follath 0:1f7c5025e59d 160 #define OPTIONS \
Janos Follath 0:1f7c5025e59d 161 "md4, md5, ripemd160, sha1, sha256, sha512,\r\n" \
Janos Follath 0:1f7c5025e59d 162 "arc4, des3, des, aes_cbc, aes_gcm, aes_ccm, camellia, blowfish,\r\n" \
Janos Follath 0:1f7c5025e59d 163 "havege, ctr_drbg, hmac_drbg\r\n" \
Janos Follath 0:1f7c5025e59d 164 "rsa, dhm, ecdsa, ecdh.\r\n"
Janos Follath 0:1f7c5025e59d 165
Janos Follath 0:1f7c5025e59d 166 #if defined(MBEDTLS_ERROR_C)
Janos Follath 0:1f7c5025e59d 167 #define PRINT_ERROR \
Janos Follath 0:1f7c5025e59d 168 mbedtls_strerror( ret, ( char * )tmp, sizeof( tmp ) ); \
Janos Follath 0:1f7c5025e59d 169 mbedtls_printf( "FAILED: %s\r\n", tmp );
Janos Follath 0:1f7c5025e59d 170 #else
Janos Follath 0:1f7c5025e59d 171 #define PRINT_ERROR \
Janos Follath 0:1f7c5025e59d 172 mbedtls_printf( "FAILED: -0x%04x\r\n", -ret );
Janos Follath 0:1f7c5025e59d 173 #endif
Janos Follath 0:1f7c5025e59d 174
Janos Follath 0:1f7c5025e59d 175 static unsigned long mbedtls_timing_hardclock( void )
Janos Follath 0:1f7c5025e59d 176 {
Janos Follath 0:1f7c5025e59d 177 static int dwt_started = 0;
Janos Follath 0:1f7c5025e59d 178
Janos Follath 0:1f7c5025e59d 179 if( dwt_started == 0 )
Janos Follath 0:1f7c5025e59d 180 {
Janos Follath 0:1f7c5025e59d 181 CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
Janos Follath 0:1f7c5025e59d 182 DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
Janos Follath 0:1f7c5025e59d 183 }
Janos Follath 0:1f7c5025e59d 184
Janos Follath 0:1f7c5025e59d 185 return( DWT->CYCCNT );
Janos Follath 0:1f7c5025e59d 186 }
Janos Follath 0:1f7c5025e59d 187
Janos Follath 0:1f7c5025e59d 188 static volatile int alarmed;
Janos Follath 0:1f7c5025e59d 189 static void alarm() { alarmed = 1; }
Janos Follath 0:1f7c5025e59d 190
Janos Follath 0:1f7c5025e59d 191 #define TIME_AND_TSC( TITLE, CODE ) \
Janos Follath 0:1f7c5025e59d 192 do { \
Janos Follath 0:1f7c5025e59d 193 unsigned long i, j, tsc; \
Janos Follath 0:1f7c5025e59d 194 Timeout t; \
Janos Follath 0:1f7c5025e59d 195 \
Janos Follath 0:1f7c5025e59d 196 mbedtls_printf( HEADER_FORMAT, TITLE ); \
Janos Follath 0:1f7c5025e59d 197 \
Janos Follath 0:1f7c5025e59d 198 for( i = 1, alarmed = 0, t.attach( alarm, 1.0 ); !alarmed; i++ ) \
Janos Follath 0:1f7c5025e59d 199 { \
Janos Follath 0:1f7c5025e59d 200 CODE; \
Janos Follath 0:1f7c5025e59d 201 } \
Janos Follath 0:1f7c5025e59d 202 \
Janos Follath 0:1f7c5025e59d 203 tsc = mbedtls_timing_hardclock(); \
Janos Follath 0:1f7c5025e59d 204 for( j = 0; j < 1024; j++ ) \
Janos Follath 0:1f7c5025e59d 205 { \
Janos Follath 0:1f7c5025e59d 206 CODE; \
Janos Follath 0:1f7c5025e59d 207 } \
Janos Follath 0:1f7c5025e59d 208 \
Janos Follath 0:1f7c5025e59d 209 mbedtls_printf( "%9lu Kb/s, %9lu cycles/byte\r\n", \
Janos Follath 0:1f7c5025e59d 210 i * BUFSIZE / 1024, \
Janos Follath 0:1f7c5025e59d 211 ( mbedtls_timing_hardclock() - tsc ) / ( j * BUFSIZE ) ); \
Janos Follath 0:1f7c5025e59d 212 } while( 0 )
Janos Follath 0:1f7c5025e59d 213
Janos Follath 0:1f7c5025e59d 214 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && defined(MBEDTLS_MEMORY_DEBUG)
Janos Follath 0:1f7c5025e59d 215
Janos Follath 0:1f7c5025e59d 216 #define MEMORY_MEASURE_INIT \
Janos Follath 0:1f7c5025e59d 217 size_t max_used, max_blocks, max_bytes; \
Janos Follath 0:1f7c5025e59d 218 size_t prv_used, prv_blocks; \
Janos Follath 0:1f7c5025e59d 219 mbedtls_memory_buffer_alloc_cur_get( &prv_used, &prv_blocks ); \
Janos Follath 0:1f7c5025e59d 220 mbedtls_memory_buffer_alloc_max_reset( );
Janos Follath 0:1f7c5025e59d 221
Janos Follath 0:1f7c5025e59d 222 #define MEMORY_MEASURE_PRINT( title_len ) \
Janos Follath 0:1f7c5025e59d 223 mbedtls_memory_buffer_alloc_max_get( &max_used, &max_blocks ); \
Janos Follath 0:1f7c5025e59d 224 for( i = 12 - title_len; i != 0; i-- ) mbedtls_printf( " " ); \
Janos Follath 0:1f7c5025e59d 225 max_used -= prv_used; \
Janos Follath 0:1f7c5025e59d 226 max_blocks -= prv_blocks; \
Janos Follath 0:1f7c5025e59d 227 max_bytes = max_used + MEM_BLOCK_OVERHEAD * max_blocks; \
Janos Follath 0:1f7c5025e59d 228 mbedtls_printf( "%6u heap bytes", (unsigned) max_bytes );
Janos Follath 0:1f7c5025e59d 229
Janos Follath 0:1f7c5025e59d 230 #else
Janos Follath 0:1f7c5025e59d 231 #define MEMORY_MEASURE_INIT
Janos Follath 0:1f7c5025e59d 232 #define MEMORY_MEASURE_PRINT( title_len )
Janos Follath 0:1f7c5025e59d 233 #endif
Janos Follath 0:1f7c5025e59d 234
Janos Follath 0:1f7c5025e59d 235 #define TIME_PUBLIC( TITLE, TYPE, CODE ) \
Janos Follath 0:1f7c5025e59d 236 do { \
Janos Follath 0:1f7c5025e59d 237 unsigned long ms; \
Janos Follath 0:1f7c5025e59d 238 int ret = 0; \
Janos Follath 0:1f7c5025e59d 239 Timer t; \
Janos Follath 0:1f7c5025e59d 240 MEMORY_MEASURE_INIT; \
Janos Follath 0:1f7c5025e59d 241 \
Janos Follath 0:1f7c5025e59d 242 mbedtls_printf( HEADER_FORMAT, TITLE ); \
Janos Follath 0:1f7c5025e59d 243 fflush( stdout ); \
Janos Follath 0:1f7c5025e59d 244 \
Janos Follath 0:1f7c5025e59d 245 t.start(); \
Janos Follath 0:1f7c5025e59d 246 CODE; \
Janos Follath 0:1f7c5025e59d 247 t.stop(); \
Janos Follath 0:1f7c5025e59d 248 ms = t.read_ms(); \
Janos Follath 0:1f7c5025e59d 249 \
Janos Follath 0:1f7c5025e59d 250 if( ret != 0 ) \
Janos Follath 0:1f7c5025e59d 251 { \
Janos Follath 0:1f7c5025e59d 252 PRINT_ERROR; \
Janos Follath 0:1f7c5025e59d 253 } \
Janos Follath 0:1f7c5025e59d 254 else \
Janos Follath 0:1f7c5025e59d 255 { \
Janos Follath 0:1f7c5025e59d 256 mbedtls_printf( "%6lu ms/" TYPE, ms ); \
Janos Follath 0:1f7c5025e59d 257 MEMORY_MEASURE_PRINT( sizeof( TYPE ) + 1 ); \
Janos Follath 0:1f7c5025e59d 258 mbedtls_printf( "\r\n" ); \
Janos Follath 0:1f7c5025e59d 259 } \
Janos Follath 0:1f7c5025e59d 260 } while( 0 )
Janos Follath 0:1f7c5025e59d 261
Janos Follath 0:1f7c5025e59d 262 static int myrand( void *rng_state, unsigned char *output, size_t len )
Janos Follath 0:1f7c5025e59d 263 {
Janos Follath 0:1f7c5025e59d 264 size_t use_len;
Janos Follath 0:1f7c5025e59d 265 int rnd;
Janos Follath 0:1f7c5025e59d 266
Janos Follath 0:1f7c5025e59d 267 if( rng_state != NULL )
Janos Follath 0:1f7c5025e59d 268 rng_state = NULL;
Janos Follath 0:1f7c5025e59d 269
Janos Follath 0:1f7c5025e59d 270 while( len > 0 )
Janos Follath 0:1f7c5025e59d 271 {
Janos Follath 0:1f7c5025e59d 272 use_len = len;
Janos Follath 0:1f7c5025e59d 273 if( use_len > sizeof(int) )
Janos Follath 0:1f7c5025e59d 274 use_len = sizeof(int);
Janos Follath 0:1f7c5025e59d 275
Janos Follath 0:1f7c5025e59d 276 rnd = rand();
Janos Follath 0:1f7c5025e59d 277 memcpy( output, &rnd, use_len );
Janos Follath 0:1f7c5025e59d 278 output += use_len;
Janos Follath 0:1f7c5025e59d 279 len -= use_len;
Janos Follath 0:1f7c5025e59d 280 }
Janos Follath 0:1f7c5025e59d 281
Janos Follath 0:1f7c5025e59d 282 return( 0 );
Janos Follath 0:1f7c5025e59d 283 }
Janos Follath 0:1f7c5025e59d 284
Janos Follath 0:1f7c5025e59d 285 /*
Janos Follath 0:1f7c5025e59d 286 * Clear some memory that was used to prepare the context
Janos Follath 0:1f7c5025e59d 287 */
Janos Follath 0:1f7c5025e59d 288 #if defined(MBEDTLS_ECP_C)
Janos Follath 0:1f7c5025e59d 289 void ecp_clear_precomputed( mbedtls_ecp_group *grp )
Janos Follath 0:1f7c5025e59d 290 {
Janos Follath 0:1f7c5025e59d 291 if( grp->T != NULL )
Janos Follath 0:1f7c5025e59d 292 {
Janos Follath 0:1f7c5025e59d 293 size_t i;
Janos Follath 0:1f7c5025e59d 294 for( i = 0; i < grp->T_size; i++ )
Janos Follath 0:1f7c5025e59d 295 mbedtls_ecp_point_free( &grp->T[i] );
Janos Follath 0:1f7c5025e59d 296 mbedtls_free( grp->T );
Janos Follath 0:1f7c5025e59d 297 }
Janos Follath 0:1f7c5025e59d 298 grp->T = NULL;
Janos Follath 0:1f7c5025e59d 299 grp->T_size = 0;
Janos Follath 0:1f7c5025e59d 300 }
Janos Follath 0:1f7c5025e59d 301 #else
Janos Follath 0:1f7c5025e59d 302 #define ecp_clear_precomputed( g )
Janos Follath 0:1f7c5025e59d 303 #endif
Janos Follath 0:1f7c5025e59d 304
Janos Follath 0:1f7c5025e59d 305 unsigned char buf[BUFSIZE];
Janos Follath 0:1f7c5025e59d 306
Janos Follath 0:1f7c5025e59d 307 typedef struct {
Janos Follath 0:1f7c5025e59d 308 char md4, md5, ripemd160, sha1, sha256, sha512,
Janos Follath 0:1f7c5025e59d 309 arc4, des3, des, aes_cbc, aes_gcm, aes_ccm, camellia, blowfish,
Janos Follath 0:1f7c5025e59d 310 havege, ctr_drbg, hmac_drbg,
Janos Follath 0:1f7c5025e59d 311 rsa, dhm, ecdsa, ecdh;
Janos Follath 0:1f7c5025e59d 312 } todo_list;
Janos Follath 0:1f7c5025e59d 313
Janos Follath 0:1f7c5025e59d 314 static int benchmark( int argc, char *argv[] )
Janos Follath 0:1f7c5025e59d 315 {
Janos Follath 0:1f7c5025e59d 316 int i;
Janos Follath 0:1f7c5025e59d 317 unsigned char tmp[200];
Janos Follath 0:1f7c5025e59d 318 char title[TITLE_LEN];
Janos Follath 0:1f7c5025e59d 319 todo_list todo;
Janos Follath 0:1f7c5025e59d 320 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
Janos Follath 0:1f7c5025e59d 321 unsigned char malloc_buf[HEAP_SIZE] = { 0 };
Janos Follath 0:1f7c5025e59d 322 #endif
Janos Follath 0:1f7c5025e59d 323
Janos Follath 0:1f7c5025e59d 324 if( argc <= 1 )
Janos Follath 0:1f7c5025e59d 325 {
Janos Follath 0:1f7c5025e59d 326 memset( &todo, 1, sizeof( todo ) );
Janos Follath 0:1f7c5025e59d 327 }
Janos Follath 0:1f7c5025e59d 328 else
Janos Follath 0:1f7c5025e59d 329 {
Janos Follath 0:1f7c5025e59d 330 memset( &todo, 0, sizeof( todo ) );
Janos Follath 0:1f7c5025e59d 331
Janos Follath 0:1f7c5025e59d 332 for( i = 1; i < argc; i++ )
Janos Follath 0:1f7c5025e59d 333 {
Janos Follath 0:1f7c5025e59d 334 if( strcmp( argv[i], "md4" ) == 0 )
Janos Follath 0:1f7c5025e59d 335 todo.md4 = 1;
Janos Follath 0:1f7c5025e59d 336 else if( strcmp( argv[i], "md5" ) == 0 )
Janos Follath 0:1f7c5025e59d 337 todo.md5 = 1;
Janos Follath 0:1f7c5025e59d 338 else if( strcmp( argv[i], "ripemd160" ) == 0 )
Janos Follath 0:1f7c5025e59d 339 todo.ripemd160 = 1;
Janos Follath 0:1f7c5025e59d 340 else if( strcmp( argv[i], "sha1" ) == 0 )
Janos Follath 0:1f7c5025e59d 341 todo.sha1 = 1;
Janos Follath 0:1f7c5025e59d 342 else if( strcmp( argv[i], "sha256" ) == 0 )
Janos Follath 0:1f7c5025e59d 343 todo.sha256 = 1;
Janos Follath 0:1f7c5025e59d 344 else if( strcmp( argv[i], "sha512" ) == 0 )
Janos Follath 0:1f7c5025e59d 345 todo.sha512 = 1;
Janos Follath 0:1f7c5025e59d 346 else if( strcmp( argv[i], "arc4" ) == 0 )
Janos Follath 0:1f7c5025e59d 347 todo.arc4 = 1;
Janos Follath 0:1f7c5025e59d 348 else if( strcmp( argv[i], "des3" ) == 0 )
Janos Follath 0:1f7c5025e59d 349 todo.des3 = 1;
Janos Follath 0:1f7c5025e59d 350 else if( strcmp( argv[i], "des" ) == 0 )
Janos Follath 0:1f7c5025e59d 351 todo.des = 1;
Janos Follath 0:1f7c5025e59d 352 else if( strcmp( argv[i], "aes_cbc" ) == 0 )
Janos Follath 0:1f7c5025e59d 353 todo.aes_cbc = 1;
Janos Follath 0:1f7c5025e59d 354 else if( strcmp( argv[i], "aes_gcm" ) == 0 )
Janos Follath 0:1f7c5025e59d 355 todo.aes_gcm = 1;
Janos Follath 0:1f7c5025e59d 356 else if( strcmp( argv[i], "aes_ccm" ) == 0 )
Janos Follath 0:1f7c5025e59d 357 todo.aes_ccm = 1;
Janos Follath 0:1f7c5025e59d 358 else if( strcmp( argv[i], "camellia" ) == 0 )
Janos Follath 0:1f7c5025e59d 359 todo.camellia = 1;
Janos Follath 0:1f7c5025e59d 360 else if( strcmp( argv[i], "blowfish" ) == 0 )
Janos Follath 0:1f7c5025e59d 361 todo.blowfish = 1;
Janos Follath 0:1f7c5025e59d 362 else if( strcmp( argv[i], "havege" ) == 0 )
Janos Follath 0:1f7c5025e59d 363 todo.havege = 1;
Janos Follath 0:1f7c5025e59d 364 else if( strcmp( argv[i], "ctr_drbg" ) == 0 )
Janos Follath 0:1f7c5025e59d 365 todo.ctr_drbg = 1;
Janos Follath 0:1f7c5025e59d 366 else if( strcmp( argv[i], "hmac_drbg" ) == 0 )
Janos Follath 0:1f7c5025e59d 367 todo.hmac_drbg = 1;
Janos Follath 0:1f7c5025e59d 368 else if( strcmp( argv[i], "rsa" ) == 0 )
Janos Follath 0:1f7c5025e59d 369 todo.rsa = 1;
Janos Follath 0:1f7c5025e59d 370 else if( strcmp( argv[i], "dhm" ) == 0 )
Janos Follath 0:1f7c5025e59d 371 todo.dhm = 1;
Janos Follath 0:1f7c5025e59d 372 else if( strcmp( argv[i], "ecdsa" ) == 0 )
Janos Follath 0:1f7c5025e59d 373 todo.ecdsa = 1;
Janos Follath 0:1f7c5025e59d 374 else if( strcmp( argv[i], "ecdh" ) == 0 )
Janos Follath 0:1f7c5025e59d 375 todo.ecdh = 1;
Janos Follath 0:1f7c5025e59d 376 else
Janos Follath 0:1f7c5025e59d 377 {
Janos Follath 0:1f7c5025e59d 378 mbedtls_printf( "Unrecognized option: %s\r\n", argv[i] );
Janos Follath 0:1f7c5025e59d 379 mbedtls_printf( "Available options: " OPTIONS );
Janos Follath 0:1f7c5025e59d 380 }
Janos Follath 0:1f7c5025e59d 381 }
Janos Follath 0:1f7c5025e59d 382 }
Janos Follath 0:1f7c5025e59d 383
Janos Follath 0:1f7c5025e59d 384 mbedtls_printf( "\r\n\r\n" );
Janos Follath 0:1f7c5025e59d 385
Janos Follath 0:1f7c5025e59d 386 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
Janos Follath 0:1f7c5025e59d 387 mbedtls_memory_buffer_alloc_init( malloc_buf, sizeof( malloc_buf ) );
Janos Follath 0:1f7c5025e59d 388 #endif
Janos Follath 0:1f7c5025e59d 389 memset( buf, 0xAA, sizeof( buf ) );
Janos Follath 0:1f7c5025e59d 390 memset( tmp, 0xBB, sizeof( tmp ) );
Janos Follath 0:1f7c5025e59d 391
Janos Follath 0:1f7c5025e59d 392 #if defined(MBEDTLS_MD4_C)
Janos Follath 0:1f7c5025e59d 393 if( todo.md4 )
Janos Follath 0:1f7c5025e59d 394 TIME_AND_TSC( "MD4", mbedtls_md4( buf, BUFSIZE, tmp ) );
Janos Follath 0:1f7c5025e59d 395 #endif
Janos Follath 0:1f7c5025e59d 396
Janos Follath 0:1f7c5025e59d 397 #if defined(MBEDTLS_MD5_C)
Janos Follath 0:1f7c5025e59d 398 if( todo.md5 )
Janos Follath 0:1f7c5025e59d 399 TIME_AND_TSC( "MD5", mbedtls_md5( buf, BUFSIZE, tmp ) );
Janos Follath 0:1f7c5025e59d 400 #endif
Janos Follath 0:1f7c5025e59d 401
Janos Follath 0:1f7c5025e59d 402 #if defined(MBEDTLS_RIPEMD160_C)
Janos Follath 0:1f7c5025e59d 403 if( todo.ripemd160 )
Janos Follath 0:1f7c5025e59d 404 TIME_AND_TSC( "RIPEMD160", mbedtls_ripemd160( buf, BUFSIZE, tmp ) );
Janos Follath 0:1f7c5025e59d 405 #endif
Janos Follath 0:1f7c5025e59d 406
Janos Follath 0:1f7c5025e59d 407 #if defined(MBEDTLS_SHA1_C)
Janos Follath 0:1f7c5025e59d 408 if( todo.sha1 )
Janos Follath 0:1f7c5025e59d 409 TIME_AND_TSC( "SHA-1", mbedtls_sha1( buf, BUFSIZE, tmp ) );
Janos Follath 0:1f7c5025e59d 410 #endif
Janos Follath 0:1f7c5025e59d 411
Janos Follath 0:1f7c5025e59d 412 #if defined(MBEDTLS_SHA256_C)
Janos Follath 0:1f7c5025e59d 413 if( todo.sha256 )
Janos Follath 0:1f7c5025e59d 414 TIME_AND_TSC( "SHA-256", mbedtls_sha256( buf, BUFSIZE, tmp, 0 ) );
Janos Follath 0:1f7c5025e59d 415 #endif
Janos Follath 0:1f7c5025e59d 416
Janos Follath 0:1f7c5025e59d 417 #if defined(MBEDTLS_SHA512_C)
Janos Follath 0:1f7c5025e59d 418 if( todo.sha512 )
Janos Follath 0:1f7c5025e59d 419 TIME_AND_TSC( "SHA-512", mbedtls_sha512( buf, BUFSIZE, tmp, 0 ) );
Janos Follath 0:1f7c5025e59d 420 #endif
Janos Follath 0:1f7c5025e59d 421
Janos Follath 0:1f7c5025e59d 422 #if defined(MBEDTLS_ARC4_C)
Janos Follath 0:1f7c5025e59d 423 if( todo.arc4 )
Janos Follath 0:1f7c5025e59d 424 {
Janos Follath 0:1f7c5025e59d 425 mbedtls_arc4_context arc4;
Janos Follath 0:1f7c5025e59d 426 mbedtls_arc4_init( &arc4 );
Janos Follath 0:1f7c5025e59d 427 mbedtls_arc4_setup( &arc4, tmp, 32 );
Janos Follath 0:1f7c5025e59d 428 TIME_AND_TSC( "ARC4", mbedtls_arc4_crypt( &arc4, BUFSIZE, buf, buf ) );
Janos Follath 0:1f7c5025e59d 429 mbedtls_arc4_free( &arc4 );
Janos Follath 0:1f7c5025e59d 430 }
Janos Follath 0:1f7c5025e59d 431 #endif
Janos Follath 0:1f7c5025e59d 432
Janos Follath 0:1f7c5025e59d 433 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
Janos Follath 0:1f7c5025e59d 434 if( todo.des3 )
Janos Follath 0:1f7c5025e59d 435 {
Janos Follath 0:1f7c5025e59d 436 mbedtls_des3_context des3;
Janos Follath 0:1f7c5025e59d 437 mbedtls_des3_init( &des3 );
Janos Follath 0:1f7c5025e59d 438 mbedtls_des3_set3key_enc( &des3, tmp );
Janos Follath 0:1f7c5025e59d 439 TIME_AND_TSC( "3DES",
Janos Follath 0:1f7c5025e59d 440 mbedtls_des3_crypt_cbc( &des3, MBEDTLS_DES_ENCRYPT, BUFSIZE, tmp, buf, buf ) );
Janos Follath 0:1f7c5025e59d 441 mbedtls_des3_free( &des3 );
Janos Follath 0:1f7c5025e59d 442 }
Janos Follath 0:1f7c5025e59d 443
Janos Follath 0:1f7c5025e59d 444 if( todo.des )
Janos Follath 0:1f7c5025e59d 445 {
Janos Follath 0:1f7c5025e59d 446 mbedtls_des_context des;
Janos Follath 0:1f7c5025e59d 447 mbedtls_des_init( &des );
Janos Follath 0:1f7c5025e59d 448 mbedtls_des_setkey_enc( &des, tmp );
Janos Follath 0:1f7c5025e59d 449 TIME_AND_TSC( "DES",
Janos Follath 0:1f7c5025e59d 450 mbedtls_des_crypt_cbc( &des, MBEDTLS_DES_ENCRYPT, BUFSIZE, tmp, buf, buf ) );
Janos Follath 0:1f7c5025e59d 451 mbedtls_des_free( &des );
Janos Follath 0:1f7c5025e59d 452 }
Janos Follath 0:1f7c5025e59d 453 #endif
Janos Follath 0:1f7c5025e59d 454
Janos Follath 0:1f7c5025e59d 455 #if defined(MBEDTLS_AES_C)
Janos Follath 0:1f7c5025e59d 456 #if defined(MBEDTLS_CIPHER_MODE_CBC)
Janos Follath 0:1f7c5025e59d 457 if( todo.aes_cbc )
Janos Follath 0:1f7c5025e59d 458 {
Janos Follath 0:1f7c5025e59d 459 int keysize;
Janos Follath 0:1f7c5025e59d 460 mbedtls_aes_context aes;
Janos Follath 0:1f7c5025e59d 461 mbedtls_aes_init( &aes );
Janos Follath 0:1f7c5025e59d 462 for( keysize = 128; keysize <= 256; keysize += 64 )
Janos Follath 0:1f7c5025e59d 463 {
Janos Follath 0:1f7c5025e59d 464 mbedtls_snprintf( title, sizeof( title ), "AES-CBC-%d", keysize );
Janos Follath 0:1f7c5025e59d 465
Janos Follath 0:1f7c5025e59d 466 memset( buf, 0, sizeof( buf ) );
Janos Follath 0:1f7c5025e59d 467 memset( tmp, 0, sizeof( tmp ) );
Janos Follath 0:1f7c5025e59d 468 mbedtls_aes_setkey_enc( &aes, tmp, keysize );
Janos Follath 0:1f7c5025e59d 469
Janos Follath 0:1f7c5025e59d 470 TIME_AND_TSC( title,
Janos Follath 0:1f7c5025e59d 471 mbedtls_aes_crypt_cbc( &aes, MBEDTLS_AES_ENCRYPT, BUFSIZE, tmp, buf, buf ) );
Janos Follath 0:1f7c5025e59d 472 }
Janos Follath 0:1f7c5025e59d 473 mbedtls_aes_free( &aes );
Janos Follath 0:1f7c5025e59d 474 }
Janos Follath 0:1f7c5025e59d 475 #endif
Janos Follath 0:1f7c5025e59d 476 #if defined(MBEDTLS_GCM_C)
Janos Follath 0:1f7c5025e59d 477 if( todo.aes_gcm )
Janos Follath 0:1f7c5025e59d 478 {
Janos Follath 0:1f7c5025e59d 479 int keysize;
Janos Follath 0:1f7c5025e59d 480 mbedtls_gcm_context gcm;
Janos Follath 0:1f7c5025e59d 481
Janos Follath 0:1f7c5025e59d 482 mbedtls_gcm_init( &gcm );
Janos Follath 0:1f7c5025e59d 483 for( keysize = 128; keysize <= 256; keysize += 64 )
Janos Follath 0:1f7c5025e59d 484 {
Janos Follath 0:1f7c5025e59d 485 mbedtls_snprintf( title, sizeof( title ), "AES-GCM-%d", keysize );
Janos Follath 0:1f7c5025e59d 486
Janos Follath 0:1f7c5025e59d 487 memset( buf, 0, sizeof( buf ) );
Janos Follath 0:1f7c5025e59d 488 memset( tmp, 0, sizeof( tmp ) );
Janos Follath 0:1f7c5025e59d 489 mbedtls_gcm_setkey( &gcm, MBEDTLS_CIPHER_ID_AES, tmp, keysize );
Janos Follath 0:1f7c5025e59d 490
Janos Follath 0:1f7c5025e59d 491 TIME_AND_TSC( title,
Janos Follath 0:1f7c5025e59d 492 mbedtls_gcm_crypt_and_tag( &gcm, MBEDTLS_GCM_ENCRYPT, BUFSIZE, tmp,
Janos Follath 0:1f7c5025e59d 493 12, NULL, 0, buf, buf, 16, tmp ) );
Janos Follath 0:1f7c5025e59d 494
Janos Follath 0:1f7c5025e59d 495 mbedtls_gcm_free( &gcm );
Janos Follath 0:1f7c5025e59d 496 }
Janos Follath 0:1f7c5025e59d 497 }
Janos Follath 0:1f7c5025e59d 498 #endif
Janos Follath 0:1f7c5025e59d 499 #if defined(MBEDTLS_CCM_C)
Janos Follath 0:1f7c5025e59d 500 if( todo.aes_ccm )
Janos Follath 0:1f7c5025e59d 501 {
Janos Follath 0:1f7c5025e59d 502 int keysize;
Janos Follath 0:1f7c5025e59d 503 mbedtls_ccm_context ccm;
Janos Follath 0:1f7c5025e59d 504
Janos Follath 0:1f7c5025e59d 505 mbedtls_ccm_init( &ccm );
Janos Follath 0:1f7c5025e59d 506 for( keysize = 128; keysize <= 256; keysize += 64 )
Janos Follath 0:1f7c5025e59d 507 {
Janos Follath 0:1f7c5025e59d 508 mbedtls_snprintf( title, sizeof( title ), "AES-CCM-%d", keysize );
Janos Follath 0:1f7c5025e59d 509
Janos Follath 0:1f7c5025e59d 510 memset( buf, 0, sizeof( buf ) );
Janos Follath 0:1f7c5025e59d 511 memset( tmp, 0, sizeof( tmp ) );
Janos Follath 0:1f7c5025e59d 512 mbedtls_ccm_setkey( &ccm, MBEDTLS_CIPHER_ID_AES, tmp, keysize );
Janos Follath 0:1f7c5025e59d 513
Janos Follath 0:1f7c5025e59d 514 TIME_AND_TSC( title,
Janos Follath 0:1f7c5025e59d 515 mbedtls_ccm_encrypt_and_tag( &ccm, BUFSIZE, tmp,
Janos Follath 0:1f7c5025e59d 516 12, NULL, 0, buf, buf, tmp, 16 ) );
Janos Follath 0:1f7c5025e59d 517
Janos Follath 0:1f7c5025e59d 518 mbedtls_ccm_free( &ccm );
Janos Follath 0:1f7c5025e59d 519 }
Janos Follath 0:1f7c5025e59d 520 }
Janos Follath 0:1f7c5025e59d 521 #endif
Janos Follath 0:1f7c5025e59d 522 #endif
Janos Follath 0:1f7c5025e59d 523
Janos Follath 0:1f7c5025e59d 524 #if defined(MBEDTLS_CAMELLIA_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
Janos Follath 0:1f7c5025e59d 525 if( todo.camellia )
Janos Follath 0:1f7c5025e59d 526 {
Janos Follath 0:1f7c5025e59d 527 int keysize;
Janos Follath 0:1f7c5025e59d 528 mbedtls_camellia_context camellia;
Janos Follath 0:1f7c5025e59d 529 mbedtls_camellia_init( &camellia );
Janos Follath 0:1f7c5025e59d 530 for( keysize = 128; keysize <= 256; keysize += 64 )
Janos Follath 0:1f7c5025e59d 531 {
Janos Follath 0:1f7c5025e59d 532 mbedtls_snprintf( title, sizeof( title ), "CAMELLIA-CBC-%d", keysize );
Janos Follath 0:1f7c5025e59d 533
Janos Follath 0:1f7c5025e59d 534 memset( buf, 0, sizeof( buf ) );
Janos Follath 0:1f7c5025e59d 535 memset( tmp, 0, sizeof( tmp ) );
Janos Follath 0:1f7c5025e59d 536 mbedtls_camellia_setkey_enc( &camellia, tmp, keysize );
Janos Follath 0:1f7c5025e59d 537
Janos Follath 0:1f7c5025e59d 538 TIME_AND_TSC( title,
Janos Follath 0:1f7c5025e59d 539 mbedtls_camellia_crypt_cbc( &camellia, MBEDTLS_CAMELLIA_ENCRYPT,
Janos Follath 0:1f7c5025e59d 540 BUFSIZE, tmp, buf, buf ) );
Janos Follath 0:1f7c5025e59d 541 }
Janos Follath 0:1f7c5025e59d 542 mbedtls_camellia_free( &camellia );
Janos Follath 0:1f7c5025e59d 543 }
Janos Follath 0:1f7c5025e59d 544 #endif
Janos Follath 0:1f7c5025e59d 545
Janos Follath 0:1f7c5025e59d 546 #if defined(MBEDTLS_BLOWFISH_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
Janos Follath 0:1f7c5025e59d 547 if( todo.blowfish )
Janos Follath 0:1f7c5025e59d 548 {
Janos Follath 0:1f7c5025e59d 549 int keysize;
Janos Follath 0:1f7c5025e59d 550 mbedtls_blowfish_context blowfish;
Janos Follath 0:1f7c5025e59d 551 mbedtls_blowfish_init( &blowfish );
Janos Follath 0:1f7c5025e59d 552
Janos Follath 0:1f7c5025e59d 553 for( keysize = 128; keysize <= 256; keysize += 64 )
Janos Follath 0:1f7c5025e59d 554 {
Janos Follath 0:1f7c5025e59d 555 mbedtls_snprintf( title, sizeof( title ), "BLOWFISH-CBC-%d", keysize );
Janos Follath 0:1f7c5025e59d 556
Janos Follath 0:1f7c5025e59d 557 memset( buf, 0, sizeof( buf ) );
Janos Follath 0:1f7c5025e59d 558 memset( tmp, 0, sizeof( tmp ) );
Janos Follath 0:1f7c5025e59d 559 mbedtls_blowfish_setkey( &blowfish, tmp, keysize );
Janos Follath 0:1f7c5025e59d 560
Janos Follath 0:1f7c5025e59d 561 TIME_AND_TSC( title,
Janos Follath 0:1f7c5025e59d 562 mbedtls_blowfish_crypt_cbc( &blowfish, MBEDTLS_BLOWFISH_ENCRYPT, BUFSIZE,
Janos Follath 0:1f7c5025e59d 563 tmp, buf, buf ) );
Janos Follath 0:1f7c5025e59d 564 }
Janos Follath 0:1f7c5025e59d 565
Janos Follath 0:1f7c5025e59d 566 mbedtls_blowfish_free( &blowfish );
Janos Follath 0:1f7c5025e59d 567 }
Janos Follath 0:1f7c5025e59d 568 #endif
Janos Follath 0:1f7c5025e59d 569
Janos Follath 0:1f7c5025e59d 570 #if defined(MBEDTLS_HAVEGE_C)
Janos Follath 0:1f7c5025e59d 571 if( todo.havege )
Janos Follath 0:1f7c5025e59d 572 {
Janos Follath 0:1f7c5025e59d 573 mbedtls_havege_state hs;
Janos Follath 0:1f7c5025e59d 574 mbedtls_havege_init( &hs );
Janos Follath 0:1f7c5025e59d 575 TIME_AND_TSC( "HAVEGE", mbedtls_havege_random( &hs, buf, BUFSIZE ) );
Janos Follath 0:1f7c5025e59d 576 mbedtls_havege_free( &hs );
Janos Follath 0:1f7c5025e59d 577 }
Janos Follath 0:1f7c5025e59d 578 #endif
Janos Follath 0:1f7c5025e59d 579
Janos Follath 0:1f7c5025e59d 580 #if defined(MBEDTLS_CTR_DRBG_C)
Janos Follath 0:1f7c5025e59d 581 if( todo.ctr_drbg )
Janos Follath 0:1f7c5025e59d 582 {
Janos Follath 0:1f7c5025e59d 583 mbedtls_ctr_drbg_context ctr_drbg;
Janos Follath 0:1f7c5025e59d 584
Janos Follath 0:1f7c5025e59d 585 mbedtls_ctr_drbg_init( &ctr_drbg );
Janos Follath 0:1f7c5025e59d 586
Janos Follath 0:1f7c5025e59d 587 if( mbedtls_ctr_drbg_seed( &ctr_drbg, myrand, NULL, NULL, 0 ) != 0 )
Janos Follath 0:1f7c5025e59d 588 mbedtls_exit(1);
Janos Follath 0:1f7c5025e59d 589 TIME_AND_TSC( "CTR_DRBG (NOPR)",
Janos Follath 0:1f7c5025e59d 590 if( mbedtls_ctr_drbg_random( &ctr_drbg, buf, BUFSIZE ) != 0 )
Janos Follath 0:1f7c5025e59d 591 mbedtls_exit(1) );
Janos Follath 0:1f7c5025e59d 592
Janos Follath 0:1f7c5025e59d 593 if( mbedtls_ctr_drbg_seed( &ctr_drbg, myrand, NULL, NULL, 0 ) != 0 )
Janos Follath 0:1f7c5025e59d 594 mbedtls_exit(1);
Janos Follath 0:1f7c5025e59d 595 mbedtls_ctr_drbg_set_prediction_resistance( &ctr_drbg, MBEDTLS_CTR_DRBG_PR_ON );
Janos Follath 0:1f7c5025e59d 596 TIME_AND_TSC( "CTR_DRBG (PR)",
Janos Follath 0:1f7c5025e59d 597 if( mbedtls_ctr_drbg_random( &ctr_drbg, buf, BUFSIZE ) != 0 )
Janos Follath 0:1f7c5025e59d 598 mbedtls_exit(1) );
Janos Follath 0:1f7c5025e59d 599 mbedtls_ctr_drbg_free( &ctr_drbg );
Janos Follath 0:1f7c5025e59d 600 }
Janos Follath 0:1f7c5025e59d 601 #endif
Janos Follath 0:1f7c5025e59d 602
Janos Follath 0:1f7c5025e59d 603 #if defined(MBEDTLS_HMAC_DRBG_C)
Janos Follath 0:1f7c5025e59d 604 if( todo.hmac_drbg )
Janos Follath 0:1f7c5025e59d 605 {
Janos Follath 0:1f7c5025e59d 606 mbedtls_hmac_drbg_context hmac_drbg;
Janos Follath 0:1f7c5025e59d 607 const mbedtls_md_info_t *md_info;
Janos Follath 0:1f7c5025e59d 608
Janos Follath 0:1f7c5025e59d 609 mbedtls_hmac_drbg_init( &hmac_drbg );
Janos Follath 0:1f7c5025e59d 610
Janos Follath 0:1f7c5025e59d 611 #if defined(MBEDTLS_SHA1_C)
Janos Follath 0:1f7c5025e59d 612 if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ) ) == NULL )
Janos Follath 0:1f7c5025e59d 613 mbedtls_exit(1);
Janos Follath 0:1f7c5025e59d 614
Janos Follath 0:1f7c5025e59d 615 if( mbedtls_hmac_drbg_seed( &hmac_drbg, md_info, myrand, NULL, NULL, 0 ) != 0 )
Janos Follath 0:1f7c5025e59d 616 mbedtls_exit(1);
Janos Follath 0:1f7c5025e59d 617 TIME_AND_TSC( "HMAC_DRBG SHA-1 (NOPR)",
Janos Follath 0:1f7c5025e59d 618 if( mbedtls_hmac_drbg_random( &hmac_drbg, buf, BUFSIZE ) != 0 )
Janos Follath 0:1f7c5025e59d 619 mbedtls_exit(1) );
Janos Follath 0:1f7c5025e59d 620 mbedtls_hmac_drbg_free( &hmac_drbg );
Janos Follath 0:1f7c5025e59d 621
Janos Follath 0:1f7c5025e59d 622 if( mbedtls_hmac_drbg_seed( &hmac_drbg, md_info, myrand, NULL, NULL, 0 ) != 0 )
Janos Follath 0:1f7c5025e59d 623 mbedtls_exit(1);
Janos Follath 0:1f7c5025e59d 624 mbedtls_hmac_drbg_set_prediction_resistance( &hmac_drbg,
Janos Follath 0:1f7c5025e59d 625 MBEDTLS_HMAC_DRBG_PR_ON );
Janos Follath 0:1f7c5025e59d 626 TIME_AND_TSC( "HMAC_DRBG SHA-1 (PR)",
Janos Follath 0:1f7c5025e59d 627 if( mbedtls_hmac_drbg_random( &hmac_drbg, buf, BUFSIZE ) != 0 )
Janos Follath 0:1f7c5025e59d 628 mbedtls_exit(1) );
Janos Follath 0:1f7c5025e59d 629 mbedtls_hmac_drbg_free( &hmac_drbg );
Janos Follath 0:1f7c5025e59d 630 #endif
Janos Follath 0:1f7c5025e59d 631
Janos Follath 0:1f7c5025e59d 632 #if defined(MBEDTLS_SHA256_C)
Janos Follath 0:1f7c5025e59d 633 if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ) ) == NULL )
Janos Follath 0:1f7c5025e59d 634 mbedtls_exit(1);
Janos Follath 0:1f7c5025e59d 635
Janos Follath 0:1f7c5025e59d 636 if( mbedtls_hmac_drbg_seed( &hmac_drbg, md_info, myrand, NULL, NULL, 0 ) != 0 )
Janos Follath 0:1f7c5025e59d 637 mbedtls_exit(1);
Janos Follath 0:1f7c5025e59d 638 TIME_AND_TSC( "HMAC_DRBG SHA-256 (NOPR)",
Janos Follath 0:1f7c5025e59d 639 if( mbedtls_hmac_drbg_random( &hmac_drbg, buf, BUFSIZE ) != 0 )
Janos Follath 0:1f7c5025e59d 640 mbedtls_exit(1) );
Janos Follath 0:1f7c5025e59d 641 mbedtls_hmac_drbg_free( &hmac_drbg );
Janos Follath 0:1f7c5025e59d 642
Janos Follath 0:1f7c5025e59d 643 if( mbedtls_hmac_drbg_seed( &hmac_drbg, md_info, myrand, NULL, NULL, 0 ) != 0 )
Janos Follath 0:1f7c5025e59d 644 mbedtls_exit(1);
Janos Follath 0:1f7c5025e59d 645 mbedtls_hmac_drbg_set_prediction_resistance( &hmac_drbg,
Janos Follath 0:1f7c5025e59d 646 MBEDTLS_HMAC_DRBG_PR_ON );
Janos Follath 0:1f7c5025e59d 647 TIME_AND_TSC( "HMAC_DRBG SHA-256 (PR)",
Janos Follath 0:1f7c5025e59d 648 if( mbedtls_hmac_drbg_random( &hmac_drbg, buf, BUFSIZE ) != 0 )
Janos Follath 0:1f7c5025e59d 649 mbedtls_exit(1) );
Janos Follath 0:1f7c5025e59d 650 mbedtls_hmac_drbg_free( &hmac_drbg );
Janos Follath 0:1f7c5025e59d 651 #endif
Janos Follath 0:1f7c5025e59d 652 }
Janos Follath 0:1f7c5025e59d 653 #endif
Janos Follath 0:1f7c5025e59d 654
Janos Follath 0:1f7c5025e59d 655 #if defined(MBEDTLS_RSA_C) && \
Janos Follath 0:1f7c5025e59d 656 defined(MBEDTLS_PEM_PARSE_C) && defined(MBEDTLS_PK_PARSE_C)
Janos Follath 0:1f7c5025e59d 657 if( todo.rsa )
Janos Follath 0:1f7c5025e59d 658 {
Janos Follath 0:1f7c5025e59d 659 mbedtls_pk_context pk;
Janos Follath 0:1f7c5025e59d 660 mbedtls_rsa_context *rsa;
Janos Follath 0:1f7c5025e59d 661 const char *rsa_keys[] = { RSA_PRIVATE_KEY_2048, RSA_PRIVATE_KEY_4096 };
Janos Follath 0:1f7c5025e59d 662 size_t i;
Janos Follath 0:1f7c5025e59d 663
Janos Follath 0:1f7c5025e59d 664 for( i = 0; i < sizeof( rsa_keys ) / sizeof( rsa_keys[0] ); i++ )
Janos Follath 0:1f7c5025e59d 665 {
Janos Follath 0:1f7c5025e59d 666 mbedtls_pk_init( &pk );
Janos Follath 0:1f7c5025e59d 667 mbedtls_pk_parse_key( &pk, (const unsigned char *) rsa_keys[i],
Janos Follath 0:1f7c5025e59d 668 strlen( rsa_keys[i] ) + 1, NULL, 0 );
Janos Follath 0:1f7c5025e59d 669 rsa = mbedtls_pk_rsa( pk );
Janos Follath 0:1f7c5025e59d 670
Janos Follath 0:1f7c5025e59d 671 mbedtls_snprintf( title, sizeof( title ), "RSA-%d", mbedtls_pk_get_bitlen( &pk ) );
Janos Follath 0:1f7c5025e59d 672
Janos Follath 0:1f7c5025e59d 673 TIME_PUBLIC( title, " public",
Janos Follath 0:1f7c5025e59d 674 buf[0] = 0;
Janos Follath 0:1f7c5025e59d 675 ret = mbedtls_rsa_public( rsa, buf, buf ) );
Janos Follath 0:1f7c5025e59d 676
Janos Follath 0:1f7c5025e59d 677 TIME_PUBLIC( title, "private",
Janos Follath 0:1f7c5025e59d 678 buf[0] = 0;
Janos Follath 0:1f7c5025e59d 679 ret = mbedtls_rsa_private( rsa, myrand, NULL, buf, buf ) );
Janos Follath 0:1f7c5025e59d 680
Janos Follath 0:1f7c5025e59d 681 mbedtls_pk_free( &pk );
Janos Follath 0:1f7c5025e59d 682 }
Janos Follath 0:1f7c5025e59d 683 }
Janos Follath 0:1f7c5025e59d 684 #endif
Janos Follath 0:1f7c5025e59d 685
Janos Follath 0:1f7c5025e59d 686 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_BIGNUM_C)
Janos Follath 0:1f7c5025e59d 687 if( todo.dhm )
Janos Follath 0:1f7c5025e59d 688 {
Janos Follath 0:1f7c5025e59d 689 int dhm_sizes[] = { 2048, 3072 };
Janos Follath 0:1f7c5025e59d 690 const char *dhm_P[] = {
Janos Follath 0:1f7c5025e59d 691 MBEDTLS_DHM_RFC3526_MODP_2048_P,
Janos Follath 0:1f7c5025e59d 692 MBEDTLS_DHM_RFC3526_MODP_3072_P,
Janos Follath 0:1f7c5025e59d 693 };
Janos Follath 0:1f7c5025e59d 694 const char *dhm_G[] = {
Janos Follath 0:1f7c5025e59d 695 MBEDTLS_DHM_RFC3526_MODP_2048_G,
Janos Follath 0:1f7c5025e59d 696 MBEDTLS_DHM_RFC3526_MODP_3072_G,
Janos Follath 0:1f7c5025e59d 697 };
Janos Follath 0:1f7c5025e59d 698
Janos Follath 0:1f7c5025e59d 699 mbedtls_dhm_context dhm;
Janos Follath 0:1f7c5025e59d 700 size_t olen;
Janos Follath 0:1f7c5025e59d 701 for( i = 0; (size_t) i < sizeof( dhm_sizes ) / sizeof( dhm_sizes[0] ); i++ )
Janos Follath 0:1f7c5025e59d 702 {
Janos Follath 0:1f7c5025e59d 703 mbedtls_dhm_init( &dhm );
Janos Follath 0:1f7c5025e59d 704
Janos Follath 0:1f7c5025e59d 705 if( mbedtls_mpi_read_string( &dhm.P, 16, dhm_P[i] ) != 0 ||
Janos Follath 0:1f7c5025e59d 706 mbedtls_mpi_read_string( &dhm.G, 16, dhm_G[i] ) != 0 )
Janos Follath 0:1f7c5025e59d 707 {
Janos Follath 0:1f7c5025e59d 708 mbedtls_exit( 1 );
Janos Follath 0:1f7c5025e59d 709 }
Janos Follath 0:1f7c5025e59d 710
Janos Follath 0:1f7c5025e59d 711 dhm.len = mbedtls_mpi_size( &dhm.P );
Janos Follath 0:1f7c5025e59d 712 mbedtls_dhm_make_public( &dhm, (int) dhm.len, buf, dhm.len, myrand, NULL );
Janos Follath 0:1f7c5025e59d 713 if( mbedtls_mpi_copy( &dhm.GY, &dhm.GX ) != 0 )
Janos Follath 0:1f7c5025e59d 714 mbedtls_exit( 1 );
Janos Follath 0:1f7c5025e59d 715
Janos Follath 0:1f7c5025e59d 716 mbedtls_snprintf( title, sizeof( title ), "DHE-%d", dhm_sizes[i] );
Janos Follath 0:1f7c5025e59d 717 TIME_PUBLIC( title, "handshake",
Janos Follath 0:1f7c5025e59d 718 ret |= mbedtls_dhm_make_public( &dhm, (int) dhm.len, buf, dhm.len,
Janos Follath 0:1f7c5025e59d 719 myrand, NULL );
Janos Follath 0:1f7c5025e59d 720 ret |= mbedtls_dhm_calc_secret( &dhm, buf, sizeof( buf ), &olen, myrand, NULL ) );
Janos Follath 0:1f7c5025e59d 721
Janos Follath 0:1f7c5025e59d 722 mbedtls_snprintf( title, sizeof( title ), "DH-%d", dhm_sizes[i] );
Janos Follath 0:1f7c5025e59d 723 TIME_PUBLIC( title, "handshake",
Janos Follath 0:1f7c5025e59d 724 ret |= mbedtls_dhm_calc_secret( &dhm, buf, sizeof( buf ), &olen, myrand, NULL ) );
Janos Follath 0:1f7c5025e59d 725
Janos Follath 0:1f7c5025e59d 726 mbedtls_dhm_free( &dhm );
Janos Follath 0:1f7c5025e59d 727 }
Janos Follath 0:1f7c5025e59d 728 }
Janos Follath 0:1f7c5025e59d 729 #endif
Janos Follath 0:1f7c5025e59d 730
Janos Follath 0:1f7c5025e59d 731 #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C)
Janos Follath 0:1f7c5025e59d 732 if( todo.ecdsa )
Janos Follath 0:1f7c5025e59d 733 {
Janos Follath 0:1f7c5025e59d 734 mbedtls_ecdsa_context ecdsa;
Janos Follath 0:1f7c5025e59d 735 const mbedtls_ecp_curve_info *curve_info;
Janos Follath 0:1f7c5025e59d 736 size_t sig_len;
Janos Follath 0:1f7c5025e59d 737
Janos Follath 0:1f7c5025e59d 738 memset( buf, 0x2A, sizeof( buf ) );
Janos Follath 0:1f7c5025e59d 739
Janos Follath 0:1f7c5025e59d 740 for( curve_info = mbedtls_ecp_curve_list();
Janos Follath 0:1f7c5025e59d 741 curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
Janos Follath 0:1f7c5025e59d 742 curve_info++ )
Janos Follath 0:1f7c5025e59d 743 {
Janos Follath 0:1f7c5025e59d 744 mbedtls_ecdsa_init( &ecdsa );
Janos Follath 0:1f7c5025e59d 745
Janos Follath 0:1f7c5025e59d 746 if( mbedtls_ecdsa_genkey( &ecdsa, curve_info->grp_id, myrand, NULL ) != 0 )
Janos Follath 0:1f7c5025e59d 747 mbedtls_exit( 1 );
Janos Follath 0:1f7c5025e59d 748 ecp_clear_precomputed( &ecdsa.grp );
Janos Follath 0:1f7c5025e59d 749
Janos Follath 0:1f7c5025e59d 750 mbedtls_snprintf( title, sizeof( title ), "ECDSA-%s",
Janos Follath 0:1f7c5025e59d 751 curve_info->name );
Janos Follath 0:1f7c5025e59d 752 TIME_PUBLIC( title, "sign",
Janos Follath 0:1f7c5025e59d 753 ret = mbedtls_ecdsa_write_signature( &ecdsa, MBEDTLS_MD_SHA256, buf, curve_info->bit_size,
Janos Follath 0:1f7c5025e59d 754 tmp, &sig_len, myrand, NULL ) );
Janos Follath 0:1f7c5025e59d 755
Janos Follath 0:1f7c5025e59d 756 mbedtls_ecdsa_free( &ecdsa );
Janos Follath 0:1f7c5025e59d 757 }
Janos Follath 0:1f7c5025e59d 758
Janos Follath 0:1f7c5025e59d 759 for( curve_info = mbedtls_ecp_curve_list();
Janos Follath 0:1f7c5025e59d 760 curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
Janos Follath 0:1f7c5025e59d 761 curve_info++ )
Janos Follath 0:1f7c5025e59d 762 {
Janos Follath 0:1f7c5025e59d 763 mbedtls_ecdsa_init( &ecdsa );
Janos Follath 0:1f7c5025e59d 764
Janos Follath 0:1f7c5025e59d 765 if( mbedtls_ecdsa_genkey( &ecdsa, curve_info->grp_id, myrand, NULL ) != 0 ||
Janos Follath 0:1f7c5025e59d 766 mbedtls_ecdsa_write_signature( &ecdsa, MBEDTLS_MD_SHA256, buf, curve_info->bit_size,
Janos Follath 0:1f7c5025e59d 767 tmp, &sig_len, myrand, NULL ) != 0 )
Janos Follath 0:1f7c5025e59d 768 {
Janos Follath 0:1f7c5025e59d 769 mbedtls_exit( 1 );
Janos Follath 0:1f7c5025e59d 770 }
Janos Follath 0:1f7c5025e59d 771 ecp_clear_precomputed( &ecdsa.grp );
Janos Follath 0:1f7c5025e59d 772
Janos Follath 0:1f7c5025e59d 773 mbedtls_snprintf( title, sizeof( title ), "ECDSA-%s",
Janos Follath 0:1f7c5025e59d 774 curve_info->name );
Janos Follath 0:1f7c5025e59d 775 TIME_PUBLIC( title, "verify",
Janos Follath 0:1f7c5025e59d 776 ret = mbedtls_ecdsa_read_signature( &ecdsa, buf, curve_info->bit_size,
Janos Follath 0:1f7c5025e59d 777 tmp, sig_len ) );
Janos Follath 0:1f7c5025e59d 778
Janos Follath 0:1f7c5025e59d 779 mbedtls_ecdsa_free( &ecdsa );
Janos Follath 0:1f7c5025e59d 780 }
Janos Follath 0:1f7c5025e59d 781 }
Janos Follath 0:1f7c5025e59d 782 #endif
Janos Follath 0:1f7c5025e59d 783
Janos Follath 0:1f7c5025e59d 784 #if defined(MBEDTLS_ECDH_C)
Janos Follath 0:1f7c5025e59d 785 if( todo.ecdh )
Janos Follath 0:1f7c5025e59d 786 {
Janos Follath 0:1f7c5025e59d 787 mbedtls_ecdh_context ecdh;
Janos Follath 0:1f7c5025e59d 788 #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
Janos Follath 0:1f7c5025e59d 789 mbedtls_mpi z;
Janos Follath 0:1f7c5025e59d 790 #endif
Janos Follath 0:1f7c5025e59d 791 const mbedtls_ecp_curve_info *curve_info;
Janos Follath 0:1f7c5025e59d 792 size_t olen;
Janos Follath 0:1f7c5025e59d 793
Janos Follath 0:1f7c5025e59d 794 for( curve_info = mbedtls_ecp_curve_list();
Janos Follath 0:1f7c5025e59d 795 curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
Janos Follath 0:1f7c5025e59d 796 curve_info++ )
Janos Follath 0:1f7c5025e59d 797 {
Janos Follath 0:1f7c5025e59d 798 mbedtls_ecdh_init( &ecdh );
Janos Follath 0:1f7c5025e59d 799
Janos Follath 0:1f7c5025e59d 800 if( mbedtls_ecp_group_load( &ecdh.grp, curve_info->grp_id ) != 0 ||
Janos Follath 0:1f7c5025e59d 801 mbedtls_ecdh_make_public( &ecdh, &olen, buf, sizeof( buf ),
Janos Follath 0:1f7c5025e59d 802 myrand, NULL ) != 0 ||
Janos Follath 0:1f7c5025e59d 803 mbedtls_ecp_copy( &ecdh.Qp, &ecdh.Q ) != 0 )
Janos Follath 0:1f7c5025e59d 804 {
Janos Follath 0:1f7c5025e59d 805 mbedtls_exit( 1 );
Janos Follath 0:1f7c5025e59d 806 }
Janos Follath 0:1f7c5025e59d 807 ecp_clear_precomputed( &ecdh.grp );
Janos Follath 0:1f7c5025e59d 808
Janos Follath 0:1f7c5025e59d 809 mbedtls_snprintf( title, sizeof( title ), "ECDHE-%s",
Janos Follath 0:1f7c5025e59d 810 curve_info->name );
Janos Follath 0:1f7c5025e59d 811 TIME_PUBLIC( title, "handshake",
Janos Follath 0:1f7c5025e59d 812 ret |= mbedtls_ecdh_make_public( &ecdh, &olen, buf, sizeof( buf ),
Janos Follath 0:1f7c5025e59d 813 myrand, NULL );
Janos Follath 0:1f7c5025e59d 814 ret |= mbedtls_ecdh_calc_secret( &ecdh, &olen, buf, sizeof( buf ),
Janos Follath 0:1f7c5025e59d 815 myrand, NULL ) );
Janos Follath 0:1f7c5025e59d 816 mbedtls_ecdh_free( &ecdh );
Janos Follath 0:1f7c5025e59d 817 }
Janos Follath 0:1f7c5025e59d 818
Janos Follath 0:1f7c5025e59d 819 /* Curve25519 needs to be handled separately */
Janos Follath 0:1f7c5025e59d 820 #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
Janos Follath 0:1f7c5025e59d 821 mbedtls_ecdh_init( &ecdh );
Janos Follath 0:1f7c5025e59d 822 mbedtls_mpi_init( &z );
Janos Follath 0:1f7c5025e59d 823
Janos Follath 0:1f7c5025e59d 824 if( mbedtls_ecp_group_load( &ecdh.grp, MBEDTLS_ECP_DP_CURVE25519 ) != 0 ||
Janos Follath 0:1f7c5025e59d 825 mbedtls_ecdh_gen_public( &ecdh.grp, &ecdh.d, &ecdh.Qp, myrand, NULL ) != 0 )
Janos Follath 0:1f7c5025e59d 826 {
Janos Follath 0:1f7c5025e59d 827 mbedtls_exit( 1 );
Janos Follath 0:1f7c5025e59d 828 }
Janos Follath 0:1f7c5025e59d 829
Janos Follath 0:1f7c5025e59d 830 TIME_PUBLIC( "ECDHE-Curve25519", "handshake",
Janos Follath 0:1f7c5025e59d 831 ret |= mbedtls_ecdh_gen_public( &ecdh.grp, &ecdh.d, &ecdh.Q,
Janos Follath 0:1f7c5025e59d 832 myrand, NULL );
Janos Follath 0:1f7c5025e59d 833 ret |= mbedtls_ecdh_compute_shared( &ecdh.grp, &z, &ecdh.Qp, &ecdh.d,
Janos Follath 0:1f7c5025e59d 834 myrand, NULL ) );
Janos Follath 0:1f7c5025e59d 835
Janos Follath 0:1f7c5025e59d 836 mbedtls_ecdh_free( &ecdh );
Janos Follath 0:1f7c5025e59d 837 mbedtls_mpi_free( &z );
Janos Follath 0:1f7c5025e59d 838 #endif
Janos Follath 0:1f7c5025e59d 839
Janos Follath 0:1f7c5025e59d 840 for( curve_info = mbedtls_ecp_curve_list();
Janos Follath 0:1f7c5025e59d 841 curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
Janos Follath 0:1f7c5025e59d 842 curve_info++ )
Janos Follath 0:1f7c5025e59d 843 {
Janos Follath 0:1f7c5025e59d 844 mbedtls_ecdh_init( &ecdh );
Janos Follath 0:1f7c5025e59d 845
Janos Follath 0:1f7c5025e59d 846 if( mbedtls_ecp_group_load( &ecdh.grp, curve_info->grp_id ) != 0 ||
Janos Follath 0:1f7c5025e59d 847 mbedtls_ecdh_make_public( &ecdh, &olen, buf, sizeof( buf ),
Janos Follath 0:1f7c5025e59d 848 myrand, NULL ) != 0 ||
Janos Follath 0:1f7c5025e59d 849 mbedtls_ecp_copy( &ecdh.Qp, &ecdh.Q ) != 0 ||
Janos Follath 0:1f7c5025e59d 850 mbedtls_ecdh_make_public( &ecdh, &olen, buf, sizeof( buf ),
Janos Follath 0:1f7c5025e59d 851 myrand, NULL ) != 0 )
Janos Follath 0:1f7c5025e59d 852 {
Janos Follath 0:1f7c5025e59d 853 mbedtls_exit( 1 );
Janos Follath 0:1f7c5025e59d 854 }
Janos Follath 0:1f7c5025e59d 855 ecp_clear_precomputed( &ecdh.grp );
Janos Follath 0:1f7c5025e59d 856
Janos Follath 0:1f7c5025e59d 857 mbedtls_snprintf( title, sizeof( title ), "ECDH-%s",
Janos Follath 0:1f7c5025e59d 858 curve_info->name );
Janos Follath 0:1f7c5025e59d 859 TIME_PUBLIC( title, "handshake",
Janos Follath 0:1f7c5025e59d 860 ret |= mbedtls_ecdh_calc_secret( &ecdh, &olen, buf, sizeof( buf ),
Janos Follath 0:1f7c5025e59d 861 myrand, NULL ) );
Janos Follath 0:1f7c5025e59d 862 mbedtls_ecdh_free( &ecdh );
Janos Follath 0:1f7c5025e59d 863 }
Janos Follath 0:1f7c5025e59d 864
Janos Follath 0:1f7c5025e59d 865 /* Curve25519 needs to be handled separately */
Janos Follath 0:1f7c5025e59d 866 #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
Janos Follath 0:1f7c5025e59d 867 mbedtls_ecdh_init( &ecdh );
Janos Follath 0:1f7c5025e59d 868 mbedtls_mpi_init( &z );
Janos Follath 0:1f7c5025e59d 869
Janos Follath 0:1f7c5025e59d 870 if( mbedtls_ecp_group_load( &ecdh.grp, MBEDTLS_ECP_DP_CURVE25519 ) != 0 ||
Janos Follath 0:1f7c5025e59d 871 mbedtls_ecdh_gen_public( &ecdh.grp, &ecdh.d, &ecdh.Qp,
Janos Follath 0:1f7c5025e59d 872 myrand, NULL ) != 0 ||
Janos Follath 0:1f7c5025e59d 873 mbedtls_ecdh_gen_public( &ecdh.grp, &ecdh.d, &ecdh.Q, myrand, NULL ) != 0 )
Janos Follath 0:1f7c5025e59d 874 {
Janos Follath 0:1f7c5025e59d 875 mbedtls_exit( 1 );
Janos Follath 0:1f7c5025e59d 876 }
Janos Follath 0:1f7c5025e59d 877
Janos Follath 0:1f7c5025e59d 878 TIME_PUBLIC( "ECDH-Curve25519", "handshake",
Janos Follath 0:1f7c5025e59d 879 ret |= mbedtls_ecdh_compute_shared( &ecdh.grp, &z, &ecdh.Qp, &ecdh.d,
Janos Follath 0:1f7c5025e59d 880 myrand, NULL ) );
Janos Follath 0:1f7c5025e59d 881
Janos Follath 0:1f7c5025e59d 882 mbedtls_ecdh_free( &ecdh );
Janos Follath 0:1f7c5025e59d 883 mbedtls_mpi_free( &z );
Janos Follath 0:1f7c5025e59d 884 #endif
Janos Follath 0:1f7c5025e59d 885 }
Janos Follath 0:1f7c5025e59d 886 #endif
Janos Follath 0:1f7c5025e59d 887
Janos Follath 0:1f7c5025e59d 888 mbedtls_printf("\r\nDONE\r\n");
Janos Follath 0:1f7c5025e59d 889
Janos Follath 0:1f7c5025e59d 890 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
Janos Follath 0:1f7c5025e59d 891 mbedtls_memory_buffer_alloc_free();
Janos Follath 0:1f7c5025e59d 892 #endif
Janos Follath 0:1f7c5025e59d 893
Janos Follath 0:1f7c5025e59d 894 return( 0 );
Janos Follath 0:1f7c5025e59d 895 }
Janos Follath 0:1f7c5025e59d 896
Janos Follath 0:1f7c5025e59d 897 int main(void) {
Janos Follath 0:1f7c5025e59d 898 int ret = benchmark(0, NULL);
Janos Follath 0:1f7c5025e59d 899 if (ret != 0) {
Janos Follath 0:1f7c5025e59d 900 mbedtls_printf("Benchmark failed with error %d\r\n", ret);
Janos Follath 0:1f7c5025e59d 901 }
Janos Follath 0:1f7c5025e59d 902 }