Viewing file: rsa_x931.c (2.62 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* * Copyright 2005-2020 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy * in the file LICENSE in the source distribution or at * https://www.openssl.org/source/license.html */
/* * RSA low level APIs are deprecated for public use, but still ok for * internal use. */ #include "internal/deprecated.h"
#include <stdio.h> #include "internal/cryptlib.h" #include <openssl/bn.h> #include <openssl/rsa.h> #include <openssl/objects.h>
int RSA_padding_add_X931(unsigned char *to, int tlen, const unsigned char *from, int flen) { int j; unsigned char *p;
/* * Absolute minimum amount of padding is 1 header nibble, 1 padding * nibble and 2 trailer bytes: but 1 hash if is already in 'from'. */
j = tlen - flen - 2;
if (j < 0) { ERR_raise(ERR_LIB_RSA, RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE); return -1; }
p = (unsigned char *)to;
/* If no padding start and end nibbles are in one byte */ if (j == 0) { *p++ = 0x6A; } else { *p++ = 0x6B; if (j > 1) { memset(p, 0xBB, j - 1); p += j - 1; } *p++ = 0xBA; } memcpy(p, from, (unsigned int)flen); p += flen; *p = 0xCC; return 1; }
int RSA_padding_check_X931(unsigned char *to, int tlen, const unsigned char *from, int flen, int num) { int i = 0, j; const unsigned char *p;
p = from; if ((num != flen) || ((*p != 0x6A) && (*p != 0x6B))) { ERR_raise(ERR_LIB_RSA, RSA_R_INVALID_HEADER); return -1; }
if (*p++ == 0x6B) { j = flen - 3; for (i = 0; i < j; i++) { unsigned char c = *p++; if (c == 0xBA) break; if (c != 0xBB) { ERR_raise(ERR_LIB_RSA, RSA_R_INVALID_PADDING); return -1; } }
j -= i;
if (i == 0) { ERR_raise(ERR_LIB_RSA, RSA_R_INVALID_PADDING); return -1; }
} else { j = flen - 2; }
if (p[j] != 0xCC) { ERR_raise(ERR_LIB_RSA, RSA_R_INVALID_TRAILER); return -1; }
memcpy(to, p, (unsigned int)j);
return j; }
/* Translate between X931 hash ids and NIDs */
int RSA_X931_hash_id(int nid) { switch (nid) { case NID_sha1: return 0x33;
case NID_sha256: return 0x34;
case NID_sha384: return 0x36;
case NID_sha512: return 0x35;
} return -1; }
|