Public Key Acceleration Library Reference Guide  2.0
pka.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: © 2023 NVIDIA Corporation & affiliates.
2 // SPDX-License-Identifier: BSD-3-Clause
3 
97 
98 #ifndef __PKA_H__
99 #define __PKA_H__
100 
101 #ifdef __KERNEL__
102 #include <linux/types.h>
103 #else
104 #include <stdint.h>
105 #include <stdbool.h>
106 #endif
107 
109 typedef uint64_t pka_instance_t;
110 
112 #define PKA_INSTANCE_INVALID 0
113 
115 typedef struct pka_local_info_t* pka_handle_t;
116 
118 #define PKA_HANDLE_INVALID NULL
119 
121 typedef enum
122 {
149 
170  uint8_t flags,
171  uint32_t ring_cnt,
172  uint32_t queue_cnt,
173  uint32_t cmd_queue_size,
174  uint32_t result_queue_size);
175 
181 
188 
195 
206 
212 
218 
219 // user_data value used to indicate the context of async_jobs context
220 // so that there is no need to acquire lock
221 #define USER_DATA_POLLING 1
222 
225 #define MAX_OPERAND_CNT 11
226 
231 #define MAX_RESULT_CNT 2
232 
235 #define MAX_BYTE_LEN 520 // 130 * 4 bytes
236 
240 #define OTHER_MAX_BYTE_LEN 264 // 66 * 4 bytes
241 
246 #define MAX_RESULT_CNT 2
247 
251 typedef struct // 16 bytes long
252 {
253  uint16_t buf_len;
254  uint16_t actual_len;
255  uint8_t is_encrypted;
256  uint8_t big_endian;
257  uint8_t internal_use;
258  uint8_t pad;
259  uint8_t* buf_ptr;
260 } pka_operand_t;
261 
263 typedef enum
264 {
266  CC_ADD = 0x01,
268  CC_SUBTRACT = 0x02,
274  CC_MULTIPLY = 0x04,
276  CC_DIVIDE = 0x05,
278  CC_MODULO = 0x06,
284  CC_COMPARE = 0x09,
286  CC_COPY = 0xA0,
315 } pka_opcode_t;
316 
318 typedef enum
319 {
321  RC_NO_ERROR = 0x00,
333  RC_RESULT_IS_PAI = 0x86, // Not a real error?
337  RC_INTERMEDIATE_PAI = 0x89, // PAI = Point At Infinity
359  RC_MEMORY_DEADLOCK = 0xC1
361 
363 typedef enum
364 {
370  RC_RIGHT_IS_SMALLER = 0x4
372 
377 typedef struct // 50 bytes long
378 {
379  void* user_data;
381  uint8_t result_cnt;
385 } pka_results_t;
386 
394 
396 // This function handles the scenarios of async and sync pka request.
397 // user_data is used to distinguish the two.
398 // In sync mode, lock is acquired and relased inside this function.
399 // In async mode, lock is acquired by caller: polling_func.
407  void *user_data);
408 
415 
422 
435  void* user_data,
436  pka_operand_t* value,
437  pka_operand_t* addend);
438 
455  void* user_data,
456  pka_operand_t* value,
457  pka_operand_t* subtrahend);
458 
477  void* user_data,
478  pka_operand_t* value,
479  pka_operand_t* addend,
480  pka_operand_t* subtrahend);
481 
497  void* user_data,
498  pka_operand_t* value,
499  pka_operand_t* multiplier);
500 
514  void* user_data,
515  pka_operand_t* value,
516  pka_operand_t* divisor);
517 
531  void* user_data,
532  pka_operand_t* value,
533  pka_operand_t* modulus);
534 
547  void* user_data,
548  pka_operand_t* value,
549  uint32_t shift_cnt);
550 
563  void* user_data,
564  pka_operand_t* value,
565  uint32_t shift_cnt);
566 
582 int pka_dh(pka_handle_t handle,
583  void* user_data,
584  pka_operand_t* private_key,
585  pka_operand_t* modulus,
586  pka_operand_t* value);
587 
603  void* user_data,
604  pka_operand_t* exponent,
605  pka_operand_t* modulus,
606  pka_operand_t* value);
607 
629  void* user_data,
630  pka_operand_t* value,
631  pka_operand_t* p,
632  pka_operand_t* q,
633  pka_operand_t* d_p,
634  pka_operand_t* d_q,
635  pka_operand_t* qinv);
636 
673  void* user_data,
674  pka_operand_t* exponent,
675  pka_operand_t* modulus,
676  pka_operand_t* value);
677 
727  void* user_data,
728  pka_operand_t* p,
729  pka_operand_t* q,
730  pka_operand_t* c,
731  pka_operand_t* d_p,
732  pka_operand_t* d_q,
733  pka_operand_t* qinv);
734 
750  void* user_data,
751  pka_operand_t* value,
752  pka_operand_t* modulus);
753 
754 
757 typedef struct
758 {
761 } ecc_point_t;
762 
775 typedef struct
776 {
780 } ecc_curve_t;
781 
782 typedef enum
783 {
788 
806 typedef struct
807 {
812 
843  void* user_data,
844  ecc_mont_curve_t* curve,
845  pka_operand_t* point_x,
846  pka_operand_t* multiplier);
847 
903  void* user_data,
904  ecc_curve_t* curve,
905  ecc_point_t* pointA,
906  ecc_point_t* pointB);
907 
929  void* user_data,
930  ecc_curve_t* curve,
931  ecc_point_t* pointA,
932  pka_operand_t* multiplier);
933 
958  void* user_data,
959  ecc_mont_curve_t* curve,
960  pka_operand_t* point_x,
961  pka_operand_t* private_key);
962 
983  void* user_data,
984  ecc_curve_t* curve,
985  ecc_point_t* point,
986  pka_operand_t* private_key);
987 
1023  void* user_data,
1024  ecc_curve_t* curve,
1025  ecc_point_t* base_pt,
1026  pka_operand_t* base_pt_order,
1027  pka_operand_t* private_key,
1028  pka_operand_t* hash,
1029  pka_operand_t* k);
1030 
1034 typedef struct
1035 {
1038 } dsa_signature_t;
1039 
1082  void* user_data,
1083  ecc_curve_t* curve,
1084  ecc_point_t* base_pt,
1085  pka_operand_t* base_pt_order,
1086  ecc_point_t* public_key,
1087  pka_operand_t* hash,
1088  dsa_signature_t* rcvd_signature,
1089  uint8_t no_write);
1090 
1120  void* user_data,
1121  pka_operand_t* p,
1122  pka_operand_t* q,
1123  pka_operand_t* g,
1124  pka_operand_t* private_key,
1125  pka_operand_t* hash,
1126  pka_operand_t* k);
1127 
1164  void* user_data,
1165  pka_operand_t* p,
1166  pka_operand_t* q,
1167  pka_operand_t* g,
1168  pka_operand_t* public_key,
1169  pka_operand_t* hash,
1170  dsa_signature_t* rcvd_signature,
1171  uint8_t no_write);
1172 
1183  uint8_t *buf,
1184  uint32_t buf_len);
1185 
1186 #endif // __PKA_H__
int pka_divide(pka_handle_t handle, void *user_data, pka_operand_t *value, pka_operand_t *divisor)
void pka_term_local(pka_handle_t handle)
int pka_mont_ecdh(pka_handle_t handle, void *user_data, ecc_mont_curve_t *curve, pka_operand_t *point_x, pka_operand_t *private_key)
int pka_ecc_pt_add(pka_handle_t handle, void *user_data, ecc_curve_t *curve, ecc_point_t *pointA, ecc_point_t *pointB)
pka_cmp_code_t
PKA Compare Result Code Values.
Definition: pka.h:364
@ RC_RIGHT_IS_SMALLER
Right operand is smaller than left operand ('A' > 'B').
Definition: pka.h:370
@ RC_COMPARE_EQUAL
Both operands are equal ('A' = 'B').
Definition: pka.h:366
@ RC_LEFT_IS_SMALLER
Left operand is smaller than right operand ('A' < 'B').
Definition: pka.h:368
int pka_ecdsa_signature_generate(pka_handle_t handle, void *user_data, ecc_curve_t *curve, ecc_point_t *base_pt, pka_operand_t *base_pt_order, pka_operand_t *private_key, pka_operand_t *hash, pka_operand_t *k)
int pka_shift_left(pka_handle_t handle, void *user_data, pka_operand_t *value, uint32_t shift_cnt)
uint64_t pka_instance_t
PK instance type.
Definition: pka.h:109
pka_mont_curve_t
Definition: pka.h:783
@ PKA_CURVE_448
Definition: pka.h:786
@ PKA_CURVE_NULL
Definition: pka.h:784
@ PKA_CURVE_25519
Definition: pka.h:785
uint8_t pka_get_rings_byte_order(pka_handle_t handle)
int pka_modular_exp(pka_handle_t handle, void *user_data, pka_operand_t *exponent, pka_operand_t *modulus, pka_operand_t *value)
int pka_get_result_by_user_data(pka_handle_t handle, pka_results_t *results, void *user_data)
Return results pending in queue that match user_data.
int pka_modular_exp_crt(pka_handle_t handle, void *user_data, pka_operand_t *value, pka_operand_t *p, pka_operand_t *q, pka_operand_t *d_p, pka_operand_t *d_q, pka_operand_t *qinv)
int pka_ecdsa_signature_verify(pka_handle_t handle, void *user_data, ecc_curve_t *curve, ecc_point_t *base_pt, pka_operand_t *base_pt_order, ecc_point_t *public_key, pka_operand_t *hash, dsa_signature_t *rcvd_signature, uint8_t no_write)
int pka_add(pka_handle_t handle, void *user_data, pka_operand_t *value, pka_operand_t *addend)
pka_flags_t
PK flags that are supplied during PK instance initialization.
Definition: pka.h:122
@ PKA_F_SYNC_MODE_DISABLE
Definition: pka.h:142
@ PKA_F_SYNC_MODE_ENABLE
Definition: pka.h:147
@ PKA_F_PROCESS_MODE_SINGLE
Definition: pka.h:127
@ PKA_F_PROCESS_MODE_MULTI
Definition: pka.h:136
pka_opcode_t
PKA Command Code Values.
Definition: pka.h:264
@ CC_SHIFT_LEFT
Shift left (basic arithmetic).
Definition: pka.h:280
@ CC_MODULAR_EXP
Modular Exponentiation without CRT (complex arithmetic).
Definition: pka.h:288
@ CC_DSA_VERIFY_NO_WRITE
Definition: pka.h:314
@ CC_SHIFT_RIGHT
Shift right (basic arithmetic).
Definition: pka.h:282
@ CC_ECC_PT_ADD
ECC point addition/doubling (complex arithmetic).
Definition: pka.h:296
@ CC_ECDSA_VERIFY_NO_WRITE
Definition: pka.h:311
@ CC_ECC_PT_MULTIPLY
ECC point multiplication (complex arithmetic).
Definition: pka.h:298
@ CC_ECDSA_GENERATE
ECDSA signature generation (high-level PKA operations).
Definition: pka.h:300
@ CC_COPY
Copy (basic arithmetic).
Definition: pka.h:286
@ CC_DIVIDE
Divide (basic arithmetic).
Definition: pka.h:276
@ CC_COMPARE
Compare (basic arithmetic).
Definition: pka.h:284
@ CC_MOD_EXP_CRT
Modular Exponentiation with CRT (complex arithmetic).
Definition: pka.h:290
@ CC_ADD
Add (basic arithmetic).
Definition: pka.h:266
@ CC_DSA_VERIFY
Definition: pka.h:308
@ CC_SUBTRACT
Subtract (basic arithmetic).
Definition: pka.h:268
@ CC_MODULO
Modulo (basic arithmetic).
Definition: pka.h:278
@ CC_MODULAR_INVERT
Modular Inversion (complex arithmetic).
Definition: pka.h:292
@ CC_MONT_ECDH_MULTIPLY
ECC point multiplication on Montgomery Curves (complex arithmetic)
Definition: pka.h:294
@ CC_ADD_SUBTRACT
Add/Subtract combination (basic arithmetic).
Definition: pka.h:270
@ CC_ECDSA_VERIFY
Definition: pka.h:303
@ CC_DSA_GENERATE
DSA signature generation (high-level PKA operations).
Definition: pka.h:305
@ CC_MULTIPLY
Definition: pka.h:274
uint8_t * pka_get_rings_bitmask(pka_instance_t instance)
uint32_t pka_get_rings_count(pka_instance_t instance)
int pka_get_result(pka_handle_t handle, pka_results_t *results)
int pka_dsa_signature_generate(pka_handle_t handle, void *user_data, pka_operand_t *p, pka_operand_t *q, pka_operand_t *g, pka_operand_t *private_key, pka_operand_t *hash, pka_operand_t *k)
int pka_rsa_crt(pka_handle_t handle, void *user_data, pka_operand_t *p, pka_operand_t *q, pka_operand_t *c, pka_operand_t *d_p, pka_operand_t *d_q, pka_operand_t *qinv)
struct pka_local_info_t * pka_handle_t
PK handle (opaque) type that encapsulates local information.
Definition: pka.h:115
int pka_dsa_signature_verify(pka_handle_t handle, void *user_data, pka_operand_t *p, pka_operand_t *q, pka_operand_t *g, pka_operand_t *public_key, pka_operand_t *hash, dsa_signature_t *rcvd_signature, uint8_t no_write)
void pka_term_global(pka_instance_t instance)
int pka_ecc_pt_mult(pka_handle_t handle, void *user_data, ecc_curve_t *curve, ecc_point_t *pointA, pka_operand_t *multiplier)
int pka_rsa(pka_handle_t handle, void *user_data, pka_operand_t *exponent, pka_operand_t *modulus, pka_operand_t *value)
pka_result_code_t
PKA Result Code Values.
Definition: pka.h:319
@ RC_CALCULATION_ERR
Calculated value error.
Definition: pka.h:351
@ RC_EVEN_MODULUS
Modulus was even.
Definition: pka.h:323
@ RC_NO_MODULAR_INVERSE
Modular inverse does not exist.
Definition: pka.h:339
@ RC_NO_ERROR
No error – Normal command completion.
Definition: pka.h:321
@ RC_ENCRYPTED_PARAM_ERR
Illegal encrypted parameter use.
Definition: pka.h:355
@ RC_UNDEFINED_TRIGGER
Host used undefined trigger.
Definition: pka.h:345
@ RC_RESULT_IS_PAI
Result point of ECC operation is 'at infinity' -not a real error.
Definition: pka.h:333
@ RC_INVALID_ADDRESS
Address is invalid.
Definition: pka.h:353
@ RC_MEMORY_DEADLOCK
Memory deadlock error.
Definition: pka.h:359
@ RC_SHORT_MODULUS
Modulus was too short (less than 9 significant bits).
Definition: pka.h:327
@ RC_ECC_RESULT_OFF_CURVE
Result of ECC operation is not on the curve.
Definition: pka.h:341
@ RC_ONE_EXPONENT
Exponent was 1 (for a modular exponentiation).
Definition: pka.h:329
@ RC_OPERAND_VALUE_ERR
Operand value error.
Definition: pka.h:349
@ RC_INVALID_ARGUMENT
Invalid argument.
Definition: pka.h:347
@ RC_ZERO_EXPONENT
Exponent was 0 (for a modular exponentiation).
Definition: pka.h:325
@ RC_TOO_LITTLE_MEMORY
Farm memory too small for operation.
Definition: pka.h:357
@ RC_OPERAND_LENGTH_ERR
Operand length error.
Definition: pka.h:343
@ RC_UNKNOWN_COMMAND
Unknown command.
Definition: pka.h:335
@ RC_INTERMEDIATE_PAI
Intermediate result of ECC operation is 'at infinity' -not a real error.
Definition: pka.h:337
@ RC_BAD_ODD_POWERS
Odd powers not in range 1 … 16.
Definition: pka.h:331
#define MAX_RESULT_CNT
Definition: pka.h:246
int pka_modular_inverse(pka_handle_t handle, void *user_data, pka_operand_t *value, pka_operand_t *modulus)
int pka_ecdh(pka_handle_t handle, void *user_data, ecc_curve_t *curve, ecc_point_t *point, pka_operand_t *private_key)
pka_handle_t pka_init_local(pka_instance_t instance)
int pka_modulo(pka_handle_t handle, void *user_data, pka_operand_t *value, pka_operand_t *modulus)
int pka_subtract(pka_handle_t handle, void *user_data, pka_operand_t *value, pka_operand_t *subtrahend)
int pka_add_subtract(pka_handle_t handle, void *user_data, pka_operand_t *value, pka_operand_t *addend, pka_operand_t *subtrahend)
int pka_get_rand_bytes(pka_handle_t handle, uint8_t *buf, uint32_t buf_len)
uint32_t pka_request_count(pka_handle_t handle)
bool pka_has_avail_result(pka_handle_t handle)
int pka_multiply(pka_handle_t handle, void *user_data, pka_operand_t *value, pka_operand_t *multiplier)
int pka_mont_ecdh_mult(pka_handle_t handle, void *user_data, ecc_mont_curve_t *curve, pka_operand_t *point_x, pka_operand_t *multiplier)
int pka_shift_right(pka_handle_t handle, void *user_data, pka_operand_t *value, uint32_t shift_cnt)
int pka_dh(pka_handle_t handle, void *user_data, pka_operand_t *private_key, pka_operand_t *modulus, pka_operand_t *value)
pka_instance_t pka_init_global(const char *name, uint8_t flags, uint32_t ring_cnt, uint32_t queue_cnt, uint32_t cmd_queue_size, uint32_t result_queue_size)
Definition: pka.h:1035
pka_operand_t r
big integer value called 'r' in the standard
Definition: pka.h:1036
pka_operand_t s
big integer value called 's' in the standard
Definition: pka.h:1037
Definition: pka.h:776
pka_operand_t b
constant coefficient in defining equation
Definition: pka.h:779
pka_operand_t p
large integer prime defining the finite field
Definition: pka.h:777
pka_operand_t a
coefficient of x in the defining equation
Definition: pka.h:778
Definition: pka.h:807
pka_operand_t p
large integer prime defining the finite field
Definition: pka.h:808
pka_mont_curve_t type
type to depict curve.
Definition: pka.h:810
pka_operand_t A
coefficient of u^2 in the defining equation
Definition: pka.h:809
Definition: pka.h:758
pka_operand_t x
big integer x coordinate of a point on a EC curve
Definition: pka.h:759
pka_operand_t y
big integer y coordinate of a point on a EC curve
Definition: pka.h:760
Definition: pka.h:252
uint16_t buf_len
Size of the buffer holding the big integer.
Definition: pka.h:253
uint16_t actual_len
Actual minimum # of bytes used by the operand.
Definition: pka.h:254
uint8_t * buf_ptr
Pointer to the buffer holding the big integer.
Definition: pka.h:259
uint8_t big_endian
Indicates byte order of the big integer operand.
Definition: pka.h:256
uint8_t internal_use
Internal use. Must be set to 0 by users.
Definition: pka.h:257
uint8_t is_encrypted
Reserved for future use.
Definition: pka.h:255
uint8_t pad
Reserved for future use.
Definition: pka.h:258
Definition: pka.h:378
pka_cmp_code_t compare_result
Result of a comparison.
Definition: pka.h:383
pka_result_code_t status
Same as result_code.
Definition: pka.h:382
pka_opcode_t opcode
Opcode of the associated request.
Definition: pka.h:380
uint8_t result_cnt
Result cnt must be 0, 1 or 2.
Definition: pka.h:381
void * user_data
Opaque data pointer.
Definition: pka.h:379