diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/evp/e_aes.c | 82 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/evp/e_aes.c | 82 |
2 files changed, 140 insertions, 24 deletions
diff --git a/src/lib/libcrypto/evp/e_aes.c b/src/lib/libcrypto/evp/e_aes.c index fb767d9619..3304e3417e 100644 --- a/src/lib/libcrypto/evp/e_aes.c +++ b/src/lib/libcrypto/evp/e_aes.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: e_aes.c,v 1.23 2014/07/10 22:45:57 jsing Exp $ */ | 1 | /* $OpenBSD: e_aes.c,v 1.24 2014/07/11 14:38:51 miod Exp $ */ |
2 | /* ==================================================================== | 2 | /* ==================================================================== |
3 | * Copyright (c) 2001-2011 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 2001-2011 The OpenSSL Project. All rights reserved. |
4 | * | 4 | * |
@@ -785,6 +785,27 @@ aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr) | |||
785 | /* Extra padding: tag appended to record */ | 785 | /* Extra padding: tag appended to record */ |
786 | return EVP_GCM_TLS_TAG_LEN; | 786 | return EVP_GCM_TLS_TAG_LEN; |
787 | 787 | ||
788 | case EVP_CTRL_COPY: | ||
789 | { | ||
790 | EVP_CIPHER_CTX *out = ptr; | ||
791 | EVP_AES_GCM_CTX *gctx_out = out->cipher_data; | ||
792 | |||
793 | if (gctx->gcm.key) { | ||
794 | if (gctx->gcm.key != &gctx->ks) | ||
795 | return 0; | ||
796 | gctx_out->gcm.key = &gctx_out->ks; | ||
797 | } | ||
798 | if (gctx->iv == c->iv) | ||
799 | gctx_out->iv = out->iv; | ||
800 | else { | ||
801 | gctx_out->iv = malloc(gctx->ivlen); | ||
802 | if (!gctx_out->iv) | ||
803 | return 0; | ||
804 | memcpy(gctx_out->iv, gctx->iv, gctx->ivlen); | ||
805 | } | ||
806 | return 1; | ||
807 | } | ||
808 | |||
788 | default: | 809 | default: |
789 | return -1; | 810 | return -1; |
790 | 811 | ||
@@ -992,9 +1013,10 @@ aes_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | |||
992 | 1013 | ||
993 | } | 1014 | } |
994 | 1015 | ||
995 | #define CUSTOM_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 \ | 1016 | #define CUSTOM_FLAGS \ |
996 | | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \ | 1017 | ( EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV | \ |
997 | | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT) | 1018 | EVP_CIPH_FLAG_CUSTOM_CIPHER | EVP_CIPH_ALWAYS_CALL_INIT | \ |
1019 | EVP_CIPH_CTRL_INIT | EVP_CIPH_CUSTOM_COPY ) | ||
998 | 1020 | ||
999 | BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, gcm, GCM, | 1021 | BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, gcm, GCM, |
1000 | EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS) | 1022 | EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS) |
@@ -1008,13 +1030,35 @@ aes_xts_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr) | |||
1008 | { | 1030 | { |
1009 | EVP_AES_XTS_CTX *xctx = c->cipher_data; | 1031 | EVP_AES_XTS_CTX *xctx = c->cipher_data; |
1010 | 1032 | ||
1011 | if (type != EVP_CTRL_INIT) | 1033 | switch (type) { |
1012 | return -1; | 1034 | case EVP_CTRL_INIT: |
1035 | /* | ||
1036 | * key1 and key2 are used as an indicator both key and IV | ||
1037 | * are set | ||
1038 | */ | ||
1039 | xctx->xts.key1 = NULL; | ||
1040 | xctx->xts.key2 = NULL; | ||
1041 | return 1; | ||
1013 | 1042 | ||
1014 | /* key1 and key2 are used as an indicator both key and IV are set */ | 1043 | case EVP_CTRL_COPY: |
1015 | xctx->xts.key1 = NULL; | 1044 | { |
1016 | xctx->xts.key2 = NULL; | 1045 | EVP_CIPHER_CTX *out = ptr; |
1017 | return 1; | 1046 | EVP_AES_XTS_CTX *xctx_out = out->cipher_data; |
1047 | |||
1048 | if (xctx->xts.key1) { | ||
1049 | if (xctx->xts.key1 != &xctx->ks1) | ||
1050 | return 0; | ||
1051 | xctx_out->xts.key1 = &xctx_out->ks1; | ||
1052 | } | ||
1053 | if (xctx->xts.key2) { | ||
1054 | if (xctx->xts.key2 != &xctx->ks2) | ||
1055 | return 0; | ||
1056 | xctx_out->xts.key2 = &xctx_out->ks2; | ||
1057 | } | ||
1058 | return 1; | ||
1059 | } | ||
1060 | } | ||
1061 | return -1; | ||
1018 | } | 1062 | } |
1019 | 1063 | ||
1020 | static int | 1064 | static int |
@@ -1106,8 +1150,9 @@ aes_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | |||
1106 | 1150 | ||
1107 | #define aes_xts_cleanup NULL | 1151 | #define aes_xts_cleanup NULL |
1108 | 1152 | ||
1109 | #define XTS_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV \ | 1153 | #define XTS_FLAGS \ |
1110 | | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT) | 1154 | ( EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV | \ |
1155 | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT | EVP_CIPH_CUSTOM_COPY ) | ||
1111 | 1156 | ||
1112 | BLOCK_CIPHER_custom(NID_aes, 128, 1, 16, xts, XTS, EVP_CIPH_FLAG_FIPS|XTS_FLAGS) | 1157 | BLOCK_CIPHER_custom(NID_aes, 128, 1, 16, xts, XTS, EVP_CIPH_FLAG_FIPS|XTS_FLAGS) |
1113 | BLOCK_CIPHER_custom(NID_aes, 256, 1, 16, xts, XTS, EVP_CIPH_FLAG_FIPS|XTS_FLAGS) | 1158 | BLOCK_CIPHER_custom(NID_aes, 256, 1, 16, xts, XTS, EVP_CIPH_FLAG_FIPS|XTS_FLAGS) |
@@ -1158,6 +1203,19 @@ aes_ccm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr) | |||
1158 | cctx->len_set = 0; | 1203 | cctx->len_set = 0; |
1159 | return 1; | 1204 | return 1; |
1160 | 1205 | ||
1206 | case EVP_CTRL_COPY: | ||
1207 | { | ||
1208 | EVP_CIPHER_CTX *out = ptr; | ||
1209 | EVP_AES_CCM_CTX *cctx_out = out->cipher_data; | ||
1210 | |||
1211 | if (cctx->ccm.key) { | ||
1212 | if (cctx->ccm.key != &cctx->ks) | ||
1213 | return 0; | ||
1214 | cctx_out->ccm.key = &cctx_out->ks; | ||
1215 | } | ||
1216 | return 1; | ||
1217 | } | ||
1218 | |||
1161 | default: | 1219 | default: |
1162 | return -1; | 1220 | return -1; |
1163 | } | 1221 | } |
diff --git a/src/lib/libssl/src/crypto/evp/e_aes.c b/src/lib/libssl/src/crypto/evp/e_aes.c index fb767d9619..3304e3417e 100644 --- a/src/lib/libssl/src/crypto/evp/e_aes.c +++ b/src/lib/libssl/src/crypto/evp/e_aes.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: e_aes.c,v 1.23 2014/07/10 22:45:57 jsing Exp $ */ | 1 | /* $OpenBSD: e_aes.c,v 1.24 2014/07/11 14:38:51 miod Exp $ */ |
2 | /* ==================================================================== | 2 | /* ==================================================================== |
3 | * Copyright (c) 2001-2011 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 2001-2011 The OpenSSL Project. All rights reserved. |
4 | * | 4 | * |
@@ -785,6 +785,27 @@ aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr) | |||
785 | /* Extra padding: tag appended to record */ | 785 | /* Extra padding: tag appended to record */ |
786 | return EVP_GCM_TLS_TAG_LEN; | 786 | return EVP_GCM_TLS_TAG_LEN; |
787 | 787 | ||
788 | case EVP_CTRL_COPY: | ||
789 | { | ||
790 | EVP_CIPHER_CTX *out = ptr; | ||
791 | EVP_AES_GCM_CTX *gctx_out = out->cipher_data; | ||
792 | |||
793 | if (gctx->gcm.key) { | ||
794 | if (gctx->gcm.key != &gctx->ks) | ||
795 | return 0; | ||
796 | gctx_out->gcm.key = &gctx_out->ks; | ||
797 | } | ||
798 | if (gctx->iv == c->iv) | ||
799 | gctx_out->iv = out->iv; | ||
800 | else { | ||
801 | gctx_out->iv = malloc(gctx->ivlen); | ||
802 | if (!gctx_out->iv) | ||
803 | return 0; | ||
804 | memcpy(gctx_out->iv, gctx->iv, gctx->ivlen); | ||
805 | } | ||
806 | return 1; | ||
807 | } | ||
808 | |||
788 | default: | 809 | default: |
789 | return -1; | 810 | return -1; |
790 | 811 | ||
@@ -992,9 +1013,10 @@ aes_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | |||
992 | 1013 | ||
993 | } | 1014 | } |
994 | 1015 | ||
995 | #define CUSTOM_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 \ | 1016 | #define CUSTOM_FLAGS \ |
996 | | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \ | 1017 | ( EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV | \ |
997 | | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT) | 1018 | EVP_CIPH_FLAG_CUSTOM_CIPHER | EVP_CIPH_ALWAYS_CALL_INIT | \ |
1019 | EVP_CIPH_CTRL_INIT | EVP_CIPH_CUSTOM_COPY ) | ||
998 | 1020 | ||
999 | BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, gcm, GCM, | 1021 | BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, gcm, GCM, |
1000 | EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS) | 1022 | EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS) |
@@ -1008,13 +1030,35 @@ aes_xts_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr) | |||
1008 | { | 1030 | { |
1009 | EVP_AES_XTS_CTX *xctx = c->cipher_data; | 1031 | EVP_AES_XTS_CTX *xctx = c->cipher_data; |
1010 | 1032 | ||
1011 | if (type != EVP_CTRL_INIT) | 1033 | switch (type) { |
1012 | return -1; | 1034 | case EVP_CTRL_INIT: |
1035 | /* | ||
1036 | * key1 and key2 are used as an indicator both key and IV | ||
1037 | * are set | ||
1038 | */ | ||
1039 | xctx->xts.key1 = NULL; | ||
1040 | xctx->xts.key2 = NULL; | ||
1041 | return 1; | ||
1013 | 1042 | ||
1014 | /* key1 and key2 are used as an indicator both key and IV are set */ | 1043 | case EVP_CTRL_COPY: |
1015 | xctx->xts.key1 = NULL; | 1044 | { |
1016 | xctx->xts.key2 = NULL; | 1045 | EVP_CIPHER_CTX *out = ptr; |
1017 | return 1; | 1046 | EVP_AES_XTS_CTX *xctx_out = out->cipher_data; |
1047 | |||
1048 | if (xctx->xts.key1) { | ||
1049 | if (xctx->xts.key1 != &xctx->ks1) | ||
1050 | return 0; | ||
1051 | xctx_out->xts.key1 = &xctx_out->ks1; | ||
1052 | } | ||
1053 | if (xctx->xts.key2) { | ||
1054 | if (xctx->xts.key2 != &xctx->ks2) | ||
1055 | return 0; | ||
1056 | xctx_out->xts.key2 = &xctx_out->ks2; | ||
1057 | } | ||
1058 | return 1; | ||
1059 | } | ||
1060 | } | ||
1061 | return -1; | ||
1018 | } | 1062 | } |
1019 | 1063 | ||
1020 | static int | 1064 | static int |
@@ -1106,8 +1150,9 @@ aes_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | |||
1106 | 1150 | ||
1107 | #define aes_xts_cleanup NULL | 1151 | #define aes_xts_cleanup NULL |
1108 | 1152 | ||
1109 | #define XTS_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV \ | 1153 | #define XTS_FLAGS \ |
1110 | | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT) | 1154 | ( EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV | \ |
1155 | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT | EVP_CIPH_CUSTOM_COPY ) | ||
1111 | 1156 | ||
1112 | BLOCK_CIPHER_custom(NID_aes, 128, 1, 16, xts, XTS, EVP_CIPH_FLAG_FIPS|XTS_FLAGS) | 1157 | BLOCK_CIPHER_custom(NID_aes, 128, 1, 16, xts, XTS, EVP_CIPH_FLAG_FIPS|XTS_FLAGS) |
1113 | BLOCK_CIPHER_custom(NID_aes, 256, 1, 16, xts, XTS, EVP_CIPH_FLAG_FIPS|XTS_FLAGS) | 1158 | BLOCK_CIPHER_custom(NID_aes, 256, 1, 16, xts, XTS, EVP_CIPH_FLAG_FIPS|XTS_FLAGS) |
@@ -1158,6 +1203,19 @@ aes_ccm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr) | |||
1158 | cctx->len_set = 0; | 1203 | cctx->len_set = 0; |
1159 | return 1; | 1204 | return 1; |
1160 | 1205 | ||
1206 | case EVP_CTRL_COPY: | ||
1207 | { | ||
1208 | EVP_CIPHER_CTX *out = ptr; | ||
1209 | EVP_AES_CCM_CTX *cctx_out = out->cipher_data; | ||
1210 | |||
1211 | if (cctx->ccm.key) { | ||
1212 | if (cctx->ccm.key != &cctx->ks) | ||
1213 | return 0; | ||
1214 | cctx_out->ccm.key = &cctx_out->ks; | ||
1215 | } | ||
1216 | return 1; | ||
1217 | } | ||
1218 | |||
1161 | default: | 1219 | default: |
1162 | return -1; | 1220 | return -1; |
1163 | } | 1221 | } |